{
  "generatedAt": "2026-08-04T12:44:01.701Z",
  "repo": "Lawhive/platform",
  "repoLabel": "platform (v2)",
  "branch": "develop",
  "schemaCommit": "b0580da7bc099ff2eb751ff90c88fff01a7cdf0b",
  "interpretedCommit": "b0580da7bc099ff2eb751ff90c88fff01a7cdf0b",
  "interpretationVersion": 1,
  "inngestGeneratedAt": "2026-07-27T08:52:11.647Z",
  "totals": {
    "domains": 17,
    "datastores": 3,
    "models": 146,
    "views": 1,
    "enums": 108,
    "fields": 1917,
    "relations": 579,
    "codeAreas": 111,
    "apiModules": 46,
    "uiFeatures": 31,
    "prismaSites": 1517,
    "noDirectCalls": 20,
    "unreferenced": 4,
    "interpreted": 146,
    "tiers": {
      "core": 91,
      "supporting": 51,
      "legacy": 4
    },
    "events": {
      "total": 236,
      "v2Events": 112,
      "unmappedSites": 0,
      "ownedByRule": 112,
      "ownedBySite": 0,
      "unowned": 0
    },
    "drift": 0
  },
  "drift": {
    "unassigned": [],
    "unknownAssignments": [],
    "unassignedAreas": [],
    "uninterpreted": [],
    "removed": [],
    "staleFields": [],
    "commitGap": null
  },
  "overview": {
    "standfirst": "One Postgres database with real foreign keys, one Person wearing every role, and the Case at the centre. Seventeen business domains carved out of an eight-year-old monolith.",
    "conventions": [
      {
        "title": "One database, real relations, prefixed ids",
        "body": "Almost everything lives in a single Postgres schema behind one Prisma client. Records still carry prefixed nanoid ids (cas_ case, psn_ person, qt_ quote, bl_ bill) so an id tells you what it is, but references are ordinary foreign keys with joins, not cross-service lookups. Two datastores sit outside it: the ai database for Lawrence's threads and embeddings, and case-quality's own database behind the one real service."
      },
      {
        "title": "One person, many hats",
        "body": "Person is the identity record: name, email, phone. What someone can do comes from the hat records hanging off it. User for a client login, Admin for Lawhive staff, Customer for the paying client, Solicitor for a regulated lawyer, and FirmEmployee for a seat at a firm. The same human can hold several at once, and Clerk ids live on the hats rather than on Person."
      },
      {
        "title": "Domains talk through Inngest events",
        "body": "Cross-domain work is choreographed with Inngest. Modules declare events in <module>.events.ts, emit them with inngest.send, and react in event handlers. The long-running processes (opening a case, generating a briefing note, settling a bill, escalating a quality alert) are event chains rather than single transactions."
      }
    ],
    "birthPaths": [
      {
        "title": "The marketplace path (CaseSource.lawhive)",
        "body": "A client describes a problem and gets an AssessmentRequest, a consultation with a lawyer, then a Quote. Accepting the quote authorises payment and creates an Instruction, which is offered to solicitors as InstructionAssignments until one accepts. Acceptance opens the Case, and the legal work, communication, billing and AI all hang off it."
      },
      {
        "title": "Bring your own client (CaseSource.byoc)",
        "body": "A firm's own lawyer quotes a client they already have and opens the case directly. No marketplace assignment happens, so there is no InstructionAssignment fan-out, but everything from the Case onward behaves the same and the firm still bills through the platform."
      },
      {
        "title": "Follow-on work (CaseSource.followOn)",
        "body": "More work on an existing relationship: a new quote against the same client produces a new Case linked back through CaseAssociation, with its own bill and its own fee plan."
      }
    ]
  },
  "pillars": [
    {
      "id": "people",
      "label": "People & firms",
      "domains": [
        "people",
        "firms"
      ]
    },
    {
      "id": "funnel",
      "label": "Getting the work",
      "domains": [
        "catalog",
        "consultations",
        "quotes",
        "instructions"
      ]
    },
    {
      "id": "case",
      "label": "The case",
      "domains": [
        "cases",
        "documents"
      ]
    },
    {
      "id": "money",
      "label": "Money",
      "domains": [
        "money"
      ]
    },
    {
      "id": "comms",
      "label": "Communication",
      "domains": [
        "chat",
        "email",
        "voice",
        "post"
      ]
    },
    {
      "id": "assurance",
      "label": "Compliance & quality",
      "domains": [
        "compliance",
        "quality"
      ]
    },
    {
      "id": "ai",
      "label": "AI",
      "domains": [
        "ai"
      ]
    },
    {
      "id": "plumbing",
      "label": "Plumbing",
      "domains": [
        "plumbing"
      ]
    }
  ],
  "datastoreDetail": [
    {
      "id": "app",
      "label": "app",
      "kind": "prisma",
      "client": "prisma",
      "schemaFile": "packages/db/prisma/schema.prisma",
      "envVar": "DATABASE_URL",
      "note": "The monolith database. Everything except the AI vector store and case-quality lives here.",
      "models": 135,
      "enums": 95
    },
    {
      "id": "ai",
      "label": "ai",
      "kind": "prisma",
      "client": "prismaAI",
      "schemaFile": "packages/db-ai/prisma/schema.prisma",
      "envVar": "AI_DATABASE_URL",
      "note": "Lawrence's own database: chat threads, embeddings, feedback. pgvector lives here.",
      "models": 6,
      "enums": 3
    },
    {
      "id": "case_quality",
      "label": "case-quality",
      "kind": "drizzle",
      "client": "db",
      "schemaFile": "services/case-quality/src/db/schema.ts",
      "envVar": "DATABASE_URL (case-quality)",
      "note": "The one v2 datastore behind its own service: communication spans, classifications, and alerts.",
      "models": 5,
      "enums": 10
    }
  ],
  "idPrefixCollisions": [
    {
      "prefix": "comm_",
      "models": [
        "app/Communication",
        "app/CommunicationThread"
      ]
    },
    {
      "prefix": "tm_",
      "models": [
        "app/LegalForm",
        "app/LegalFormCaseArtifact",
        "app/TeamMember"
      ]
    }
  ],
  "rawSites": [
    {
      "file": "packages/api/src/modules/cases/files/folders/procedures/listCaseFileFoldersForCase.handler.ts",
      "line": 52,
      "kind": "queryRaw",
      "area": "api/cases"
    }
  ],
  "domains": [
    {
      "id": "people",
      "order": 1,
      "groups": [],
      "name": "People: one person, many hats",
      "tagline": "One Person row per human, plus the hats: User, Admin, Customer, Solicitor",
      "whatItIs": "Everyone in v2 is a Person, one row per email address, holding the name, phone number and photo that the rest of the product renders. What a Person can do comes from the hat records hanging off it: a User means they can sign in through Clerk, an Admin means they work at Lawhive, a Customer means they can be billed, a Solicitor means they can be given legal work. A Person can hold several hats at once, and none of them are required. Around that core the domain also holds the things you set per person: out of office windows (StatusSchedule), notification snoozing (SnoozeNotifications), the lawyer's rating and the reviews behind it, and client referrals. Admins can edit a person's name, primary email and primary phone from the admin app; lawyers get their assignment status, exclusivity, engagement basis and account manager changed from api/solicitors.",
      "howItConnects": "Almost every other domain points here. Cases attach people as parties and invitees, chat attaches them as channel members and message authors, consultations as meeting hosts and attendees, compliance as signers and check reviewers. The Customer hat is the anchor for quotes, payments and KYC, and it owns a CustomerLedger in money. The Solicitor hat is the supply side: firms links it to a Firm through FirmEmployee, instructions matches it to work and scores it, consultations assigns it to assessments. Admin is the audit trail for staff actions, so money, post, quotes and instructions all carry an adminId for who did the thing. Identity itself lives in Clerk, not here: Clerk webhooks and the first authenticated tRPC call are what create User and Person rows.",
      "lifecycle": "INVITED → REGISTERED",
      "flows": [
        {
          "id": "signup",
          "title": "How a Person and its hats get created",
          "mermaid": "flowchart LR\n  Clerk[Clerk user] --> Entry[webhook or first tRPC call]\n  Entry --> P[Person upsert by email]\n  P --> U[User with clerkUserId]\n  U --> C[Customer]\n  C --> L[CustomerLedger]\n  C --> S[Stripe customer]",
          "caption": "createUserFromClerk upserts the Person by primary email, upserts the User, then upserts a Customer with its ledger and a Stripe customer. Every signed-in Person ends up with a Customer, whether or not they ever buy anything."
        },
        {
          "id": "hats",
          "title": "The hat records",
          "mermaid": "flowchart TD\n  P[Person psn_] --> U[User usr_]\n  P --> A[Admin adm_]\n  P --> C[Customer cus_]\n  P --> S[Solicitor sol_]\n  U --> F[Firm membership]\n  S --> FE[FirmEmployee]",
          "caption": "Each hat is a separate table with a unique personId, so at most one of each per Person. User and Admin each carry their own clerkUserId; Customer carries stripeCustomerId and onfidoApplicantId; Solicitor carries the professional registration."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "Clerk is the source of truth for auth, and there are two Clerk instances. User.clerkUserId comes from the platform instance (platformClerkClient), Admin.clerkUserId from the admin instance (adminClerkClient). The same colleague signing into both apps has two different Clerk ids on two records that share one Person."
        },
        {
          "kind": "status",
          "body": "A Person starts INVITED when someone else creates them (a case invite, a referral, a payment request, a v1 import) and flips to REGISTERED once a Clerk user attaches. Person rows are matched and deduplicated on the lowercased emailAddress, not on any external id."
        },
        {
          "kind": "duplication",
          "body": "Customer is not the same thing as User. User means \"can log in\", Customer means \"can be invoiced\", and getUser plus createUserFromClerk both call upsertCustomer, so nearly every User has a Customer sitting next to it."
        },
        {
          "kind": "legacy",
          "body": "UserOnboarding is written once, nested inside upsertUserForPerson, and never read back. getUser recomputes onboarding state live from Clerk and Person.hasUploadedProfilePhoto instead."
        },
        {
          "kind": "misfiled",
          "body": "LegalPersonProfile is assigned to people but hangs off FirmEmployee, not Person. It is created nested by createSolicitorFirmEmployeeForMembership and createNonSolicitorFirmEmployeeForMembership and updated by firms/service/setFirmEmployeeBio. It belongs in firms."
        },
        {
          "kind": "legacy",
          "body": "Two write sites in the usage map are not live paths. packages/api/src/integrations/v1/cases/beginImport.ts upserts Admin rows for the v1 migration, and firms/firmEmployees/procedures/inviteSolicitor.ts throws \"Not implemented\" with its Person upsert commented out."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/persons",
          "kind": "api-module",
          "label": "persons",
          "path": "packages/api/src/modules/persons",
          "files": 30,
          "prismaSites": 18,
          "procedures": {
            "queries": 3,
            "mutations": 9
          }
        },
        {
          "id": "api/users",
          "kind": "api-module",
          "label": "users",
          "path": "packages/api/src/modules/users",
          "files": 27,
          "prismaSites": 21,
          "procedures": {
            "queries": 4,
            "mutations": 2
          }
        },
        {
          "id": "api/customers",
          "kind": "api-module",
          "label": "customers",
          "path": "packages/api/src/modules/customers",
          "files": 15,
          "prismaSites": 13,
          "procedures": {
            "queries": 2,
            "mutations": 2
          }
        },
        {
          "id": "api/solicitors",
          "kind": "api-module",
          "label": "solicitors",
          "path": "packages/api/src/modules/solicitors",
          "files": 45,
          "prismaSites": 60,
          "procedures": {
            "queries": 11,
            "mutations": 11
          }
        },
        {
          "id": "api/_auth",
          "kind": "api-core",
          "label": "api auth",
          "path": "packages/api/src/auth",
          "files": 2,
          "prismaSites": 2
        },
        {
          "id": "ui/auth",
          "kind": "ui-feature",
          "label": "auth",
          "path": "apps/platform/src/features/auth",
          "files": 15,
          "prismaSites": 0
        },
        {
          "id": "ui/user",
          "kind": "ui-feature",
          "label": "user",
          "path": "apps/platform/src/features/user",
          "files": 3,
          "prismaSites": 0
        },
        {
          "id": "ui/profile",
          "kind": "ui-feature",
          "label": "profile",
          "path": "apps/platform/src/features/profile",
          "files": 3,
          "prismaSites": 0
        },
        {
          "id": "ui/onboarding",
          "kind": "ui-feature",
          "label": "onboarding",
          "path": "apps/platform/src/features/onboarding",
          "files": 10,
          "prismaSites": 0
        },
        {
          "id": "ui/ratings",
          "kind": "ui-feature",
          "label": "ratings",
          "path": "apps/platform/src/features/ratings",
          "files": 2,
          "prismaSites": 0
        },
        {
          "id": "ui/notifications",
          "kind": "ui-feature",
          "label": "notifications",
          "path": "apps/platform/src/features/notifications",
          "files": 6,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/incentive/scheme-member/scheme-id.updated",
            "namespace": "app",
            "area": "api/solicitors",
            "file": "packages/api/src/modules/solicitors/procedures/setExclusivityStatus.handler.ts",
            "line": 39,
            "live": "silent"
          },
          {
            "name": "solicitors/review.created",
            "namespace": "solicitors",
            "area": "api/solicitors",
            "file": "packages/api/src/modules/solicitors/reviews/service/createSolicitorReview.ts",
            "line": 274,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "solicitors/review.created",
            "namespace": "solicitors",
            "area": "api/solicitors",
            "file": "packages/api/src/modules/solicitors/reviews/service/sendRatingToN8n.ts",
            "line": 10,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/score/all-lawyers",
            "namespace": "app",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/score/lawyer",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/scoreAllLawyers.ts",
            "line": 15,
            "live": "active",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "solicitors/review.created",
            "namespace": "solicitors",
            "area": "api/solicitors",
            "file": "packages/api/src/modules/solicitors/reviews/service/createSolicitorReview.ts",
            "line": 274,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "people"
            ],
            "consumers": [
              "people"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "KycWorkflowRunStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 540,
          "doc": null,
          "values": [
            {
              "name": "not_started",
              "doc": null
            },
            {
              "name": "awaiting_input",
              "doc": null
            },
            {
              "name": "processing",
              "doc": null
            },
            {
              "name": "abandoned",
              "doc": null
            },
            {
              "name": "error",
              "doc": null
            },
            {
              "name": "approved",
              "doc": null
            },
            {
              "name": "review",
              "doc": null
            },
            {
              "name": "declined",
              "doc": null
            }
          ],
          "usedBy": [
            "Customer",
            "KycWorkflowRun"
          ],
          "datastore": "app",
          "shared": true
        },
        {
          "name": "LawyerAssignmentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 387,
          "doc": null,
          "values": [
            {
              "name": "Active",
              "doc": null
            },
            {
              "name": "Onboarding",
              "doc": null
            },
            {
              "name": "Offboarded",
              "doc": null
            },
            {
              "name": "Inactive",
              "doc": null
            },
            {
              "name": "Suspended",
              "doc": null
            },
            {
              "name": "OnlyBYOC",
              "doc": null
            },
            {
              "name": "WithinNotice",
              "doc": null
            },
            {
              "name": "UnderMonitoring",
              "doc": null
            },
            {
              "name": "Paused",
              "doc": null
            },
            {
              "name": "ProposedOffboarding",
              "doc": null
            }
          ],
          "usedBy": [
            "Solicitor"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "PersonStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 212,
          "doc": null,
          "values": [
            {
              "name": "INVITED",
              "doc": null
            },
            {
              "name": "REGISTERED",
              "doc": null
            }
          ],
          "usedBy": [
            "Person"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "SnoozeNotificationsStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 152,
          "doc": null,
          "values": [
            {
              "name": "enabled",
              "doc": null
            },
            {
              "name": "disabled",
              "doc": null
            }
          ],
          "usedBy": [
            "SnoozeNotifications"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "SolicitorEngagementBasis",
          "file": "packages/db/prisma/schema.prisma",
          "line": 400,
          "doc": null,
          "values": [
            {
              "name": "platform_consultant",
              "doc": null
            },
            {
              "name": "retained_consultant",
              "doc": null
            },
            {
              "name": "in_house",
              "doc": null
            }
          ],
          "usedBy": [
            "Solicitor"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "SolicitorProfessionalBody",
          "file": "packages/db/prisma/schema.prisma",
          "line": 380,
          "doc": null,
          "values": [
            {
              "name": "sra",
              "doc": null
            },
            {
              "name": "cilex",
              "doc": null
            },
            {
              "name": "clc",
              "doc": null
            },
            {
              "name": "other",
              "doc": null
            }
          ],
          "usedBy": [
            "Solicitor"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "StatusScheduleStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 130,
          "doc": null,
          "values": [
            {
              "name": "enabled",
              "doc": null
            },
            {
              "name": "disabled",
              "doc": null
            }
          ],
          "usedBy": [
            "StatusSchedule"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 130,
        "writes": 39
      },
      "models": [
        {
          "key": "app/Person",
          "name": "Person",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 171,
          "idPrefix": "psn_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 33,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "emailAddress",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firstName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lastName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "phoneNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "photoUrl",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hasUploadedProfilePhoto",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hasConfirmedDetails",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "user",
              "type": "User",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "User",
              "onDelete": null
            },
            {
              "name": "admin",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "statusSchedule",
              "type": "StatusSchedule",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "StatusSchedule",
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "Solicitor",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "caseParties",
              "type": "CaseParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseParty",
              "onDelete": null
            },
            {
              "name": "sentInvites",
              "type": "CaseInvitation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseInvitation",
              "onDelete": null
            },
            {
              "name": "receivedInvites",
              "type": "CaseInvitation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseInvitation",
              "onDelete": null
            },
            {
              "name": "status",
              "type": "PersonStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "channelMembers",
              "type": "ChannelMember",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ChannelMember",
              "onDelete": null
            },
            {
              "name": "messages",
              "type": "Message",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Message",
              "onDelete": null
            },
            {
              "name": "hostMeetings",
              "type": "Meeting",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Meeting",
              "onDelete": null
            },
            {
              "name": "attendeeMeetings",
              "type": "Meeting",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Meeting",
              "onDelete": null
            },
            {
              "name": "solicitorReviews",
              "type": "SolicitorReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "SolicitorReview",
              "onDelete": null
            },
            {
              "name": "uploadedCaseFiles",
              "type": "CaseFile",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "snoozeNotifications",
              "type": "SnoozeNotifications",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "SnoozeNotifications",
              "onDelete": null
            },
            {
              "name": "clientAgreementSignatures",
              "type": "ClientAgreementSignature",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreementSignature",
              "onDelete": null
            },
            {
              "name": "referralsMade",
              "type": "ClientReferral",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientReferral",
              "onDelete": null
            },
            {
              "name": "customerServiceContacts",
              "type": "CustomerServiceContact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CustomerServiceContact",
              "onDelete": null
            },
            {
              "name": "calls",
              "type": "Call",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Call",
              "onDelete": null
            },
            {
              "name": "addressChecksRun",
              "type": "AddressCheck",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AddressCheck",
              "onDelete": null
            },
            {
              "name": "addressChecksReviewed",
              "type": "AddressCheck",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AddressCheck",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "user",
              "target": "User",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/User",
              "targetDomain": "people"
            },
            {
              "field": "admin",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "statusSchedule",
              "target": "StatusSchedule",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/StatusSchedule",
              "targetDomain": "people"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "solicitor",
              "target": "Solicitor",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            },
            {
              "field": "caseParties",
              "target": "CaseParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseParty",
              "targetDomain": "cases"
            },
            {
              "field": "sentInvites",
              "target": "CaseInvitation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "sentInvites",
              "onDelete": null,
              "targetKey": "app/CaseInvitation",
              "targetDomain": "cases"
            },
            {
              "field": "receivedInvites",
              "target": "CaseInvitation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "receivedInvites",
              "onDelete": null,
              "targetKey": "app/CaseInvitation",
              "targetDomain": "cases"
            },
            {
              "field": "channelMembers",
              "target": "ChannelMember",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ChannelMember",
              "targetDomain": "chat"
            },
            {
              "field": "messages",
              "target": "Message",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Message",
              "targetDomain": "chat"
            },
            {
              "field": "hostMeetings",
              "target": "Meeting",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Meeting",
              "targetDomain": "consultations"
            },
            {
              "field": "attendeeMeetings",
              "target": "Meeting",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Meeting",
              "targetDomain": "consultations"
            },
            {
              "field": "solicitorReviews",
              "target": "SolicitorReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/SolicitorReview",
              "targetDomain": "people"
            },
            {
              "field": "uploadedCaseFiles",
              "target": "CaseFile",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            },
            {
              "field": "snoozeNotifications",
              "target": "SnoozeNotifications",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/SnoozeNotifications",
              "targetDomain": "people"
            },
            {
              "field": "clientAgreementSignatures",
              "target": "ClientAgreementSignature",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreementSignature",
              "targetDomain": "compliance"
            },
            {
              "field": "referralsMade",
              "target": "ClientReferral",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientReferral",
              "targetDomain": "people"
            },
            {
              "field": "customerServiceContacts",
              "target": "CustomerServiceContact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CustomerServiceContact",
              "targetDomain": "cases"
            },
            {
              "field": "calls",
              "target": "Call",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Call",
              "targetDomain": "voice"
            },
            {
              "field": "addressChecksRun",
              "target": "AddressCheck",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "AddressCheckRunner",
              "onDelete": null,
              "targetKey": "app/AddressCheck",
              "targetDomain": "compliance"
            },
            {
              "field": "addressChecksReviewed",
              "target": "AddressCheck",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "AddressCheckReviewer",
              "onDelete": null,
              "targetKey": "app/AddressCheck",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "AddressCheck",
              "field": "runner",
              "fk": true,
              "list": false,
              "sourceKey": "app/AddressCheck",
              "sourceDomain": "compliance"
            },
            {
              "model": "AddressCheck",
              "field": "reviewer",
              "fk": true,
              "list": false,
              "sourceKey": "app/AddressCheck",
              "sourceDomain": "compliance"
            },
            {
              "model": "Admin",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Call",
              "field": "initiatedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/Call",
              "sourceDomain": "voice"
            },
            {
              "model": "CaseFile",
              "field": "uploadingPerson",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "CaseInvitation",
              "field": "inviter",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseInvitation",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseInvitation",
              "field": "invitee",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseInvitation",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseParty",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseParty",
              "sourceDomain": "cases"
            },
            {
              "model": "ChannelMember",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/ChannelMember",
              "sourceDomain": "chat"
            },
            {
              "model": "ClientAgreementSignature",
              "field": "signingPerson",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreementSignature",
              "sourceDomain": "compliance"
            },
            {
              "model": "ClientReferral",
              "field": "referrer",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientReferral",
              "sourceDomain": "people"
            },
            {
              "model": "Customer",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "CustomerServiceContact",
              "field": "contactedPerson",
              "fk": true,
              "list": false,
              "sourceKey": "app/CustomerServiceContact",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Meeting",
              "field": "hostPerson",
              "fk": true,
              "list": false,
              "sourceKey": "app/Meeting",
              "sourceDomain": "consultations"
            },
            {
              "model": "Meeting",
              "field": "attendeePerson",
              "fk": true,
              "list": false,
              "sourceKey": "app/Meeting",
              "sourceDomain": "consultations"
            },
            {
              "model": "Message",
              "field": "author",
              "fk": true,
              "list": false,
              "sourceKey": "app/Message",
              "sourceDomain": "chat"
            },
            {
              "model": "SnoozeNotifications",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/SnoozeNotifications",
              "sourceDomain": "people"
            },
            {
              "model": "Solicitor",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            },
            {
              "model": "SolicitorReview",
              "field": "reviewingPerson",
              "fk": true,
              "list": false,
              "sourceKey": "app/SolicitorReview",
              "sourceDomain": "people"
            },
            {
              "model": "StatusSchedule",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/StatusSchedule",
              "sourceDomain": "people"
            },
            {
              "model": "User",
              "field": "person",
              "fk": true,
              "list": false,
              "sourceKey": "app/User",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseParty",
              "field": "caseParties"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseInvitation",
              "field": "sentInvites"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseInvitation",
              "field": "receivedInvites"
            },
            {
              "dir": "out",
              "domain": "chat",
              "model": "ChannelMember",
              "field": "channelMembers"
            },
            {
              "dir": "out",
              "domain": "chat",
              "model": "Message",
              "field": "messages"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "Meeting",
              "field": "hostMeetings"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "Meeting",
              "field": "attendeeMeetings"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFile",
              "field": "uploadedCaseFiles"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "ClientAgreementSignature",
              "field": "clientAgreementSignatures"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CustomerServiceContact",
              "field": "customerServiceContacts"
            },
            {
              "dir": "out",
              "domain": "voice",
              "model": "Call",
              "field": "calls"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "addressChecksRun"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "addressChecksReviewed"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "runner"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "reviewer"
            },
            {
              "dir": "in",
              "domain": "voice",
              "model": "Call",
              "field": "initiatedBy"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFile",
              "field": "uploadingPerson"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseInvitation",
              "field": "inviter"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseInvitation",
              "field": "invitee"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseParty",
              "field": "person"
            },
            {
              "dir": "in",
              "domain": "chat",
              "model": "ChannelMember",
              "field": "person"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "ClientAgreementSignature",
              "field": "signingPerson"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CustomerServiceContact",
              "field": "contactedPerson"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "person"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "Meeting",
              "field": "hostPerson"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "Meeting",
              "field": "attendeePerson"
            },
            {
              "dir": "in",
              "domain": "chat",
              "model": "Message",
              "field": "author"
            }
          ],
          "usage": {
            "total": 43,
            "reads": 34,
            "writes": 9,
            "ops": {
              "findUniqueOrThrow": 13,
              "findFirst": 5,
              "findMany": 7,
              "findFirstOrThrow": 2,
              "findUnique": 7,
              "update": 5,
              "upsert": 2,
              "create": 2
            },
            "byArea": [
              {
                "area": "api/persons",
                "reads": 4,
                "writes": 3,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 6,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/users",
                "reads": 3,
                "writes": 3,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 5,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_integrations",
                "reads": 5,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/firms",
                "reads": 2,
                "writes": 1,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 3,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/calls",
                "reads": 2,
                "writes": 0,
                "domain": "voice",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/customers",
                "reads": 0,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/kyc",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/customers/_referrals/procedures/createReferralHandler.ts",
                "line": 35,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/firms/firmEmployees/procedures/inviteSolicitor.ts",
                "line": 25,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/persons/mutations/setUploadedPhoto.ts",
                "line": 14,
                "op": "update"
              }
            ],
            "nested": 314,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 69
              },
              {
                "area": "admin",
                "n": 56
              },
              {
                "area": "api/solicitors",
                "n": 19
              },
              {
                "area": "api/_integrations",
                "n": 18
              },
              {
                "area": "api/agreements",
                "n": 17
              },
              {
                "area": "api/instructions",
                "n": 16
              },
              {
                "area": "api/firms",
                "n": 12
              },
              {
                "area": "api/users",
                "n": 8
              }
            ],
            "typeMentions": 67,
            "typeMentionsByArea": [
              {
                "area": "api/users",
                "n": 9
              },
              {
                "area": "api/_integrations",
                "n": 8
              },
              {
                "area": "admin",
                "n": 6
              },
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "api/payments",
                "n": 5
              },
              {
                "area": "ui/cases",
                "n": 4
              },
              {
                "area": "api/firms",
                "n": 4
              },
              {
                "area": "api/search",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One human known to Lawhive, keyed on a unique email address. It holds the contact details and photo everything else renders, and it is the join point every other domain points at.",
          "keyFields": [
            {
              "name": "emailAddress",
              "meaning": "unique, lowercased on write; the natural key used to dedupe people"
            },
            {
              "name": "status",
              "meaning": "INVITED if someone else created them, REGISTERED once a Clerk user attaches"
            },
            {
              "name": "phoneNumber",
              "meaning": "primary number, synced from the Clerk user's primary phone"
            },
            {
              "name": "hasUploadedProfilePhoto",
              "meaning": "drives the photo step of lawyer onboarding"
            },
            {
              "name": "hasConfirmedDetails",
              "meaning": "the person has checked their own name and contact details"
            }
          ],
          "references": [
            {
              "field": "firmEmployee",
              "target": "firms",
              "meaning": "their seats at law firms, one per firm membership"
            },
            {
              "field": "caseParties",
              "target": "cases",
              "meaning": "every case they are a party on, in any role"
            },
            {
              "field": "channelMembers",
              "target": "chat",
              "meaning": "the chat channels they belong to"
            },
            {
              "field": "clientAgreementSignatures",
              "target": "compliance",
              "meaning": "agreements this person has signed"
            }
          ],
          "lifecycle": "INVITED → REGISTERED",
          "grouped": [
            "StatusSchedule",
            "SnoozeNotifications"
          ],
          "flags": []
        },
        {
          "key": "app/User",
          "name": "User",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 72,
          "idPrefix": "usr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clerkUserId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "userOnboarding",
              "type": "UserOnboarding",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "UserOnboarding",
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firms",
              "type": "Firm",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "deleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deletedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "clerkUserId"
          ],
          "relationsOut": [
            {
              "field": "userOnboarding",
              "target": "UserOnboarding",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/UserOnboarding",
              "targetDomain": "people"
            },
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "firms",
              "target": "Firm",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "Firm",
              "field": "owner",
              "fk": true,
              "list": false,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "Person",
              "field": "user",
              "fk": false,
              "list": false,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "UserOnboarding",
              "field": "user",
              "fk": true,
              "list": false,
              "sourceKey": "app/UserOnboarding",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firms"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "owner"
            }
          ],
          "usage": {
            "total": 26,
            "reads": 23,
            "writes": 3,
            "ops": {
              "findUniqueOrThrow": 12,
              "upsert": 1,
              "findUnique": 7,
              "findFirstOrThrow": 2,
              "findFirst": 1,
              "findMany": 1,
              "update": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/users",
                "reads": 5,
                "writes": 2,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 3,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/persons",
                "reads": 4,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/ai",
                "reads": 2,
                "writes": 0,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/officeAddin",
                "reads": 1,
                "writes": 0,
                "domain": "email",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/test-data",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/clerk/utils.ts",
                "line": 111,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/users/service/deleteUser.ts",
                "line": 8,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/users/service/upsertDbUser.ts",
                "line": 21,
                "op": "create"
              }
            ],
            "nested": 27,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "pkg/db",
                "n": 4
              },
              {
                "area": "api/_integrations",
                "n": 3
              },
              {
                "area": "api/officeAddin",
                "n": 3
              },
              {
                "area": "api/persons",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 2
              },
              {
                "area": "api/solicitors",
                "n": 2
              }
            ],
            "typeMentions": 82,
            "typeMentionsByArea": [
              {
                "area": "api/users",
                "n": 16
              },
              {
                "area": "admin",
                "n": 12
              },
              {
                "area": "ui/messaging",
                "n": 10
              },
              {
                "area": "api/_integrations",
                "n": 6
              },
              {
                "area": "api/_root",
                "n": 6
              },
              {
                "area": "api/firms",
                "n": 5
              },
              {
                "area": "ui/_app",
                "n": 4
              },
              {
                "area": "ui/cases",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The sign-in hat: a Person who has a Clerk account on the platform Clerk instance. One User per Person at most, and its clerkUserId is what tRPC resolves a request to.",
          "keyFields": [
            {
              "name": "clerkUserId",
              "meaning": "the platform Clerk user id, unique; the only link between auth and our data"
            },
            {
              "name": "personId",
              "meaning": "unique, so a Person can hold at most one User"
            },
            {
              "name": "deleted",
              "meaning": "soft delete set by the clerk user.deleted webhook; rows are never removed"
            },
            {
              "name": "deletedAt",
              "meaning": "when the Clerk deletion webhook arrived"
            }
          ],
          "references": [
            {
              "field": "person",
              "target": "people",
              "meaning": "the human behind the login"
            },
            {
              "field": "firms",
              "target": "firms",
              "meaning": "firms this user owns"
            }
          ],
          "lifecycle": null,
          "grouped": [
            "UserOnboarding"
          ],
          "flags": [
            "clerk-backed",
            "soft-delete"
          ]
        },
        {
          "key": "app/Admin",
          "name": "Admin",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 87,
          "idPrefix": "adm_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 27,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clerkUserId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "slackUserId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quotes",
              "type": "Quote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteNotes",
              "type": "QuoteNote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteNote",
              "onDelete": null
            },
            {
              "name": "caseRefunds",
              "type": "CasePaymentRefund",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CasePaymentRefund",
              "onDelete": null
            },
            {
              "name": "cancelledPaymentAuthorisations",
              "type": "PaymentAuthorisationCancellation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentAuthorisationCancellation",
              "onDelete": null
            },
            {
              "name": "comments",
              "type": "Comment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Comment",
              "onDelete": null
            },
            {
              "name": "bills",
              "type": "Bill",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billReviews",
              "type": "BillReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillReview",
              "onDelete": null
            },
            {
              "name": "officeAccountTransfers",
              "type": "OfficeAccountTransfer",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OfficeAccountTransfer",
              "onDelete": null
            },
            {
              "name": "officeAccountTransferReconciliations",
              "type": "OfficeAccountTransferReconciliation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OfficeAccountTransferReconciliation",
              "onDelete": null
            },
            {
              "name": "bankTransfer",
              "type": "BankTransfer",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransfer",
              "onDelete": null
            },
            {
              "name": "assignedAssessmentRequests",
              "type": "AssessmentRequestAssignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AssessmentRequestAssignment",
              "onDelete": null
            },
            {
              "name": "assignedInstructions",
              "type": "InstructionAssignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "InstructionAssignment",
              "onDelete": null
            },
            {
              "name": "customerServiceContacts",
              "type": "CustomerServiceContact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CustomerServiceContact",
              "onDelete": null
            },
            {
              "name": "celebratoryMessages",
              "type": "CelebratoryMessage",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CelebratoryMessage",
              "onDelete": null
            },
            {
              "name": "solicitorsManaged",
              "type": "Solicitor",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "outboundMailDeliveryMethods",
              "type": "OutboundMailDeliveryMethod",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailDeliveryMethod",
              "onDelete": null
            },
            {
              "name": "processedOutboundMailRequests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "outboundMailBatches",
              "type": "OutboundMailBatch",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailBatch",
              "onDelete": null
            },
            {
              "name": "globalMailContacts",
              "type": "GlobalMailContact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "GlobalMailContact",
              "onDelete": null
            },
            {
              "name": "bulkDisbursementPostings",
              "type": "BulkDisbursementPosting",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BulkDisbursementPosting",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "clerkUserId",
            "slackUserId"
          ],
          "relationsOut": [
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "quotes",
              "target": "Quote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "quoteNotes",
              "target": "QuoteNote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteNote",
              "targetDomain": "quotes"
            },
            {
              "field": "caseRefunds",
              "target": "CasePaymentRefund",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePaymentRefund",
              "targetDomain": "money"
            },
            {
              "field": "cancelledPaymentAuthorisations",
              "target": "PaymentAuthorisationCancellation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisationCancellation",
              "targetDomain": "money"
            },
            {
              "field": "comments",
              "target": "Comment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Comment",
              "targetDomain": "cases"
            },
            {
              "field": "bills",
              "target": "Bill",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "createdBy",
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "billReviews",
              "target": "BillReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillReview",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountTransfers",
              "target": "OfficeAccountTransfer",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransfer",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountTransferReconciliations",
              "target": "OfficeAccountTransferReconciliation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransferReconciliation",
              "targetDomain": "money"
            },
            {
              "field": "bankTransfer",
              "target": "BankTransfer",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransfer",
              "targetDomain": "money"
            },
            {
              "field": "assignedAssessmentRequests",
              "target": "AssessmentRequestAssignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequestAssignment",
              "targetDomain": "consultations"
            },
            {
              "field": "assignedInstructions",
              "target": "InstructionAssignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/InstructionAssignment",
              "targetDomain": "instructions"
            },
            {
              "field": "customerServiceContacts",
              "target": "CustomerServiceContact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CustomerServiceContact",
              "targetDomain": "cases"
            },
            {
              "field": "celebratoryMessages",
              "target": "CelebratoryMessage",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CelebratoryMessage",
              "targetDomain": "plumbing"
            },
            {
              "field": "solicitorsManaged",
              "target": "Solicitor",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            },
            {
              "field": "outboundMailDeliveryMethods",
              "target": "OutboundMailDeliveryMethod",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailDeliveryMethod",
              "targetDomain": "post"
            },
            {
              "field": "processedOutboundMailRequests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            },
            {
              "field": "outboundMailBatches",
              "target": "OutboundMailBatch",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailBatch",
              "targetDomain": "post"
            },
            {
              "field": "globalMailContacts",
              "target": "GlobalMailContact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/GlobalMailContact",
              "targetDomain": "post"
            },
            {
              "field": "bulkDisbursementPostings",
              "target": "BulkDisbursementPosting",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BulkDisbursementPosting",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "AssessmentRequestAssignment",
              "field": "assignedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/AssessmentRequestAssignment",
              "sourceDomain": "consultations"
            },
            {
              "model": "BankTransfer",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "Bill",
              "field": "admin",
              "fk": true,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "BillReview",
              "field": "reviewedByAdmin",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillReview",
              "sourceDomain": "money"
            },
            {
              "model": "BulkDisbursementPosting",
              "field": "admin",
              "fk": true,
              "list": false,
              "sourceKey": "app/BulkDisbursementPosting",
              "sourceDomain": "money"
            },
            {
              "model": "CasePaymentRefund",
              "field": "admin",
              "fk": true,
              "list": false,
              "sourceKey": "app/CasePaymentRefund",
              "sourceDomain": "money"
            },
            {
              "model": "CelebratoryMessage",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CelebratoryMessage",
              "sourceDomain": "plumbing"
            },
            {
              "model": "Comment",
              "field": "author",
              "fk": true,
              "list": false,
              "sourceKey": "app/Comment",
              "sourceDomain": "cases"
            },
            {
              "model": "CustomerServiceContact",
              "field": "handlingLawhiveAdmin",
              "fk": true,
              "list": false,
              "sourceKey": "app/CustomerServiceContact",
              "sourceDomain": "cases"
            },
            {
              "model": "GlobalMailContact",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/GlobalMailContact",
              "sourceDomain": "post"
            },
            {
              "model": "InstructionAssignment",
              "field": "manuallyAssignedByAdmin",
              "fk": true,
              "list": false,
              "sourceKey": "app/InstructionAssignment",
              "sourceDomain": "instructions"
            },
            {
              "model": "OfficeAccountTransfer",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/OfficeAccountTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "OfficeAccountTransferReconciliation",
              "field": "reconciledBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/OfficeAccountTransferReconciliation",
              "sourceDomain": "money"
            },
            {
              "model": "OutboundMailBatch",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailBatch",
              "sourceDomain": "post"
            },
            {
              "model": "OutboundMailDeliveryMethod",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailDeliveryMethod",
              "sourceDomain": "post"
            },
            {
              "model": "OutboundMailRequest",
              "field": "processedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            },
            {
              "model": "PaymentAuthorisationCancellation",
              "field": "admin",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentAuthorisationCancellation",
              "sourceDomain": "money"
            },
            {
              "model": "Person",
              "field": "admin",
              "fk": false,
              "list": false,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Quote",
              "field": "lawhiveCreator",
              "fk": true,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteNote",
              "field": "lawhiveCreator",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteNote",
              "sourceDomain": "quotes"
            },
            {
              "model": "Solicitor",
              "field": "accountManager",
              "fk": true,
              "list": false,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quotes"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteNote",
              "field": "quoteNotes"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CasePaymentRefund",
              "field": "caseRefunds"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentAuthorisationCancellation",
              "field": "cancelledPaymentAuthorisations"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Comment",
              "field": "comments"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "Bill",
              "field": "bills"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BillReview",
              "field": "billReviews"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "OfficeAccountTransfer",
              "field": "officeAccountTransfers"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "OfficeAccountTransferReconciliation",
              "field": "officeAccountTransferReconciliations"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BankTransfer",
              "field": "bankTransfer"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "AssessmentRequestAssignment",
              "field": "assignedAssessmentRequests"
            },
            {
              "dir": "out",
              "domain": "instructions",
              "model": "InstructionAssignment",
              "field": "assignedInstructions"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CustomerServiceContact",
              "field": "customerServiceContacts"
            },
            {
              "dir": "out",
              "domain": "plumbing",
              "model": "CelebratoryMessage",
              "field": "celebratoryMessages"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailDeliveryMethod",
              "field": "outboundMailDeliveryMethods"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "processedOutboundMailRequests"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailBatch",
              "field": "outboundMailBatches"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "GlobalMailContact",
              "field": "globalMailContacts"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BulkDisbursementPosting",
              "field": "bulkDisbursementPostings"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "AssessmentRequestAssignment",
              "field": "assignedBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BankTransfer",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "Bill",
              "field": "admin"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillReview",
              "field": "reviewedByAdmin"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BulkDisbursementPosting",
              "field": "admin"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CasePaymentRefund",
              "field": "admin"
            },
            {
              "dir": "in",
              "domain": "plumbing",
              "model": "CelebratoryMessage",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Comment",
              "field": "author"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CustomerServiceContact",
              "field": "handlingLawhiveAdmin"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "GlobalMailContact",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "InstructionAssignment",
              "field": "manuallyAssignedByAdmin"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "OfficeAccountTransfer",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "OfficeAccountTransferReconciliation",
              "field": "reconciledBy"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailBatch",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailDeliveryMethod",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "processedBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentAuthorisationCancellation",
              "field": "admin"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "lawhiveCreator"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteNote",
              "field": "lawhiveCreator"
            }
          ],
          "usage": {
            "total": 20,
            "reads": 17,
            "writes": 3,
            "ops": {
              "findUniqueOrThrow": 6,
              "findMany": 3,
              "findUnique": 4,
              "update": 1,
              "findFirstOrThrow": 3,
              "findFirst": 1,
              "upsert": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 7,
                "writes": 1,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_integrations",
                "reads": 2,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/assessments",
                "reads": 2,
                "writes": 0,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "api/users",
                "reads": 1,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "package"
              },
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 1,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "apps/admin/src/app/(with-sidebar)/settings/slack-linking/page.tsx",
                "line": 50,
                "op": "update"
              },
              {
                "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
                "line": 135,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/users/service/createAdmin.ts",
                "line": 35,
                "op": "create"
              }
            ],
            "nested": 40,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 14
              },
              {
                "area": "api/instructions",
                "n": 6
              },
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "api/_integrations",
                "n": 4
              },
              {
                "area": "api/outbound-mail",
                "n": 3
              },
              {
                "area": "api/quotes",
                "n": 2
              },
              {
                "area": "api/solicitors",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ],
            "typeMentions": 23,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 6
              },
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "ui/cases",
                "n": 3
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "api/instructions",
                "n": 2
              },
              {
                "area": "ui/alerts",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/assessments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The staff hat: someone who works at Lawhive and acts through the admin app. It is the actor id stamped on staff actions across money, post, quotes and instructions.",
          "keyFields": [
            {
              "name": "clerkUserId",
              "meaning": "unique id from the separate admin Clerk instance, not the platform one"
            },
            {
              "name": "personId",
              "meaning": "unique; the admin shares its Person with any other hat they hold"
            },
            {
              "name": "slackUserId",
              "meaning": "set from the admin app's slack-linking page so Slack alerts can @ them"
            }
          ],
          "references": [
            {
              "field": "person",
              "target": "people",
              "meaning": "the human behind the staff account"
            },
            {
              "field": "solicitorsManaged",
              "target": "people",
              "meaning": "the lawyers whose account manager they are"
            },
            {
              "field": "assignedInstructions",
              "target": "instructions",
              "meaning": "instructions they assigned to a lawyer by hand"
            },
            {
              "field": "bills",
              "target": "money",
              "meaning": "bills they raised"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/Customer",
          "name": "Customer",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 480,
          "idPrefix": "cus_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 21,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployeeClient",
              "type": "FirmEmployeeClient",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeClient",
              "onDelete": null
            },
            {
              "name": "quotes",
              "type": "Quote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "paymentAuthorisations",
              "type": "PaymentAuthorisation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentAuthorisation",
              "onDelete": null
            },
            {
              "name": "casePayments",
              "type": "CasePayment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CasePayment",
              "onDelete": null
            },
            {
              "name": "customerLedger",
              "type": "CustomerLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CustomerLedger",
              "onDelete": null
            },
            {
              "name": "customerLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeCustomerId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "kycWorkflowRuns",
              "type": "KycWorkflowRun",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "KycWorkflowRun",
              "onDelete": null
            },
            {
              "name": "kycStatus",
              "type": "KycWorkflowRunStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "onfidoApplicantId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientAgreementSignatureRequests",
              "type": "ClientAgreementSignatureRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreementSignatureRequest",
              "onDelete": null
            },
            {
              "name": "assessmentRequests",
              "type": "AssessmentRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AssessmentRequest",
              "onDelete": null
            },
            {
              "name": "assessments",
              "type": "Assessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Assessment",
              "onDelete": null
            },
            {
              "name": "leadCustomerCases",
              "type": "Case",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "referrals",
              "type": "ClientReferral",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientReferral",
              "onDelete": null
            },
            {
              "name": "source",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripeCustomerId",
            "onfidoApplicantId"
          ],
          "relationsOut": [
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "firmEmployeeClient",
              "target": "FirmEmployeeClient",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeClient",
              "targetDomain": "firms"
            },
            {
              "field": "quotes",
              "target": "Quote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "paymentAuthorisations",
              "target": "PaymentAuthorisation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisation",
              "targetDomain": "money"
            },
            {
              "field": "casePayments",
              "target": "CasePayment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePayment",
              "targetDomain": "money"
            },
            {
              "field": "customerLedger",
              "target": "CustomerLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CustomerLedger",
              "targetDomain": "money"
            },
            {
              "field": "kycWorkflowRuns",
              "target": "KycWorkflowRun",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/KycWorkflowRun",
              "targetDomain": "compliance"
            },
            {
              "field": "clientAgreementSignatureRequests",
              "target": "ClientAgreementSignatureRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreementSignatureRequest",
              "targetDomain": "compliance"
            },
            {
              "field": "assessmentRequests",
              "target": "AssessmentRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequest",
              "targetDomain": "consultations"
            },
            {
              "field": "assessments",
              "target": "Assessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Assessment",
              "targetDomain": "consultations"
            },
            {
              "field": "leadCustomerCases",
              "target": "Case",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "referrals",
              "target": "ClientReferral",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientReferral",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Assessment",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/Assessment",
              "sourceDomain": "consultations"
            },
            {
              "model": "AssessmentRequest",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/AssessmentRequest",
              "sourceDomain": "consultations"
            },
            {
              "model": "Case",
              "field": "leadCustomer",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CasePayment",
              "field": "paidBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CasePayment",
              "sourceDomain": "money"
            },
            {
              "model": "ClientAgreementSignatureRequest",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreementSignatureRequest",
              "sourceDomain": "compliance"
            },
            {
              "model": "ClientReferral",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientReferral",
              "sourceDomain": "people"
            },
            {
              "model": "CustomerLedger",
              "field": "customer",
              "fk": false,
              "list": false,
              "sourceKey": "app/CustomerLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeClient",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeClient",
              "sourceDomain": "firms"
            },
            {
              "model": "KycWorkflowRun",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/KycWorkflowRun",
              "sourceDomain": "compliance"
            },
            {
              "model": "PaymentAuthorisation",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentAuthorisation",
              "sourceDomain": "money"
            },
            {
              "model": "Person",
              "field": "customer",
              "fk": false,
              "list": false,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Quote",
              "field": "customer",
              "fk": true,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployeeClient",
              "field": "firmEmployeeClient"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quotes"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentAuthorisation",
              "field": "paymentAuthorisations"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CasePayment",
              "field": "casePayments"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CustomerLedger",
              "field": "customerLedger"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "KycWorkflowRun",
              "field": "kycWorkflowRuns"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "ClientAgreementSignatureRequest",
              "field": "clientAgreementSignatureRequests"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "AssessmentRequest",
              "field": "assessmentRequests"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "Assessment",
              "field": "assessments"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "leadCustomerCases"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "Assessment",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "AssessmentRequest",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "leadCustomer"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CasePayment",
              "field": "paidBy"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "ClientAgreementSignatureRequest",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CustomerLedger",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployeeClient",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "KycWorkflowRun",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentAuthorisation",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "customer"
            }
          ],
          "usage": {
            "total": 21,
            "reads": 14,
            "writes": 7,
            "ops": {
              "findUniqueOrThrow": 9,
              "findFirstOrThrow": 2,
              "findUnique": 3,
              "upsert": 1,
              "update": 5,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/customers",
                "reads": 4,
                "writes": 3,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/kyc",
                "reads": 3,
                "writes": 3,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 3,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/customers/service/createCustomer.ts",
                "line": 21,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/customers/service/createCustomer.ts",
                "line": 49,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/customers/service/setCustomerSource.ts",
                "line": 32,
                "op": "updateMany"
              }
            ],
            "nested": 11,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 6
              },
              {
                "area": "api/payments",
                "n": 4
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 52,
            "typeMentionsByArea": [
              {
                "area": "pkg/db",
                "n": 14
              },
              {
                "area": "api/customers",
                "n": 9
              },
              {
                "area": "admin",
                "n": 8
              },
              {
                "area": "api/payments",
                "n": 6
              },
              {
                "area": "ui/user",
                "n": 2
              },
              {
                "area": "api/agreements",
                "n": 2
              },
              {
                "area": "api/kyc",
                "n": 2
              },
              {
                "area": "api/search",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The billable hat: the Person as a buyer of legal services. It owns the Stripe customer, the KYC state and a CustomerLedger, and it is what quotes, payments and cases hang the paying client off.",
          "keyFields": [
            {
              "name": "kycStatus",
              "meaning": "not_started through approved, review or declined; mirrors the latest KycWorkflowRun"
            },
            {
              "name": "stripeCustomerId",
              "meaning": "the Stripe customer created and kept in sync by customers/service/createCustomer"
            },
            {
              "name": "onfidoApplicantId",
              "meaning": "unique Onfido applicant used for identity checks"
            },
            {
              "name": "customerLedgerId",
              "meaning": "unique; the double-entry ledger opened with the Customer"
            },
            {
              "name": "source",
              "meaning": "free-form JSON attribution for where the customer came from"
            }
          ],
          "references": [
            {
              "field": "person",
              "target": "people",
              "meaning": "the human doing the buying"
            },
            {
              "field": "customerLedger",
              "target": "money",
              "meaning": "their ledger, created in the same transaction"
            },
            {
              "field": "leadCustomerCases",
              "target": "cases",
              "meaning": "cases where they are the paying client"
            },
            {
              "field": "quotes",
              "target": "quotes",
              "meaning": "quotes addressed to them"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "stripe-backed"
          ]
        },
        {
          "key": "app/Solicitor",
          "name": "Solicitor",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 406,
          "idPrefix": "sol_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 23,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "professionalBody",
              "type": "SolicitorProfessionalBody",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "professionalRegistrationId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "isLawhiveBrandRisk",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignmentStatus",
              "type": "LawyerAssignmentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignmentStatusNotes",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "canCreateCases",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isExclusive",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "exclusivityLastCheckedDate",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "engagementBasis",
              "type": "SolicitorEngagementBasis",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "accountManagerId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "accountManager",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "instructionAssignments",
              "type": "InstructionAssignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "InstructionAssignment",
              "onDelete": null
            },
            {
              "name": "assessmentRequestAssignments",
              "type": "AssessmentRequestAssignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AssessmentRequestAssignment",
              "onDelete": null
            },
            {
              "name": "reviews",
              "type": "SolicitorReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "SolicitorReview",
              "onDelete": null
            },
            {
              "name": "rating",
              "type": "Float",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "don't update this field directly, we will just recalculate and update when we add a review",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ratingUnderperformingLastAlertSent",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "scores",
              "type": "SolicitorScores",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "SolicitorScores",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "professionalRegistrationId"
          ],
          "relationsOut": [
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "accountManager",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "accountManagerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "instructionAssignments",
              "target": "InstructionAssignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/InstructionAssignment",
              "targetDomain": "instructions"
            },
            {
              "field": "assessmentRequestAssignments",
              "target": "AssessmentRequestAssignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequestAssignment",
              "targetDomain": "consultations"
            },
            {
              "field": "reviews",
              "target": "SolicitorReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/SolicitorReview",
              "targetDomain": "people"
            },
            {
              "field": "scores",
              "target": "SolicitorScores",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/SolicitorScores",
              "targetDomain": "instructions"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "solicitorsManaged",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "AssessmentRequestAssignment",
              "field": "solicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/AssessmentRequestAssignment",
              "sourceDomain": "consultations"
            },
            {
              "model": "FirmEmployee",
              "field": "solicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "InstructionAssignment",
              "field": "solicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/InstructionAssignment",
              "sourceDomain": "instructions"
            },
            {
              "model": "Person",
              "field": "solicitor",
              "fk": false,
              "list": false,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "SolicitorReview",
              "field": "solicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/SolicitorReview",
              "sourceDomain": "people"
            },
            {
              "model": "SolicitorScores",
              "field": "solicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/SolicitorScores",
              "sourceDomain": "instructions"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "instructions",
              "model": "InstructionAssignment",
              "field": "instructionAssignments"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "AssessmentRequestAssignment",
              "field": "assessmentRequestAssignments"
            },
            {
              "dir": "out",
              "domain": "instructions",
              "model": "SolicitorScores",
              "field": "scores"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "AssessmentRequestAssignment",
              "field": "solicitor"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "solicitor"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "InstructionAssignment",
              "field": "solicitor"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "SolicitorScores",
              "field": "solicitor"
            }
          ],
          "usage": {
            "total": 36,
            "reads": 25,
            "writes": 11,
            "ops": {
              "findUniqueOrThrow": 11,
              "findMany": 8,
              "findFirstOrThrow": 1,
              "create": 2,
              "findFirst": 4,
              "update": 9,
              "findUnique": 1
            },
            "byArea": [
              {
                "area": "api/solicitors",
                "reads": 10,
                "writes": 10,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 6,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 1,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/incentives",
                "reads": 2,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/firms/procedures/createFirmAsAdminProcedure.ts",
                "line": 37,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/solicitors/events.ts",
                "line": 19,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/solicitors/events.ts",
                "line": 39,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 69,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 27
              },
              {
                "area": "api/instructions",
                "n": 6
              },
              {
                "area": "api/_utils",
                "n": 6
              },
              {
                "area": "ui/cases",
                "n": 5
              },
              {
                "area": "api/outbound-mail",
                "n": 4
              },
              {
                "area": "api/solicitors",
                "n": 4
              },
              {
                "area": "pkg/db",
                "n": 4
              },
              {
                "area": "api/firms",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The practising-lawyer hat: a Person qualified to be given legal work, with their professional registration and their standing on the platform. Written almost entirely by api/solicitors.",
          "keyFields": [
            {
              "name": "professionalBody",
              "meaning": "sra, cilex, clc or other; which regulator they are registered with"
            },
            {
              "name": "professionalRegistrationId",
              "meaning": "their number with that body, checked during onboarding"
            },
            {
              "name": "assignmentStatus",
              "meaning": "Active, Onboarding, Paused, Suspended, WithinNotice, Offboarded and friends; gates new work"
            },
            {
              "name": "engagementBasis",
              "meaning": "platform_consultant, retained_consultant or in_house"
            },
            {
              "name": "isExclusive",
              "meaning": "works only through Lawhive; rechecked on exclusivityLastCheckedDate"
            },
            {
              "name": "rating",
              "meaning": "recalculated average of their counting SolicitorReviews, never set directly"
            },
            {
              "name": "canCreateCases",
              "meaning": "allowed to bring their own clients onto the platform"
            }
          ],
          "references": [
            {
              "field": "person",
              "target": "people",
              "meaning": "the human holding the practising certificate"
            },
            {
              "field": "accountManagerId",
              "target": "people",
              "meaning": "the Admin who looks after this lawyer"
            },
            {
              "field": "firmEmployee",
              "target": "firms",
              "meaning": "the firm seats they practise through"
            },
            {
              "field": "instructionAssignments",
              "target": "instructions",
              "meaning": "work offered to and taken by them"
            }
          ],
          "lifecycle": "Onboarding → Active → Paused / Suspended / WithinNotice → Offboarded",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/SolicitorReview",
          "name": "SolicitorReview",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 458,
          "idPrefix": "solrev_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "Solicitor",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "solicitorId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rating",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "review",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewingPerson",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "reviewingPersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewSource",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "shouldCountTowardsOverallRating",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isPubliclyVisible",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "superseded",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "solicitor",
              "target": "Solicitor",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "solicitorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            },
            {
              "field": "reviewingPerson",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "reviewingPersonId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Person",
              "field": "solicitorReviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Solicitor",
              "field": "reviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 13,
            "reads": 10,
            "writes": 3,
            "ops": {
              "findMany": 5,
              "aggregate": 2,
              "update": 1,
              "findFirst": 2,
              "updateMany": 1,
              "create": 1,
              "findUnique": 1
            },
            "byArea": [
              {
                "area": "api/solicitors",
                "reads": 6,
                "writes": 3,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 2,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/case-internal-reviews",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/solicitors/reviews/procedures/adminUpdateSolicitorReviewVisibility.ts",
                "line": 18,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/solicitors/reviews/service/createSolicitorReview.ts",
                "line": 85,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/solicitors/reviews/service/createSolicitorReview.ts",
                "line": 107,
                "op": "create"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/_integrations",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/solicitors",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One rating a client left for a lawyer, off the back of a case or an assessment. Creating one recalculates Solicitor.rating, posts to Slack and fires solicitors/review.created.",
          "keyFields": [
            {
              "name": "rating",
              "meaning": "stars the client gave; 4 or more also triggers a Trustpilot invitation"
            },
            {
              "name": "reviewSource",
              "meaning": "JSON tag saying whether the review came from a case or an assessment"
            },
            {
              "name": "superseded",
              "meaning": "true when the same client re-reviewed the same lawyer within 7 days"
            },
            {
              "name": "shouldCountTowardsOverallRating",
              "meaning": "cleared on superseded reviews so they drop out of the average"
            },
            {
              "name": "isPubliclyVisible",
              "meaning": "admins can hide a review from the public profile"
            }
          ],
          "references": [
            {
              "field": "solicitorId",
              "target": "people",
              "meaning": "the lawyer being rated"
            },
            {
              "field": "reviewingPersonId",
              "target": "people",
              "meaning": "the client who left it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/LegalPersonProfile",
          "name": "LegalPersonProfile",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 811,
          "idPrefix": "legprf_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "admissionYear",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "biography",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployee",
              "field": "profile",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "profile"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 8,
            "nestedByArea": [
              {
                "area": "api/firms",
                "n": 6
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The public-facing blurb for a firm employee: their admission year and biography. Created empty with every FirmEmployee and filled in later from the firm's profile editor.",
          "keyFields": [
            {
              "name": "admissionYear",
              "meaning": "year they were admitted, shown on the lawyer profile"
            },
            {
              "name": "biography",
              "meaning": "free text set through firms/service/setFirmEmployeeBio"
            }
          ],
          "references": [
            {
              "field": "firmEmployee",
              "target": "firms",
              "meaning": "the firm seat this profile describes; nothing here points at Person"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only",
            "belongs-in-firms"
          ]
        },
        {
          "key": "app/UserOnboarding",
          "name": "UserOnboarding",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 799,
          "idPrefix": "usronb_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "user",
              "type": "User",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "User",
              "onDelete": null
            },
            {
              "name": "userId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hasEmail",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "emailVerified",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hasPassword",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "user",
              "target": "User",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "userId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/User",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "User",
              "field": "userOnboarding",
              "fk": false,
              "list": false,
              "sourceKey": "app/User",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/_integrations",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "legacy",
          "meaning": "A snapshot of whether a new user had an email, a verified email and a password. Written once when the User is created and never read again.",
          "keyFields": [
            {
              "name": "hasEmail",
              "meaning": "hardcoded true by upsertUserForPerson"
            },
            {
              "name": "emailVerified",
              "meaning": "hardcoded true by upsertUserForPerson"
            },
            {
              "name": "hasPassword",
              "meaning": "hardcoded false; getUser reads the live value from Clerk instead"
            }
          ],
          "references": [
            {
              "field": "userId",
              "target": "people",
              "meaning": "unique, one onboarding row per User"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "write-only",
            "superseded-by-clerk"
          ]
        },
        {
          "key": "app/StatusSchedule",
          "name": "StatusSchedule",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 135,
          "idPrefix": "stsche_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "startDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "endDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "message",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sendMessageInResponse",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "blockNewAssignments",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "StatusScheduleStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "adminNote",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Person",
              "field": "statusSchedule",
              "fk": false,
              "list": false,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 3,
            "reads": 2,
            "writes": 1,
            "ops": {
              "findFirst": 2,
              "upsert": 1
            },
            "byArea": [
              {
                "area": "api/persons",
                "reads": 1,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/persons/statusSchedule/statusScheduleEvents.ts",
                "line": 22,
                "op": "upsert"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 4
              },
              {
                "area": "api/_integrations",
                "n": 1
              }
            ],
            "typeMentions": 10,
            "typeMentionsByArea": [
              {
                "area": "api/persons",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "ui/_app",
                "n": 2
              },
              {
                "area": "api/solicitors",
                "n": 2
              },
              {
                "area": "ui/feedOfWork",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A person's out of office window: dates, an optional auto-reply, and whether they should be kept out of new assignments while it runs. One row per Person, upserted.",
          "keyFields": [
            {
              "name": "blockNewAssignments",
              "meaning": "keeps the lawyer out of instruction matching for the window"
            },
            {
              "name": "sendMessageInResponse",
              "meaning": "auto-reply in chat while the schedule is active"
            },
            {
              "name": "message",
              "meaning": "the auto-reply text clients see"
            },
            {
              "name": "status",
              "meaning": "enabled or disabled, independent of the dates"
            }
          ],
          "references": [
            {
              "field": "personId",
              "target": "people",
              "meaning": "unique, so one schedule per person"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/SnoozeNotifications",
          "name": "SnoozeNotifications",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 157,
          "idPrefix": "snzn_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "endDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "SnoozeNotificationsStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "snoozeEmail",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "snoozeSMS",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "snoozeInApp",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Person",
              "field": "snoozeNotifications",
              "fk": false,
              "list": false,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 3,
            "reads": 2,
            "writes": 1,
            "ops": {
              "findUnique": 2,
              "upsert": 1
            },
            "byArea": [
              {
                "area": "api/persons",
                "reads": 2,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/persons/snoozeNotifications/snoozeNotificationsEvents.ts",
                "line": 25,
                "op": "upsert"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "api/persons",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A person's notification mute, per channel, until an end date. One row per Person, upserted by api/persons and read when deciding whether to send.",
          "keyFields": [
            {
              "name": "endDate",
              "meaning": "when the mute expires"
            },
            {
              "name": "status",
              "meaning": "enabled or disabled"
            },
            {
              "name": "snoozeEmail",
              "meaning": "mute email; defaults on"
            },
            {
              "name": "snoozeInApp",
              "meaning": "mute in-app; snoozeSMS covers texts"
            }
          ],
          "references": [
            {
              "field": "personId",
              "target": "people",
              "meaning": "unique, so one snooze record per person"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/ClientReferral",
          "name": "ClientReferral",
          "table": null,
          "datastore": "app",
          "domain": "people",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2903,
          "idPrefix": "cliref_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "referrer",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "referrerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "referralFeePercentage",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "instruction",
              "type": "Instruction",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Instruction",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "payments",
              "type": "ReferralPayment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ReferralPayment",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "referrer",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "referrerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "instruction",
              "target": "Instruction",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Instruction",
              "targetDomain": "instructions"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "payments",
              "target": "ReferralPayment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ReferralPayment",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "referral",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Customer",
              "field": "referrals",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "Instruction",
              "field": "referral",
              "fk": true,
              "list": false,
              "sourceKey": "app/Instruction",
              "sourceDomain": "instructions"
            },
            {
              "model": "Person",
              "field": "referralsMade",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "ReferralPayment",
              "field": "referral",
              "fk": true,
              "list": false,
              "sourceKey": "app/ReferralPayment",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "instructions",
              "model": "Instruction",
              "field": "instruction"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "ReferralPayment",
              "field": "payments"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "referral"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "Instruction",
              "field": "referral"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "ReferralPayment",
              "field": "referral"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "findFirst": 1,
              "findUniqueOrThrow": 2,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/customers",
                "reads": 1,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/customers/_referrals/events.ts",
                "line": 23,
                "op": "create"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 2
              },
              {
                "area": "api/customers",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One person sending a client to Lawhive on an agreed cut. Created by the customers/_referrals event, and it pays out through ReferralPayment rows raised against bills.",
          "keyFields": [
            {
              "name": "referralFeePercentage",
              "meaning": "the referrer's cut of the fees, fixed at creation"
            },
            {
              "name": "details",
              "meaning": "free text describing the referral"
            }
          ],
          "references": [
            {
              "field": "referrerId",
              "target": "people",
              "meaning": "the Person making the referral"
            },
            {
              "field": "customerId",
              "target": "people",
              "meaning": "the Customer who was referred"
            },
            {
              "field": "payments",
              "target": "money",
              "meaning": "referral payments raised against bills"
            },
            {
              "field": "case",
              "target": "cases",
              "meaning": "set when an admin backdates a referral onto a case"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        }
      ]
    },
    {
      "id": "firms",
      "order": 2,
      "groups": [],
      "name": "Firms: the supply side",
      "tagline": "Law firms, lawyer seats, teams, and the clients a firm brings with it",
      "whatItIs": "This is the supply side of the marketplace: the law firms Lawhive works with and the people inside them. A Firm is one regulated practice, mirrored from a Clerk organisation. A FirmEmployee is one person's seat at one firm, and it is the thing that owns cases, writes quotes, gets paid, and can be blocked from taking work. In here you can create a firm as an admin, invite a solicitor into it, record the legal entity they invoice under, set which products and areas they cover, cap how many live cases they can hold, build a team so colleagues can see and work each other's cases, and keep the firm's own client list separate from the leads Lawhive introduced.",
      "howItConnects": "People holds the human identity (Person, User, Solicitor) and Firms holds the employment: a FirmEmployee points at a Person and optionally at a Solicitor. Cases hang off FirmEmployee through ownerId, so almost every read of a case touches this domain to answer who owns it. Instructions checks this domain before it lets anyone accept work, using canFirmDoWork and canFirmEmployeeDoWork plus caseLimit and instructionCredits. Money reaches in the other direction: a firm carries an office account ledger and an external ledger, each seat carries a fees ledger and a disbursements ledger, and a bill receipt is issued in the name of a FirmEmployee's LegalEntity. Catalogue supplies the products and areas that the coverage join records against a seat. Compliance and Post both key firm-level records (client agreements, address checks, mail contacts) off Firm or FirmEmployee.",
      "lifecycle": null,
      "flows": [
        {
          "id": "clerk-provisioning",
          "title": "Clerk organisations become firms and seats",
          "mermaid": "flowchart TD\n  ClerkOrg[Clerk organisation] --> Firm\n  ClerkMembership[Clerk org membership] --> FirmEmployee\n  Firm --> FirmEmployee\n  Person --> FirmEmployee\n  Solicitor --> FirmEmployee\n  Firm --> FirmLedgers[Office account and external ledgers]\n  Firm --> StripeCustomer[Stripe customer and subscription]\n  FirmEmployee --> EmpLedgers[Fees and disbursement ledgers]\n  FirmEmployee --> Profile[LegalPersonProfile]",
          "caption": "Clerk is upstream. createFirmFromClerk reads the organisation and creates the Firm with both its ledgers, a Stripe customer and a clientMoneyAccount payment source. createOrUpdateFirmEmployeeFromClerkMembership does the same per membership, branching on whether the Person has a Solicitor: solicitors get roles ['solicitor'], everyone else gets an empty roles array."
        },
        {
          "id": "can-accept-work",
          "title": "What has to be true before a lawyer can accept work",
          "mermaid": "flowchart TD\n  Accept[Lawyer accepts instruction] --> FirmCheck{canFirmDoWork}\n  FirmCheck -->|fails| Blocked[Cannot accept]\n  FirmCheck -->|passes| EmpCheck{canFirmEmployeeDoWork}\n  EmpCheck -->|fails| Blocked\n  EmpCheck -->|passes| Limit{caseLimit reached}\n  Limit -->|yes| Blocked\n  Limit -->|no| Accepted[Assignment accepted]\n  Accepted --> Credit[instructionCredits decrement]",
          "caption": "canFirmDoWork wants an active clientMoneyAccount payment source, an SRA number, a Stripe customer, a Connect account that can transfer and pay out, a client money payout account, and a fee plan for every case source. canFirmEmployeeDoWork adds a LegalEntity (with a VAT number if it is VAT registered) and a live payout bank account. The caseLimit check only runs behind the feature-case-limits flag and only counts OPENING or ACTIVE cases with source lawhive or followOn."
        },
        {
          "id": "product-coverage",
          "title": "Product coverage and the view built on top of it",
          "mermaid": "flowchart LR\n  FirmEmployee --> Join[FirmEmployeeToProductAndArea]\n  Product --> Join\n  ProductArea --> Join\n  Join --> View[FirmEmployeesOfferingEveryProductInAreas]\n  View --> FeeGuide[feeGuide sync]\n  FeeGuide --> Join\n  Join --> Matching[Instruction matching]",
          "caption": "setFirmEmployeeProductsOffered rewrites a seat's coverage rows wholesale (deleteMany then createMany). The SQL view lists, per seat, the areas where that seat covers every active product in the area. The feeGuide sync reads the view before the catalogue changes and writes the missing join rows back afterwards, so a lawyer who offered a whole area keeps offering the whole area when a new product is added to it."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "FirmEmployee.isActive defaults to true and is read as a filter by listSolicitorsWhoCanBeAssignedWork, but no application code ever writes it. Deactivation in practice goes through deleted and deletedAt, which deleteFirmEmployee sets. Treat isActive as a field nobody maintains."
        },
        {
          "kind": "duplication",
          "body": "TeamMember uses the tm_ id prefix, and so do LegalForm and LegalFormCaseArtifact in the catalogue and documents domains. Three unrelated tables share one prefix, so a bare tm_ id tells you nothing about what it points at."
        },
        {
          "kind": "misfiled",
          "body": "Company sits in this domain because of FirmEmployeeClient, but three of the four mutations in api/modules/company are about attaching or detaching a Company from a CaseParty, and CaseParty belongs to cases. Company reads more like a shared party record than a firm-owned one."
        },
        {
          "kind": "companion",
          "body": "FirmEmployeesOfferingEveryProductInAreas is a Prisma view, not a table. It is defined in the 20250204135214 migration over FirmEmployeeToProductAndArea, Product, ProductArea and the _ProductToProductArea join, and it has exactly one caller."
        },
        {
          "kind": "status",
          "body": "Nothing in this domain is created by the platform on its own. createFirm's own doc comment says it should only be used to build a firm from a Clerk organisation, so Clerk is the place a new firm actually starts."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/firms",
          "kind": "api-module",
          "label": "firms",
          "path": "packages/api/src/modules/firms",
          "files": 55,
          "prismaSites": 60,
          "procedures": {
            "queries": 6,
            "mutations": 11
          }
        },
        {
          "id": "api/team",
          "kind": "api-module",
          "label": "team",
          "path": "packages/api/src/modules/team",
          "files": 18,
          "prismaSites": 12,
          "procedures": {
            "queries": 2,
            "mutations": 6
          }
        },
        {
          "id": "api/company",
          "kind": "api-module",
          "label": "company",
          "path": "packages/api/src/modules/company",
          "files": 6,
          "prismaSites": 6,
          "procedures": {
            "queries": 0,
            "mutations": 4
          }
        },
        {
          "id": "ui/firm",
          "kind": "ui-feature",
          "label": "firm",
          "path": "apps/platform/src/features/firm",
          "files": 1,
          "prismaSites": 0
        },
        {
          "id": "ui/teams",
          "kind": "ui-feature",
          "label": "teams",
          "path": "apps/platform/src/features/teams",
          "files": 4,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/team/teamMember.removalRequested",
            "namespace": "app",
            "area": "api/team",
            "file": "packages/api/src/modules/team/teamMember/admin/adminRemoveTeamMember.handler.ts",
            "line": 10,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/team/teamMember.removalRequested",
            "namespace": "app",
            "area": "api/team",
            "file": "packages/api/src/modules/team/teamMember/inngest/handleTeamMemberRemoval.ts",
            "line": 7,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/team/teamMember.removalRequested",
            "namespace": "app",
            "area": "api/team",
            "file": "packages/api/src/modules/team/teamMember/admin/adminRemoveTeamMember.handler.ts",
            "line": 10,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "firms"
            ],
            "consumers": [
              "firms"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "FirmEmployeeRoleType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 349,
          "doc": null,
          "values": [
            {
              "name": "solicitor",
              "doc": null
            },
            {
              "name": "colp",
              "doc": null
            },
            {
              "name": "cofa",
              "doc": null
            }
          ],
          "usedBy": [
            "FirmEmployee"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "LegalEntityType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 375,
          "doc": null,
          "values": [
            {
              "name": "individual",
              "doc": null
            },
            {
              "name": "company",
              "doc": null
            }
          ],
          "usedBy": [
            "BillReceipt",
            "LegalEntity"
          ],
          "datastore": "app",
          "shared": true
        }
      ],
      "usage": {
        "reads": 91,
        "writes": 39
      },
      "models": [
        {
          "key": "app/Firm",
          "name": "Firm",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 217,
          "idPrefix": "frm_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 33,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sraNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "employees",
              "type": "FirmEmployee",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "teams",
              "type": "Team",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Team",
              "onDelete": null
            },
            {
              "name": "clerkOrganisationId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentSources",
              "type": "FirmPaymentSource",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmPaymentSource",
              "onDelete": null
            },
            {
              "name": "bankAccounts",
              "type": "FirmBankAccount",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmBankAccount",
              "onDelete": null
            },
            {
              "name": "stripeConnectedAccountId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeCustomerId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deletedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "owner",
              "type": "User",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "User",
              "onDelete": null
            },
            {
              "name": "ownerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "officeAccountLedger",
              "type": "FirmOfficeAccountLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmOfficeAccountLedger",
              "onDelete": null
            },
            {
              "name": "officeAccountLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmExternalLedger",
              "type": "FirmExternalLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmExternalLedger",
              "onDelete": null
            },
            {
              "name": "firmExternalLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "nonBillableFundsCounterparty",
              "type": "Counterparty",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Counterparty",
              "onDelete": null
            },
            {
              "name": "nonBillableFundsCounterpartyId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billableFundsCounterparty",
              "type": "Counterparty",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Counterparty",
              "onDelete": null
            },
            {
              "name": "billableFundsCounterpartyId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "officeAccountTransfers",
              "type": "OfficeAccountTransfer",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OfficeAccountTransfer",
              "onDelete": null
            },
            {
              "name": "officeAccountTransferReconciliations",
              "type": "OfficeAccountTransferReconciliation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OfficeAccountTransferReconciliation",
              "onDelete": null
            },
            {
              "name": "clientAgreements",
              "type": "ClientAgreement",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreement",
              "onDelete": null
            },
            {
              "name": "feePlans",
              "type": "FeePlan",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePlan",
              "onDelete": null
            },
            {
              "name": "internalReviews",
              "type": "CaseInternalReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseInternalReview",
              "onDelete": null
            },
            {
              "name": "billAssessments",
              "type": "BillAssessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillAssessment",
              "onDelete": null
            },
            {
              "name": "externalParties",
              "type": "CaseExternalParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseExternalParty",
              "onDelete": null
            },
            {
              "name": "addresses",
              "type": "Address",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Address",
              "onDelete": null
            },
            {
              "name": "addressChecks",
              "type": "AddressCheck",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AddressCheck",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "clerkOrganisationId",
            "stripeConnectedAccountId",
            "stripeCustomerId"
          ],
          "relationsOut": [
            {
              "field": "employees",
              "target": "FirmEmployee",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "teams",
              "target": "Team",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Team",
              "targetDomain": "firms"
            },
            {
              "field": "paymentSources",
              "target": "FirmPaymentSource",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmPaymentSource",
              "targetDomain": "money"
            },
            {
              "field": "bankAccounts",
              "target": "FirmBankAccount",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmBankAccount",
              "targetDomain": "money"
            },
            {
              "field": "owner",
              "target": "User",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ownerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/User",
              "targetDomain": "people"
            },
            {
              "field": "officeAccountLedger",
              "target": "FirmOfficeAccountLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "officeAccountLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmOfficeAccountLedger",
              "targetDomain": "money"
            },
            {
              "field": "firmExternalLedger",
              "target": "FirmExternalLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmExternalLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmExternalLedger",
              "targetDomain": "money"
            },
            {
              "field": "nonBillableFundsCounterparty",
              "target": "Counterparty",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "nonBillableFundsCounterpartyId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Counterparty",
              "targetDomain": "money"
            },
            {
              "field": "billableFundsCounterparty",
              "target": "Counterparty",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "billableFundsCounterpartyId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Counterparty",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountTransfers",
              "target": "OfficeAccountTransfer",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransfer",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountTransferReconciliations",
              "target": "OfficeAccountTransferReconciliation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransferReconciliation",
              "targetDomain": "money"
            },
            {
              "field": "clientAgreements",
              "target": "ClientAgreement",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreement",
              "targetDomain": "compliance"
            },
            {
              "field": "feePlans",
              "target": "FeePlan",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlan",
              "targetDomain": "money"
            },
            {
              "field": "internalReviews",
              "target": "CaseInternalReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseInternalReview",
              "targetDomain": "compliance"
            },
            {
              "field": "billAssessments",
              "target": "BillAssessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillAssessment",
              "targetDomain": "money"
            },
            {
              "field": "externalParties",
              "target": "CaseExternalParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseExternalParty",
              "targetDomain": "cases"
            },
            {
              "field": "addresses",
              "target": "Address",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Address",
              "targetDomain": "compliance"
            },
            {
              "field": "addressChecks",
              "target": "AddressCheck",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AddressCheck",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "Address",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/Address",
              "sourceDomain": "compliance"
            },
            {
              "model": "AddressCheck",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/AddressCheck",
              "sourceDomain": "compliance"
            },
            {
              "model": "BillAssessment",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillAssessment",
              "sourceDomain": "money"
            },
            {
              "model": "CaseExternalParty",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseExternalParty",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseInternalReview",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseInternalReview",
              "sourceDomain": "compliance"
            },
            {
              "model": "ClientAgreement",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreement",
              "sourceDomain": "compliance"
            },
            {
              "model": "Counterparty",
              "field": "nonBillableFundsFirm",
              "fk": false,
              "list": false,
              "sourceKey": "app/Counterparty",
              "sourceDomain": "money"
            },
            {
              "model": "Counterparty",
              "field": "billableFundsFirm",
              "fk": false,
              "list": false,
              "sourceKey": "app/Counterparty",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlan",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePlan",
              "sourceDomain": "money"
            },
            {
              "model": "FirmBankAccount",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmBankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmExternalLedger",
              "field": "firm",
              "fk": false,
              "list": false,
              "sourceKey": "app/FirmExternalLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmOfficeAccountLedger",
              "field": "firm",
              "fk": false,
              "list": false,
              "sourceKey": "app/FirmOfficeAccountLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmPaymentSource",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmPaymentSource",
              "sourceDomain": "money"
            },
            {
              "model": "OfficeAccountTransfer",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/OfficeAccountTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "OfficeAccountTransferReconciliation",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/OfficeAccountTransferReconciliation",
              "sourceDomain": "money"
            },
            {
              "model": "Team",
              "field": "firm",
              "fk": true,
              "list": false,
              "sourceKey": "app/Team",
              "sourceDomain": "firms"
            },
            {
              "model": "User",
              "field": "firms",
              "fk": false,
              "list": true,
              "sourceKey": "app/User",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmPaymentSource",
              "field": "paymentSources"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmBankAccount",
              "field": "bankAccounts"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "User",
              "field": "owner"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmOfficeAccountLedger",
              "field": "officeAccountLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmExternalLedger",
              "field": "firmExternalLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "Counterparty",
              "field": "nonBillableFundsCounterparty"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "Counterparty",
              "field": "billableFundsCounterparty"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "OfficeAccountTransfer",
              "field": "officeAccountTransfers"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "OfficeAccountTransferReconciliation",
              "field": "officeAccountTransferReconciliations"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "clientAgreements"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeePlan",
              "field": "feePlans"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "CaseInternalReview",
              "field": "internalReviews"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BillAssessment",
              "field": "billAssessments"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseExternalParty",
              "field": "externalParties"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "Address",
              "field": "addresses"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "addressChecks"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "Address",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillAssessment",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseExternalParty",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "CaseInternalReview",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "Counterparty",
              "field": "nonBillableFundsFirm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "Counterparty",
              "field": "billableFundsFirm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeePlan",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmBankAccount",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmExternalLedger",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmOfficeAccountLedger",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmPaymentSource",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "OfficeAccountTransfer",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "OfficeAccountTransferReconciliation",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "User",
              "field": "firms"
            }
          ],
          "usage": {
            "total": 28,
            "reads": 20,
            "writes": 8,
            "ops": {
              "findUniqueOrThrow": 8,
              "update": 6,
              "findMany": 6,
              "findUnique": 5,
              "create": 1,
              "findFirst": 1,
              "upsert": 1
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 8,
                "writes": 6,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 4,
                "writes": 1,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/payments",
                "reads": 3,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 2,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/users",
                "reads": 2,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "apps/admin/src/app/(with-sidebar)/firms/FirmOnboardingTable.tsx",
                "line": 84,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/firms/procedures/createFirmAsAdminProcedure.ts",
                "line": 65,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/firms/procedures/setFirmClientAccountDetails.ts",
                "line": 36,
                "op": "update"
              }
            ],
            "nested": 54,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 11
              },
              {
                "area": "api/cases",
                "n": 10
              },
              {
                "area": "api/firms",
                "n": 10
              },
              {
                "area": "admin",
                "n": 5
              },
              {
                "area": "api/agreements",
                "n": 5
              },
              {
                "area": "api/finance",
                "n": 4
              },
              {
                "area": "api/case-internal-reviews",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ],
            "typeMentions": 89,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 20
              },
              {
                "area": "api/firms",
                "n": 20
              },
              {
                "area": "api/users",
                "n": 8
              },
              {
                "area": "api/payments",
                "n": 7
              },
              {
                "area": "api/cases",
                "n": 6
              },
              {
                "area": "pkg/db",
                "n": 6
              },
              {
                "area": "ui/_app",
                "n": 5
              },
              {
                "area": "api/_root",
                "n": 5
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One law firm on the platform, mirrored one-to-one from a Clerk organisation. It holds the regulatory identity (SRA number), the money plumbing (Stripe customer, Connect account, office and external ledgers) and the list of seats.",
          "keyFields": [
            {
              "name": "clerkOrganisationId",
              "meaning": "Unique link to the Clerk organisation that is upstream of this row"
            },
            {
              "name": "sraNumber",
              "meaning": "Optional, but a firm with no SRA number on record cannot be given work"
            },
            {
              "name": "stripeConnectedAccountId",
              "meaning": "Connect account client money is paid out to; absence blocks the firm from work"
            },
            {
              "name": "stripeCustomerId",
              "meaning": "Customer the platform subscription is billed to, set right after create"
            },
            {
              "name": "name",
              "meaning": "Copied from the Clerk organisation name and used in the ledger names"
            },
            {
              "name": "deleted",
              "meaning": "Soft delete set by deleteFirm; rows are never removed"
            }
          ],
          "references": [
            {
              "field": "ownerId",
              "target": "people",
              "meaning": "The User who created the Clerk organisation"
            },
            {
              "field": "officeAccountLedgerId",
              "target": "money",
              "meaning": "The firm's office account ledger, created inline with the firm"
            },
            {
              "field": "firmExternalLedgerId",
              "target": "money",
              "meaning": "The firm's external ledger, also created inline"
            },
            {
              "field": "billableFundsCounterpartyId",
              "target": "money",
              "meaning": "Counterparty used when billable funds move"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "clerk-mirrored"
          ]
        },
        {
          "key": "app/FirmEmployee",
          "name": "FirmEmployee",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 259,
          "idPrefix": "frmemp_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 59,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "Solicitor",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "solicitorId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deletedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clerkRole",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clerkOrganisationMembershipId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isActive",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clients",
              "type": "FirmEmployeeClient",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeClient",
              "onDelete": null
            },
            {
              "name": "roles",
              "type": "FirmEmployeeRoleType",
              "list": true,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ownedCases",
              "type": "Case",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseNotes",
              "type": "CaseNote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseNote",
              "onDelete": null
            },
            {
              "name": "quotes",
              "type": "Quote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteNotes",
              "type": "QuoteNote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteNote",
              "onDelete": null
            },
            {
              "name": "firmEmployeeLedger",
              "type": "FirmEmployeeLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployeeLedger",
              "onDelete": null
            },
            {
              "name": "firmEmployeeLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployeeDisbursementLedger",
              "type": "FirmEmployeeDisbursementLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployeeDisbursementLedger",
              "onDelete": null
            },
            {
              "name": "firmEmployeeDisbursementLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankAccounts",
              "type": "FirmEmployeeBankAccount",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeBankAccount",
              "onDelete": null
            },
            {
              "name": "bills",
              "type": "Bill",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billPayouts",
              "type": "BillPayout",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillPayout",
              "onDelete": null
            },
            {
              "name": "paymentRequests",
              "type": "PaymentRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentRequest",
              "onDelete": null
            },
            {
              "name": "bankTransferIntents",
              "type": "BankTransferIntent",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransferIntent",
              "onDelete": null
            },
            {
              "name": "caseRefunds",
              "type": "CasePaymentRefund",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CasePaymentRefund",
              "onDelete": null
            },
            {
              "name": "completionRequestsRequested",
              "type": "CaseCompletionRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseCompletionRequest",
              "onDelete": null
            },
            {
              "name": "completionRequestsResponded",
              "type": "CaseCompletionRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseCompletionRequest",
              "onDelete": null
            },
            {
              "name": "feePayments",
              "type": "FeePayment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePayment",
              "onDelete": null
            },
            {
              "name": "feePlans",
              "type": "FeePlan",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePlan",
              "onDelete": null
            },
            {
              "name": "feePlanPromotions",
              "type": "FeePlanPromotion",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePlanPromotion",
              "onDelete": null
            },
            {
              "name": "feeAllowances",
              "type": "FeeAllowance",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeeAllowance",
              "onDelete": null
            },
            {
              "name": "profile",
              "type": "LegalPersonProfile",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "LegalPersonProfile",
              "onDelete": null
            },
            {
              "name": "profileId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "productsAndAreas",
              "type": "FirmEmployeeToProductAndArea",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeToProductAndArea",
              "onDelete": null
            },
            {
              "name": "legalEntity",
              "type": "LegalEntity",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "LegalEntity",
              "onDelete": null
            },
            {
              "name": "legalEntityId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "riskAssessments",
              "type": "RiskAssessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "RiskAssessment",
              "onDelete": null
            },
            {
              "name": "riskAssessmentReviews",
              "type": "RiskAssessmentReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "RiskAssessmentReview",
              "onDelete": null
            },
            {
              "name": "instructionCredits",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseLimit",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Maximum number of OPENING/ACTIVE cases a lawyer can own within this firm. Null = unlimited",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reassignmentsFrom",
              "type": "CaseReassignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseReassignment",
              "onDelete": null
            },
            {
              "name": "reassignmentsTo",
              "type": "CaseReassignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseReassignment",
              "onDelete": null
            },
            {
              "name": "assessments",
              "type": "Assessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Assessment",
              "onDelete": null
            },
            {
              "name": "timeTrackingEntries",
              "type": "TimeTrackingEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "TimeTrackingEntry",
              "onDelete": null
            },
            {
              "name": "ownedTeams",
              "type": "Team",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Team",
              "onDelete": null
            },
            {
              "name": "teamMembership",
              "type": "TeamMember",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "TeamMember",
              "onDelete": null
            },
            {
              "name": "internalReviews",
              "type": "CaseInternalReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseInternalReview",
              "onDelete": null
            },
            {
              "name": "billAssessments",
              "type": "BillAssessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillAssessment",
              "onDelete": null
            },
            {
              "name": "caseExternalParties",
              "type": "CaseExternalParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseExternalParty",
              "onDelete": null
            },
            {
              "name": "stripeConnectAccountId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientFacingPhoneNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "consultationCalendlyUrl",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "outboundMailRequests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "caseMailContacts",
              "type": "CaseMailContact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseMailContact",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([firmId, personId])"
          ],
          "looseRefs": [
            "clerkOrganisationMembershipId",
            "stripeConnectAccountId"
          ],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "solicitor",
              "target": "Solicitor",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "solicitorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            },
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "clients",
              "target": "FirmEmployeeClient",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeClient",
              "targetDomain": "firms"
            },
            {
              "field": "ownedCases",
              "target": "Case",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "caseNotes",
              "target": "CaseNote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseNote",
              "targetDomain": "cases"
            },
            {
              "field": "quotes",
              "target": "Quote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "quoteNotes",
              "target": "QuoteNote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteNote",
              "targetDomain": "quotes"
            },
            {
              "field": "firmEmployeeLedger",
              "target": "FirmEmployeeLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeLedger",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployeeDisbursementLedger",
              "target": "FirmEmployeeDisbursementLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeDisbursementLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeDisbursementLedger",
              "targetDomain": "money"
            },
            {
              "field": "bankAccounts",
              "target": "FirmEmployeeBankAccount",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeBankAccount",
              "targetDomain": "money"
            },
            {
              "field": "bills",
              "target": "Bill",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "billPayouts",
              "target": "BillPayout",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillPayout",
              "targetDomain": "money"
            },
            {
              "field": "paymentRequests",
              "target": "PaymentRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentRequest",
              "targetDomain": "money"
            },
            {
              "field": "bankTransferIntents",
              "target": "BankTransferIntent",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransferIntent",
              "targetDomain": "money"
            },
            {
              "field": "caseRefunds",
              "target": "CasePaymentRefund",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePaymentRefund",
              "targetDomain": "money"
            },
            {
              "field": "completionRequestsRequested",
              "target": "CaseCompletionRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseCompletionRequest",
              "targetDomain": "cases"
            },
            {
              "field": "completionRequestsResponded",
              "target": "CaseCompletionRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseCompletionRequest",
              "targetDomain": "cases"
            },
            {
              "field": "feePayments",
              "target": "FeePayment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePayment",
              "targetDomain": "money"
            },
            {
              "field": "feePlans",
              "target": "FeePlan",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlan",
              "targetDomain": "money"
            },
            {
              "field": "feePlanPromotions",
              "target": "FeePlanPromotion",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlanPromotion",
              "targetDomain": "money"
            },
            {
              "field": "feeAllowances",
              "target": "FeeAllowance",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeeAllowance",
              "targetDomain": "money"
            },
            {
              "field": "profile",
              "target": "LegalPersonProfile",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "profileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalPersonProfile",
              "targetDomain": "people"
            },
            {
              "field": "productsAndAreas",
              "target": "FirmEmployeeToProductAndArea",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeToProductAndArea",
              "targetDomain": "firms"
            },
            {
              "field": "legalEntity",
              "target": "LegalEntity",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "legalEntityId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalEntity",
              "targetDomain": "firms"
            },
            {
              "field": "riskAssessments",
              "target": "RiskAssessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/RiskAssessment",
              "targetDomain": "compliance"
            },
            {
              "field": "riskAssessmentReviews",
              "target": "RiskAssessmentReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/RiskAssessmentReview",
              "targetDomain": "compliance"
            },
            {
              "field": "reassignmentsFrom",
              "target": "CaseReassignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseReassignment",
              "targetDomain": "cases"
            },
            {
              "field": "reassignmentsTo",
              "target": "CaseReassignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseReassignment",
              "targetDomain": "cases"
            },
            {
              "field": "assessments",
              "target": "Assessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Assessment",
              "targetDomain": "consultations"
            },
            {
              "field": "timeTrackingEntries",
              "target": "TimeTrackingEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/TimeTrackingEntry",
              "targetDomain": "money"
            },
            {
              "field": "ownedTeams",
              "target": "Team",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Team",
              "targetDomain": "firms"
            },
            {
              "field": "teamMembership",
              "target": "TeamMember",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/TeamMember",
              "targetDomain": "firms"
            },
            {
              "field": "internalReviews",
              "target": "CaseInternalReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseInternalReview",
              "targetDomain": "compliance"
            },
            {
              "field": "billAssessments",
              "target": "BillAssessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillAssessment",
              "targetDomain": "money"
            },
            {
              "field": "caseExternalParties",
              "target": "CaseExternalParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseExternalParty",
              "targetDomain": "cases"
            },
            {
              "field": "outboundMailRequests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            },
            {
              "field": "caseMailContacts",
              "target": "CaseMailContact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseMailContact",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Assessment",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/Assessment",
              "sourceDomain": "consultations"
            },
            {
              "model": "BankTransferIntent",
              "field": "requestedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransferIntent",
              "sourceDomain": "money"
            },
            {
              "model": "Bill",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "BillAssessment",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillAssessment",
              "sourceDomain": "money"
            },
            {
              "model": "BillPayout",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillPayout",
              "sourceDomain": "money"
            },
            {
              "model": "Case",
              "field": "owner",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseCompletionRequest",
              "field": "requestedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseCompletionRequest",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseCompletionRequest",
              "field": "respondedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseCompletionRequest",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseExternalParty",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseExternalParty",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseInternalReview",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseInternalReview",
              "sourceDomain": "compliance"
            },
            {
              "model": "CaseMailContact",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseMailContact",
              "sourceDomain": "post"
            },
            {
              "model": "CaseNote",
              "field": "createdBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseNote",
              "sourceDomain": "cases"
            },
            {
              "model": "CasePaymentRefund",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/CasePaymentRefund",
              "sourceDomain": "money"
            },
            {
              "model": "CaseReassignment",
              "field": "oldFirmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseReassignment",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseReassignment",
              "field": "newFirmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseReassignment",
              "sourceDomain": "cases"
            },
            {
              "model": "FeeAllowance",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeeAllowance",
              "sourceDomain": "money"
            },
            {
              "model": "FeePayment",
              "field": "firmSolicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePayment",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlan",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePlan",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlanPromotion",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePlanPromotion",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "employees",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployeeBankAccount",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeBankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeClient",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeClient",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployeeDisbursementLedger",
              "field": "firmEmployee",
              "fk": false,
              "list": false,
              "sourceKey": "app/FirmEmployeeDisbursementLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeLedger",
              "field": "firmEmployee",
              "fk": false,
              "list": false,
              "sourceKey": "app/FirmEmployeeLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeToProductAndArea",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeToProductAndArea",
              "sourceDomain": "firms"
            },
            {
              "model": "LegalEntity",
              "field": "firmEmployee",
              "fk": false,
              "list": false,
              "sourceKey": "app/LegalEntity",
              "sourceDomain": "firms"
            },
            {
              "model": "LegalPersonProfile",
              "field": "firmEmployee",
              "fk": false,
              "list": false,
              "sourceKey": "app/LegalPersonProfile",
              "sourceDomain": "people"
            },
            {
              "model": "OutboundMailRequest",
              "field": "requestedBy",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            },
            {
              "model": "PaymentRequest",
              "field": "creator",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentRequest",
              "sourceDomain": "money"
            },
            {
              "model": "Person",
              "field": "firmEmployee",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Quote",
              "field": "solicitor",
              "fk": true,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteNote",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteNote",
              "sourceDomain": "quotes"
            },
            {
              "model": "RiskAssessment",
              "field": "assessingFirmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/RiskAssessment",
              "sourceDomain": "compliance"
            },
            {
              "model": "RiskAssessmentReview",
              "field": "reviewingFirmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/RiskAssessmentReview",
              "sourceDomain": "compliance"
            },
            {
              "model": "Solicitor",
              "field": "firmEmployee",
              "fk": false,
              "list": true,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            },
            {
              "model": "Team",
              "field": "owner",
              "fk": true,
              "list": false,
              "sourceKey": "app/Team",
              "sourceDomain": "firms"
            },
            {
              "model": "TeamMember",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/TeamMember",
              "sourceDomain": "firms"
            },
            {
              "model": "TimeTrackingEntry",
              "field": "firmEmployee",
              "fk": true,
              "list": false,
              "sourceKey": "app/TimeTrackingEntry",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Solicitor",
              "field": "solicitor"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "person"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "ownedCases"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseNote",
              "field": "caseNotes"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quotes"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteNote",
              "field": "quoteNotes"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmEmployeeLedger",
              "field": "firmEmployeeLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmEmployeeDisbursementLedger",
              "field": "firmEmployeeDisbursementLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FirmEmployeeBankAccount",
              "field": "bankAccounts"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "Bill",
              "field": "bills"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BillPayout",
              "field": "billPayouts"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentRequest",
              "field": "paymentRequests"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BankTransferIntent",
              "field": "bankTransferIntents"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CasePaymentRefund",
              "field": "caseRefunds"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseCompletionRequest",
              "field": "completionRequestsRequested"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseCompletionRequest",
              "field": "completionRequestsResponded"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeePayment",
              "field": "feePayments"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeePlan",
              "field": "feePlans"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeePlanPromotion",
              "field": "feePlanPromotions"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeeAllowance",
              "field": "feeAllowances"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "LegalPersonProfile",
              "field": "profile"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "RiskAssessment",
              "field": "riskAssessments"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "RiskAssessmentReview",
              "field": "riskAssessmentReviews"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseReassignment",
              "field": "reassignmentsFrom"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseReassignment",
              "field": "reassignmentsTo"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "Assessment",
              "field": "assessments"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "TimeTrackingEntry",
              "field": "timeTrackingEntries"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "CaseInternalReview",
              "field": "internalReviews"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BillAssessment",
              "field": "billAssessments"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseExternalParty",
              "field": "caseExternalParties"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "outboundMailRequests"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "CaseMailContact",
              "field": "caseMailContacts"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "Assessment",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BankTransferIntent",
              "field": "requestedBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "Bill",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillAssessment",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillPayout",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "owner"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseCompletionRequest",
              "field": "requestedBy"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseCompletionRequest",
              "field": "respondedBy"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseExternalParty",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "CaseInternalReview",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "CaseMailContact",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseNote",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CasePaymentRefund",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseReassignment",
              "field": "oldFirmEmployee"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseReassignment",
              "field": "newFirmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeeAllowance",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeePayment",
              "field": "firmSolicitor"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeePlan",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeePlanPromotion",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmEmployeeBankAccount",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmEmployeeDisbursementLedger",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FirmEmployeeLedger",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "LegalPersonProfile",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "requestedBy"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentRequest",
              "field": "creator"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "solicitor"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteNote",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "RiskAssessment",
              "field": "assessingFirmEmployee"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "RiskAssessmentReview",
              "field": "reviewingFirmEmployee"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Solicitor",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "TimeTrackingEntry",
              "field": "firmEmployee"
            }
          ],
          "usage": {
            "total": 60,
            "reads": 44,
            "writes": 16,
            "ops": {
              "findMany": 8,
              "update": 12,
              "findUniqueOrThrow": 26,
              "findUnique": 7,
              "create": 1,
              "upsert": 2,
              "findFirst": 3,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 9,
                "writes": 10,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 11,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 1,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/instructions",
                "reads": 3,
                "writes": 1,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 3,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 3,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              },
              {
                "area": "api/assessments",
                "reads": 3,
                "writes": 0,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "api/incentives",
                "reads": 3,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/users",
                "reads": 3,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 1,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/team",
                "reads": 1,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/_root",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "apps/admin/src/app/(with-sidebar)/persons/[id]/_tabs/lawyer/LawyerFirmsTab.tsx",
                "line": 105,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/service/solicitorCreateAssessmentCase.ts",
                "line": 89,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/service/solicitorCreateCase.ts",
                "line": 76,
                "op": "update"
              }
            ],
            "nested": 44,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 15
              },
              {
                "area": "api/cases",
                "n": 12
              },
              {
                "area": "api/outbound-mail",
                "n": 6
              },
              {
                "area": "api/instructions",
                "n": 5
              },
              {
                "area": "ui/_app",
                "n": 2
              },
              {
                "area": "api/firms",
                "n": 2
              },
              {
                "area": "api/payments",
                "n": 1
              },
              {
                "area": "api/solicitors",
                "n": 1
              }
            ],
            "typeMentions": 52,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 15
              },
              {
                "area": "api/firms",
                "n": 11
              },
              {
                "area": "api/instructions",
                "n": 5
              },
              {
                "area": "api/_root",
                "n": 4
              },
              {
                "area": "pkg/db",
                "n": 4
              },
              {
                "area": "api/quotes",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/assessments",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One person's seat at one firm, unique per firm and person. This is the row that owns cases, writes quotes, holds bank accounts and fee plans, and gets paid, so most of the platform talks about lawyers by FirmEmployee id rather than Solicitor id.",
          "keyFields": [
            {
              "name": "roles",
              "meaning": "solicitor, colp or cofa; colp adds firm-wide case read and completion sign-off, cofa adds read only"
            },
            {
              "name": "clerkRole",
              "meaning": "The raw Clerk membership role string, kept in sync from Clerk webhooks"
            },
            {
              "name": "caseLimit",
              "meaning": "Max OPENING or ACTIVE cases the seat may own, default 10, null means unlimited"
            },
            {
              "name": "instructionCredits",
              "meaning": "Default 3. Bringing your own client mints one, accepting a Lawhive instruction spends one"
            },
            {
              "name": "isActive",
              "meaning": "Filters the assignable-lawyer list but is never written by any code path"
            },
            {
              "name": "deleted",
              "meaning": "Soft delete set by deleteFirmEmployee; the real off switch for a seat"
            },
            {
              "name": "consultationCalendlyUrl",
              "meaning": "Booking link used when a client books a consultation with this lawyer"
            }
          ],
          "references": [
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "The firm this seat belongs to"
            },
            {
              "field": "personId",
              "target": "people",
              "meaning": "The human behind the seat; unique together with firmId"
            },
            {
              "field": "solicitorId",
              "target": "people",
              "meaning": "Set only for lawyers. A null solicitorId cannot accept work"
            },
            {
              "field": "legalEntityId",
              "target": "firms",
              "meaning": "The entity this lawyer invoices under; required before accepting work"
            },
            {
              "field": "profileId",
              "target": "people",
              "meaning": "The public LegalPersonProfile (bio, admission year, practice areas)"
            },
            {
              "field": "firmEmployeeLedgerId",
              "target": "money",
              "meaning": "The seat's fees ledger, created inline with the seat"
            },
            {
              "field": "firmEmployeeDisbursementLedgerId",
              "target": "money",
              "meaning": "The seat's disbursements ledger"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "clerk-mirrored",
            "case-owner"
          ]
        },
        {
          "key": "app/Team",
          "name": "Team",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3029,
          "idPrefix": "team_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ownerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "owner",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "teamMembers",
              "type": "TeamMember",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "TeamMember",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([ownerId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "owner",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ownerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "teamMembers",
              "target": "TeamMember",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/TeamMember",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "Firm",
              "field": "teams",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "ownedTeams",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "TeamMember",
              "field": "team",
              "fk": true,
              "list": false,
              "sourceKey": "app/TeamMember",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 6,
            "reads": 4,
            "writes": 2,
            "ops": {
              "findFirst": 3,
              "findMany": 1,
              "create": 2
            },
            "byArea": [
              {
                "area": "api/team",
                "reads": 2,
                "writes": 1,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/team/teamEventsRouter.ts",
                "line": 20,
                "op": "create"
              },
              {
                "file": "packages/db/seed/team/index.ts",
                "line": 12,
                "op": "create"
              }
            ],
            "nested": 9,
            "nestedByArea": [
              {
                "area": "api/team",
                "n": 4
              },
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              }
            ],
            "typeMentions": 35,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 12
              },
              {
                "area": "ui/_app",
                "n": 10
              },
              {
                "area": "ui/cases",
                "n": 5
              },
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "ui/teams",
                "n": 2
              },
              {
                "area": "api/workflows-v2",
                "n": 2
              },
              {
                "area": "api/team",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A group of seats gathered around one owning lawyer inside one firm. There is no name or status: a team is just the owner plus its members, and getOrCreateOwnedTeam finds by ownerId, so each lawyer effectively has at most one.",
          "keyFields": [],
          "references": [
            {
              "field": "ownerId",
              "target": "firms",
              "meaning": "The FirmEmployee whose team this is"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "The firm the team lives in"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "event-written"
          ]
        },
        {
          "key": "app/TeamMember",
          "name": "TeamMember",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3045,
          "idPrefix": "tm_",
          "idPrefixShared": [
            "app/LegalForm",
            "app/LegalFormCaseArtifact"
          ],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "team",
              "type": "Team",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Team",
              "onDelete": null
            },
            {
              "name": "teamId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "caseParties",
              "type": "CaseParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseParty",
              "onDelete": null
            },
            {
              "name": "partyOnAllCases",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "roleName",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deletedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([firmEmployeeId, teamId])",
            "@@index([firmEmployeeId])",
            "@@index([teamId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "team",
              "target": "Team",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "teamId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Team",
              "targetDomain": "firms"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "caseParties",
              "target": "CaseParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseParty",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseParty",
              "field": "teamMember",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseParty",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "teamMembership",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Team",
              "field": "teamMembers",
              "fk": false,
              "list": true,
              "sourceKey": "app/Team",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseParty",
              "field": "caseParties"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseParty",
              "field": "teamMember"
            }
          ],
          "usage": {
            "total": 12,
            "reads": 9,
            "writes": 3,
            "ops": {
              "findMany": 4,
              "findFirst": 2,
              "findUnique": 1,
              "findUniqueOrThrow": 2,
              "upsert": 1,
              "update": 2
            },
            "byArea": [
              {
                "area": "api/team",
                "reads": 3,
                "writes": 3,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 5,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/team/teamMember/teamMemberEventsRouter.ts",
                "line": 53,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/team/teamMember/teamMemberEventsRouter.ts",
                "line": 73,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/team/teamMember/teamMemberEventsRouter.ts",
                "line": 84,
                "op": "update"
              }
            ],
            "nested": 14,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 6
              },
              {
                "area": "api/team",
                "n": 4
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/firms",
                "n": 1
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 6,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "ui/cases",
                "n": 2
              },
              {
                "area": "api/team",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One seat's membership of one team, and the hook that gives a colleague access to the owner's cases. With partyOnAllCases true, adding the member also creates a TEAM_MEMBER CaseParty on every case the team owner holds.",
          "keyFields": [
            {
              "name": "roleName",
              "meaning": "Free-text label the firm chooses for this member, no enum behind it"
            },
            {
              "name": "partyOnAllCases",
              "meaning": "If true, the member is added as a party on all of the team owner's cases"
            },
            {
              "name": "isDeleted",
              "meaning": "Soft removal set by team.teamMember.remove; re-adding clears it"
            }
          ],
          "references": [
            {
              "field": "teamId",
              "target": "firms",
              "meaning": "The team joined"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "The seat joining; unique together with teamId"
            }
          ],
          "lifecycle": "ADDED → UPDATED → isDeleted",
          "grouped": [],
          "flags": [
            "event-written",
            "shared-id-prefix"
          ]
        },
        {
          "key": "app/LegalEntity",
          "name": "LegalEntity",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 355,
          "idPrefix": "legent_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "address",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "LegalEntityType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "companyNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isVatRegistered",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "vatNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "billReceipts",
              "type": "BillReceipt",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillReceipt",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "billReceipts",
              "target": "BillReceipt",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillReceipt",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BillReceipt",
              "field": "legalEntity",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillReceipt",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "legalEntity",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "money",
              "model": "BillReceipt",
              "field": "billReceipts"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillReceipt",
              "field": "legalEntity"
            }
          ],
          "usage": {
            "total": 3,
            "reads": 3,
            "writes": 0,
            "ops": {
              "findFirst": 3
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 2,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/firms",
                "n": 3
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ],
            "typeMentions": 15,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 8
              },
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "api/firms",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The legal identity a lawyer invoices under: either an individual or a company with a company number, plus VAT status. A seat with no LegalEntity cannot accept work, and a bill receipt is issued in this entity's name.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "individual or company; a company must also carry a companyNumber"
            },
            {
              "name": "isVatRegistered",
              "meaning": "If true, vatNumber must be present or the seat is blocked from work"
            },
            {
              "name": "vatNumber",
              "meaning": "VAT registration number that appears on receipts"
            },
            {
              "name": "name",
              "meaning": "The invoicing name shown on bill receipts"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only"
          ]
        },
        {
          "key": "app/FirmEmployeeClient",
          "name": "FirmEmployeeClient",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 781,
          "idPrefix": "frmempcli_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "company",
              "type": "Company",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Company",
              "onDelete": null
            },
            {
              "name": "companyId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isLawhiveLead",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([firmEmployeeId, customerId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "company",
              "target": "Company",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "companyId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Company",
              "targetDomain": "firms"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "Company",
              "field": "firmEmployeeClients",
              "fk": false,
              "list": true,
              "sourceKey": "app/Company",
              "sourceDomain": "firms"
            },
            {
              "model": "Customer",
              "field": "firmEmployeeClient",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "FirmEmployee",
              "field": "clients",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "firmEmployeeClient"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 6,
            "writes": 4,
            "ops": {
              "findFirst": 2,
              "count": 1,
              "upsert": 4,
              "findMany": 2,
              "findUnique": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/firms",
                "reads": 2,
                "writes": 1,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 0,
                "writes": 1,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/kyc",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/caseService.ts",
                "line": 228,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/firms/firmEmployees/service/createFirmEmployeeClient.ts",
                "line": 14,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/instructions/service/acceptReassignment.ts",
                "line": 276,
                "op": "upsert"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/kyc",
                "n": 1
              }
            ],
            "typeMentions": 1,
            "typeMentionsByArea": [
              {
                "area": "api/assessments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The link that says this customer or company is a client of this lawyer, and whether Lawhive introduced them. It is what separates a firm's own book of business from marketplace leads, and it drives the client search in the platform sidebar.",
          "keyFields": [
            {
              "name": "isLawhiveLead",
              "meaning": "True when Lawhive introduced the client. wasClientIntroducedByLawhive reads only this"
            }
          ],
          "references": [
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "The lawyer who holds the relationship; unique with customerId"
            },
            {
              "field": "customerId",
              "target": "people",
              "meaning": "The Customer hat of the client person"
            },
            {
              "field": "companyId",
              "target": "firms",
              "meaning": "Set instead when the client is a company"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "upsert-only"
          ]
        },
        {
          "key": "app/Company",
          "name": "Company",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 765,
          "idPrefix": "cmp_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "address",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "companyNumber",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseParties",
              "type": "CaseParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseParty",
              "onDelete": null
            },
            {
              "name": "firmEmployeeClients",
              "type": "FirmEmployeeClient",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeClient",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([companyNumber])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "caseParties",
              "target": "CaseParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseParty",
              "targetDomain": "cases"
            },
            {
              "field": "firmEmployeeClients",
              "target": "FirmEmployeeClient",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeClient",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseParty",
              "field": "company",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseParty",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployeeClient",
              "field": "company",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeClient",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseParty",
              "field": "caseParties"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseParty",
              "field": "company"
            }
          ],
          "usage": {
            "total": 6,
            "reads": 3,
            "writes": 3,
            "ops": {
              "findUniqueOrThrow": 1,
              "upsert": 1,
              "update": 1,
              "create": 1,
              "findMany": 2
            },
            "byArea": [
              {
                "area": "api/company",
                "reads": 0,
                "writes": 2,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/service/solicitorCreateCase.ts",
                "line": 84,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/company/companyEventsRouter.ts",
                "line": 58,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/company/companyEventsRouter.ts",
                "line": 81,
                "op": "create"
              }
            ],
            "nested": 16,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 6
              },
              {
                "area": "api/firms",
                "n": 4
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "api/company",
                "n": 2
              },
              {
                "area": "api/agreements",
                "n": 1
              }
            ],
            "typeMentions": 36,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 19
              },
              {
                "area": "ui/cases",
                "n": 8
              },
              {
                "area": "ui/_app",
                "n": 2
              },
              {
                "area": "pkg/shared",
                "n": 2
              },
              {
                "area": "pkg/ui",
                "n": 2
              },
              {
                "area": "ui/conflict-checks",
                "n": 1
              },
              {
                "area": "api/company",
                "n": 1
              },
              {
                "area": "pkg/e2e-tests",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A corporate body: either a lawyer's client company or a company standing as a party on a case. companyNumber is the natural key, so the same registered company is reused across cases and firms.",
          "keyFields": [
            {
              "name": "companyNumber",
              "meaning": "Companies House number, unique, used as the upsert key"
            },
            {
              "name": "name",
              "meaning": "Registered name, editable by admins through company.admin.update"
            },
            {
              "name": "address",
              "meaning": "Registered address"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "shared-across-domains"
          ]
        },
        {
          "key": "app/FirmEmployeeToProductAndArea",
          "name": "FirmEmployeeToProductAndArea",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2865,
          "idPrefix": null,
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "productArea",
              "type": "ProductArea",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ProductArea",
              "onDelete": null
            },
            {
              "name": "productAreaId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "product",
              "type": "Product",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Product",
              "onDelete": null
            },
            {
              "name": "productId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@id([firmEmployeeId, productAreaId, productId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "productArea",
              "target": "ProductArea",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "productAreaId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductArea",
              "targetDomain": "catalog"
            },
            {
              "field": "product",
              "target": "Product",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "productId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Product",
              "targetDomain": "catalog"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployee",
              "field": "productsAndAreas",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Product",
              "field": "areasAndFirmEmployees",
              "fk": false,
              "list": true,
              "sourceKey": "app/Product",
              "sourceDomain": "catalog"
            },
            {
              "model": "ProductArea",
              "field": "firmEmployeesAndAreas",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductArea",
              "sourceDomain": "catalog"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "catalog",
              "model": "ProductArea",
              "field": "productArea"
            },
            {
              "dir": "out",
              "domain": "catalog",
              "model": "Product",
              "field": "product"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "Product",
              "field": "areasAndFirmEmployees"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "ProductArea",
              "field": "firmEmployeesAndAreas"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 1,
            "writes": 3,
            "ops": {
              "createMany": 2,
              "deleteMany": 1,
              "findMany": 1
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 0,
                "writes": 2,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/feeGuide",
                "reads": 0,
                "writes": 1,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feeGuide/sync/firmEmployeeProductUpdater.ts",
                "line": 25,
                "op": "createMany"
              },
              {
                "file": "packages/api/src/modules/firms/service/setFirmEmployeeProductsOffered.ts",
                "line": 12,
                "op": "deleteMany"
              },
              {
                "file": "packages/api/src/modules/firms/service/setFirmEmployeeProductsOffered.ts",
                "line": 22,
                "op": "createMany"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/instructions",
                "n": 1
              },
              {
                "area": "api/solicitors",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One row per product a lawyer offers in one product area. This is the coverage list instruction matching filters on, keyed on all three ids with no id column of its own.",
          "keyFields": [],
          "references": [
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "The seat offering the product"
            },
            {
              "field": "productId",
              "target": "catalog",
              "meaning": "The product offered"
            },
            {
              "field": "productAreaId",
              "target": "catalog",
              "meaning": "The area it is offered in"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "composite-key"
          ]
        },
        {
          "key": "app/FirmEmployeesOfferingEveryProductInAreas",
          "name": "FirmEmployeesOfferingEveryProductInAreas",
          "table": null,
          "datastore": "app",
          "domain": "firms",
          "isView": true,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3202,
          "idPrefix": null,
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 2,
          "fields": [
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "productAreaIds",
              "type": "String",
              "list": true,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "firmEmployeeId",
            "productAreaIds"
          ],
          "relationsOut": [],
          "relationsIn": [],
          "crossDomainRelations": [],
          "usage": {
            "total": 1,
            "reads": 1,
            "writes": 0,
            "ops": {
              "findMany": 1
            },
            "byArea": [
              {
                "area": "api/feeGuide",
                "reads": 1,
                "writes": 0,
                "domain": "catalog",
                "kind": "api-module"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A Prisma view, one row per seat, listing the product areas where that seat covers every active product in the area. The feeGuide sync reads it to keep full-area coverage intact when the catalogue gains a product.",
          "keyFields": [
            {
              "name": "firmEmployeeId",
              "meaning": "The seat the row is about"
            },
            {
              "name": "productAreaIds",
              "meaning": "Areas where the seat offers every active product"
            }
          ],
          "references": [
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "The seat the row summarises"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "sql-view",
            "single-caller"
          ]
        }
      ]
    },
    {
      "id": "catalog",
      "order": 3,
      "groups": [],
      "name": "Catalogue: what Lawhive sells",
      "tagline": "Legal areas, products and priced templates, synced nightly from Contentful",
      "whatItIs": "The catalogue is the sellable menu: a ProductArea is a legal area like family or conveyancing, a Product is a job inside that area (\"sale of residential property\"), and a ProductOption is one priced way of doing that job, carrying its default line items, its default inclusions and exclusions, and a short name. Nobody edits any of this in the platform. Marketing writes it in Contentful and a nightly cron at /api/cron/update-fee-guide runs updateFeeGuide, which upserts every level by contentfulId and flips active to false on anything Contentful no longer publishes. What you can do here is read: the feeGuide router exposes getFeeGuide, listProductsInArea, listOptionsForProduct and getProductOption, all filtered to active rows, and that is what the quote composer reads when a lawyer or an admin prices a case. The domain also holds LegalForm, the list of OneAdvance form codes (D8, LRAP1, TR1 and the rest) pulled in by its own nightly Inngest job, plus LegalFormCaseArtifact, which records that a given case document was generated from a given form.",
      "howItConnects": "Quotes is the main consumer. A quote's QuoteProduct points at a Product and a ProductOption, its QuoteLineItems point at ProductOptionLineItems, and the option's inclusions and exclusions get expanded into quote scope items. ProductArea doubles as the legal area on QuoteProduct and HourlyFeeQuote. Firms links the supply side to the menu through FirmEmployeeToProductAndArea, and the fee-guide sync maintains those rows for lawyers marked as offering everything in an area. Legal forms reach into documents: when a workflow fills a form, the PDF becomes a CaseArtifact and LegalFormCaseArtifact ties it back to the form code with a filling score. The instant-assign and instant-export feature flags live outside Postgres in Vercel KV, keyed by the Contentful ids of the area and product, so the catalogue's contentfulId is what those flags are addressed by.",
      "lifecycle": null,
      "flows": [
        {
          "id": "contentful-sync",
          "title": "Nightly Contentful sync",
          "mermaid": "flowchart TD\n  CF[Contentful fee guide] --> CRON[cron update-fee-guide]\n  CRON --> A[upsert ProductArea]\n  A --> P[upsert Product]\n  P --> O[upsert ProductOption]\n  O --> LI[upsert ProductOptionLineItem]\n  CRON --> D[deactivate rows Contentful dropped]\n  CRON --> FE[link lawyers to new products]",
          "caption": "updateFeeGuide walks the four levels in order, matching on contentfulId, then sets active false on anything missing from Contentful or holding a null contentfulId."
        },
        {
          "id": "template-to-quote",
          "title": "Template to quote",
          "mermaid": "flowchart LR\n  PA[ProductArea] --> PR[Product]\n  PR --> PO[ProductOption]\n  PO --> POLI[ProductOptionLineItem]\n  PO --> QP[QuoteProduct]\n  PO --> SNAP[templateSnapshot json]\n  POLI --> QLI[QuoteLineItem]\n  PO --> SC[QuoteScopeItem inclusions and exclusions]",
          "caption": "createQuoteTransaction copies the chosen option into the quote: templateId keeps the pointer, templateSnapshot keeps a frozen copy, and defaultInclusions and defaultExclusions become scope items."
        },
        {
          "id": "legal-forms",
          "title": "OneAdvance forms to case documents",
          "mermaid": "flowchart TD\n  OA[OneAdvance getAllForms] --> LF[LegalForm upsert by code]\n  LF --> PRD[connected to Product by sku]\n  PRD --> CASE[forms offered on a case via its quote]\n  CASE --> FILL[form filled and rendered to PDF]\n  FILL --> CA[CaseArtifact filledForm]\n  CA --> LFCA[LegalFormCaseArtifact fillingScore]",
          "caption": "getForCaseId does not ask the case which forms it needs. It walks the case's quotes to their templateProduct and returns that product's legal forms."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "Postgres is downstream of Contentful for everything except LegalForm. Editing a name, price or slug in the platform database gets overwritten on the next nightly run, and a row with a null contentfulId is deactivated on sight."
        },
        {
          "kind": "status",
          "body": "The instant-assign and instant-export toggles are Vercel KV sets, not tables. instant:<areaContentfulId> is read by the v1 case import to decide auto assignment, instantExport:<areaContentfulId> plus a master instantExport:enabled key by the instant-export route."
        },
        {
          "kind": "status",
          "body": "LegalForm and LegalFormCaseArtifact both mint ids with the tm_ prefix, shared with at least one other model, so an id alone does not tell you which table it came from."
        },
        {
          "kind": "status",
          "body": "In createQuoteTransaction the line-item snapshot calls prisma.productOption.findUniqueOrThrow with the QuoteLineItem templateId, which is a ProductOptionLineItem id. Any line item sent with a templateId would throw, which suggests the composer never sends one."
        },
        {
          "kind": "companion",
          "body": "The domain map lists apps/platform/src/features/bundles as a catalogue area, but that code is the case document bundle wizard and touches no catalogue model."
        },
        {
          "kind": "misfiled",
          "body": "LegalFormCaseArtifact is per-case data, not catalogue data. It is one row per generated document, it is written by the formCompletion integration, and its unique key is a CaseArtifact id. Documents is a better home for it; LegalForm belongs here."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/feeGuide",
          "kind": "api-module",
          "label": "feeGuide",
          "path": "packages/api/src/modules/feeGuide",
          "files": 8,
          "prismaSites": 19,
          "procedures": {
            "queries": 6,
            "mutations": 0
          }
        },
        {
          "id": "api/instantProducts",
          "kind": "api-module",
          "label": "instantProducts",
          "path": "packages/api/src/modules/instantProducts",
          "files": 15,
          "prismaSites": 12,
          "procedures": {
            "queries": 3,
            "mutations": 5
          }
        },
        {
          "id": "api/legalForms",
          "kind": "api-module",
          "label": "legalForms",
          "path": "packages/api/src/modules/legalForms",
          "files": 16,
          "prismaSites": 10,
          "procedures": {
            "queries": 7,
            "mutations": 7
          }
        },
        {
          "id": "api/jurisdictions",
          "kind": "api-module",
          "label": "jurisdictions",
          "path": "packages/api/src/modules/jurisdictions",
          "files": 1,
          "prismaSites": 0,
          "procedures": {
            "queries": 0,
            "mutations": 0
          }
        },
        {
          "id": "pkg/scripts",
          "kind": "package",
          "label": "scripts",
          "path": "packages/scripts",
          "files": 11,
          "prismaSites": 25
        },
        {
          "id": "ui/bundles",
          "kind": "ui-feature",
          "label": "bundles",
          "path": "apps/platform/src/features/bundles",
          "files": 5,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/form_filling/form-field-override-enrichment",
            "namespace": "app",
            "area": "api/legalForms",
            "file": "packages/api/src/modules/legalForms/procedures/adminEnrichFormV2.ts",
            "line": 29,
            "live": "silent"
          },
          {
            "name": "app/legalForms/update.requested",
            "namespace": "app",
            "area": "api/legalForms",
            "file": "packages/api/src/modules/legalForms/procedures/updateLegalForms.ts",
            "line": 10,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/legalForms/update.requested",
            "namespace": "app",
            "area": "api/legalForms",
            "file": "packages/api/src/modules/legalForms/procedures/updateLegalForms.ts",
            "line": 15,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/legalForms/update.requested",
            "namespace": "app",
            "area": "api/legalForms",
            "file": "packages/api/src/modules/legalForms/procedures/updateLegalForms.ts",
            "line": 10,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "catalog"
            ],
            "consumers": [
              "catalog"
            ]
          }
        ]
      },
      "enums": [],
      "usage": {
        "reads": 51,
        "writes": 32
      },
      "models": [
        {
          "key": "app/ProductArea",
          "name": "ProductArea",
          "table": null,
          "datastore": "app",
          "domain": "catalog",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1207,
          "idPrefix": "prodarea_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "active",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "slug",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "products",
              "type": "Product",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Product",
              "onDelete": null
            },
            {
              "name": "quoteProducts",
              "type": "QuoteProduct",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteProduct",
              "onDelete": null
            },
            {
              "name": "hourlyFeeQuotes",
              "type": "HourlyFeeQuote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "HourlyFeeQuote",
              "onDelete": null
            },
            {
              "name": "contentfulId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "contentfulPublishedVersion",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployeesAndAreas",
              "type": "FirmEmployeeToProductAndArea",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeToProductAndArea",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "contentfulId"
          ],
          "relationsOut": [
            {
              "field": "products",
              "target": "Product",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Product",
              "targetDomain": "catalog"
            },
            {
              "field": "quoteProducts",
              "target": "QuoteProduct",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteProduct",
              "targetDomain": "quotes"
            },
            {
              "field": "hourlyFeeQuotes",
              "target": "HourlyFeeQuote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuote",
              "targetDomain": "quotes"
            },
            {
              "field": "firmEmployeesAndAreas",
              "target": "FirmEmployeeToProductAndArea",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeToProductAndArea",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployeeToProductAndArea",
              "field": "productArea",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeToProductAndArea",
              "sourceDomain": "firms"
            },
            {
              "model": "HourlyFeeQuote",
              "field": "legalArea",
              "fk": true,
              "list": false,
              "sourceKey": "app/HourlyFeeQuote",
              "sourceDomain": "quotes"
            },
            {
              "model": "Product",
              "field": "productAreas",
              "fk": false,
              "list": true,
              "sourceKey": "app/Product",
              "sourceDomain": "catalog"
            },
            {
              "model": "QuoteProduct",
              "field": "legalArea",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteProduct",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteProduct",
              "field": "quoteProducts"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "HourlyFeeQuote",
              "field": "hourlyFeeQuotes"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployeeToProductAndArea",
              "field": "firmEmployeesAndAreas"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployeeToProductAndArea",
              "field": "productArea"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "HourlyFeeQuote",
              "field": "legalArea"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteProduct",
              "field": "legalArea"
            }
          ],
          "usage": {
            "total": 29,
            "reads": 21,
            "writes": 8,
            "ops": {
              "findMany": 10,
              "findUnique": 3,
              "upsert": 5,
              "updateMany": 2,
              "findUniqueOrThrow": 7,
              "findFirst": 1,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/instantProducts",
                "reads": 7,
                "writes": 0,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "pkg/scripts",
                "reads": 3,
                "writes": 4,
                "domain": "catalog",
                "kind": "package"
              },
              {
                "area": "api/feeGuide",
                "reads": 3,
                "writes": 2,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 4,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "package"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/test-data",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 50,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 74,
                "op": "updateMany"
              },
              {
                "file": "packages/db/seed/feeGuide/index.ts",
                "line": 4,
                "op": "upsert"
              }
            ],
            "nested": 21,
            "nestedByArea": [
              {
                "area": "api/feeGuide",
                "n": 10
              },
              {
                "area": "ui/_app",
                "n": 2
              },
              {
                "area": "api/firms",
                "n": 2
              },
              {
                "area": "api/quotes",
                "n": 2
              },
              {
                "area": "pkg/scripts",
                "n": 2
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/instructions",
                "n": 1
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 10,
            "typeMentionsByArea": [
              {
                "area": "pkg/scripts",
                "n": 6
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One legal area Lawhive sells in, such as family or employment. It is both the top of the catalogue tree and the legal area stamped on quotes and on lawyer coverage.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "the area's display title, taken from the Contentful entry title"
            },
            {
              "name": "slug",
              "meaning": "url-safe handle used by the marketing site and quote links"
            },
            {
              "name": "active",
              "meaning": "false once Contentful stops publishing the entry; every read filters on active true"
            },
            {
              "name": "contentfulId",
              "meaning": "unique Contentful sys id, the match key for the nightly upsert and the KV flag key"
            },
            {
              "name": "contentfulPublishedVersion",
              "meaning": "Contentful publish version as a string, useful for spotting a stale sync"
            },
            {
              "name": "description",
              "meaning": "area blurb from Contentful, empty string when the entry has none"
            }
          ],
          "references": [
            {
              "field": "quoteProducts",
              "target": "quotes",
              "meaning": "quote products that name this area as their legal area"
            },
            {
              "field": "hourlyFeeQuotes",
              "target": "quotes",
              "meaning": "hourly-fee quotes priced in this area"
            },
            {
              "field": "firmEmployeesAndAreas",
              "target": "firms",
              "meaning": "which lawyers offer which products in this area"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/Product",
          "name": "Product",
          "table": null,
          "datastore": "app",
          "domain": "catalog",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1227,
          "idPrefix": "prodcat_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "active",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "slug",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "productOptions",
              "type": "ProductOption",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ProductOption",
              "onDelete": null
            },
            {
              "name": "productAreas",
              "type": "ProductArea",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ProductArea",
              "onDelete": null
            },
            {
              "name": "areasAndFirmEmployees",
              "type": "FirmEmployeeToProductAndArea",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeToProductAndArea",
              "onDelete": null
            },
            {
              "name": "contentfulId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "contentfulPublishedVersion",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quoteProducts",
              "type": "QuoteProduct",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteProduct",
              "onDelete": null
            },
            {
              "name": "legalForms",
              "type": "LegalForm",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LegalForm",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "contentfulId"
          ],
          "relationsOut": [
            {
              "field": "productOptions",
              "target": "ProductOption",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductOption",
              "targetDomain": "catalog"
            },
            {
              "field": "productAreas",
              "target": "ProductArea",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductArea",
              "targetDomain": "catalog"
            },
            {
              "field": "areasAndFirmEmployees",
              "target": "FirmEmployeeToProductAndArea",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeToProductAndArea",
              "targetDomain": "firms"
            },
            {
              "field": "quoteProducts",
              "target": "QuoteProduct",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteProduct",
              "targetDomain": "quotes"
            },
            {
              "field": "legalForms",
              "target": "LegalForm",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalForm",
              "targetDomain": "catalog"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployeeToProductAndArea",
              "field": "product",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeToProductAndArea",
              "sourceDomain": "firms"
            },
            {
              "model": "LegalForm",
              "field": "products",
              "fk": false,
              "list": true,
              "sourceKey": "app/LegalForm",
              "sourceDomain": "catalog"
            },
            {
              "model": "ProductArea",
              "field": "products",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductArea",
              "sourceDomain": "catalog"
            },
            {
              "model": "ProductOption",
              "field": "products",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductOption",
              "sourceDomain": "catalog"
            },
            {
              "model": "QuoteProduct",
              "field": "templateProduct",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteProduct",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployeeToProductAndArea",
              "field": "areasAndFirmEmployees"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteProduct",
              "field": "quoteProducts"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployeeToProductAndArea",
              "field": "product"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteProduct",
              "field": "templateProduct"
            }
          ],
          "usage": {
            "total": 21,
            "reads": 13,
            "writes": 8,
            "ops": {
              "findUnique": 3,
              "findMany": 5,
              "upsert": 4,
              "updateMany": 2,
              "findUniqueOrThrow": 5,
              "update": 2
            },
            "byArea": [
              {
                "area": "pkg/scripts",
                "reads": 3,
                "writes": 4,
                "domain": "catalog",
                "kind": "package"
              },
              {
                "area": "api/feeGuide",
                "reads": 3,
                "writes": 2,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/instantProducts",
                "reads": 5,
                "writes": 0,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/legalForms",
                "reads": 1,
                "writes": 1,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 112,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 143,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/legalForms/procedures/connectSkusToLegalForms.ts",
                "line": 23,
                "op": "update"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/instructions",
                "n": 1
              },
              {
                "area": "api/legalForms",
                "n": 1
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 1
              }
            ],
            "typeMentions": 27,
            "typeMentionsByArea": [
              {
                "area": "pkg/shared",
                "n": 9
              },
              {
                "area": "pkg/scripts",
                "n": 7
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "pkg/ui",
                "n": 3
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "api/instructions",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One job a client can buy inside one or more legal areas, for example \"sale of residential property\" or \"divorce\". It groups the priced options and carries the OneAdvance forms that job needs.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "what the job is called to clients and lawyers"
            },
            {
              "name": "slug",
              "meaning": "the sku. connectSkusToLegalForms matches products by slug to attach form codes"
            },
            {
              "name": "active",
              "meaning": "false once Contentful drops the product or the product has no linked area"
            },
            {
              "name": "contentfulId",
              "meaning": "unique Contentful sys id, the upsert key and the KV instant-flag member"
            },
            {
              "name": "description",
              "meaning": "optional product blurb from Contentful"
            }
          ],
          "references": [
            {
              "field": "productAreas",
              "target": "catalog",
              "meaning": "the areas this product appears under, set from Contentful back-links"
            },
            {
              "field": "legalForms",
              "target": "catalog",
              "meaning": "OneAdvance forms this job may need, attached by sku"
            },
            {
              "field": "quoteProducts",
              "target": "quotes",
              "meaning": "quote products created from this product"
            },
            {
              "field": "areasAndFirmEmployees",
              "target": "firms",
              "meaning": "lawyers who offer this product in a given area"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/ProductOption",
          "name": "ProductOption",
          "table": null,
          "datastore": "app",
          "domain": "catalog",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1249,
          "idPrefix": "prodtmpl_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "active",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "slug",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "shortName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "defaultLineItems",
              "type": "ProductOptionLineItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ProductOptionLineItem",
              "onDelete": null
            },
            {
              "name": "defaultInclusions",
              "type": "String",
              "list": true,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "defaultExclusions",
              "type": "String",
              "list": true,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "expectedDuration",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "products",
              "type": "Product",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Product",
              "onDelete": null
            },
            {
              "name": "quoteProduct",
              "type": "QuoteProduct",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteProduct",
              "onDelete": null
            },
            {
              "name": "contentfulId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "contentfulPublishedVersion",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "contentfulId"
          ],
          "relationsOut": [
            {
              "field": "defaultLineItems",
              "target": "ProductOptionLineItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductOptionLineItem",
              "targetDomain": "catalog"
            },
            {
              "field": "products",
              "target": "Product",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Product",
              "targetDomain": "catalog"
            },
            {
              "field": "quoteProduct",
              "target": "QuoteProduct",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteProduct",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "Product",
              "field": "productOptions",
              "fk": false,
              "list": true,
              "sourceKey": "app/Product",
              "sourceDomain": "catalog"
            },
            {
              "model": "ProductOptionLineItem",
              "field": "productOptions",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductOptionLineItem",
              "sourceDomain": "catalog"
            },
            {
              "model": "QuoteProduct",
              "field": "template",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteProduct",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteProduct",
              "field": "quoteProduct"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteProduct",
              "field": "template"
            }
          ],
          "usage": {
            "total": 19,
            "reads": 11,
            "writes": 8,
            "ops": {
              "findUnique": 3,
              "findMany": 5,
              "findUniqueOrThrow": 3,
              "upsert": 5,
              "updateMany": 2,
              "update": 1
            },
            "byArea": [
              {
                "area": "pkg/scripts",
                "reads": 3,
                "writes": 4,
                "domain": "catalog",
                "kind": "package"
              },
              {
                "area": "api/feeGuide",
                "reads": 4,
                "writes": 2,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/quotes",
                "reads": 2,
                "writes": 0,
                "domain": "quotes",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "package"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/search",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 174,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 221,
                "op": "updateMany"
              },
              {
                "file": "packages/db/seed/feeGuide/index.ts",
                "line": 29,
                "op": "upsert"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/feeGuide",
                "n": 3
              },
              {
                "area": "pkg/scripts",
                "n": 2
              }
            ],
            "typeMentions": 8,
            "typeMentionsByArea": [
              {
                "area": "pkg/scripts",
                "n": 6
              },
              {
                "area": "api/_integrations",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One priced way of doing a product, the thing Contentful calls a product variant. It is the template a quote is built from: default line items, default inclusions and exclusions, and a short name for the quote card.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "the option title, for example \"fixed fee, freehold, no mortgage\""
            },
            {
              "name": "shortName",
              "meaning": "compact label used where the full option name is too long"
            },
            {
              "name": "defaultInclusions",
              "meaning": "strings that become inclusion scope items on the quote"
            },
            {
              "name": "defaultExclusions",
              "meaning": "strings that become exclusion scope items on the quote"
            },
            {
              "name": "active",
              "meaning": "false once Contentful drops the variant; getProductOption refuses inactive options"
            },
            {
              "name": "expectedDuration",
              "meaning": "nullable ISO duration. Nothing in the codebase writes it; quotes carry their own duration"
            },
            {
              "name": "contentfulId",
              "meaning": "unique Contentful sys id, the upsert key"
            }
          ],
          "references": [
            {
              "field": "products",
              "target": "catalog",
              "meaning": "the products this option prices, set from Contentful back-links"
            },
            {
              "field": "defaultLineItems",
              "target": "catalog",
              "meaning": "the priced lines that make up the option"
            },
            {
              "field": "quoteProduct",
              "target": "quotes",
              "meaning": "quote products whose template is this option"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "unwritten-field:expectedDuration"
          ]
        },
        {
          "key": "app/ProductOptionLineItem",
          "name": "ProductOptionLineItem",
          "table": null,
          "datastore": "app",
          "domain": "catalog",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1270,
          "idPrefix": "prodtmplli_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "LineItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "productOptions",
              "type": "ProductOption",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ProductOption",
              "onDelete": null
            },
            {
              "name": "quoteLineItem",
              "type": "QuoteLineItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteLineItem",
              "onDelete": null
            },
            {
              "name": "contentfulId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "contentfulPublishedVersion",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "contentfulId"
          ],
          "relationsOut": [
            {
              "field": "productOptions",
              "target": "ProductOption",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductOption",
              "targetDomain": "catalog"
            },
            {
              "field": "quoteLineItem",
              "target": "QuoteLineItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteLineItem",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "ProductOption",
              "field": "defaultLineItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductOption",
              "sourceDomain": "catalog"
            },
            {
              "model": "QuoteLineItem",
              "field": "template",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteLineItem",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteLineItem",
              "field": "quoteLineItem"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteLineItem",
              "field": "template"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 2,
            "writes": 3,
            "ops": {
              "upsert": 2,
              "findFirst": 1,
              "findMany": 1,
              "update": 1
            },
            "byArea": [
              {
                "area": "pkg/scripts",
                "reads": 2,
                "writes": 2,
                "domain": "catalog",
                "kind": "package"
              },
              {
                "area": "api/feeGuide",
                "reads": 0,
                "writes": 1,
                "domain": "catalog",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feeGuide/sync/updateFeeGuide.ts",
                "line": 254,
                "op": "upsert"
              },
              {
                "file": "packages/scripts/fee-guide/sync-contentful-ids.ts",
                "line": 504,
                "op": "update"
              },
              {
                "file": "packages/scripts/fee-guide/update-fee-guide.ts",
                "line": 221,
                "op": "upsert"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "pkg/db",
                "n": 2
              },
              {
                "area": "pkg/scripts",
                "n": 2
              }
            ],
            "typeMentions": 4,
            "typeMentionsByArea": [
              {
                "area": "pkg/scripts",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One default priced line on a product option, either a fee or a disbursement. It is where the catalogue's money actually lives, and it is copied into a quote as a QuoteLineItem.",
          "keyFields": [
            {
              "name": "description",
              "meaning": "what the client is being charged for, taken from the Contentful line item name"
            },
            {
              "name": "amount",
              "meaning": "pence. Fees are stored ex VAT (Contentful price divided by 1.2), disbursements as given"
            },
            {
              "name": "type",
              "meaning": "fee or disbursement; drives the VAT handling and the follow-on fee modifier"
            },
            {
              "name": "currency",
              "meaning": "always gbp, the only value the Currency enum has"
            },
            {
              "name": "contentfulId",
              "meaning": "unique Contentful sys id, the upsert key"
            }
          ],
          "references": [
            {
              "field": "productOptions",
              "target": "catalog",
              "meaning": "the options that include this line, set from Contentful back-links"
            },
            {
              "field": "quoteLineItem",
              "target": "quotes",
              "meaning": "quote lines created from this default"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/LegalForm",
          "name": "LegalForm",
          "table": null,
          "datastore": "app",
          "domain": "catalog",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3085,
          "idPrefix": "tm_",
          "idPrefixShared": [
            "app/LegalFormCaseArtifact",
            "app/TeamMember"
          ],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "code",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "This is at the moment a OneAdvance unique code",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "human readable name",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "LegalFormCaseArtifact",
              "type": "LegalFormCaseArtifact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LegalFormCaseArtifact",
              "onDelete": null
            },
            {
              "name": "metadata",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "active",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "products",
              "type": "Product",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Product",
              "onDelete": null
            },
            {
              "name": "previewPdfBase64",
              "type": "Bytes",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "previewPdfBase64UpdatedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "formFieldsStaging",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([code])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "LegalFormCaseArtifact",
              "target": "LegalFormCaseArtifact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalFormCaseArtifact",
              "targetDomain": "catalog"
            },
            {
              "field": "products",
              "target": "Product",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Product",
              "targetDomain": "catalog"
            }
          ],
          "relationsIn": [
            {
              "model": "LegalFormCaseArtifact",
              "field": "legalForm",
              "fk": true,
              "list": false,
              "sourceKey": "app/LegalFormCaseArtifact",
              "sourceDomain": "catalog"
            },
            {
              "model": "Product",
              "field": "legalForms",
              "fk": false,
              "list": true,
              "sourceKey": "app/Product",
              "sourceDomain": "catalog"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 8,
            "reads": 4,
            "writes": 4,
            "ops": {
              "findFirstOrThrow": 1,
              "update": 2,
              "findMany": 2,
              "findUnique": 1,
              "upsert": 1,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/legalForms",
                "reads": 3,
                "writes": 4,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/legalForms/procedures/adminSaveFieldMap.ts",
                "line": 18,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/legalForms/procedures/generatePreview.ts",
                "line": 53,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/legalForms/procedures/updateLegalForms.ts",
                "line": 36,
                "op": "upsert"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/legalForms",
                "n": 1
              }
            ],
            "typeMentions": 6,
            "typeMentionsByArea": [
              {
                "area": "ui/ai",
                "n": 6
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One court or Land Registry form Lawhive can fill for a client, identified by its OneAdvance code such as D8 or LRAP1. A nightly Inngest job (app/legalForms/update.requested, also on a midnight cron) upserts the list from OneAdvance and deactivates codes that vanish.",
          "keyFields": [
            {
              "name": "code",
              "meaning": "the OneAdvance form code, unique, and the key everything else joins on"
            },
            {
              "name": "name",
              "meaning": "human readable description from OneAdvance, nullable"
            },
            {
              "name": "metadata",
              "meaning": "the raw OneAdvance form payload, stored whole"
            },
            {
              "name": "active",
              "meaning": "false once OneAdvance stops listing the code"
            },
            {
              "name": "previewPdfBase64",
              "meaning": "cached blank rendering of the form, refreshed when older than two weeks"
            },
            {
              "name": "formFieldsStaging",
              "meaning": "admin-edited field map, saved by adminSaveFieldMap before it goes live"
            }
          ],
          "references": [
            {
              "field": "products",
              "target": "catalog",
              "meaning": "the products this form belongs to, wired up by connectSkusToLegalForms"
            },
            {
              "field": "LegalFormCaseArtifact",
              "target": "catalog",
              "meaning": "filled instances of this form on cases"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "shared-id-prefix"
          ]
        },
        {
          "key": "app/LegalFormCaseArtifact",
          "name": "LegalFormCaseArtifact",
          "table": null,
          "datastore": "app",
          "domain": "catalog",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3110,
          "idPrefix": "tm_",
          "idPrefixShared": [
            "app/LegalForm",
            "app/TeamMember"
          ],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalForm",
              "type": "LegalForm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "LegalForm",
              "onDelete": null
            },
            {
              "name": "legalFormId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseArtifact",
              "type": "CaseArtifact",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseArtifact",
              "onDelete": null
            },
            {
              "name": "caseArtifactId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "fillingScore",
              "type": "Float",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "legalForm",
              "target": "LegalForm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "legalFormId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalForm",
              "targetDomain": "catalog"
            },
            {
              "field": "caseArtifact",
              "target": "CaseArtifact",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseArtifactId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseArtifact",
              "targetDomain": "documents"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseArtifact",
              "field": "LegalFormCaseArtifact",
              "fk": false,
              "list": false,
              "sourceKey": "app/CaseArtifact",
              "sourceDomain": "documents"
            },
            {
              "model": "LegalForm",
              "field": "LegalFormCaseArtifact",
              "fk": false,
              "list": true,
              "sourceKey": "app/LegalForm",
              "sourceDomain": "catalog"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseArtifact",
              "field": "caseArtifact"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseArtifact",
              "field": "LegalFormCaseArtifact"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/inngest/formCompletion/common.ts",
                "line": 80,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The record that one case document was generated from one legal form, with how completely it got filled. Written in a single place, saveCaseArtefact in the formCompletion Inngest integration, right after the CaseArtifact is published.",
          "keyFields": [
            {
              "name": "fillingScore",
              "meaning": "how much of the form the filler managed to complete, read back by getFillingStatusByCaseArtifactId"
            },
            {
              "name": "caseArtifactId",
              "meaning": "unique, so a case artifact maps to at most one form"
            }
          ],
          "references": [
            {
              "field": "legalFormId",
              "target": "catalog",
              "meaning": "the form code this document was rendered from"
            },
            {
              "field": "caseArtifactId",
              "target": "documents",
              "meaning": "the generated CaseArtifact holding the filled PDF"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "shared-id-prefix"
          ]
        }
      ]
    },
    {
      "id": "consultations",
      "order": 4,
      "groups": [],
      "name": "Consultations: the first conversation",
      "tagline": "The free assessment call: a client's problem, a lawyer who takes it, the outcome",
      "whatItIs": "Every matter at Lawhive starts with a free assessment call. A client describes their problem and gives the times they can talk, which is an AssessmentRequest plus a set of AvailabilityWindow rows. A Lawhive admin then fans that request out to one or more solicitors, one AssessmentRequestAssignment each, with a six hour expiry by default. The first solicitor to accept picks a slot that has to fall inside the client's windows, and the accept creates a Meeting with a booked MeetingBooking and an Assessment in AWAITING_ASSESSMENT. All the other assignments are expired on the spot. After the call the lawyer either writes a quote or dismisses the assessment with a reason. Admins can also reschedule (which wipes the windows and asks the client again), cancel the request, or hand the request back to v1.",
      "howItConnects": "This is the front door to Quotes and Cases. Assessment holds a unique quoteId and a unique caseId, so it is the record that ties one consultation to the quote the lawyer wrote and the Case that opened from it. Quotes calls linkQuoteToAssessment on quote creation and Cases calls linkCaseToAssessment when a solicitor opens a case from an assessment, which is what flips the assessment to CASE_OPENED. The client side comes from People (Customer and Person) and the supply side from Firms and People (Solicitor for the offer, FirmEmployee for whoever actually takes the call). Accepting also creates a FirmEmployeeClient in Firms. Nothing in the product creates an AssessmentRequest from scratch: the only writer is the v1 assessment-call importer, so the whole domain is fed by the old system. Notifications go out through Knock (assessmentAssigned, assessmentRequestAvailabilityRequested, meetingBooked) and admin nudges through Slack.",
      "lifecycle": "PENDING_AVAILABILITY_SELECTION → PENDING_SOLICITOR_SELECTION → PENDING_SOLICITOR_ACCEPTANCE → ASSIGNED → AWAITING_ASSESSMENT → CASE_OPENED / DISMISSED",
      "flows": [
        {
          "id": "request-to-assessment",
          "title": "From a v1 call to a booked assessment",
          "mermaid": "flowchart TD\n  V1[\"v1 assessment call\"] --> AR[\"AssessmentRequest\"]\n  AR --> NEED{\"windows already known?\"}\n  NEED -->|no| ASK[\"client picks times\"]\n  ASK --> AW[\"AvailabilityWindow rows\"]\n  NEED -->|yes| AW\n  AW --> FAN[\"admin fans out to solicitors\"]\n  FAN --> ASRA[\"AssessmentRequestAssignment, 6h expiry\"]\n  ASRA -->|accepts a slot inside the windows| MB[\"Meeting + booked MeetingBooking\"]\n  MB --> AS[\"Assessment, AWAITING_ASSESSMENT\"]\n  ASRA -->|rejects or expires| FAN",
          "caption": "beginImport creates the request, setAssessmentRequestAvailability connects the windows, assignRequestToSolicitor creates the offers, acceptRequest does the rest in one pass."
        },
        {
          "id": "assessment-outcome",
          "title": "What the call turns into",
          "mermaid": "flowchart LR\n  AS[\"Assessment, AWAITING_ASSESSMENT\"] -->|lawyer writes a quote| Q[\"quoteId set\"]\n  Q -->|case opened from the assessment| C[\"CASE_OPENED, caseId set\"]\n  AS -->|lawyer dismisses with a reason| D[\"DISMISSED\"]\n  AS -->|admin cancels the request| X[\"CANCELLED\"]",
          "caption": "A quote alone does not move the status. Only linkCaseToAssessment sets CASE_OPENED, and an admin can reset a DISMISSED assessment back to AWAITING_ASSESSMENT."
        }
      ],
      "notes": [
        {
          "kind": "legacy",
          "body": "The domain is entirely v1-fed. The only code that creates an AssessmentRequest is packages/api/src/integrations/v1/assessmentCalls/beginImport.ts, which pulls the lead and their chosen times out of v1 and stamps importedFromV1AssessmentCallId. Acceptance calls back with markCallExported, and an admin can return an unaccepted request with returnAssessmentRequestToV1, which cancels the pending assignments and resets the call in v1."
        },
        {
          "kind": "status",
          "body": "Dead corners: AssessmentRequest.privateNotes is never read or written outside the generated zod schemas, AssessmentRequestAssignment.rejectedAt is rendered in the admin and platform UIs but never set by rejectRequest, and the MeetingBookingStatus values AWAITING_WINDOWS and AWAITING_SLOT appear only in a unit test. Bookings are created BOOKED and only ever move to CANCELLED."
        },
        {
          "kind": "duplication",
          "body": "AvailabilityWindow is globally deduplicated by @@unique([startDate, duration]) and upserted through getOrCreateAvailabilityWindow, so one row is shared by unrelated requests and bookings. Rescheduling does not delete windows, it disconnects them with availabilityWindows: { set: [] }, which leaves orphans behind."
        },
        {
          "kind": "companion",
          "body": "Meeting and MeetingBooking read as a general scheduling primitive, but in v2 the only MeetingType is call and the only thing that creates one is assessment acceptance. Consultation bookings on live cases go through Calendly instead: the webhook at apps/platform/src/pages/api/webhook/calendly.ts emits webhooks/calendly/invitee.created, and the workflows-v2 handler writes a case note rather than a Meeting."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/assessments",
          "kind": "api-module",
          "label": "assessments",
          "path": "packages/api/src/modules/assessments",
          "files": 40,
          "prismaSites": 44,
          "procedures": {
            "queries": 4,
            "mutations": 7
          }
        },
        {
          "id": "api/meetings",
          "kind": "api-module",
          "label": "meetings",
          "path": "packages/api/src/modules/meetings",
          "files": 16,
          "prismaSites": 8,
          "procedures": {
            "queries": 2,
            "mutations": 1
          }
        },
        {
          "id": "ui/assessments",
          "kind": "ui-feature",
          "label": "assessments",
          "path": "apps/platform/src/features/assessments",
          "files": 18,
          "prismaSites": 0
        },
        {
          "id": "ui/meetings",
          "kind": "ui-feature",
          "label": "meetings",
          "path": "apps/platform/src/features/meetings",
          "files": 13,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [],
        "consumes": [],
        "owns": [
          {
            "name": "webhooks/calendly/invitee.created",
            "namespace": "webhooks",
            "area": "ui/_app",
            "file": "apps/platform/src/pages/api/webhook/calendly.ts",
            "line": 13,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "ai"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "AssessmentRequestAssignmentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2771,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "accepted",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            },
            {
              "name": "expired",
              "doc": null
            },
            {
              "name": "processing",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "AssessmentRequestAssignment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "AssessmentRequestStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2719,
          "doc": null,
          "values": [
            {
              "name": "pending_availability_selection",
              "doc": null
            },
            {
              "name": "pending_solicitor_selection",
              "doc": null
            },
            {
              "name": "pending_solicitor_acceptance",
              "doc": null
            },
            {
              "name": "assigned",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            },
            {
              "name": "processing",
              "doc": null
            }
          ],
          "usedBy": [
            "AssessmentRequest"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "AssessmentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2809,
          "doc": null,
          "values": [
            {
              "name": "awaiting_assessment",
              "doc": null
            },
            {
              "name": "case_opened",
              "doc": null
            },
            {
              "name": "dismissed",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "Assessment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "MeetingBookingStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2858,
          "doc": null,
          "values": [
            {
              "name": "awaiting_windows",
              "doc": null
            },
            {
              "name": "awaiting_slot",
              "doc": null
            },
            {
              "name": "booked",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "MeetingBooking"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "MeetingType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2837,
          "doc": null,
          "values": [
            {
              "name": "call",
              "doc": null
            }
          ],
          "usedBy": [
            "Meeting"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 39,
        "writes": 29
      },
      "models": [
        {
          "key": "app/AssessmentRequest",
          "name": "AssessmentRequest",
          "table": null,
          "datastore": "app",
          "domain": "consultations",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2697,
          "idPrefix": "asr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "problemDescription",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "privateNotes",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "availabilityWindows",
              "type": "AvailabilityWindow",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AvailabilityWindow",
              "onDelete": null
            },
            {
              "name": "status",
              "type": "AssessmentRequestStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignments",
              "type": "AssessmentRequestAssignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AssessmentRequestAssignment",
              "onDelete": null
            },
            {
              "name": "assessment",
              "type": "Assessment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Assessment",
              "onDelete": null
            },
            {
              "name": "importedFromV1AssessmentCallId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "importedFromV1AssessmentCallId"
          ],
          "relationsOut": [
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "availabilityWindows",
              "target": "AvailabilityWindow",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AvailabilityWindow",
              "targetDomain": "consultations"
            },
            {
              "field": "assignments",
              "target": "AssessmentRequestAssignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequestAssignment",
              "targetDomain": "consultations"
            },
            {
              "field": "assessment",
              "target": "Assessment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Assessment",
              "targetDomain": "consultations"
            }
          ],
          "relationsIn": [
            {
              "model": "Assessment",
              "field": "request",
              "fk": true,
              "list": false,
              "sourceKey": "app/Assessment",
              "sourceDomain": "consultations"
            },
            {
              "model": "AssessmentRequestAssignment",
              "field": "assessmentRequest",
              "fk": true,
              "list": false,
              "sourceKey": "app/AssessmentRequestAssignment",
              "sourceDomain": "consultations"
            },
            {
              "model": "AvailabilityWindow",
              "field": "assessmentRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/AvailabilityWindow",
              "sourceDomain": "consultations"
            },
            {
              "model": "Customer",
              "field": "assessmentRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "assessmentRequests"
            }
          ],
          "usage": {
            "total": 22,
            "reads": 12,
            "writes": 10,
            "ops": {
              "findUniqueOrThrow": 4,
              "findMany": 3,
              "update": 9,
              "findUnique": 3,
              "create": 1,
              "findFirstOrThrow": 2
            },
            "byArea": [
              {
                "area": "api/assessments",
                "reads": 7,
                "writes": 9,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_utils",
                "reads": 1,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/procedures/adminCancelAssessmentRequest.ts",
                "line": 56,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/service/acceptRequest.ts",
                "line": 132,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/service/assignRequestToSolicitor.ts",
                "line": 49,
                "op": "update"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/assessments",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/assessments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One client asking for a free assessment call: the problem in their own words plus the times they can talk. It is the unit an admin assigns to lawyers.",
          "keyFields": [
            {
              "name": "problemDescription",
              "meaning": "the client's own account of the legal problem, copied from the v1 call details"
            },
            {
              "name": "status",
              "meaning": "where the request is between the client picking times and a lawyer taking it"
            },
            {
              "name": "importedFromV1AssessmentCallId",
              "meaning": "the v1 assessment call this came from, set on every request created today"
            },
            {
              "name": "privateNotes",
              "meaning": "internal notes field, never read or written by any code"
            }
          ],
          "references": [
            {
              "field": "customerId",
              "target": "people",
              "meaning": "the client who wants the call"
            }
          ],
          "lifecycle": "PENDING_AVAILABILITY_SELECTION → PENDING_SOLICITOR_SELECTION → PENDING_SOLICITOR_ACCEPTANCE → ASSIGNED, or CANCELLED. PROCESSING is a short lock held while an accept or reject runs",
          "grouped": [],
          "flags": [
            "v1-fed"
          ]
        },
        {
          "key": "app/AssessmentRequestAssignment",
          "name": "AssessmentRequestAssignment",
          "table": null,
          "datastore": "app",
          "domain": "consultations",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2740,
          "idPrefix": "asra_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 17,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assessmentRequest",
              "type": "AssessmentRequest",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "AssessmentRequest",
              "onDelete": null
            },
            {
              "name": "assessmentRequestId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "AssessmentRequestAssignmentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "Solicitor",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "solicitorId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "expiresAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "acceptedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "acceptedStartTime",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "acceptedDuration",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rejectedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rejectionReason",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rejectionDetails",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignedBy",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "assignedById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([assessmentRequestId])",
            "@@index([solicitorId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "assessmentRequest",
              "target": "AssessmentRequest",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "assessmentRequestId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequest",
              "targetDomain": "consultations"
            },
            {
              "field": "solicitor",
              "target": "Solicitor",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "solicitorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            },
            {
              "field": "assignedBy",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "assignedById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "assignedAssessmentRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "AssessmentRequest",
              "field": "assignments",
              "fk": false,
              "list": true,
              "sourceKey": "app/AssessmentRequest",
              "sourceDomain": "consultations"
            },
            {
              "model": "Solicitor",
              "field": "assessmentRequestAssignments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Solicitor",
              "field": "solicitor"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "assignedBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "assignedAssessmentRequests"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Solicitor",
              "field": "assessmentRequestAssignments"
            }
          ],
          "usage": {
            "total": 15,
            "reads": 8,
            "writes": 7,
            "ops": {
              "findMany": 4,
              "findUnique": 1,
              "findUniqueOrThrow": 3,
              "update": 4,
              "create": 2,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/assessments",
                "reads": 5,
                "writes": 5,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_utils",
                "reads": 1,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/service/acceptRequest.ts",
                "line": 117,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/service/assignRequestToSolicitor.ts",
                "line": 26,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/service/cancelAssessmentRequestAssignment.ts",
                "line": 16,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/assessments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One offer of a request to one solicitor, with a deadline. Several go out at once and the first acceptance wins, so the rest get expired.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PENDING until the solicitor answers, then ACCEPTED, REJECTED, EXPIRED or CANCELLED"
            },
            {
              "name": "expiresAt",
              "meaning": "six hours after creation unless the caller overrides it; a cron sweeps past-due PENDING rows"
            },
            {
              "name": "acceptedStartTime",
              "meaning": "the slot the accepting lawyer picked, which must sit inside the client's windows"
            },
            {
              "name": "acceptedDuration",
              "meaning": "ISO duration of the accepted slot, mirrored onto the MeetingBooking"
            },
            {
              "name": "rejectionReason",
              "meaning": "why the lawyer passed; cancellations reuse rejectionDetails for the admin's reason"
            }
          ],
          "references": [
            {
              "field": "assessmentRequestId",
              "target": "consultations",
              "meaning": "the request being offered"
            },
            {
              "field": "solicitorId",
              "target": "people",
              "meaning": "the solicitor the offer went to, notified via Knock"
            },
            {
              "field": "assignedById",
              "target": "people",
              "meaning": "the Lawhive admin who sent the offer; there is no automatic assignment here"
            }
          ],
          "lifecycle": "PENDING → ACCEPTED / REJECTED / EXPIRED / CANCELLED",
          "grouped": [],
          "flags": [
            "expiry-swept"
          ]
        },
        {
          "key": "app/Assessment",
          "name": "Assessment",
          "table": null,
          "datastore": "app",
          "domain": "consultations",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2780,
          "idPrefix": "as_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 18,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "AssessmentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "meeting",
              "type": "Meeting",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Meeting",
              "onDelete": null
            },
            {
              "name": "meetingId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "dismissReason",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "dismissDetail",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "request",
              "type": "AssessmentRequest",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "AssessmentRequest",
              "onDelete": null
            },
            {
              "name": "requestId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "meeting",
              "target": "Meeting",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "meetingId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Meeting",
              "targetDomain": "consultations"
            },
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "request",
              "target": "AssessmentRequest",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequest",
              "targetDomain": "consultations"
            }
          ],
          "relationsIn": [
            {
              "model": "AssessmentRequest",
              "field": "assessment",
              "fk": false,
              "list": false,
              "sourceKey": "app/AssessmentRequest",
              "sourceDomain": "consultations"
            },
            {
              "model": "Case",
              "field": "assessment",
              "fk": false,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Customer",
              "field": "assessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "FirmEmployee",
              "field": "assessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Meeting",
              "field": "assessment",
              "fk": false,
              "list": false,
              "sourceKey": "app/Meeting",
              "sourceDomain": "consultations"
            },
            {
              "model": "Quote",
              "field": "assessment",
              "fk": false,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quote"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "assessment"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "assessments"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "assessments"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "assessment"
            }
          ],
          "usage": {
            "total": 17,
            "reads": 11,
            "writes": 6,
            "ops": {
              "findUnique": 5,
              "update": 5,
              "findMany": 2,
              "create": 1,
              "findFirst": 2,
              "findUniqueOrThrow": 2
            },
            "byArea": [
              {
                "area": "api/assessments",
                "reads": 7,
                "writes": 6,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 2,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/assessments/assessmentRequests/procedures/adminCancelAssessmentRequest.ts",
                "line": 50,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/assessments/service/createAssessment.ts",
                "line": 20,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/assessments/service/dismissAssessment.ts",
                "line": 47,
                "op": "update"
              }
            ],
            "nested": 7,
            "nestedByArea": [
              {
                "area": "api/assessments",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/go",
                "n": 1
              },
              {
                "area": "api/solicitors",
                "n": 1
              }
            ],
            "typeMentions": 86,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 26
              },
              {
                "area": "admin",
                "n": 16
              },
              {
                "area": "ui/assessments",
                "n": 12
              },
              {
                "area": "ui/_app",
                "n": 12
              },
              {
                "area": "api/assessments",
                "n": 11
              },
              {
                "area": "ui/feedOfWork",
                "n": 3
              },
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "ui/client",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The consultation itself once a lawyer has taken it: who is on the call, when, and what came out of it. One per AssessmentRequest.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "AWAITING_ASSESSMENT until the outcome lands, then CASE_OPENED, DISMISSED or CANCELLED"
            },
            {
              "name": "dismissReason",
              "meaning": "noResponse, notLegalMatter, outsideAreaOfPractice, tooBusy or other"
            },
            {
              "name": "dismissDetail",
              "meaning": "free text the lawyer adds when the reason is other; cleared by an admin reset"
            }
          ],
          "references": [
            {
              "field": "requestId",
              "target": "consultations",
              "meaning": "the request this answers, unique so a request has at most one assessment"
            },
            {
              "field": "meetingId",
              "target": "consultations",
              "meaning": "the scheduled call, unique per assessment"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the lawyer who accepted and runs the call"
            },
            {
              "field": "customerId",
              "target": "people",
              "meaning": "the client on the call"
            },
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "the quote written off the back of the call, set by linkQuoteToAssessment"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case opened from the call, set together with CASE_OPENED"
            }
          ],
          "lifecycle": "AWAITING_ASSESSMENT → CASE_OPENED / DISMISSED / CANCELLED, and an admin can reset DISMISSED back to AWAITING_ASSESSMENT",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/AvailabilityWindow",
          "name": "AvailabilityWindow",
          "table": null,
          "datastore": "app",
          "domain": "consultations",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2728,
          "idPrefix": "availwin_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 5,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "startDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "duration",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assessmentRequests",
              "type": "AssessmentRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AssessmentRequest",
              "onDelete": null
            },
            {
              "name": "meetingBookings",
              "type": "MeetingBooking",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "MeetingBooking",
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([startDate, duration])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "assessmentRequests",
              "target": "AssessmentRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AssessmentRequest",
              "targetDomain": "consultations"
            },
            {
              "field": "meetingBookings",
              "target": "MeetingBooking",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/MeetingBooking",
              "targetDomain": "consultations"
            }
          ],
          "relationsIn": [
            {
              "model": "AssessmentRequest",
              "field": "availabilityWindows",
              "fk": false,
              "list": true,
              "sourceKey": "app/AssessmentRequest",
              "sourceDomain": "consultations"
            },
            {
              "model": "MeetingBooking",
              "field": "availabilityWindows",
              "fk": false,
              "list": true,
              "sourceKey": "app/MeetingBooking",
              "sourceDomain": "consultations"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 2,
            "reads": 0,
            "writes": 2,
            "ops": {
              "upsert": 2
            },
            "byArea": [
              {
                "area": "api/meetings",
                "reads": 0,
                "writes": 1,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/meetings/utils.ts",
                "line": 21,
                "op": "upsert"
              },
              {
                "file": "packages/db/seed/assessmentRequest/index.ts",
                "line": 27,
                "op": "upsert"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/assessments",
                "n": 3
              },
              {
                "area": "api/meetings",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 37,
            "typeMentionsByArea": [
              {
                "area": "ui/meetings",
                "n": 20
              },
              {
                "area": "api/assessments",
                "n": 6
              },
              {
                "area": "ui/assessments",
                "n": 3
              },
              {
                "area": "ui/instructions",
                "n": 2
              },
              {
                "area": "api/meetings",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 2
              },
              {
                "area": "pkg/shared",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A block of time someone is free, held as a start plus an ISO duration. Rows are shared, not owned: the same start and duration is one row across every request and booking that uses it.",
          "keyFields": [
            {
              "name": "startDate",
              "meaning": "when the window opens; weekend and bank-holiday windows are filtered out before use"
            },
            {
              "name": "duration",
              "meaning": "ISO duration, PT2H for windows imported from v1"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "shared-row",
            "upsert-only"
          ]
        },
        {
          "key": "app/Meeting",
          "name": "Meeting",
          "table": null,
          "datastore": "app",
          "domain": "consultations",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2816,
          "idPrefix": "meet_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "title",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hostPerson",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "hostPersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "attendeePerson",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "attendeePersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assessment",
              "type": "Assessment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Assessment",
              "onDelete": null
            },
            {
              "name": "bookings",
              "type": "MeetingBooking",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "MeetingBooking",
              "onDelete": null
            },
            {
              "name": "type",
              "type": "MeetingType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "hostPerson",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "hostPersonId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "attendeePerson",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "attendeePersonId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "assessment",
              "target": "Assessment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Assessment",
              "targetDomain": "consultations"
            },
            {
              "field": "bookings",
              "target": "MeetingBooking",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/MeetingBooking",
              "targetDomain": "consultations"
            }
          ],
          "relationsIn": [
            {
              "model": "Assessment",
              "field": "meeting",
              "fk": true,
              "list": false,
              "sourceKey": "app/Assessment",
              "sourceDomain": "consultations"
            },
            {
              "model": "MeetingBooking",
              "field": "meeting",
              "fk": true,
              "list": false,
              "sourceKey": "app/MeetingBooking",
              "sourceDomain": "consultations"
            },
            {
              "model": "Person",
              "field": "hostMeetings",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Person",
              "field": "attendeeMeetings",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "hostPerson"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "attendeePerson"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "hostMeetings"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "attendeeMeetings"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 4,
            "writes": 0,
            "ops": {
              "findUniqueOrThrow": 2,
              "findMany": 1,
              "findUnique": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/meetings",
                "reads": 1,
                "writes": 0,
                "domain": "consultations",
                "kind": "api-module"
              }
            ],
            "writeSites": [],
            "nested": 12,
            "nestedByArea": [
              {
                "area": "api/assessments",
                "n": 6
              },
              {
                "area": "api/meetings",
                "n": 3
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/go",
                "n": 1
              }
            ],
            "typeMentions": 14,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 5
              },
              {
                "area": "api/workflows-v2",
                "n": 3
              },
              {
                "area": "api/meetings",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 2
              },
              {
                "area": "ui/assessments",
                "n": 1
              },
              {
                "area": "api/assessments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A scheduled call between two people, one host and one attendee. Its location is the attendee's phone number, since the only type is a call.",
          "keyFields": [
            {
              "name": "title",
              "meaning": "\"Lawhive Legal Assessment\" plus both full names, built at acceptance"
            },
            {
              "name": "type",
              "meaning": "call, the only value MeetingType has"
            }
          ],
          "references": [
            {
              "field": "hostPersonId",
              "target": "people",
              "meaning": "the lawyer running the call"
            },
            {
              "field": "attendeePersonId",
              "target": "people",
              "meaning": "the client attending, whose phone number is the meeting location"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only"
          ]
        },
        {
          "key": "app/MeetingBooking",
          "name": "MeetingBooking",
          "table": null,
          "datastore": "app",
          "domain": "consultations",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2841,
          "idPrefix": "meetbk_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "meeting",
              "type": "Meeting",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Meeting",
              "onDelete": null
            },
            {
              "name": "meetingId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "MeetingBookingStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "availabilityWindows",
              "type": "AvailabilityWindow",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AvailabilityWindow",
              "onDelete": null
            },
            {
              "name": "bookedStartDate",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bookedDuration",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "meeting",
              "target": "Meeting",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "meetingId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Meeting",
              "targetDomain": "consultations"
            },
            {
              "field": "availabilityWindows",
              "target": "AvailabilityWindow",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AvailabilityWindow",
              "targetDomain": "consultations"
            }
          ],
          "relationsIn": [
            {
              "model": "AvailabilityWindow",
              "field": "meetingBookings",
              "fk": false,
              "list": true,
              "sourceKey": "app/AvailabilityWindow",
              "sourceDomain": "consultations"
            },
            {
              "model": "Meeting",
              "field": "bookings",
              "fk": false,
              "list": true,
              "sourceKey": "app/Meeting",
              "sourceDomain": "consultations"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 8,
            "reads": 4,
            "writes": 4,
            "ops": {
              "findMany": 2,
              "findUnique": 1,
              "update": 1,
              "create": 2,
              "findUniqueOrThrow": 1,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/meetings",
                "reads": 2,
                "writes": 4,
                "domain": "consultations",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/go",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/meetings/meetingEvents.ts",
                "line": 11,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/meetings/service/createMeeting.ts",
                "line": 33,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/meetings/service/rescheduleMeeting.ts",
                "line": 18,
                "op": "create"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/assessments",
                "n": 2
              }
            ],
            "typeMentions": 8,
            "typeMentionsByArea": [
              {
                "area": "api/meetings",
                "n": 6
              },
              {
                "area": "api/assessments",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One booked time for a Meeting. Rescheduling never edits a booking: it creates a new BOOKED row and cancels the old one, so the bookings are the history of when the call was meant to happen.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "BOOKED or CANCELLED in practice; exactly one non-cancelled booking is the current one"
            },
            {
              "name": "bookedStartDate",
              "meaning": "the agreed start, required before parties can be notified"
            },
            {
              "name": "bookedDuration",
              "meaning": "ISO duration of the agreed slot"
            }
          ],
          "references": [
            {
              "field": "meetingId",
              "target": "consultations",
              "meaning": "the meeting being booked"
            }
          ],
          "lifecycle": "BOOKED → CANCELLED",
          "grouped": [],
          "flags": [
            "append-only-reschedule"
          ]
        }
      ]
    },
    {
      "id": "quotes",
      "order": 5,
      "groups": [],
      "name": "Quotes: pricing the work",
      "tagline": "What the client is asked to pay: fixed fee or hourly, priced off the catalogue",
      "whatItIs": "A Quote is the priced offer a client sees before any work starts. Every quote is either fixed (a set of QuoteProducts, each with QuoteLineItems for fees and disbursements and QuoteScopeItems for what is in and out of scope) or hourly (a single HourlyFeeQuote with an hourly rate and named stages, optionally with a CFAQuote for a no win no fee arrangement). Quotes are built in the solicitor wizard under apps/platform/src/features/quote or by an admin, both landing in the same createQuoteTransaction. From here you can price a matter, set an expiry, attach an internal QuoteNote, discount it, request a payment or a card authorisation against it, and mark it accepted. The whole module is api/quotes: 12 queries and 11 mutations, and it owns the quote lifecycle end to end.",
      "howItConnects": "Catalogue supplies the templates a quote is priced from, and each QuoteProduct and QuoteLineItem keeps a templateSnapshot so later catalogue edits cannot rewrite an offer already sent. Consultations link an Assessment to the quote that came out of the call. Compliance turns a quote into signable ClientAgreements (terms of business, client care letter, CFA) and a signature is one of the things that flips the quote to ACCEPTED. Money raises PaymentRequests and PaymentAuthorisationRequests against the quote, and once a card authorisation succeeds, Instructions creates the Instruction that goes to the marketplace. Later, when a lawyer bills, BillLineItem and BillScopeItem point back at the original QuoteLineItem and scope rows, so a bill can be read against what was quoted.",
      "lifecycle": "OUTSTANDING → ACCEPTED / REJECTED / EXPIRED",
      "flows": [
        {
          "id": "quote-shape",
          "title": "Fixed and hourly are two different trees",
          "mermaid": "flowchart TD\n  Q[Quote] --> T{feeType}\n  T -->|fixed| P[QuoteProduct]\n  P --> LI[QuoteLineItem]\n  P --> SI[QuoteScopeItem]\n  Q --> D[QuoteDiscountItem]\n  T -->|hourly| H[HourlyFeeQuote]\n  H --> S0[initial stage]\n  H --> S1[further stages]\n  S0 --> SS[stage scope items]\n  S1 --> SS\n  H --> CFA[CFAQuote]",
          "caption": "One transaction writes the whole tree. A fixed quote gets products, line items and scope; an hourly quote gets a rate, an initial stage, further stages and their scope, plus a CFAQuote when the solicitor entered CFA terms."
        },
        {
          "id": "quote-to-bill",
          "title": "From an offer to an instruction to a bill",
          "mermaid": "flowchart LR\n  Q[Quote OUTSTANDING] --> AG[Sign TOB, CCL or CFA]\n  Q --> AU[Authorise card payment]\n  AG --> AC[Quote ACCEPTED]\n  AU --> AC\n  AU --> I[Instruction pendingSolicitorSelection]\n  AC --> C[Case opens if ready]\n  C --> B[Bill]\n  B --> BL[BillLineItem cites QuoteLineItem]",
          "caption": "acceptQuoteIfNotAccepted publishes quote.accepted, which stamps status, acceptedAt and expectedCompletionDate, then calls openCaseIfReady. A successful Stripe authorisation is what creates the Instruction; admins can force that from the admin quote page."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "Only Quote and QuoteNote get direct Prisma writes. QuoteProduct, QuoteLineItem, QuoteScopeItem, QuoteDiscountItem, HourlyFeeQuote, HourlyFeeQuoteStage and CFAQuote are written through nested creates in createQuoteTransaction and the v1 importer. Zero direct calls does not mean dead here."
        },
        {
          "kind": "status",
          "body": "isApproved is written true at every creation site and no code ever sets it false. It is a leftover approval gate, not a live one."
        },
        {
          "kind": "legacy",
          "body": "WizardSession has one column, an id, and nothing reads, writes or nests into it. Quote.wizardSessionId and the wizard value on QuoteSource are the other half of the same abandoned self serve flow."
        },
        {
          "kind": "legacy",
          "body": "Cases imported from v1 create their quote inline in integrations/v1/cases/beginImport.ts with lastPrice set to an empty object, isCustom true on every row and a placeholder Imported Quote legal area. Those quotes never went through createQuoteTransaction."
        },
        {
          "kind": "duplication",
          "body": "Agreement text lives in two places. Quote.clientCareLetter and CFAQuote.cfaAgreement hold the drafted document as JSON, while the signable copy is a ClientAgreement in compliance."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/quotes",
          "kind": "api-module",
          "label": "quotes",
          "path": "packages/api/src/modules/quotes",
          "files": 39,
          "prismaSites": 37,
          "procedures": {
            "queries": 12,
            "mutations": 11
          }
        },
        {
          "id": "ui/quote",
          "kind": "ui-feature",
          "label": "quote",
          "path": "apps/platform/src/features/quote",
          "files": 31,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [],
        "consumes": [],
        "owns": [
          {
            "name": "Imported Quote",
            "namespace": "Imported Quote",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
            "line": 363,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": []
          }
        ]
      },
      "enums": [
        {
          "name": "QuoteDiscountItemType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1426,
          "doc": null,
          "values": [
            {
              "name": "percentage",
              "doc": null
            },
            {
              "name": "absolute",
              "doc": null
            }
          ],
          "usedBy": [
            "QuoteDiscountItem"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "QuoteFeeType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1501,
          "doc": null,
          "values": [
            {
              "name": "fixed",
              "doc": null
            },
            {
              "name": "hourly",
              "doc": null
            }
          ],
          "usedBy": [
            "Quote"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "QuoteNoteSource",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1366,
          "doc": null,
          "values": [
            {
              "name": "solicitor",
              "doc": null
            },
            {
              "name": "lawhive",
              "doc": null
            }
          ],
          "usedBy": [
            "QuoteNote"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "QuoteSource",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1488,
          "doc": null,
          "values": [
            {
              "name": "solicitor",
              "doc": null
            },
            {
              "name": "lawhive",
              "doc": null
            },
            {
              "name": "wizard",
              "doc": null
            }
          ],
          "usedBy": [
            "Quote"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "QuoteStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1494,
          "doc": null,
          "values": [
            {
              "name": "outstanding",
              "doc": null
            },
            {
              "name": "accepted",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            },
            {
              "name": "expired",
              "doc": null
            }
          ],
          "usedBy": [
            "Quote"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "ScopeItemType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1068,
          "doc": null,
          "values": [
            {
              "name": "inclusion",
              "doc": null
            },
            {
              "name": "exclusion",
              "doc": null
            }
          ],
          "usedBy": [
            "HourlyFeeQuoteStageScopeItem",
            "QuoteScopeItem"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 35,
        "writes": 16
      },
      "models": [
        {
          "key": "app/Quote",
          "name": "Quote",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1431,
          "idPrefix": "qt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 37,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "humanReadableId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "QuoteSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "wizardSession",
              "type": "WizardSession",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "WizardSession",
              "onDelete": null
            },
            {
              "name": "wizardSessionId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lawhiveCreator",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "lawhiveCreatorId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "QuoteStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feeType",
              "type": "QuoteFeeType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "products",
              "type": "QuoteProduct",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteProduct",
              "onDelete": null
            },
            {
              "name": "discounts",
              "type": "QuoteDiscountItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteDiscountItem",
              "onDelete": null
            },
            {
              "name": "instructions",
              "type": "Instruction",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Instruction",
              "onDelete": null
            },
            {
              "name": "paymentRequests",
              "type": "PaymentRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentRequest",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lastPrice",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "notes",
              "type": "QuoteNote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteNote",
              "onDelete": null
            },
            {
              "name": "isApproved",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "expiresAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "extensionRequested",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "expectedDuration",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "expectedCompletionDate",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "acceptedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hourlyFeeQuote",
              "type": "HourlyFeeQuote",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "HourlyFeeQuote",
              "onDelete": null
            },
            {
              "name": "paymentAuthorisationRequests",
              "type": "PaymentAuthorisationRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentAuthorisationRequest",
              "onDelete": null
            },
            {
              "name": "clientAgreements",
              "type": "ClientAgreement",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreement",
              "onDelete": null
            },
            {
              "name": "clientCareLetter",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requiresClientCareLetter",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assessment",
              "type": "Assessment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Assessment",
              "onDelete": null
            },
            {
              "name": "expediteDate",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([humanReadableId])"
          ],
          "looseRefs": [
            "humanReadableId"
          ],
          "relationsOut": [
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "solicitor",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "wizardSession",
              "target": "WizardSession",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "wizardSessionId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/WizardSession",
              "targetDomain": "quotes"
            },
            {
              "field": "lawhiveCreator",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "lawhiveCreatorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "products",
              "target": "QuoteProduct",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteProduct",
              "targetDomain": "quotes"
            },
            {
              "field": "discounts",
              "target": "QuoteDiscountItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteDiscountItem",
              "targetDomain": "quotes"
            },
            {
              "field": "instructions",
              "target": "Instruction",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Instruction",
              "targetDomain": "instructions"
            },
            {
              "field": "paymentRequests",
              "target": "PaymentRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentRequest",
              "targetDomain": "money"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "notes",
              "target": "QuoteNote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteNote",
              "targetDomain": "quotes"
            },
            {
              "field": "hourlyFeeQuote",
              "target": "HourlyFeeQuote",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuote",
              "targetDomain": "quotes"
            },
            {
              "field": "paymentAuthorisationRequests",
              "target": "PaymentAuthorisationRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisationRequest",
              "targetDomain": "money"
            },
            {
              "field": "clientAgreements",
              "target": "ClientAgreement",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreement",
              "targetDomain": "compliance"
            },
            {
              "field": "assessment",
              "target": "Assessment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Assessment",
              "targetDomain": "consultations"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "quotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Assessment",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/Assessment",
              "sourceDomain": "consultations"
            },
            {
              "model": "Case",
              "field": "quotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "ClientAgreement",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreement",
              "sourceDomain": "compliance"
            },
            {
              "model": "Customer",
              "field": "quotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "FirmEmployee",
              "field": "quotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "HourlyFeeQuote",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/HourlyFeeQuote",
              "sourceDomain": "quotes"
            },
            {
              "model": "Instruction",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/Instruction",
              "sourceDomain": "instructions"
            },
            {
              "model": "PaymentAuthorisationRequest",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentAuthorisationRequest",
              "sourceDomain": "money"
            },
            {
              "model": "PaymentRequest",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentRequest",
              "sourceDomain": "money"
            },
            {
              "model": "QuoteDiscountItem",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteDiscountItem",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteNote",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteNote",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteProduct",
              "field": "quote",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteProduct",
              "sourceDomain": "quotes"
            },
            {
              "model": "WizardSession",
              "field": "quote",
              "fk": false,
              "list": true,
              "sourceKey": "app/WizardSession",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "solicitor"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "lawhiveCreator"
            },
            {
              "dir": "out",
              "domain": "instructions",
              "model": "Instruction",
              "field": "instructions"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentRequest",
              "field": "paymentRequests"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentAuthorisationRequest",
              "field": "paymentAuthorisationRequests"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "clientAgreements"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "Assessment",
              "field": "assessment"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "quotes"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "Assessment",
              "field": "quote"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "quotes"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "quote"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "quotes"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "quotes"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "Instruction",
              "field": "quote"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentAuthorisationRequest",
              "field": "quote"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentRequest",
              "field": "quote"
            }
          ],
          "usage": {
            "total": 43,
            "reads": 33,
            "writes": 10,
            "ops": {
              "findMany": 8,
              "findUniqueOrThrow": 13,
              "create": 4,
              "findFirstOrThrow": 4,
              "findFirst": 7,
              "update": 5,
              "findUnique": 1,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/quotes",
                "reads": 14,
                "writes": 7,
                "domain": "quotes",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 7,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/agreements",
                "reads": 4,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 3,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 2,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/kyc",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/test-data",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/_utils",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
                "line": 203,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/quotes/events/acceptQuote.ts",
                "line": 16,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/quotes/procedures/requestQuoteExtension.ts",
                "line": 73,
                "op": "update"
              }
            ],
            "nested": 96,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 32
              },
              {
                "area": "api/instructions",
                "n": 31
              },
              {
                "area": "api/quotes",
                "n": 9
              },
              {
                "area": "admin",
                "n": 5
              },
              {
                "area": "api/agreements",
                "n": 5
              },
              {
                "area": "pkg/db",
                "n": 3
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "api/firms",
                "n": 2
              }
            ],
            "typeMentions": 122,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 28
              },
              {
                "area": "pkg/ui",
                "n": 22
              },
              {
                "area": "ui/_app",
                "n": 17
              },
              {
                "area": "ui/quote",
                "n": 14
              },
              {
                "area": "ui/cases",
                "n": 10
              },
              {
                "area": "api/quotes",
                "n": 8
              },
              {
                "area": "ui/instructions",
                "n": 5
              },
              {
                "area": "ui/assessments",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One priced offer to a client, quoted by a firm employee or by Lawhive, either fixed fee or hourly. It is the thing a client accepts before a case opens.",
          "keyFields": [
            {
              "name": "humanReadableId",
              "meaning": "The short reference used in Slack, notifications and the admin UI"
            },
            {
              "name": "source",
              "meaning": "solicitor, lawhive or wizard. Only the first two are ever written"
            },
            {
              "name": "feeType",
              "meaning": "fixed means QuoteProducts; hourly means a single HourlyFeeQuote"
            },
            {
              "name": "status",
              "meaning": "outstanding, accepted, rejected or expired"
            },
            {
              "name": "lastPrice",
              "meaning": "The computed total (fees, disbursements, VAT, discounts) frozen as JSON at creation"
            },
            {
              "name": "expiresAt",
              "meaning": "When the offer lapses. setQuoteExpiry flips status to expired if the date is past"
            },
            {
              "name": "extensionRequested",
              "meaning": "The client asked for more time. Within a week it self extends, otherwise it goes to Slack"
            }
          ],
          "references": [
            {
              "field": "customerId",
              "target": "people",
              "meaning": "the client being quoted"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the firm employee who quoted, when source is solicitor"
            },
            {
              "field": "lawhiveCreatorId",
              "target": "people",
              "meaning": "the admin who quoted, when source is lawhive"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case this prices, set for follow on quotes and case opening quotes"
            },
            {
              "field": "wizardSessionId",
              "target": "quotes",
              "meaning": "dead link to the abandoned self serve wizard"
            }
          ],
          "lifecycle": "OUTSTANDING → ACCEPTED / REJECTED / EXPIRED",
          "grouped": [],
          "flags": [
            "expedite-date",
            "always-approved"
          ]
        },
        {
          "key": "app/QuoteProduct",
          "name": "QuoteProduct",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1324,
          "idPrefix": "qtprod_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "template",
              "type": "ProductOption",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ProductOption",
              "onDelete": null
            },
            {
              "name": "templateId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "templateProduct",
              "type": "Product",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Product",
              "onDelete": null
            },
            {
              "name": "templateProductId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "templateSnapshot",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isCustom",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lineItems",
              "type": "QuoteLineItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteLineItem",
              "onDelete": null
            },
            {
              "name": "scopes",
              "type": "QuoteScopeItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "QuoteScopeItem",
              "onDelete": null
            },
            {
              "name": "legalArea",
              "type": "ProductArea",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ProductArea",
              "onDelete": null
            },
            {
              "name": "legalAreaId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([quoteId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "template",
              "target": "ProductOption",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "templateId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductOption",
              "targetDomain": "catalog"
            },
            {
              "field": "templateProduct",
              "target": "Product",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "templateProductId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Product",
              "targetDomain": "catalog"
            },
            {
              "field": "lineItems",
              "target": "QuoteLineItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteLineItem",
              "targetDomain": "quotes"
            },
            {
              "field": "scopes",
              "target": "QuoteScopeItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteScopeItem",
              "targetDomain": "quotes"
            },
            {
              "field": "legalArea",
              "target": "ProductArea",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "legalAreaId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductArea",
              "targetDomain": "catalog"
            }
          ],
          "relationsIn": [
            {
              "model": "Product",
              "field": "quoteProducts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Product",
              "sourceDomain": "catalog"
            },
            {
              "model": "ProductArea",
              "field": "quoteProducts",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductArea",
              "sourceDomain": "catalog"
            },
            {
              "model": "ProductOption",
              "field": "quoteProduct",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductOption",
              "sourceDomain": "catalog"
            },
            {
              "model": "Quote",
              "field": "products",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteLineItem",
              "field": "product",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteLineItem",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteScopeItem",
              "field": "product",
              "fk": true,
              "list": false,
              "sourceKey": "app/QuoteScopeItem",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "catalog",
              "model": "ProductOption",
              "field": "template"
            },
            {
              "dir": "out",
              "domain": "catalog",
              "model": "Product",
              "field": "templateProduct"
            },
            {
              "dir": "out",
              "domain": "catalog",
              "model": "ProductArea",
              "field": "legalArea"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "Product",
              "field": "quoteProducts"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "ProductArea",
              "field": "quoteProducts"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "ProductOption",
              "field": "quoteProduct"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/quotes",
                "reads": 0,
                "writes": 1,
                "domain": "quotes",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/quotes/service/createQuoteTransaction.ts",
                "line": 180,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One priced item of work on a fixed fee quote, either taken from a catalogue ProductOption or written freehand by the solicitor. Only fixed quotes have them.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "What the client sees, and what the quote title is built from"
            },
            {
              "name": "isCustom",
              "meaning": "True when the solicitor typed it rather than picking a catalogue option"
            },
            {
              "name": "templateSnapshot",
              "meaning": "The ProductOption row copied in full at creation, so later catalogue edits cannot change a sent quote"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "the quote it belongs to"
            },
            {
              "field": "templateId",
              "target": "catalog",
              "meaning": "the ProductOption it was priced from"
            },
            {
              "field": "templateProductId",
              "target": "catalog",
              "meaning": "the Product above that option"
            },
            {
              "field": "legalAreaId",
              "target": "catalog",
              "meaning": "the practice area the work sits in"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/QuoteLineItem",
          "name": "QuoteLineItem",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1286,
          "idPrefix": "qtli_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "product",
              "type": "QuoteProduct",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "QuoteProduct",
              "onDelete": null
            },
            {
              "name": "productId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "template",
              "type": "ProductOptionLineItem",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ProductOptionLineItem",
              "onDelete": null
            },
            {
              "name": "templateId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "templateSnapshot",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isCustom",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "LineItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billLineItems",
              "type": "BillLineItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillLineItem",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([productId])",
            "@@index([templateId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "product",
              "target": "QuoteProduct",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "productId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteProduct",
              "targetDomain": "quotes"
            },
            {
              "field": "template",
              "target": "ProductOptionLineItem",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "templateId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductOptionLineItem",
              "targetDomain": "catalog"
            },
            {
              "field": "billLineItems",
              "target": "BillLineItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillLineItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BillLineItem",
              "field": "quoteLineItem",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillLineItem",
              "sourceDomain": "money"
            },
            {
              "model": "ProductOptionLineItem",
              "field": "quoteLineItem",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductOptionLineItem",
              "sourceDomain": "catalog"
            },
            {
              "model": "QuoteProduct",
              "field": "lineItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/QuoteProduct",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "catalog",
              "model": "ProductOptionLineItem",
              "field": "template"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BillLineItem",
              "field": "billLineItems"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillLineItem",
              "field": "quoteLineItem"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "ProductOptionLineItem",
              "field": "quoteLineItem"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 1,
            "writes": 0,
            "ops": {
              "findMany": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One money line on a fixed fee quote: either a fee or a disbursement, priced excluding VAT. These add up to the quote total the client pays.",
          "keyFields": [
            {
              "name": "amount",
              "meaning": "Pence, excluding VAT. The v1 importer converts inclusive legacy amounts down"
            },
            {
              "name": "type",
              "meaning": "fee or disbursement. Fees attract VAT, disbursements do not"
            },
            {
              "name": "description",
              "meaning": "The wording the client reads on the line"
            },
            {
              "name": "templateSnapshot",
              "meaning": "The catalogue ProductOption copied at creation time for this line"
            }
          ],
          "references": [
            {
              "field": "productId",
              "target": "quotes",
              "meaning": "the QuoteProduct it prices"
            },
            {
              "field": "templateId",
              "target": "catalog",
              "meaning": "the ProductOptionLineItem it came from"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "billed-against"
          ]
        },
        {
          "key": "app/QuoteScopeItem",
          "name": "QuoteScopeItem",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1308,
          "idPrefix": "qtsi_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "product",
              "type": "QuoteProduct",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "QuoteProduct",
              "onDelete": null
            },
            {
              "name": "productId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isCustom",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "ScopeItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billScopeItems",
              "type": "BillScopeItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillScopeItem",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([productId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "product",
              "target": "QuoteProduct",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "productId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteProduct",
              "targetDomain": "quotes"
            },
            {
              "field": "billScopeItems",
              "target": "BillScopeItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillScopeItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BillScopeItem",
              "field": "quoteScope",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillScopeItem",
              "sourceDomain": "money"
            },
            {
              "model": "QuoteProduct",
              "field": "scopes",
              "fk": false,
              "list": true,
              "sourceKey": "app/QuoteProduct",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "money",
              "model": "BillScopeItem",
              "field": "billScopeItems"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillScopeItem",
              "field": "quoteScope"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 1,
            "writes": 0,
            "ops": {
              "findMany": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One line of what a fixed fee quote does or does not cover. Bills cite these rows back, so a client can check the work against what was promised.",
          "keyFields": [
            {
              "name": "description",
              "meaning": "The inclusion or exclusion as written for the client"
            },
            {
              "name": "type",
              "meaning": "inclusion or exclusion"
            },
            {
              "name": "isCustom",
              "meaning": "True when typed by the solicitor rather than pulled from the catalogue"
            }
          ],
          "references": [
            {
              "field": "productId",
              "target": "quotes",
              "meaning": "the QuoteProduct whose scope this is"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/QuoteNote",
          "name": "QuoteNote",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1346,
          "idPrefix": "qtnt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "QuoteNoteSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isVisibleToClient",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lawhiveCreator",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "lawhiveCreatorId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([quoteId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "lawhiveCreator",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "lawhiveCreatorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "quoteNotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "FirmEmployee",
              "field": "quoteNotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Quote",
              "field": "notes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "lawhiveCreator"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "quoteNotes"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "quoteNotes"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 0,
            "writes": 5,
            "ops": {
              "create": 4,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/quotes",
                "reads": 0,
                "writes": 4,
                "domain": "quotes",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/service/createReassignment.ts",
                "line": 40,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/quotes/notes/quoteNoteEventsRouter.ts",
                "line": 35,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/quotes/notes/quoteNoteEventsRouter.ts",
                "line": 48,
                "op": "update"
              }
            ],
            "nested": 14,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/instructions",
                "n": 2
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 1
              },
              {
                "area": "api/test-data",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "An internal comment on a quote, written by the quoting firm employee or by a Lawhive admin. Case reassignment also drops one here.",
          "keyFields": [
            {
              "name": "content",
              "meaning": "The note text, editable through the note update event"
            },
            {
              "name": "source",
              "meaning": "solicitor or lawhive, matching whichever creator id is set"
            },
            {
              "name": "isVisibleToClient",
              "meaning": "Written false at every call site, so notes are staff only in practice"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "the quote being annotated"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the firm employee author"
            },
            {
              "field": "lawhiveCreatorId",
              "target": "people",
              "meaning": "the admin author"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/QuoteDiscountItem",
          "name": "QuoteDiscountItem",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1415,
          "idPrefix": "qtdi_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "discountType",
              "type": "QuoteDiscountItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "Quote",
              "field": "discounts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/agreements",
                "n": 2
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/quotes",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A reduction applied to a fixed fee quote total, either a percentage or a flat amount. getQuoteTotal subtracts it before VAT.",
          "keyFields": [
            {
              "name": "discountType",
              "meaning": "percentage or absolute"
            },
            {
              "name": "amount",
              "meaning": "Basis for the reduction: a percentage, or pence excluding VAT"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "the quote being discounted"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only",
            "admin-and-import-only"
          ]
        },
        {
          "key": "app/HourlyFeeQuote",
          "name": "HourlyFeeQuote",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1518,
          "idPrefix": "hfqt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hourlyRate",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "cfaQuote",
              "type": "CFAQuote",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CFAQuote",
              "onDelete": null
            },
            {
              "name": "legalArea",
              "type": "ProductArea",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ProductArea",
              "onDelete": null
            },
            {
              "name": "legalAreaId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "initialStage",
              "type": "HourlyFeeQuoteStage",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "HourlyFeeQuoteStage",
              "onDelete": null
            },
            {
              "name": "initialStageId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "furtherStages",
              "type": "HourlyFeeQuoteStage",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "HourlyFeeQuoteStage",
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "estimatedMatterFee",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Estimated total cost of the matter (fees excl. VAT & disbursements) entered at quote creation. Not visible to client.",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "cfaQuote",
              "target": "CFAQuote",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CFAQuote",
              "targetDomain": "quotes"
            },
            {
              "field": "legalArea",
              "target": "ProductArea",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "legalAreaId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ProductArea",
              "targetDomain": "catalog"
            },
            {
              "field": "initialStage",
              "target": "HourlyFeeQuoteStage",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "initialStageId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuoteStage",
              "targetDomain": "quotes"
            },
            {
              "field": "furtherStages",
              "target": "HourlyFeeQuoteStage",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "furtherStages",
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuoteStage",
              "targetDomain": "quotes"
            },
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "CFAQuote",
              "field": "hourlyFeeQuote",
              "fk": true,
              "list": false,
              "sourceKey": "app/CFAQuote",
              "sourceDomain": "quotes"
            },
            {
              "model": "HourlyFeeQuoteStage",
              "field": "initialStageHourlyFeeQuote",
              "fk": false,
              "list": false,
              "sourceKey": "app/HourlyFeeQuoteStage",
              "sourceDomain": "quotes"
            },
            {
              "model": "HourlyFeeQuoteStage",
              "field": "furtherStageHourlyFeeQuote",
              "fk": true,
              "list": false,
              "sourceKey": "app/HourlyFeeQuoteStage",
              "sourceDomain": "quotes"
            },
            {
              "model": "ProductArea",
              "field": "hourlyFeeQuotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/ProductArea",
              "sourceDomain": "catalog"
            },
            {
              "model": "Quote",
              "field": "hourlyFeeQuote",
              "fk": false,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "catalog",
              "model": "ProductArea",
              "field": "legalArea"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "ProductArea",
              "field": "hourlyFeeQuotes"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 45,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 15
              },
              {
                "area": "api/quotes",
                "n": 13
              },
              {
                "area": "api/instructions",
                "n": 7
              },
              {
                "area": "api/agreements",
                "n": 6
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "pkg/shared",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The hourly half of a quote: one rate plus staged estimates, instead of a fixed price. Exactly one hangs off a Quote with feeType hourly.",
          "keyFields": [
            {
              "name": "hourlyRate",
              "meaning": "Pence per hour. This is the amount authorised on the client card, not a total"
            },
            {
              "name": "estimatedMatterFee",
              "meaning": "Internal estimate of total fees excluding VAT and disbursements, not shown to the client"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "the quote it prices"
            },
            {
              "field": "legalAreaId",
              "target": "catalog",
              "meaning": "the practice area the matter sits in"
            },
            {
              "field": "initialStageId",
              "target": "quotes",
              "meaning": "the first stage of work, always present"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only"
          ]
        },
        {
          "key": "app/HourlyFeeQuoteStage",
          "name": "HourlyFeeQuoteStage",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1542,
          "idPrefix": "qtst_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "fees",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "disbursements",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "scopes",
              "type": "HourlyFeeQuoteStageScopeItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "HourlyFeeQuoteStageScopeItem",
              "onDelete": null
            },
            {
              "name": "initialStageHourlyFeeQuote",
              "type": "HourlyFeeQuote",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "HourlyFeeQuote",
              "onDelete": null
            },
            {
              "name": "furtherStageHourlyFeeQuote",
              "type": "HourlyFeeQuote",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "HourlyFeeQuote",
              "onDelete": null
            },
            {
              "name": "furtherStageHourlyFeeQuoteId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "scopes",
              "target": "HourlyFeeQuoteStageScopeItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuoteStageScopeItem",
              "targetDomain": "quotes"
            },
            {
              "field": "initialStageHourlyFeeQuote",
              "target": "HourlyFeeQuote",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuote",
              "targetDomain": "quotes"
            },
            {
              "field": "furtherStageHourlyFeeQuote",
              "target": "HourlyFeeQuote",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "furtherStageHourlyFeeQuoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuote",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "HourlyFeeQuote",
              "field": "initialStage",
              "fk": true,
              "list": false,
              "sourceKey": "app/HourlyFeeQuote",
              "sourceDomain": "quotes"
            },
            {
              "model": "HourlyFeeQuote",
              "field": "furtherStages",
              "fk": false,
              "list": true,
              "sourceKey": "app/HourlyFeeQuote",
              "sourceDomain": "quotes"
            },
            {
              "model": "HourlyFeeQuoteStageScopeItem",
              "field": "stage",
              "fk": true,
              "list": false,
              "sourceKey": "app/HourlyFeeQuoteStageScopeItem",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 64,
            "nestedByArea": [
              {
                "area": "api/quotes",
                "n": 24
              },
              {
                "area": "api/cases",
                "n": 16
              },
              {
                "area": "api/instructions",
                "n": 14
              },
              {
                "area": "admin",
                "n": 6
              },
              {
                "area": "api/agreements",
                "n": 4
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One named chunk of work on an hourly quote, with its own fee and disbursement estimate. A stage is either the initial stage or one of the further stages.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "The stage label the client reads, for example Initial advice"
            },
            {
              "name": "fees",
              "meaning": "Estimated fees for this stage, pence excluding VAT"
            },
            {
              "name": "disbursements",
              "meaning": "Estimated disbursements for this stage, in pence"
            }
          ],
          "references": [
            {
              "field": "furtherStageHourlyFeeQuoteId",
              "target": "quotes",
              "meaning": "set when the stage is a later stage rather than the initial one"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only",
            "two-parent-links"
          ]
        },
        {
          "key": "app/HourlyFeeQuoteStageScopeItem",
          "name": "HourlyFeeQuoteStageScopeItem",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1559,
          "idPrefix": "hfqtsi_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "ScopeItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stage",
              "type": "HourlyFeeQuoteStage",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "HourlyFeeQuoteStage",
              "onDelete": null
            },
            {
              "name": "stageId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billScopeItems",
              "type": "BillScopeItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillScopeItem",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "stage",
              "target": "HourlyFeeQuoteStage",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "stageId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuoteStage",
              "targetDomain": "quotes"
            },
            {
              "field": "billScopeItems",
              "target": "BillScopeItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillScopeItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BillScopeItem",
              "field": "hourlyFeeQuoteScope",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillScopeItem",
              "sourceDomain": "money"
            },
            {
              "model": "HourlyFeeQuoteStage",
              "field": "scopes",
              "fk": false,
              "list": true,
              "sourceKey": "app/HourlyFeeQuoteStage",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "money",
              "model": "BillScopeItem",
              "field": "billScopeItems"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BillScopeItem",
              "field": "hourlyFeeQuoteScope"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One inclusion or exclusion on a single stage of an hourly quote. The hourly counterpart of QuoteScopeItem, and bills cite it the same way.",
          "keyFields": [
            {
              "name": "description",
              "meaning": "The inclusion or exclusion as written for the client"
            },
            {
              "name": "type",
              "meaning": "inclusion or exclusion"
            }
          ],
          "references": [
            {
              "field": "stageId",
              "target": "quotes",
              "meaning": "the stage this scopes"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CFAQuote",
          "name": "CFAQuote",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1506,
          "idPrefix": "cfaqt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hourlyFeeQuote",
              "type": "HourlyFeeQuote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "HourlyFeeQuote",
              "onDelete": null
            },
            {
              "name": "hourlyFeeQuoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "cfaAgreement",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "hourlyFeeQuote",
              "target": "HourlyFeeQuote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "hourlyFeeQuoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuote",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "HourlyFeeQuote",
              "field": "cfaQuote",
              "fk": false,
              "list": false,
              "sourceKey": "app/HourlyFeeQuote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/agreements",
                "n": 4
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The conditional fee (no win no fee) terms attached to an hourly quote. Its creation posts to Slack so Lawhive reviews every CFA before the client signs.",
          "keyFields": [
            {
              "name": "cfaAgreement",
              "meaning": "The drafted CFA document held as JSON, later turned into a signable ClientAgreement"
            }
          ],
          "references": [
            {
              "field": "hourlyFeeQuoteId",
              "target": "quotes",
              "meaning": "the hourly quote these terms belong to, one to one"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-writes-only"
          ]
        },
        {
          "key": "app/WizardSession",
          "name": "WizardSession",
          "table": null,
          "datastore": "app",
          "domain": "quotes",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1482,
          "idPrefix": "wizses_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 2,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Quote",
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "quote",
              "target": "Quote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "Quote",
              "field": "wizardSession",
              "fk": true,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": true,
          "interpreted": true,
          "tier": "legacy",
          "meaning": "A placeholder for a self serve quote wizard session that was never finished. The table holds nothing but an id and no code touches it.",
          "keyFields": [
            {
              "name": "id",
              "meaning": "The only column, wizses_ prefixed. Nothing reads it"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "dead-table"
          ]
        }
      ]
    },
    {
      "id": "instructions",
      "order": 6,
      "groups": [],
      "name": "Instructions: matching a lawyer",
      "tagline": "The marketplace side: offer paid work to lawyers until one accepts it",
      "whatItIs": "Once a client has paid for a quote, the work has to reach a lawyer. An Instruction is that piece of work waiting for an owner, and an InstructionAssignment is one timed offer of it to one lawyer. Offers can go out to several lawyers at once or one at a time, and the first to accept gets the case while the rest are marked lost. Admins can pick lawyers by hand, override the platform and lead fee percentages on a single offer, cancel offers, and turn auto-assignment on or off per instruction. Auto-assignment walks a named policy, which is an ordered list of rules, and each rule decides who is eligible, how they are ranked, and how long their offer lasts. SolicitorScores holds the per lawyer numbers the ranking uses. Two crons watch for trouble: one flags instructions still unassigned two business days after creation, the other flags instructions whose Stripe authorisation is about to expire.",
      "howItConnects": "Quotes hands the work over: an Instruction always points at a Quote, and money creates the Instruction when the client's Stripe authorisation succeeds. Acceptance is the boundary with cases. acceptInstruction opens a Case with the lawyer and client as parties, captures the authorised payments into PaymentRequests, and copies the assignment's fee overrides onto the case as FeePlanOverrides. Reassignment runs the same machinery backwards: cases creates a CaseReassignment with a fresh Instruction attached, and accepting that offer swaps the owner on the existing Case instead of opening a new one. Lawyers and admins come from people and firms, product and legal area eligibility comes from catalog through FirmEmployee, and instruction offers share the lawyer's feed of work with consultation assessment requests.",
      "lifecycle": "pendingSolicitorSelection → pendingSolicitorAcceptance → processing → assigned / cancelled",
      "flows": [
        {
          "id": "fan-out-and-acceptance",
          "title": "Fan out, first acceptance wins",
          "mermaid": "flowchart TD\n  auth[Payment authorised on quote] --> ins[Instruction pendingSolicitorSelection]\n  reass[CaseReassignment created] --> ins\n  ins --> fan[assignInstruction]\n  fan --> a1[Assignment pending]\n  fan --> a2[Assignment pending]\n  fan --> pend[Instruction pendingSolicitorAcceptance]\n  a1 --> proc[Assignment and Instruction processing]\n  proc --> acc[Assignment accepted, Instruction assigned]\n  acc --> cas[Case OPENING and payments captured]\n  acc --> lost[Other pending assignments lost]\n  a2 --> gone[rejected, expired or cancelled]\n  gone --> back[All offers dead, Instruction pendingSolicitorSelection]\n  back --> fan",
          "caption": "assignInstruction publishes one assignment.created event per lawyer and flips the Instruction to pendingSolicitorAcceptance. Acceptance marks both rows processing, opens the Case, then sets assigned and fires assignment.lost for every other pending offer. If every offer dies the Instruction drops back to pendingSolicitorSelection and auto-assignment is retried."
        },
        {
          "id": "auto-assignment-step",
          "title": "One auto-assignment step",
          "mermaid": "flowchart TD\n  trig[Rejection, expiry, admin toggle or stacked cron] --> step[applyNextAutoAssignmentStepToInstruction]\n  step --> gate{eligible and policy set}\n  gate -- no --> slack[Slack: assign manually]\n  gate -- yes --> rule[Next rule not in assignmentRulesApplied]\n  rule --> pool[Lawyers offering the product and legal area]\n  pool --> filter[Drop previously assigned or rejected, apply earnings threshold]\n  filter --> rank[Rank into groups 1, 2 and 3 from SolicitorScores]\n  rank --> offer[assignInstruction with the rule expiry]\n  offer --> push[Push rule key onto assignmentRulesApplied]",
          "caption": "A policy is an ordered list of rule keys. assignmentRulesApplied records how far the instruction has walked it, so each trigger applies the next unapplied rule. A rule with no matching lawyers is skipped and the next one is tried immediately."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "Nothing publishes events.instruction.created, even though the event and its create effect exist. Instructions are written directly: createInstructionFromQuote from the payments webhook, a nested create in cases/service/createReassignment, and the v1 importer in integrations/v1/cases/beginImport."
        },
        {
          "kind": "status",
          "body": "autoAssignmentEligible defaults to false and only three places set it true: the v1 importer, a nursery reassignment, and the admin toggle. autoAssignmentPolicy is set by the importer, by reassignment, or by an admin, so a normal paid instruction sits in pendingSolicitorSelection until someone acts on it."
        },
        {
          "kind": "legacy",
          "body": "The InstructionAssignmentStatus value referred is never written. It appears only in guard lists in adminCancelInstruction and assignInstruction and in one UI match arm. Instruction status processing is a short lock held while acceptance runs."
        },
        {
          "kind": "companion",
          "body": "The SolicitorAssignmentAlgorithmData SQL view under packages/db/prisma/views aggregates per lawyer assignment counts, rejections, GMV, fees billed and completed cases, but no code queries it. Only its generated zod schemas exist. The live scores in algorithm/v1_1/scores.ts recompute everything with Prisma queries instead."
        },
        {
          "kind": "duplication",
          "body": "Rule expiry comes in two shapes. expiry rules give each offer its own window, exclusivity rules in the stacked policies share one end time across the whole block so a new lawyer is added every 7.5 minutes without shortening earlier offers. Policy stackedAssignment is listed as inactive; stackedAssignmentV2 to V5 are the live variants."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/instructions",
          "kind": "api-module",
          "label": "instructions",
          "path": "packages/api/src/modules/instructions",
          "files": 77,
          "prismaSites": 96,
          "procedures": {
            "queries": 9,
            "mutations": 10
          }
        },
        {
          "id": "api/feedOfWork",
          "kind": "api-module",
          "label": "feedOfWork",
          "path": "packages/api/src/modules/feedOfWork",
          "files": 3,
          "prismaSites": 0,
          "procedures": {
            "queries": 1,
            "mutations": 0
          }
        },
        {
          "id": "ui/instructions",
          "kind": "ui-feature",
          "label": "instructions",
          "path": "apps/platform/src/features/instructions",
          "files": 10,
          "prismaSites": 0
        },
        {
          "id": "ui/feedOfWork",
          "kind": "ui-feature",
          "label": "feedOfWork",
          "path": "apps/platform/src/features/feedOfWork",
          "files": 5,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/case/caseReassignment.completed",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/acceptReassignment.ts",
            "line": 335,
            "live": "silent"
          },
          {
            "name": "app/instructions/assignment.accepted",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/instructionEvents.ts",
            "line": 111,
            "live": "active"
          },
          {
            "name": "app/instructions/assignment.lost",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/acceptInstruction.ts",
            "line": 389,
            "live": "silent"
          },
          {
            "name": "app/instructions/auto-accept.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/procedures/assignInstruction.ts",
            "line": 62,
            "live": "silent"
          },
          {
            "name": "app/instructions/autoAssignEligibility.changed",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/procedures/setInstantAssignmentEligibility.ts",
            "line": 24,
            "live": "silent"
          },
          {
            "name": "app/instructions/instruction.cancelled",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/instructionEvents.ts",
            "line": 236,
            "live": "silent"
          },
          {
            "name": "app/instructions/stackedAssignment.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/autoAssignment/rules.ts",
            "line": 160,
            "live": "silent"
          },
          {
            "name": "app/workflows/start.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/acceptInstruction.ts",
            "line": 268,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/instructions/assignment.lost",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/inngest/handleInstructionAssignmentLost.ts",
            "line": 5,
            "live": "silent"
          },
          {
            "name": "app/instructions/auto-accept.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/inngest/handleAutoAcceptRequested.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "app/instructions/instruction.created",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/sendSlackMessagesForNewInstruction.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "app/instructions/stackedAssignment.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/autoAssignment/v2/stackedAssignments.ts",
            "line": 16,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/instructions/assignment.accepted",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/instructionEvents.ts",
            "line": 111,
            "live": "active",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": []
          },
          {
            "name": "app/instructions/assignment.lost",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/acceptInstruction.ts",
            "line": 389,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": [
              "instructions"
            ]
          },
          {
            "name": "app/instructions/auto-accept.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/procedures/assignInstruction.ts",
            "line": 62,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": [
              "instructions"
            ]
          },
          {
            "name": "app/instructions/autoAssignEligibility.changed",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/procedures/setInstantAssignmentEligibility.ts",
            "line": 24,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": []
          },
          {
            "name": "app/instructions/instruction.cancelled",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/instructionEvents.ts",
            "line": 236,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": []
          },
          {
            "name": "app/instructions/instruction.created",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/sendSlackMessagesForNewInstruction.ts",
            "line": 12,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "instructions"
            ]
          },
          {
            "name": "app/instructions/stackedAssignment.requested",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/autoAssignment/rules.ts",
            "line": 160,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": [
              "instructions"
            ]
          },
          {
            "name": "app/referrals/payment.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/service/createReferralPaymentForBill.ts",
            "line": 77,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": []
          }
        ]
      },
      "enums": [
        {
          "name": "InstructionAssignmentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1196,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "accepted",
              "doc": null
            },
            {
              "name": "referred",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            },
            {
              "name": "expired",
              "doc": null
            },
            {
              "name": "processing",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            },
            {
              "name": "lost",
              "doc": null
            }
          ],
          "usedBy": [
            "InstructionAssignment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "InstructionRejectionReason",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1189,
          "doc": null,
          "values": [
            {
              "name": "outsideAreaOfPractice",
              "doc": null
            },
            {
              "name": "tooBusy",
              "doc": null
            },
            {
              "name": "feeError",
              "doc": null
            },
            {
              "name": "other",
              "doc": null
            }
          ],
          "usedBy": [
            "InstructionAssignment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "InstructionStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1099,
          "doc": null,
          "values": [
            {
              "name": "pendingSolicitorSelection",
              "doc": null
            },
            {
              "name": "pendingSolicitorAcceptance",
              "doc": null
            },
            {
              "name": "assigned",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            },
            {
              "name": "processing",
              "doc": null
            }
          ],
          "usedBy": [
            "Instruction"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 37,
        "writes": 28
      },
      "models": [
        {
          "key": "app/Instruction",
          "name": "Instruction",
          "table": null,
          "datastore": "app",
          "domain": "instructions",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1073,
          "idPrefix": "ins_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 17,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignments",
              "type": "InstructionAssignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "InstructionAssignment",
              "onDelete": null
            },
            {
              "name": "status",
              "type": "InstructionStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentAuthorisations",
              "type": "PaymentAuthorisation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentAuthorisation",
              "onDelete": null
            },
            {
              "name": "importedFromLegacyEntity",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseReassignment",
              "type": "CaseReassignment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseReassignment",
              "onDelete": null
            },
            {
              "name": "autoAssignmentEligible",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "autoAssignmentPolicy",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignmentRulesApplied",
              "type": "String",
              "list": true,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "referral",
              "type": "ClientReferral",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientReferral",
              "onDelete": null
            },
            {
              "name": "referralId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "slaBreachedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentExpiryWarning",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "assignments",
              "target": "InstructionAssignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/InstructionAssignment",
              "targetDomain": "instructions"
            },
            {
              "field": "paymentAuthorisations",
              "target": "PaymentAuthorisation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisation",
              "targetDomain": "money"
            },
            {
              "field": "caseReassignment",
              "target": "CaseReassignment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseReassignment",
              "targetDomain": "cases"
            },
            {
              "field": "referral",
              "target": "ClientReferral",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "referralId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientReferral",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseReassignment",
              "field": "instruction",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseReassignment",
              "sourceDomain": "cases"
            },
            {
              "model": "ClientReferral",
              "field": "instruction",
              "fk": false,
              "list": false,
              "sourceKey": "app/ClientReferral",
              "sourceDomain": "people"
            },
            {
              "model": "InstructionAssignment",
              "field": "instruction",
              "fk": true,
              "list": false,
              "sourceKey": "app/InstructionAssignment",
              "sourceDomain": "instructions"
            },
            {
              "model": "PaymentAuthorisation",
              "field": "instruction",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentAuthorisation",
              "sourceDomain": "money"
            },
            {
              "model": "Quote",
              "field": "instructions",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quote"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentAuthorisation",
              "field": "paymentAuthorisations"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "CaseReassignment",
              "field": "caseReassignment"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "ClientReferral",
              "field": "referral"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "CaseReassignment",
              "field": "instruction"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "ClientReferral",
              "field": "instruction"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentAuthorisation",
              "field": "instruction"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "instructions"
            }
          ],
          "usage": {
            "total": 41,
            "reads": 21,
            "writes": 20,
            "ops": {
              "findMany": 7,
              "create": 5,
              "findUniqueOrThrow": 10,
              "update": 13,
              "findFirstOrThrow": 1,
              "findFirst": 2,
              "findUnique": 1,
              "updateMany": 2
            },
            "byArea": [
              {
                "area": "api/instructions",
                "reads": 19,
                "writes": 17,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "package"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
                "line": 284,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/instructions/instructionEvents.ts",
                "line": 74,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/instructions/instructionEvents.ts",
                "line": 220,
                "op": "create"
              }
            ],
            "nested": 24,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 12
              },
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "api/quotes",
                "n": 4
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "api/_integrations",
                "n": 1
              }
            ],
            "typeMentions": 65,
            "typeMentionsByArea": [
              {
                "area": "api/instructions",
                "n": 24
              },
              {
                "area": "admin",
                "n": 18
              },
              {
                "area": "ui/instructions",
                "n": 10
              },
              {
                "area": "pkg/ui",
                "n": 7
              },
              {
                "area": "ui/cases",
                "n": 4
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/incentives",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One paid piece of work waiting for a lawyer to take it. It hangs off the Quote the client paid for and stays open until a lawyer accepts or an admin cancels it.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "pendingSolicitorSelection, pendingSolicitorAcceptance, processing, assigned or cancelled"
            },
            {
              "name": "autoAssignmentEligible",
              "meaning": "Whether the auto-assignment engine may touch this instruction. Defaults to false"
            },
            {
              "name": "autoAssignmentPolicy",
              "meaning": "Key of the policy to walk, resolved against ASSIGNMENT_POLICIES in code, not a table"
            },
            {
              "name": "assignmentRulesApplied",
              "meaning": "Ordered log of rule keys already tried, which is how the engine knows the next step"
            },
            {
              "name": "slaBreachedAt",
              "meaning": "Set by a cron when the instruction is still unassigned two business days after creation"
            },
            {
              "name": "paymentExpiryWarning",
              "meaning": "Set once a Slack warning has gone out that the Stripe authorisation expires within two days"
            },
            {
              "name": "importedFromLegacyEntity",
              "meaning": "The v1 case payload for imported instructions, parsed on acceptance to finalise the import"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "The priced work the client paid for"
            },
            {
              "field": "paymentAuthorisations",
              "target": "money",
              "meaning": "Stripe holds taken at checkout, captured when a lawyer accepts"
            },
            {
              "field": "caseReassignment",
              "target": "cases",
              "meaning": "Present when this instruction exists to move an open Case to a new lawyer"
            },
            {
              "field": "referralId",
              "target": "people",
              "meaning": "The referral that produced this work, copied onto the Case on acceptance"
            }
          ],
          "lifecycle": "pendingSolicitorSelection → pendingSolicitorAcceptance → processing → assigned / cancelled",
          "grouped": [],
          "flags": [
            "v1-import-field"
          ]
        },
        {
          "key": "app/InstructionAssignment",
          "name": "InstructionAssignment",
          "table": null,
          "datastore": "app",
          "domain": "instructions",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1161,
          "idPrefix": "insass_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 17,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "instruction",
              "type": "Instruction",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Instruction",
              "onDelete": null
            },
            {
              "name": "instructionId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "Solicitor",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "solicitorId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "InstructionAssignmentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "expiresAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lostAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rejectionReason",
              "type": "InstructionRejectionReason",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rejectionDetails",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "manuallyAssignedByAdmin",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "manuallyAssignedByAdminId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "autoAssignmentRule",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "platformFeeOverridePercentage",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "leadFeeOverridePercentage",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([instructionId])",
            "@@index([solicitorId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "instruction",
              "target": "Instruction",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "instructionId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Instruction",
              "targetDomain": "instructions"
            },
            {
              "field": "solicitor",
              "target": "Solicitor",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "solicitorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            },
            {
              "field": "manuallyAssignedByAdmin",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "manuallyAssignedByAdminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "assignedInstructions",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Instruction",
              "field": "assignments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Instruction",
              "sourceDomain": "instructions"
            },
            {
              "model": "Solicitor",
              "field": "instructionAssignments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Solicitor",
              "field": "solicitor"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "manuallyAssignedByAdmin"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "assignedInstructions"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Solicitor",
              "field": "instructionAssignments"
            }
          ],
          "usage": {
            "total": 21,
            "reads": 15,
            "writes": 6,
            "ops": {
              "findMany": 7,
              "findUniqueOrThrow": 5,
              "create": 1,
              "update": 5,
              "findUnique": 1,
              "findFirst": 1,
              "count": 1
            },
            "byArea": [
              {
                "area": "api/instructions",
                "reads": 13,
                "writes": 6,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_utils",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/instructions/instructionEvents.ts",
                "line": 81,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/instructions/instructionEvents.ts",
                "line": 103,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/instructions/instructionEvents.ts",
                "line": 128,
                "op": "update"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 2
              }
            ],
            "typeMentions": 16,
            "typeMentionsByArea": [
              {
                "area": "api/instructions",
                "n": 9
              },
              {
                "area": "ui/instructions",
                "n": 5
              },
              {
                "area": "api/incentives",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One timed offer of an instruction to one lawyer. Several can be live at once, and the first accepted offer wins while the others are marked lost.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "pending, processing, accepted, rejected, expired, cancelled, lost or the unused referred"
            },
            {
              "name": "expiresAt",
              "meaning": "When the offer lapses. Set from the rule duration, or three hours by default"
            },
            {
              "name": "rejectionReason",
              "meaning": "outsideAreaOfPractice, tooBusy, feeError or other, also used by admin cancellations"
            },
            {
              "name": "autoAssignmentRule",
              "meaning": "Rule key that created this offer, null when an admin assigned it by hand"
            },
            {
              "name": "manuallyAssignedByAdminId",
              "meaning": "The admin who made the offer, and the marker that it was manual"
            },
            {
              "name": "platformFeeOverridePercentage",
              "meaning": "Sweetener on the platform fee for this offer, copied to the Case as a fee plan override"
            },
            {
              "name": "leadFeeOverridePercentage",
              "meaning": "Same for the lead fee, applied only if this offer is the one accepted"
            }
          ],
          "references": [
            {
              "field": "instructionId",
              "target": "instructions",
              "meaning": "The work being offered"
            },
            {
              "field": "solicitorId",
              "target": "people",
              "meaning": "The lawyer the offer went to"
            },
            {
              "field": "manuallyAssignedByAdminId",
              "target": "people",
              "meaning": "The admin who made a manual offer"
            }
          ],
          "lifecycle": "pending → processing → accepted / rejected / expired / cancelled / lost",
          "grouped": [],
          "flags": [
            "fee-overrides"
          ]
        },
        {
          "key": "app/SolicitorScores",
          "name": "SolicitorScores",
          "table": null,
          "datastore": "app",
          "domain": "instructions",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 441,
          "idPrefix": "solsco_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "solicitor",
              "type": "Solicitor",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Solicitor",
              "onDelete": null
            },
            {
              "name": "solicitorId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "scores",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "validFrom",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "validTo",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([solicitorId, validTo])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "solicitor",
              "target": "Solicitor",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "solicitorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Solicitor",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Solicitor",
              "field": "scores",
              "fk": false,
              "list": true,
              "sourceKey": "app/Solicitor",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Solicitor",
              "field": "solicitor"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Solicitor",
              "field": "scores"
            }
          ],
          "usage": {
            "total": 3,
            "reads": 1,
            "writes": 2,
            "ops": {
              "updateMany": 1,
              "create": 1,
              "findMany": 1
            },
            "byArea": [
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/inngest/scoreLawyer.ts",
                "line": 53,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/integrations/inngest/scoreLawyer.ts",
                "line": 58,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A dated snapshot of one lawyer's three ranking numbers: historical rating, work distribution factor and capacity score. Auto-assignment reads the current row to sort lawyers into groups.",
          "keyFields": [
            {
              "name": "scores",
              "meaning": "Json with historicalRating, workDistributionFactor and capacityScore, each between 0 and 1"
            },
            {
              "name": "validFrom",
              "meaning": "When this snapshot was computed by the app-score-lawyer Inngest function"
            },
            {
              "name": "validTo",
              "meaning": "Closed off when a newer snapshot lands. validTo null is the row the ranking reads"
            }
          ],
          "references": [
            {
              "field": "solicitorId",
              "target": "people",
              "meaning": "The lawyer being scored"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "append-only",
            "written-by-inngest"
          ]
        }
      ]
    },
    {
      "id": "cases",
      "order": 7,
      "groups": [],
      "name": "Cases: the legal matter",
      "tagline": "The matter itself: who is on it, what state it is in, and who owns it",
      "whatItIs": "A Case is the piece of legal work a lawyer does for a client, and this domain covers the matter itself rather than the money, files or messages hanging off it. One row carries the status, the source it arrived from, an autoincrementing humanReadableId that everyone quotes in Slack and email, the owning FirmEmployee, and the AI modules switched on for it. Around it sit the records that answer who is on the case: CaseParty for the lawyer, team members and clients, CaseInvitation for clients who were invited but have not accepted yet, and CaseExternalParty for the other side's solicitor or company. You can open a case, invite and promote clients, tag it, associate it with another case, ask for it to be closed, or hand it to a different lawyer. Most of that lives in packages/api/src/modules/cases, the largest module in the repo at 68 queries and 108 mutations.",
      "howItConnects": "Cases is the hub. Fourteen other domains point a foreign key at Case: money hangs bills, payment requests, three ledgers and time tracking off it, documents hangs files, folders and artifacts, compliance hangs client agreements, KYC-driven risk assessments and address checks, and chat, voice, email and post each attach their own conversation record. A case is born out of instructions or consultations and takes its fee plan from money. Opening a case is the join point: openCaseIfReady only flips the status to ACTIVE once compliance says the lead client has signed and passed KYC, quotes says a quote is accepted, and the lawyer has filed a risk assessment. Reassignment sends work back to instructions by creating a fresh Instruction for the marketplace to fill.",
      "lifecycle": "PENDING → OPENING → ACTIVE → SUBMITTED_FOR_CLOSING → COMPLETED, with REASSIGNING and CANCELLED as side exits",
      "flows": [
        {
          "id": "case-opening",
          "title": "The three ways a case is born, and what opens it",
          "mermaid": "flowchart TD\n  A[Lawyer accepts instruction] --> B[Case created OPENING, source lawhive]\n  C[Lawyer converts an assessment] --> B\n  D[Lawyer creates a case for their own client] --> E[Case created PENDING, source byoc or followOn]\n  E --> F[Client invited]\n  F --> G[First client accepts invite]\n  G --> H[Case OPENING]\n  B --> I{openCaseIfReady}\n  H --> I\n  I -->|Terms of business, client care letter, CFA, KYC, accepted quote| J{Risk assessment filed and risk accepted}\n  I -->|something outstanding| K[Stays OPENING]\n  J -->|yes| L[Case ACTIVE]\n  J -->|no| M[Lawyer asked for a risk assessment]",
          "caption": "acceptInstruction and solicitorCreateAssessmentCase both create the case at OPENING with source lawhive. solicitorCreateCase starts at PENDING and picks followOn if Lawhive introduced the client already, byoc if not. Every path then runs openCaseIfReady, which is called again on each signature, payment and risk decision until the gates pass."
        },
        {
          "id": "case-completion",
          "title": "Asking to close a case",
          "mermaid": "flowchart TD\n  A[Lawyer requests completion] --> B{Money left on the billable account}\n  B -->|yes| C[Request refused]\n  B -->|no| D[CaseCompletionRequest pending]\n  D --> E[Case SUBMITTED_FOR_CLOSING]\n  E --> F{Firm COLP responds}\n  F -->|accepted| G[Case COMPLETED, completedAt set]\n  G --> H[Pending payment requests cancelled, review link emailed to clients]\n  F -->|rejected| I[Request rejected, other pending requests superseded]\n  E --> J{Admin responds}\n  J -->|rejected| K[Case back to ACTIVE]",
          "caption": "createCaseCompletionRequest blocks on money on account and puts the case in SUBMITTED_FOR_CLOSING. A COLP with writeFirmCaseCompletionRequest accepts or rejects it. The admin rejection path resets the case to ACTIVE; the firm rejection path does not, so a firm-rejected case sits in SUBMITTED_FOR_CLOSING until an admin intervenes."
        },
        {
          "id": "case-reassignment",
          "title": "Moving a case to a different lawyer",
          "mermaid": "flowchart TD\n  A[Admin reassigns, or a nursery paralegal hands over] --> B[Case REASSIGNING]\n  B --> C[CaseReassignment in_progress plus a new Instruction on the existing quote]\n  C --> D{Marketplace outcome}\n  D -->|new lawyer accepts| E[ownerId and baseFeePlan swapped, pending completion requests rejected]\n  E --> F[Case OPENING, reassignment complete]\n  F --> G[openCaseIfReady runs again]\n  D -->|admin cancels| H[Reassignment cancelled, case back to OPENING]\n  E --> I[Old lawyer leaves the chat channel, new lawyer joins]",
          "caption": "createReassignment needs exactly one quote to reinstruct against and refuses if a reassignment is already in flight. acceptReassignment in api/modules/instructions does the swap, and on a nursery reassignment it also adds the old paralegal to the new lawyer's team so they stay on the case."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "Case.leadCustomerId is read in a handful of selects but nothing writes it. createCase omits it and no update sets it. The real lead client is the CaseParty with isLead true and type CUSTOMER, which is what getLeadCustomerParty and promoteToLeadCustomer work on."
        },
        {
          "kind": "status",
          "body": "SUBMITTED_FOR_CLOSING has two exits with different behaviour. adminRejectCompleteCase puts the case back to ACTIVE, while the firm-facing rejectCaseCompletionRequest only updates the request and leaves the case status where it is."
        },
        {
          "kind": "misfiled",
          "body": "CustomerServiceContact and Comment are both generic admin-panel records keyed by a loose entityId with no foreign key, and neither has anything to do with cases specifically. Comments are attached to instructions, bills, bank transfer intents, customers, solicitors and outbound mail requests as well as cases, and CustomerServiceContact rows are only read back by the instructions admin views. Both would sit better in plumbing."
        },
        {
          "kind": "duplication",
          "body": "Party membership is stored twice over. CaseInvitation creates a CaseParty at status INVITED in the same transaction, and accepting the invite updates both rows. CaseParty.invitationId is the link back."
        },
        {
          "kind": "companion",
          "body": "CaseTag values are not free text. The eleven allowed strings live in a Zod enum in api/modules/cases/tags/schemas.ts, and five of them are Nursery stage markers used to track cases a Lawhive paralegal is onboarding."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/cases",
          "kind": "api-module",
          "label": "cases",
          "path": "packages/api/src/modules/cases",
          "files": 364,
          "prismaSites": 378,
          "procedures": {
            "queries": 68,
            "mutations": 108
          }
        },
        {
          "id": "api/cs-contacts",
          "kind": "api-module",
          "label": "cs-contacts",
          "path": "packages/api/src/modules/cs-contacts",
          "files": 5,
          "prismaSites": 1,
          "procedures": {
            "queries": 0,
            "mutations": 1
          }
        },
        {
          "id": "api/comments",
          "kind": "api-module",
          "label": "comments",
          "path": "packages/api/src/modules/comments",
          "files": 5,
          "prismaSites": 2,
          "procedures": {
            "queries": 1,
            "mutations": 1
          }
        },
        {
          "id": "api/search",
          "kind": "api-module",
          "label": "search",
          "path": "packages/api/src/modules/search",
          "files": 14,
          "prismaSites": 12,
          "procedures": {
            "queries": 8,
            "mutations": 0
          }
        },
        {
          "id": "api/go",
          "kind": "api-module",
          "label": "go",
          "path": "packages/api/src/modules/go",
          "files": 10,
          "prismaSites": 5,
          "procedures": {
            "queries": 1,
            "mutations": 0
          }
        },
        {
          "id": "api/test-data",
          "kind": "api-module",
          "label": "test-data",
          "path": "packages/api/src/modules/test-data",
          "files": 7,
          "prismaSites": 8,
          "procedures": {
            "queries": 0,
            "mutations": 0
          }
        },
        {
          "id": "ui/cases",
          "kind": "ui-feature",
          "label": "cases",
          "path": "apps/platform/src/features/cases",
          "files": 202,
          "prismaSites": 2
        },
        {
          "id": "ui/client",
          "kind": "ui-feature",
          "label": "client",
          "path": "apps/platform/src/features/client",
          "files": 4,
          "prismaSites": 0
        },
        {
          "id": "ui/analytics",
          "kind": "ui-feature",
          "label": "analytics",
          "path": "apps/platform/src/features/analytics",
          "files": 3,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/bill-assessment/lawrence-assessment.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/lawrence-assessments/billAssessment.service.ts",
            "line": 178,
            "live": "rare"
          },
          {
            "name": "app/case/advice_note.called",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/adviceNotes/service/requestAdviceNoteGenerationForCase.ts",
            "line": 30,
            "live": "silent"
          },
          {
            "name": "app/case/artifact_generation.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/letterGeneration/letterGenerationService.ts",
            "line": 51,
            "live": "active"
          },
          {
            "name": "app/case/bills/bill.paid",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/service/payBill.ts",
            "line": 152,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.called",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/briefingNotes/service/requestBriefingNoteGenerationForCase.ts",
            "line": 46,
            "live": "silent"
          },
          {
            "name": "app/case/case.cancelled",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/cancelCase.ts",
            "line": 35,
            "live": "silent"
          },
          {
            "name": "app/case/case.opened",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/openCaseIfReady.ts",
            "line": 309,
            "live": "silent"
          },
          {
            "name": "app/case/empty-form-generation.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/forms/service/requestEmptyFormGenerationForCase.ts",
            "line": 33,
            "live": "silent"
          },
          {
            "name": "app/case/form-filling.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/forms/service/requestFormFillingGenerationForCase.ts",
            "line": 52,
            "live": "silent"
          },
          {
            "name": "app/case/mail.uploaded",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/files/procedures/adminRegisterMailUploaded.handler.ts",
            "line": 88,
            "live": "silent"
          },
          {
            "name": "app/case/note.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/notes/caseNote.service.ts",
            "line": 25,
            "live": "silent"
          },
          {
            "name": "app/case/note.updated",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/notes/caseNote.service.ts",
            "line": 59,
            "live": "silent"
          },
          {
            "name": "app/case/party.sendbirdRemoval.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/removePartyFromCase.ts",
            "line": 39,
            "live": "silent"
          },
          {
            "name": "app/case/status.changed",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/openCaseIfReady.ts",
            "line": 243,
            "live": "silent"
          },
          {
            "name": "app/case/therefore-document-add.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/files/procedures/adminAddThereforeDocument.handler.ts",
            "line": 22,
            "live": "silent"
          },
          {
            "name": "app/cases/completionRequest.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/completionRequests/procedures/createCaseCompletionRequest.ts",
            "line": 68,
            "live": "silent"
          },
          {
            "name": "app/referrals/payment.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/service/createReferralPaymentForBill.ts",
            "line": 77,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/bill-assessment/lawrence-assessment.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/lawrence-assessments/event-handlers/handleLawrenceBillAssessmentRequested.ts",
            "line": 5,
            "live": "rare"
          },
          {
            "name": "app/case/party.sendbirdRemoval.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/parties/inngest/handleCasePartySendbirdRemoval.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "app/cases/completionRequest.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/completionRequests/inngest/handleCaseCompletionRequestCreated.ts",
            "line": 9,
            "live": "silent"
          },
          {
            "name": "artifact_generation.failed",
            "namespace": "artifact_generation",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/artifactGeneration/handleFailure.ts",
            "line": 4,
            "live": "silent"
          },
          {
            "name": "artifact_generation.final_asset_generated",
            "namespace": "artifact_generation",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/artifactGeneration/handleCompletion.ts",
            "line": 41,
            "live": "active"
          },
          {
            "name": "artifact_generation.progressed",
            "namespace": "artifact_generation",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/artifactGeneration/handleProgression.ts",
            "line": 55,
            "live": "active"
          },
          {
            "name": "cqs/case-alert/alert.cancelled",
            "namespace": "cqs",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/case-alerts/handleCaseAlertResolved.ts",
            "line": 5,
            "live": "rare"
          },
          {
            "name": "cqs/case-alert/alert.created",
            "namespace": "cqs",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/case-alerts/handleCaseAlertCreated.ts",
            "line": 6,
            "live": "rare"
          },
          {
            "name": "cqs/case-alert/alert.resolved",
            "namespace": "cqs",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/case-alerts/handleCaseAlertResolved.ts",
            "line": 5,
            "live": "active"
          }
        ],
        "owns": [
          {
            "name": "app/case/case.cancelled",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/cancelCase.ts",
            "line": 35,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "app/case/case.opened",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/openCaseIfReady.ts",
            "line": 309,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "app/case/caseReassignment.completed",
            "namespace": "app",
            "area": "api/instructions",
            "file": "packages/api/src/modules/instructions/service/acceptReassignment.ts",
            "line": 335,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions"
            ],
            "consumers": []
          },
          {
            "name": "app/case/note.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/notes/caseNote.service.ts",
            "line": 25,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "app/case/note.updated",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/notes/caseNote.service.ts",
            "line": 59,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": []
          },
          {
            "name": "app/case/status.changed",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/openCaseIfReady.ts",
            "line": 243,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/cases/completionRequest.created",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/completionRequests/procedures/createCaseCompletionRequest.ts",
            "line": 68,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "cases"
            ]
          },
          {
            "name": "matter-service/matter.cancelled",
            "namespace": "matter-service",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "matter-service/matter.created",
            "namespace": "matter-service",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "matter-service/note.created",
            "namespace": "matter-service",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "quality"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "CaseCompletionRequestStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 758,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "accepted",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            },
            {
              "name": "superseded",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseCompletionRequest"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseExternalPartyType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1410,
          "doc": null,
          "values": [
            {
              "name": "person",
              "doc": null
            },
            {
              "name": "company",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseExternalParty"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseInvitationInviterType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 729,
          "doc": null,
          "values": [
            {
              "name": "SOLICITOR",
              "doc": null
            },
            {
              "name": "CUSTOMER",
              "doc": null
            },
            {
              "name": "ADMIN",
              "doc": null
            },
            {
              "name": "TEAM_MEMBER",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseInvitation"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseInvitationStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 832,
          "doc": null,
          "values": [
            {
              "name": "PENDING",
              "doc": null
            },
            {
              "name": "ACCEPTED",
              "doc": null
            },
            {
              "name": "DECLINED",
              "doc": null
            },
            {
              "name": "CANCELLED",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseInvitation"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseModule",
          "file": "packages/db/prisma/schema.prisma",
          "line": 669,
          "doc": null,
          "values": [
            {
              "name": "lawrenceBasic",
              "doc": null
            },
            {
              "name": "lawrenceEnhanced",
              "doc": null
            },
            {
              "name": "caseAssessments",
              "doc": null
            },
            {
              "name": "proactiveLawrence",
              "doc": null
            },
            {
              "name": "informationRequest",
              "doc": null
            },
            {
              "name": "caseWorkflows",
              "doc": null
            },
            {
              "name": "veyo",
              "doc": null
            }
          ],
          "usedBy": [
            "Case"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CasePartyStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 827,
          "doc": null,
          "values": [
            {
              "name": "ASSIGNED",
              "doc": null
            },
            {
              "name": "INVITED",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseParty"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CasePartyType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 821,
          "doc": null,
          "values": [
            {
              "name": "SOLICITOR",
              "doc": null
            },
            {
              "name": "CUSTOMER",
              "doc": null
            },
            {
              "name": "TEAM_MEMBER",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseInvitation",
            "CaseParty"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseReassignmentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2643,
          "doc": null,
          "values": [
            {
              "name": "in_progress",
              "doc": null
            },
            {
              "name": "complete",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseReassignment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 653,
          "doc": null,
          "values": [
            {
              "name": "PENDING",
              "doc": null
            },
            {
              "name": "ACTIVE",
              "doc": null
            },
            {
              "name": "COMPLETED",
              "doc": null
            },
            {
              "name": "SUBMITTED_FOR_CLOSING",
              "doc": null
            },
            {
              "name": "OPENING",
              "doc": null
            },
            {
              "name": "REASSIGNING",
              "doc": null
            },
            {
              "name": "CANCELLED",
              "doc": null
            }
          ],
          "usedBy": [
            "Case"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CustomerServiceContactDirection",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3234,
          "doc": null,
          "values": [
            {
              "name": "inbound",
              "doc": null
            },
            {
              "name": "outbound",
              "doc": null
            }
          ],
          "usedBy": [
            "CustomerServiceContact"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CustomerServiceContactStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3229,
          "doc": null,
          "values": [
            {
              "name": "attempted",
              "doc": null
            },
            {
              "name": "successful",
              "doc": null
            }
          ],
          "usedBy": [
            "CustomerServiceContact"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 257,
        "writes": 77
      },
      "models": [
        {
          "key": "app/Case",
          "name": "Case",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 551,
          "idPrefix": "cas_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 60,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "humanReadableId",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CaseStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "CaseSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "parties",
              "type": "CaseParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseParty",
              "onDelete": null
            },
            {
              "name": "leadCustomer",
              "type": "Customer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "leadCustomerId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseInvitation",
              "type": "CaseInvitation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseInvitation",
              "onDelete": null
            },
            {
              "name": "owner",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "ownerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "title",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseFileFolders",
              "type": "CaseFileFolder",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFileFolder",
              "onDelete": null
            },
            {
              "name": "caseFiles",
              "type": "CaseFile",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "caseNotes",
              "type": "CaseNote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseNote",
              "onDelete": null
            },
            {
              "name": "caseArtifacts",
              "type": "CaseArtifact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseArtifact",
              "onDelete": null
            },
            {
              "name": "bills",
              "type": "Bill",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "channels",
              "type": "CaseChannel",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseChannel",
              "onDelete": null
            },
            {
              "name": "lastActivity",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "completedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quotes",
              "type": "Quote",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "paymentRequests",
              "type": "PaymentRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentRequest",
              "onDelete": null
            },
            {
              "name": "completionRequests",
              "type": "CaseCompletionRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseCompletionRequest",
              "onDelete": null
            },
            {
              "name": "payments",
              "type": "CasePayment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CasePayment",
              "onDelete": null
            },
            {
              "name": "caseLedger",
              "type": "CaseLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseLedger",
              "onDelete": null
            },
            {
              "name": "caseLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "nonBillableLedger",
              "type": "NonBillableLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "NonBillableLedger",
              "onDelete": null
            },
            {
              "name": "nonBillableLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "officeAccountLedger",
              "type": "CaseOfficeAccountLedger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseOfficeAccountLedger",
              "onDelete": null
            },
            {
              "name": "officeAccountLedgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankTransferIntents",
              "type": "BankTransferIntent",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransferIntent",
              "onDelete": null
            },
            {
              "name": "clientAgreements",
              "type": "ClientAgreement",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreement",
              "onDelete": null
            },
            {
              "name": "feeAllowances",
              "type": "FeeAllowance",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeeAllowance",
              "onDelete": null
            },
            {
              "name": "feePlanOverrides",
              "type": "FeePlanOverride",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePlanOverride",
              "onDelete": null
            },
            {
              "name": "riskAssessments",
              "type": "RiskAssessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "RiskAssessment",
              "onDelete": null
            },
            {
              "name": "reassignments",
              "type": "CaseReassignment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseReassignment",
              "onDelete": null
            },
            {
              "name": "hasRequestedReview",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assessment",
              "type": "Assessment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Assessment",
              "onDelete": null
            },
            {
              "name": "timeTrackingEntries",
              "type": "TimeTrackingEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "TimeTrackingEntry",
              "onDelete": null
            },
            {
              "name": "enabledModules",
              "type": "CaseModule",
              "list": true,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "baseFeePlan",
              "type": "FeePlan",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FeePlan",
              "onDelete": null
            },
            {
              "name": "baseFeePlanId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "referral",
              "type": "ClientReferral",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientReferral",
              "onDelete": null
            },
            {
              "name": "referralId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "communications",
              "type": "Communication",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Communication",
              "onDelete": null
            },
            {
              "name": "communicationThreads",
              "type": "CommunicationThread",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CommunicationThread",
              "onDelete": null
            },
            {
              "name": "informationRequests",
              "type": "InformationRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "InformationRequest",
              "onDelete": null
            },
            {
              "name": "reviews",
              "type": "CaseInternalReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseInternalReview",
              "onDelete": null
            },
            {
              "name": "tags",
              "type": "CaseTag",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseTag",
              "onDelete": null
            },
            {
              "name": "calls",
              "type": "Call",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Call",
              "onDelete": null
            },
            {
              "name": "workflowRuns",
              "type": "WorkflowRun",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "WorkflowRun",
              "onDelete": null
            },
            {
              "name": "autoBillingEnabled",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "externalParties",
              "type": "CaseExternalParty",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseExternalParty",
              "onDelete": null
            },
            {
              "name": "outboundMailRequests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "caseMailContacts",
              "type": "CaseMailContact",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseMailContact",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseAssociationsFrom",
              "type": "CaseAssociation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseAssociation",
              "onDelete": null
            },
            {
              "name": "caseAssociationsTo",
              "type": "CaseAssociation",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseAssociation",
              "onDelete": null
            },
            {
              "name": "addresses",
              "type": "Address",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Address",
              "onDelete": null
            },
            {
              "name": "addressChecks",
              "type": "AddressCheck",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AddressCheck",
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([source])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "parties",
              "target": "CaseParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseParty",
              "targetDomain": "cases"
            },
            {
              "field": "leadCustomer",
              "target": "Customer",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "leadCustomerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "caseInvitation",
              "target": "CaseInvitation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseInvitation",
              "targetDomain": "cases"
            },
            {
              "field": "owner",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ownerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "caseFileFolders",
              "target": "CaseFileFolder",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFileFolder",
              "targetDomain": "documents"
            },
            {
              "field": "caseFiles",
              "target": "CaseFile",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            },
            {
              "field": "caseNotes",
              "target": "CaseNote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseNote",
              "targetDomain": "cases"
            },
            {
              "field": "caseArtifacts",
              "target": "CaseArtifact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseArtifact",
              "targetDomain": "documents"
            },
            {
              "field": "bills",
              "target": "Bill",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "channels",
              "target": "CaseChannel",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseChannel",
              "targetDomain": "chat"
            },
            {
              "field": "quotes",
              "target": "Quote",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "paymentRequests",
              "target": "PaymentRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentRequest",
              "targetDomain": "money"
            },
            {
              "field": "completionRequests",
              "target": "CaseCompletionRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseCompletionRequest",
              "targetDomain": "cases"
            },
            {
              "field": "payments",
              "target": "CasePayment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePayment",
              "targetDomain": "money"
            },
            {
              "field": "caseLedger",
              "target": "CaseLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseLedger",
              "targetDomain": "money"
            },
            {
              "field": "nonBillableLedger",
              "target": "NonBillableLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "nonBillableLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/NonBillableLedger",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountLedger",
              "target": "CaseOfficeAccountLedger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "officeAccountLedgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseOfficeAccountLedger",
              "targetDomain": "money"
            },
            {
              "field": "bankTransferIntents",
              "target": "BankTransferIntent",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransferIntent",
              "targetDomain": "money"
            },
            {
              "field": "clientAgreements",
              "target": "ClientAgreement",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreement",
              "targetDomain": "compliance"
            },
            {
              "field": "feeAllowances",
              "target": "FeeAllowance",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeeAllowance",
              "targetDomain": "money"
            },
            {
              "field": "feePlanOverrides",
              "target": "FeePlanOverride",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlanOverride",
              "targetDomain": "money"
            },
            {
              "field": "riskAssessments",
              "target": "RiskAssessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/RiskAssessment",
              "targetDomain": "compliance"
            },
            {
              "field": "reassignments",
              "target": "CaseReassignment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseReassignment",
              "targetDomain": "cases"
            },
            {
              "field": "assessment",
              "target": "Assessment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Assessment",
              "targetDomain": "consultations"
            },
            {
              "field": "timeTrackingEntries",
              "target": "TimeTrackingEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/TimeTrackingEntry",
              "targetDomain": "money"
            },
            {
              "field": "baseFeePlan",
              "target": "FeePlan",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "baseFeePlanId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlan",
              "targetDomain": "money"
            },
            {
              "field": "referral",
              "target": "ClientReferral",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "referralId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientReferral",
              "targetDomain": "people"
            },
            {
              "field": "communications",
              "target": "Communication",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Communication",
              "targetDomain": "email"
            },
            {
              "field": "communicationThreads",
              "target": "CommunicationThread",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CommunicationThread",
              "targetDomain": "email"
            },
            {
              "field": "informationRequests",
              "target": "InformationRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/InformationRequest",
              "targetDomain": "ai"
            },
            {
              "field": "reviews",
              "target": "CaseInternalReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseInternalReview",
              "targetDomain": "compliance"
            },
            {
              "field": "tags",
              "target": "CaseTag",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseTag",
              "targetDomain": "cases"
            },
            {
              "field": "calls",
              "target": "Call",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Call",
              "targetDomain": "voice"
            },
            {
              "field": "workflowRuns",
              "target": "WorkflowRun",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/WorkflowRun",
              "targetDomain": "ai"
            },
            {
              "field": "externalParties",
              "target": "CaseExternalParty",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseExternalParty",
              "targetDomain": "cases"
            },
            {
              "field": "outboundMailRequests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            },
            {
              "field": "caseMailContacts",
              "target": "CaseMailContact",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseMailContact",
              "targetDomain": "post"
            },
            {
              "field": "caseAssociationsFrom",
              "target": "CaseAssociation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "caseAssociationsFrom",
              "onDelete": null,
              "targetKey": "app/CaseAssociation",
              "targetDomain": "cases"
            },
            {
              "field": "caseAssociationsTo",
              "target": "CaseAssociation",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "caseAssociationsTo",
              "onDelete": null,
              "targetKey": "app/CaseAssociation",
              "targetDomain": "cases"
            },
            {
              "field": "addresses",
              "target": "Address",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Address",
              "targetDomain": "compliance"
            },
            {
              "field": "addressChecks",
              "target": "AddressCheck",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AddressCheck",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "Address",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/Address",
              "sourceDomain": "compliance"
            },
            {
              "model": "AddressCheck",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/AddressCheck",
              "sourceDomain": "compliance"
            },
            {
              "model": "Assessment",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/Assessment",
              "sourceDomain": "consultations"
            },
            {
              "model": "BankTransferIntent",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransferIntent",
              "sourceDomain": "money"
            },
            {
              "model": "Bill",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "Call",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/Call",
              "sourceDomain": "voice"
            },
            {
              "model": "CaseArtifact",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseArtifact",
              "sourceDomain": "documents"
            },
            {
              "model": "CaseAssociation",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseAssociation",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseAssociation",
              "field": "associatedCase",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseAssociation",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseChannel",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseChannel",
              "sourceDomain": "chat"
            },
            {
              "model": "CaseCompletionRequest",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseCompletionRequest",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseExternalParty",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseExternalParty",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseFile",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "CaseFileFolder",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseFileFolder",
              "sourceDomain": "documents"
            },
            {
              "model": "CaseInternalReview",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseInternalReview",
              "sourceDomain": "compliance"
            },
            {
              "model": "CaseInvitation",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseInvitation",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseLedger",
              "field": "case",
              "fk": false,
              "list": false,
              "sourceKey": "app/CaseLedger",
              "sourceDomain": "money"
            },
            {
              "model": "CaseMailContact",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseMailContact",
              "sourceDomain": "post"
            },
            {
              "model": "CaseNote",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseNote",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseOfficeAccountLedger",
              "field": "case",
              "fk": false,
              "list": false,
              "sourceKey": "app/CaseOfficeAccountLedger",
              "sourceDomain": "money"
            },
            {
              "model": "CaseParty",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseParty",
              "sourceDomain": "cases"
            },
            {
              "model": "CasePayment",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CasePayment",
              "sourceDomain": "money"
            },
            {
              "model": "CaseReassignment",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseReassignment",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseTag",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseTag",
              "sourceDomain": "cases"
            },
            {
              "model": "ClientAgreement",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreement",
              "sourceDomain": "compliance"
            },
            {
              "model": "ClientReferral",
              "field": "case",
              "fk": false,
              "list": false,
              "sourceKey": "app/ClientReferral",
              "sourceDomain": "people"
            },
            {
              "model": "Communication",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/Communication",
              "sourceDomain": "email"
            },
            {
              "model": "CommunicationThread",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/CommunicationThread",
              "sourceDomain": "email"
            },
            {
              "model": "Customer",
              "field": "leadCustomerCases",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "FeeAllowance",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeeAllowance",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlan",
              "field": "cases",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeePlan",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlanOverride",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePlanOverride",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "ownedCases",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "InformationRequest",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/InformationRequest",
              "sourceDomain": "ai"
            },
            {
              "model": "NonBillableLedger",
              "field": "case",
              "fk": false,
              "list": false,
              "sourceKey": "app/NonBillableLedger",
              "sourceDomain": "money"
            },
            {
              "model": "OutboundMailRequest",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            },
            {
              "model": "PaymentRequest",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentRequest",
              "sourceDomain": "money"
            },
            {
              "model": "Quote",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            },
            {
              "model": "RiskAssessment",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/RiskAssessment",
              "sourceDomain": "compliance"
            },
            {
              "model": "TimeTrackingEntry",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/TimeTrackingEntry",
              "sourceDomain": "money"
            },
            {
              "model": "WorkflowRun",
              "field": "case",
              "fk": true,
              "list": false,
              "sourceKey": "app/WorkflowRun",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "leadCustomer"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "owner"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFileFolder",
              "field": "caseFileFolders"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFile",
              "field": "caseFiles"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseArtifact",
              "field": "caseArtifacts"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "Bill",
              "field": "bills"
            },
            {
              "dir": "out",
              "domain": "chat",
              "model": "CaseChannel",
              "field": "channels"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quotes"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "PaymentRequest",
              "field": "paymentRequests"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CasePayment",
              "field": "payments"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CaseLedger",
              "field": "caseLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "NonBillableLedger",
              "field": "nonBillableLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "CaseOfficeAccountLedger",
              "field": "officeAccountLedger"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BankTransferIntent",
              "field": "bankTransferIntents"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "clientAgreements"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeeAllowance",
              "field": "feeAllowances"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeePlanOverride",
              "field": "feePlanOverrides"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "RiskAssessment",
              "field": "riskAssessments"
            },
            {
              "dir": "out",
              "domain": "consultations",
              "model": "Assessment",
              "field": "assessment"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "TimeTrackingEntry",
              "field": "timeTrackingEntries"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "FeePlan",
              "field": "baseFeePlan"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "ClientReferral",
              "field": "referral"
            },
            {
              "dir": "out",
              "domain": "email",
              "model": "Communication",
              "field": "communications"
            },
            {
              "dir": "out",
              "domain": "email",
              "model": "CommunicationThread",
              "field": "communicationThreads"
            },
            {
              "dir": "out",
              "domain": "ai",
              "model": "InformationRequest",
              "field": "informationRequests"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "CaseInternalReview",
              "field": "reviews"
            },
            {
              "dir": "out",
              "domain": "voice",
              "model": "Call",
              "field": "calls"
            },
            {
              "dir": "out",
              "domain": "ai",
              "model": "WorkflowRun",
              "field": "workflowRuns"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "outboundMailRequests"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "CaseMailContact",
              "field": "caseMailContacts"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "Address",
              "field": "addresses"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "addressChecks"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "Address",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "AddressCheck",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "consultations",
              "model": "Assessment",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BankTransferIntent",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "Bill",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "voice",
              "model": "Call",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseArtifact",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "chat",
              "model": "CaseChannel",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFile",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFileFolder",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "CaseInternalReview",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CaseLedger",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "CaseMailContact",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CaseOfficeAccountLedger",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "CasePayment",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "ClientReferral",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "email",
              "model": "Communication",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "email",
              "model": "CommunicationThread",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "leadCustomerCases"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeeAllowance",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeePlan",
              "field": "cases"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "FeePlanOverride",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "ownedCases"
            },
            {
              "dir": "in",
              "domain": "ai",
              "model": "InformationRequest",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "NonBillableLedger",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "PaymentRequest",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "RiskAssessment",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "TimeTrackingEntry",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "ai",
              "model": "WorkflowRun",
              "field": "case"
            }
          ],
          "usage": {
            "total": 219,
            "reads": 196,
            "writes": 23,
            "ops": {
              "findUniqueOrThrow": 57,
              "findMany": 33,
              "groupBy": 4,
              "findFirst": 61,
              "findUnique": 28,
              "findFirstOrThrow": 4,
              "update": 20,
              "create": 3,
              "count": 9
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 105,
                "writes": 17,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 16,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/solicitors",
                "reads": 9,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 9,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/payments",
                "reads": 8,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 5,
                "writes": 2,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/ai",
                "reads": 5,
                "writes": 0,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "api/outbound-mail",
                "reads": 4,
                "writes": 0,
                "domain": "post",
                "kind": "api-module"
              },
              {
                "area": "api/workflows-v2",
                "reads": 4,
                "writes": 0,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "api/lawrence",
                "reads": 3,
                "writes": 0,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "api/messages",
                "reads": 3,
                "writes": 0,
                "domain": "chat",
                "kind": "api-module"
              },
              {
                "area": "api/test-data",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/agreements",
                "reads": 2,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/case-internal-reviews",
                "reads": 2,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/go",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/mailroom",
                "reads": 2,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/officeAddin",
                "reads": 2,
                "writes": 0,
                "domain": "email",
                "kind": "api-module"
              },
              {
                "area": "api/raw-asset-retrieval",
                "reads": 2,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/search",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/_utils",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "ui/_app",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "ui-other"
              },
              {
                "area": "api/addressChecks",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/addresses",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/company",
                "reads": 1,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/customers",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "api/feePlanPromotions",
                "reads": 1,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/legalForms",
                "reads": 1,
                "writes": 0,
                "domain": "catalog",
                "kind": "api-module"
              },
              {
                "area": "api/persons",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "pkg/db",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/briefingNotes/service/enableCaseModulesForCaseIfOwnerFlaggedUser.ts",
                "line": 40,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/caseEvents.ts",
                "line": 66,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/caseEvents.ts",
                "line": 93,
                "op": "update"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/solicitors",
                "n": 1
              }
            ],
            "typeMentions": 465,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 119
              },
              {
                "area": "ui/cases",
                "n": 83
              },
              {
                "area": "api/cases",
                "n": 71
              },
              {
                "area": "ui/_app",
                "n": 52
              },
              {
                "area": "service/case-quality",
                "n": 30
              },
              {
                "area": "pkg/ui",
                "n": 15
              },
              {
                "area": "api/payments",
                "n": 12
              },
              {
                "area": "api/_integrations",
                "n": 10
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One piece of legal work for a client, owned by one FirmEmployee. Everything else in the product hangs off it, and staff refer to it by its humanReadableId rather than its cas_ id.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PENDING, OPENING, ACTIVE, SUBMITTED_FOR_CLOSING, COMPLETED, REASSIGNING or CANCELLED"
            },
            {
              "name": "source",
              "meaning": "lawhive for marketplace work, byoc for a lawyer's own client, followOn for repeat work from a Lawhive client"
            },
            {
              "name": "humanReadableId",
              "meaning": "Autoincrementing case number, unique, used in Slack, email and ledger names"
            },
            {
              "name": "enabledModules",
              "meaning": "CaseModule list gating Lawrence, case assessments, information requests, workflows and Veyo"
            },
            {
              "name": "autoBillingEnabled",
              "meaning": "When false, raiseBill sends the bill for admin review instead of billing straight through"
            },
            {
              "name": "lastActivity",
              "meaning": "Touched by updateCaseLastActivity on invites, party changes, completion requests and openings"
            },
            {
              "name": "completedAt",
              "meaning": "Stamped when the status flips to COMPLETED, by completeCase or the case.completed event"
            }
          ],
          "references": [
            {
              "field": "ownerId",
              "target": "firms",
              "meaning": "the FirmEmployee who owns the matter; swapped on reassignment"
            },
            {
              "field": "leadCustomerId",
              "target": "people",
              "meaning": "nullable and never written; the lead client is the CaseParty with isLead"
            },
            {
              "field": "baseFeePlanId",
              "target": "money",
              "meaning": "the owner's fee plan for this case source, refreshed when the owner changes"
            },
            {
              "field": "caseLedgerId",
              "target": "money",
              "meaning": "the client-money ledger created with the case, alongside the non-billable and office ledgers"
            },
            {
              "field": "referralId",
              "target": "people",
              "meaning": "the ClientReferral the instruction came from, when there was one"
            }
          ],
          "lifecycle": "PENDING → OPENING → ACTIVE → SUBMITTED_FOR_CLOSING → COMPLETED, or REASSIGNING / CANCELLED",
          "grouped": [
            "CaseTag",
            "CaseAssociation"
          ],
          "flags": [
            "hub",
            "60-fields"
          ]
        },
        {
          "key": "app/CaseParty",
          "name": "CaseParty",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 679,
          "idPrefix": "caspar_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 17,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "CasePartyType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CasePartyStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assignedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isLead",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "invitation",
              "type": "CaseInvitation",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseInvitation",
              "onDelete": null
            },
            {
              "name": "invitationId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "teamMember",
              "type": "TeamMember",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "TeamMember",
              "onDelete": null
            },
            {
              "name": "teamMemberId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "company",
              "type": "Company",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Company",
              "onDelete": null
            },
            {
              "name": "companyId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([personId, caseId])",
            "@@index([caseId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "invitation",
              "target": "CaseInvitation",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "invitationId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseInvitation",
              "targetDomain": "cases"
            },
            {
              "field": "teamMember",
              "target": "TeamMember",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "teamMemberId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/TeamMember",
              "targetDomain": "firms"
            },
            {
              "field": "company",
              "target": "Company",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "companyId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Company",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "parties",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseInvitation",
              "field": "party",
              "fk": false,
              "list": false,
              "sourceKey": "app/CaseInvitation",
              "sourceDomain": "cases"
            },
            {
              "model": "Company",
              "field": "caseParties",
              "fk": false,
              "list": true,
              "sourceKey": "app/Company",
              "sourceDomain": "firms"
            },
            {
              "model": "Person",
              "field": "caseParties",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "TeamMember",
              "field": "caseParties",
              "fk": false,
              "list": true,
              "sourceKey": "app/TeamMember",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "person"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "TeamMember",
              "field": "teamMember"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "Company",
              "field": "company"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Company",
              "field": "caseParties"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "caseParties"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "TeamMember",
              "field": "caseParties"
            }
          ],
          "usage": {
            "total": 41,
            "reads": 28,
            "writes": 13,
            "ops": {
              "findMany": 9,
              "findFirstOrThrow": 1,
              "findFirst": 11,
              "findUniqueOrThrow": 5,
              "findUnique": 2,
              "upsert": 3,
              "create": 2,
              "update": 6,
              "delete": 1,
              "createMany": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 16,
                "writes": 9,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 3,
                "writes": 1,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/company",
                "reads": 0,
                "writes": 3,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_auth",
                "reads": 2,
                "writes": 0,
                "domain": "people",
                "kind": "api-core"
              },
              {
                "area": "api/agreements",
                "reads": 2,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/team",
                "reads": 2,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/messages",
                "reads": 1,
                "writes": 0,
                "domain": "chat",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/caseService.ts",
                "line": 216,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/cases/invites/inviteEvents.ts",
                "line": 38,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/invites/inviteEvents.ts",
                "line": 66,
                "op": "update"
              }
            ],
            "nested": 133,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 65
              },
              {
                "area": "api/_integrations",
                "n": 16
              },
              {
                "area": "admin",
                "n": 7
              },
              {
                "area": "api/messages",
                "n": 7
              },
              {
                "area": "api/officeAddin",
                "n": 4
              },
              {
                "area": "api/solicitors",
                "n": 4
              },
              {
                "area": "api/ai",
                "n": 3
              },
              {
                "area": "api/firms",
                "n": 3
              }
            ],
            "typeMentions": 24,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 6
              },
              {
                "area": "api/_utils",
                "n": 5
              },
              {
                "area": "service/case-quality",
                "n": 5
              },
              {
                "area": "api/agreements",
                "n": 4
              },
              {
                "area": "api/cases",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One person on a case, either the owning lawyer, a team member, or a client. This is the row that decides who can see the case and who signs which agreement.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "SOLICITOR, TEAM_MEMBER or CUSTOMER"
            },
            {
              "name": "status",
              "meaning": "ASSIGNED once they are really on it, INVITED while an invitation is outstanding"
            },
            {
              "name": "isLead",
              "meaning": "The lead lawyer or the lead client; promoteToLeadCustomer moves it and revokes the old letters of authority"
            },
            {
              "name": "assignedAt",
              "meaning": "When the party was put on the case"
            }
          ],
          "references": [
            {
              "field": "personId",
              "target": "people",
              "meaning": "the human on the case, not their Customer or Solicitor hat"
            },
            {
              "field": "invitationId",
              "target": "cases",
              "meaning": "the CaseInvitation this party came from, if they were invited"
            },
            {
              "field": "teamMemberId",
              "target": "firms",
              "meaning": "set when the party is on the case through the owner's team"
            },
            {
              "field": "companyId",
              "target": "firms",
              "meaning": "the corporate client the party is acting for"
            }
          ],
          "lifecycle": "INVITED → ASSIGNED",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseInvitation",
          "name": "CaseInvitation",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 708,
          "idPrefix": "casinv_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "inviter",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "inviterId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "inviterType",
              "type": "CaseInvitationInviterType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "invitee",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "inviteeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "inviteeType",
              "type": "CasePartyType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CaseInvitationStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isInvitationToBecomeLeadCustomer",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "party",
              "type": "CaseParty",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseParty",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "inviter",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "inviterId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "invitee",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "inviteeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "party",
              "target": "CaseParty",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseParty",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseInvitation",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseParty",
              "field": "invitation",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseParty",
              "sourceDomain": "cases"
            },
            {
              "model": "Person",
              "field": "sentInvites",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Person",
              "field": "receivedInvites",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "inviter"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "invitee"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "sentInvites"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "receivedInvites"
            }
          ],
          "usage": {
            "total": 11,
            "reads": 8,
            "writes": 3,
            "ops": {
              "findUniqueOrThrow": 4,
              "create": 1,
              "update": 2,
              "findUnique": 2,
              "findMany": 2
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 7,
                "writes": 3,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/users",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/invites/inviteEvents.ts",
                "line": 24,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/invites/inviteEvents.ts",
                "line": 61,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/invites/inviteEvents.ts",
                "line": 96,
                "op": "update"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "An invitation for a client to join a case, sent by a lawyer, a team member, another client or an admin. Creating one also creates the invitee's CaseParty at status INVITED.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PENDING, ACCEPTED, DECLINED or CANCELLED"
            },
            {
              "name": "inviterType",
              "meaning": "SOLICITOR, CUSTOMER, ADMIN or TEAM_MEMBER; it decides the invitee's customer source"
            },
            {
              "name": "inviteeType",
              "meaning": "CasePartyType of the invitee; inviting a SOLICITOR is rejected"
            },
            {
              "name": "isInvitationToBecomeLeadCustomer",
              "meaning": "On acceptance the new party is promoted to lead client"
            }
          ],
          "references": [
            {
              "field": "inviterId",
              "target": "people",
              "meaning": "the Person who sent the invite"
            },
            {
              "field": "inviteeId",
              "target": "people",
              "meaning": "the Person invited, created on the fly if they are new to the platform"
            }
          ],
          "lifecycle": "PENDING → ACCEPTED / DECLINED / CANCELLED",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseNote",
          "name": "CaseNote",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1371,
          "idPrefix": "casnt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isMarkdown",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "createdBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseNotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "caseNotes",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "caseNotes"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 7,
            "writes": 3,
            "ops": {
              "create": 1,
              "update": 2,
              "findUnique": 4,
              "findUniqueOrThrow": 1,
              "findMany": 2
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 5,
                "writes": 3,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/raw-asset-retrieval",
                "reads": 2,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/notes/caseNoteEvents.ts",
                "line": 29,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/notes/caseNoteEvents.ts",
                "line": 42,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/notes/caseNoteEvents.ts",
                "line": 53,
                "op": "update"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 1
              }
            ],
            "typeMentions": 4,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A note a lawyer or team member writes on a case for their own side. Written only through the case note events, and deleted by setting isDeleted rather than removing the row.",
          "keyFields": [
            {
              "name": "content",
              "meaning": "The note body"
            },
            {
              "name": "isMarkdown",
              "meaning": "Whether the content should be rendered as markdown"
            },
            {
              "name": "isDeleted",
              "meaning": "Soft delete; the row stays"
            }
          ],
          "references": [
            {
              "field": "createdById",
              "target": "firms",
              "meaning": "the FirmEmployee who wrote it"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case it belongs to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "soft-delete"
          ]
        },
        {
          "key": "app/CaseTag",
          "name": "CaseTag",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 639,
          "idPrefix": "ctag_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "tag",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": "Cascade"
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([caseId, tag])",
            "@@index([tag])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Cascade",
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "tags",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 7,
            "reads": 3,
            "writes": 4,
            "ops": {
              "findUnique": 2,
              "create": 1,
              "delete": 1,
              "findMany": 1,
              "deleteMany": 1,
              "createMany": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 3,
                "writes": 4,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/tags/services/CaseTagService.ts",
                "line": 38,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/tags/services/CaseTagService.ts",
                "line": 65,
                "op": "delete"
              },
              {
                "file": "packages/api/src/modules/cases/tags/services/CaseTagService.ts",
                "line": 113,
                "op": "deleteMany"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 47,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 19
              },
              {
                "area": "admin",
                "n": 11
              },
              {
                "area": "api/cases",
                "n": 10
              },
              {
                "area": "pkg/ui",
                "n": 7
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One workflow label on a case, from a fixed list of eleven strings such as On hold, Awaiting client response and the five Nursery stages. Unique per case and tag, and it cascades when the case is deleted.",
          "keyFields": [
            {
              "name": "tag",
              "meaning": "One of the CASE_TAGS values, validated in code rather than by a database enum"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the tagged case"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "enum-in-code"
          ]
        },
        {
          "key": "app/CaseAssociation",
          "name": "CaseAssociation",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3523,
          "idPrefix": "casa_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "associatedCaseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "associatedCase",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "associationReason",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "associatedCase",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "associatedCaseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseAssociationsFrom",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Case",
              "field": "caseAssociationsTo",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 3,
            "reads": 1,
            "writes": 2,
            "ops": {
              "create": 1,
              "findMany": 1,
              "delete": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/associations/service/createCaseAssociation.ts",
                "line": 14,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/associations/service/removeCaseAssociation.ts",
                "line": 8,
                "op": "delete"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A directed link between two cases with a free-text reason, added by admins when a matter relates to another one. Admins can point at the other case by id or by case number.",
          "keyFields": [
            {
              "name": "associationReason",
              "meaning": "Free text explaining the link"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case the association was created from"
            },
            {
              "field": "associatedCaseId",
              "target": "cases",
              "meaning": "the case it points at"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "thin-usage"
          ]
        },
        {
          "key": "app/CaseExternalParty",
          "name": "CaseExternalParty",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1390,
          "idPrefix": "casct_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "CaseExternalPartyType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "createdBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "externalParties",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Firm",
              "field": "externalParties",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "caseExternalParties",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "createdBy"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "externalParties"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "caseExternalParties"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 2,
            "writes": 2,
            "ops": {
              "create": 1,
              "update": 1,
              "findMany": 2
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 0,
                "domain": "firms",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/external-parties/case-external-party.events.ts",
                "line": 27,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/external-parties/case-external-party.events.ts",
                "line": 42,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "Someone on the other side of the matter, such as the opposing solicitor or a company, recorded as a name and a type rather than as a platform Person.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "person or company"
            },
            {
              "name": "name",
              "meaning": "Free-text name; there is no link to a Person or Company record"
            },
            {
              "name": "isDeleted",
              "meaning": "Soft delete, set by the removed event"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case they are involved in"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "the firm that recorded them"
            },
            {
              "field": "createdById",
              "target": "firms",
              "meaning": "the FirmEmployee who added them"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "soft-delete",
            "free-text-party"
          ]
        },
        {
          "key": "app/CaseCompletionRequest",
          "name": "CaseCompletionRequest",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 736,
          "idPrefix": "ccr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requestedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "respondedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requestedBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "requestedById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "respondedBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "respondedById",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CaseCompletionRequestStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rejectionReason",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "requestedBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestedById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "respondedBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "respondedById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "completionRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "completionRequestsRequested",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "completionRequestsResponded",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "requestedBy"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "respondedBy"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "completionRequestsRequested"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "completionRequestsResponded"
            }
          ],
          "usage": {
            "total": 14,
            "reads": 4,
            "writes": 10,
            "ops": {
              "updateMany": 6,
              "findUniqueOrThrow": 1,
              "findUnique": 3,
              "update": 3,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 4,
                "writes": 9,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 0,
                "writes": 1,
                "domain": "instructions",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/caseEvents.ts",
                "line": 156,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/cases/completionRequests/procedures/acceptCaseCompletionRequest.ts",
                "line": 39,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/completionRequests/procedures/acceptCaseCompletionRequest.ts",
                "line": 74,
                "op": "updateMany"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A lawyer's request to close a case, reviewed by a COLP at their own firm. Creating one moves the case to SUBMITTED_FOR_CLOSING, accepting one completes the case.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "pending, accepted, rejected or superseded"
            },
            {
              "name": "rejectionReason",
              "meaning": "Free text from the reviewer, also filled in by the system on reopening and reassignment"
            },
            {
              "name": "requestedAt",
              "meaning": "When the lawyer asked"
            },
            {
              "name": "respondedAt",
              "meaning": "When the COLP or admin answered"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case being closed"
            },
            {
              "field": "requestedById",
              "target": "firms",
              "meaning": "the FirmEmployee asking for closure"
            },
            {
              "field": "respondedById",
              "target": "firms",
              "meaning": "the FirmEmployee who accepted or rejected it"
            }
          ],
          "lifecycle": "pending → accepted / rejected / superseded",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseReassignment",
          "name": "CaseReassignment",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2618,
          "idPrefix": "casre_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 15,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CaseReassignmentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "oldFirmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "oldFirmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "newFirmEmployeeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "newFirmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "instructionId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "instruction",
              "type": "Instruction",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Instruction",
              "onDelete": null
            },
            {
              "name": "reason",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isNurseryReassignment",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "oldFirmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "oldFirmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "newFirmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "newFirmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "instruction",
              "target": "Instruction",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "instructionId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Instruction",
              "targetDomain": "instructions"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "reassignments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "reassignmentsFrom",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "reassignmentsTo",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Instruction",
              "field": "caseReassignment",
              "fk": false,
              "list": false,
              "sourceKey": "app/Instruction",
              "sourceDomain": "instructions"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "oldFirmEmployee"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "newFirmEmployee"
            },
            {
              "dir": "out",
              "domain": "instructions",
              "model": "Instruction",
              "field": "instruction"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "reassignmentsFrom"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "reassignmentsTo"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "Instruction",
              "field": "caseReassignment"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 3,
            "writes": 4,
            "ops": {
              "findMany": 1,
              "findUniqueOrThrow": 2,
              "update": 3,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 2,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/service/cancelReassignment.ts",
                "line": 20,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/service/createReassignment.ts",
                "line": 53,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/instructions/service/acceptReassignment.ts",
                "line": 161,
                "op": "update"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/instructions",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A handover of a case from one lawyer to another. It creates a fresh Instruction on the existing quote so the marketplace can find a replacement, and holds the old and new owner while that happens.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "in_progress while the new Instruction is unfilled, then complete or cancelled"
            },
            {
              "name": "reason",
              "meaning": "Why the case is moving, for example reassignedFromNursery"
            },
            {
              "name": "isNurseryReassignment",
              "meaning": "A Lawhive paralegal handing over after onboarding; the paralegal stays on as a team member"
            },
            {
              "name": "details",
              "meaning": "Free text on who started the reassignment"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case being moved"
            },
            {
              "field": "oldFirmEmployeeId",
              "target": "firms",
              "meaning": "the outgoing owner"
            },
            {
              "field": "newFirmEmployeeId",
              "target": "firms",
              "meaning": "the incoming owner, set only when the new Instruction is accepted"
            },
            {
              "field": "instructionId",
              "target": "instructions",
              "meaning": "the replacement Instruction created with the reassignment"
            }
          ],
          "lifecycle": "in_progress → complete / cancelled",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CustomerServiceContact",
          "name": "CustomerServiceContact",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3207,
          "idPrefix": "csc_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CustomerServiceContactStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "direction",
              "type": "CustomerServiceContactDirection",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "inRelationToEntityId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "handlingLawhiveAdmin",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "handlingLawhiveAdminId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "contactedPerson",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "contactedPersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([inRelationToEntityId])"
          ],
          "looseRefs": [
            "inRelationToEntityId"
          ],
          "relationsOut": [
            {
              "field": "handlingLawhiveAdmin",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "handlingLawhiveAdminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "contactedPerson",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "contactedPersonId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "customerServiceContacts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Person",
              "field": "customerServiceContacts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "handlingLawhiveAdmin"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "contactedPerson"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "customerServiceContacts"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "customerServiceContacts"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "findMany": 3,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/instructions",
                "reads": 2,
                "writes": 0,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cs-contacts",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cs-contacts/csContactEvents.ts",
                "line": 25,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A log line for an admin phoning or being phoned by a client, written from the admin panel. It hangs off whatever record the admin was looking at through an untyped inRelationToEntityId.",
          "keyFields": [
            {
              "name": "direction",
              "meaning": "inbound or outbound"
            },
            {
              "name": "status",
              "meaning": "attempted or successful"
            },
            {
              "name": "details",
              "meaning": "What was said"
            },
            {
              "name": "inRelationToEntityId",
              "meaning": "Loose id with no foreign key; in practice an Instruction id"
            }
          ],
          "references": [
            {
              "field": "handlingLawhiveAdminId",
              "target": "people",
              "meaning": "the admin who made or took the call"
            },
            {
              "field": "contactedPersonId",
              "target": "people",
              "meaning": "the person on the other end"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "loose-entity-id",
            "misfiled"
          ]
        },
        {
          "key": "app/Comment",
          "name": "Comment",
          "table": null,
          "datastore": "app",
          "domain": "cases",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2457,
          "idPrefix": "com_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "entityId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "author",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "authorId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([entityId])"
          ],
          "looseRefs": [
            "entityId"
          ],
          "relationsOut": [
            {
              "field": "author",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "authorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "comments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "author"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "comments"
            }
          ],
          "usage": {
            "total": 14,
            "reads": 2,
            "writes": 12,
            "ops": {
              "findMany": 2,
              "create": 12
            },
            "byArea": [
              {
                "area": "api/solicitors",
                "reads": 0,
                "writes": 7,
                "domain": "people",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 1,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/comments",
                "reads": 1,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/kyc",
                "reads": 0,
                "writes": 1,
                "domain": "compliance",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "apps/admin/src/components/utils/addComment.ts",
                "line": 16,
                "op": "create"
              },
              {
                "file": "packages/api/src/integrations/inngest/addThereforeDocument.ts",
                "line": 179,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/procedures/adminSetAutoBillingStatus.ts",
                "line": 19,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 7,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/comments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "An internal admin note on any record at all. The admin panel drops a comment box on cases, instructions, bills, bank transfer intents, customers, solicitors and outbound mail requests, and they all write here.",
          "keyFields": [
            {
              "name": "entityId",
              "meaning": "Id of whatever the comment is about; no foreign key, no type discriminator"
            },
            {
              "name": "content",
              "meaning": "The comment body"
            }
          ],
          "references": [
            {
              "field": "authorId",
              "target": "people",
              "meaning": "the Admin who wrote it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "loose-entity-id",
            "misfiled",
            "write-heavy"
          ]
        }
      ]
    },
    {
      "id": "documents",
      "order": 8,
      "groups": [],
      "name": "Documents: files and artifacts",
      "tagline": "Every S3 object on a case: uploads, filed email, scanned post, AI drafts",
      "whatItIs": "This is the file layer of a case. A File is one object in the case files S3 bucket with its name, size, extension and preview state. A CaseFile attaches that object to a case, says who can see it and records where it came from, and CaseFileFolder is the coloured folder list the case documents tab renders. A CaseArtifact is something the AI wrote for the case: a briefing note, an advice note, a filled legal form or a generated letter, held as a draft until a lawyer accepts it. From here you upload and delete documents, hide them from the client, sort them into folders, combine them into a PDF bundle, open a docx in the document editor, and accept or discard AI drafts.",
      "howItConnects": "Every CaseFile hangs off a Case, and the person credited with filing it is a Person from people. Money, compliance and post all borrow case files: BankTransferIntent points at supporting evidence, RiskAssessment and ClientAgreement point at the file that backs them, and OutboundMailDocument is a case file being posted. The email domain wraps a filed Outlook message, where Communication owns the message File and its attachment Files. Ingestion is the link into ai: a new case file on a case with modules enabled is pushed to the ingestion management service, which calls back with a status and triggers app/case/file.ingestionSucceeded, and Lawrence reads CaseFile rows and File.summary when it builds case context.",
      "lifecycle": null,
      "flows": [
        {
          "id": "file-onto-case",
          "title": "How a file gets onto a case",
          "mermaid": "flowchart TD\n  UI[Upload in app] --> REG[registerUploadComplete]\n  MG[Mailgun email attachment] --> REG\n  OL[Outlook add-in] --> REG\n  ED[Document editor save] --> REG\n  BU[PDF bundle] --> REG\n  REG --> CF[CaseFile plus File]\n  TH[Therefore scanned post] --> CF\n  V1[v1 legacy bucket import] --> CF\n  AR[Accepted CaseArtifact] --> CF\n  CF --> PV[requestPreviewGeneration]\n  CF --> IN[Ingestion v3]",
          "caption": "registerUploadComplete is the shared path: it checks case party membership, HEADs the S3 object for size and metadata, creates the CaseFile with its File, then asks for a preview and queues ingestion. Therefore post, the v1 import and accepted artifacts build the CaseFile themselves."
        },
        {
          "id": "artifact-to-case-file",
          "title": "From AI draft to case file",
          "mermaid": "flowchart LR\n  WF[Workflow run] --> D[CaseArtifact draft]\n  D -->|lawyer accepts| CF[CaseFile source caseArtifact]\n  D -->|lawyer discards| X[CaseArtifact discarded]\n  CF --> F[CaseArtifact final]\n  CF --> IN[Ingestion as artifact asset type]",
          "caption": "Form completion writes the PDF and publishes case.artifacts.created as a draft. acceptDraft creates the CaseFile with source caseArtifact and caseArtifactId set, flips the artifact to final and ingests it under an asset type derived from the artifact type."
        },
        {
          "id": "preview-generation",
          "title": "Preview generation",
          "mermaid": "flowchart TD\n  N[New File] --> P{Content type}\n  P -->|image audio video pdf| S[FilePreview success on the original key]\n  P -->|other type| G[FilePreview pending plus SNS request]\n  P -->|unknown| C[canPreview false]\n  G --> H[handlePreviewGenerationResult]\n  H --> OK[status success]\n  H --> FL[status failed]",
          "caption": "getPreviewGenerationPolicy decides whether a file previews itself, needs converting, or cannot be previewed at all. The converter reports back on a queue and a successful preview is never overwritten by a later result."
        }
      ],
      "notes": [
        {
          "kind": "legacy",
          "body": "File carries three AI ingestion status columns, one per pipeline generation. Only aiIngestionV3Status is written now, by the ingestion management service status webhook. aiIngestionStatus is v1, the pgvector AIDocument and AIEmbedding tables in the ai database, and aiIngestionV2Status is v2, the OpenSearch index in services/ingestion-service. Both are still selected but nothing sets them outside test data, so the badge listCaseDocuments builds by merging those two shows NOT_REQUESTED for anything ingested since v3 landed. deleteFile still fans out to all three: it marks embeddings unsearchable, calls the v2 retrieval service, and calls the v3 asset delete endpoint."
        },
        {
          "kind": "status",
          "body": "File.summary is read when Lawrence assembles the artifact list for case context, and no code in the monolith writes it."
        },
        {
          "kind": "status",
          "body": "The document editor is docx only and it never edits a file in place. loadCaseFile fetches the object from S3 and parses it to a ProseMirror document; save regenerates the docx, writes a new S3 key and calls registerUploadComplete, so each save adds another CaseFile with a versioned display name such as Contract - v2 04-08-2026."
        },
        {
          "kind": "companion",
          "body": "Inbound scanned post arrives through the mailroom module, which is a thin wrapper over an external mailroom service. Confirming a mail item match sends app/case/therefore-document-add.requested, and the Inngest handler pulls the PDF from Therefore, strips the cover page, and creates a CaseFile named Physical mail uploaded plus the date. That handler never sets source, so scanned post lands under the default value upload rather than import."
        },
        {
          "kind": "misfiled",
          "body": "raw-asset-retrieval is listed as a code area of this domain but it no longer handles documents. It resolves chat messages, lawyer notes and initial case information for AI extraction, and throws on a document asset id with a message pointing the caller at the ingestion service. No model here belongs to it."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/files",
          "kind": "api-module",
          "label": "files",
          "path": "packages/api/src/modules/files",
          "files": 4,
          "prismaSites": 7,
          "procedures": {
            "queries": 0,
            "mutations": 0
          }
        },
        {
          "id": "api/document-editor",
          "kind": "api-module",
          "label": "document-editor",
          "path": "packages/api/src/modules/document-editor",
          "files": 7,
          "prismaSites": 2,
          "procedures": {
            "queries": 1,
            "mutations": 1
          }
        },
        {
          "id": "api/raw-asset-retrieval",
          "kind": "api-module",
          "label": "raw-asset-retrieval",
          "path": "packages/api/src/modules/raw-asset-retrieval",
          "files": 4,
          "prismaSites": 9,
          "procedures": {
            "queries": 0,
            "mutations": 0
          }
        },
        {
          "id": "api/mailroom",
          "kind": "api-module",
          "label": "mailroom",
          "path": "packages/api/src/modules/mailroom",
          "files": 13,
          "prismaSites": 2,
          "procedures": {
            "queries": 4,
            "mutations": 6
          }
        },
        {
          "id": "service/ingestion-service",
          "kind": "service",
          "label": "ingestion-service",
          "path": "services/ingestion-service",
          "files": 161,
          "prismaSites": 0
        },
        {
          "id": "ui/documents",
          "kind": "ui-feature",
          "label": "documents",
          "path": "apps/platform/src/features/documents",
          "files": 2,
          "prismaSites": 0
        },
        {
          "id": "ui/document-editor",
          "kind": "ui-feature",
          "label": "document-editor",
          "path": "apps/platform/src/features/document-editor",
          "files": 11,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/case/therefore-document-add.requested",
            "namespace": "app",
            "area": "api/mailroom",
            "file": "packages/api/src/modules/mailroom/procedures/confirmMailItemMatch.ts",
            "line": 39,
            "live": "silent"
          }
        ],
        "consumes": [],
        "owns": [
          {
            "name": "app/case/file.ingestionSucceeded",
            "namespace": "app",
            "area": "api/ai",
            "file": "packages/api/src/modules/ai/service/emitIngestionCompleteInngestEvent.ts",
            "line": 23,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai",
              "quality"
            ],
            "consumers": [
              "ai",
              "quality"
            ]
          },
          {
            "name": "app/case/mail.uploaded",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/addThereforeDocument.ts",
            "line": 167,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing",
              "cases"
            ],
            "consumers": [
              "quality"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "CaseArtifactStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2954,
          "doc": null,
          "values": [
            {
              "name": "draft",
              "doc": null
            },
            {
              "name": "final",
              "doc": null
            },
            {
              "name": "discarded",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseArtifact"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseArtifactType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2947,
          "doc": null,
          "values": [
            {
              "name": "briefingNote",
              "doc": null
            },
            {
              "name": "adviceNote",
              "doc": null
            },
            {
              "name": "filledForm",
              "doc": null
            },
            {
              "name": "generatedLetter",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseArtifact"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseFileSource",
          "file": "packages/db/prisma/schema.prisma",
          "line": 931,
          "doc": null,
          "values": [
            {
              "name": "upload",
              "doc": null
            },
            {
              "name": "email",
              "doc": null
            },
            {
              "name": "import",
              "doc": null
            },
            {
              "name": "externalEmail",
              "doc": null
            },
            {
              "name": "externalEmailAttachment",
              "doc": null
            },
            {
              "name": "caseArtifact",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseFile"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseFileVisibility",
          "file": "packages/db/prisma/schema.prisma",
          "line": 940,
          "doc": null,
          "values": [
            {
              "name": "all",
              "doc": null
            },
            {
              "name": "solicitors",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseFile"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FileAIIngestionStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 839,
          "doc": null,
          "values": [
            {
              "name": "NOT_REQUESTED",
              "doc": null
            },
            {
              "name": "PENDING",
              "doc": null
            },
            {
              "name": "SUCCESS",
              "doc": null
            },
            {
              "name": "FAILED",
              "doc": null
            }
          ],
          "usedBy": [
            "File"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FilePreviewStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 892,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "success",
              "doc": null
            },
            {
              "name": "failed",
              "doc": null
            }
          ],
          "usedBy": [
            "FilePreview"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 56,
        "writes": 25
      },
      "models": [
        {
          "key": "app/File",
          "name": "File",
          "table": null,
          "datastore": "app",
          "domain": "documents",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 846,
          "idPrefix": "file_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 20,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "s3Key",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "originalFilename",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "fileSize",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "displayName",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "extension",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseFile",
              "type": "CaseFile",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "caseArtifact",
              "type": "CaseArtifact",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseArtifact",
              "onDelete": null
            },
            {
              "name": "communication",
              "type": "Communication",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Communication",
              "onDelete": null
            },
            {
              "name": "attachmentCommunication",
              "type": "Communication",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Communication",
              "onDelete": null
            },
            {
              "name": "attachmentCommunicationId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "canPreview",
              "type": "Boolean",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "preview",
              "type": "FilePreview",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FilePreview",
              "onDelete": null
            },
            {
              "name": "aiIngestionStatus",
              "type": "FileAIIngestionStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aiIngestionV2Status",
              "type": "FileAIIngestionStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aiIngestionV3Status",
              "type": "FileAIIngestionStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "summary",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([s3Key])",
            "@@index([attachmentCommunicationId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "caseFile",
              "target": "CaseFile",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            },
            {
              "field": "caseArtifact",
              "target": "CaseArtifact",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseArtifact",
              "targetDomain": "documents"
            },
            {
              "field": "communication",
              "target": "Communication",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Communication",
              "targetDomain": "email"
            },
            {
              "field": "attachmentCommunication",
              "target": "Communication",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "attachmentCommunicationId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Communication",
              "targetDomain": "email"
            },
            {
              "field": "preview",
              "target": "FilePreview",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FilePreview",
              "targetDomain": "documents"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseArtifact",
              "field": "file",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseArtifact",
              "sourceDomain": "documents"
            },
            {
              "model": "CaseFile",
              "field": "file",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "Communication",
              "field": "linkedFile",
              "fk": true,
              "list": false,
              "sourceKey": "app/Communication",
              "sourceDomain": "email"
            },
            {
              "model": "Communication",
              "field": "attachmentFiles",
              "fk": false,
              "list": true,
              "sourceKey": "app/Communication",
              "sourceDomain": "email"
            },
            {
              "model": "FilePreview",
              "field": "file",
              "fk": true,
              "list": false,
              "sourceKey": "app/FilePreview",
              "sourceDomain": "documents"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "email",
              "model": "Communication",
              "field": "communication"
            },
            {
              "dir": "out",
              "domain": "email",
              "model": "Communication",
              "field": "attachmentCommunication"
            },
            {
              "dir": "in",
              "domain": "email",
              "model": "Communication",
              "field": "linkedFile"
            },
            {
              "dir": "in",
              "domain": "email",
              "model": "Communication",
              "field": "attachmentFiles"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 2,
            "writes": 8,
            "ops": {
              "create": 1,
              "updateMany": 2,
              "update": 5,
              "findUniqueOrThrow": 2
            },
            "byArea": [
              {
                "area": "api/files",
                "reads": 0,
                "writes": 4,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/ai",
                "reads": 0,
                "writes": 1,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "api/test-data",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/inngest/formCompletion/common.ts",
                "line": 55,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/ai/service/handleV3IngestionStatusUpdate.ts",
                "line": 8,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/cases/files/fileEvents.ts",
                "line": 42,
                "op": "update"
              }
            ],
            "nested": 45,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 17
              },
              {
                "area": "api/ai",
                "n": 7
              },
              {
                "area": "api/outbound-mail",
                "n": 6
              },
              {
                "area": "admin",
                "n": 4
              },
              {
                "area": "ui/_app",
                "n": 2
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "api/officeAddin",
                "n": 2
              },
              {
                "area": "api/agreements",
                "n": 1
              }
            ],
            "typeMentions": 35,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 10
              },
              {
                "area": "pkg/ui",
                "n": 4
              },
              {
                "area": "ui/_app",
                "n": 3
              },
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "pkg/outlook-addin",
                "n": 3
              },
              {
                "area": "ui/ai",
                "n": 2
              },
              {
                "area": "ui/cases",
                "n": 2
              },
              {
                "area": "infrastructure",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One object in the case files S3 bucket. It holds the display name, extension and size, a soft delete flag, and the state of preview generation and of the three AI ingestion pipelines.",
          "keyFields": [
            {
              "name": "s3Key",
              "meaning": "Where the bytes sit in the case files bucket. Reused as the preview key for images, audio, video and PDFs."
            },
            {
              "name": "isDeleted",
              "meaning": "Soft delete, set by the file.deleted event, which also hard deletes any Communication linked to the file."
            },
            {
              "name": "canPreview",
              "meaning": "True once a preview exists or was requested, false when the content type has no preview route."
            },
            {
              "name": "aiIngestionStatus",
              "meaning": "v1 pipeline: the pgvector tables in the ai database. Only test data writes it now."
            },
            {
              "name": "aiIngestionV2Status",
              "meaning": "v2 pipeline: the OpenSearch index in services/ingestion-service. Still read for the UI badge, never written."
            },
            {
              "name": "aiIngestionV3Status",
              "meaning": "v3 pipeline: the ingestion management service. The only status the platform still writes."
            },
            {
              "name": "summary",
              "meaning": "Short description read by Lawrence when building case context. Nothing in the monolith writes it."
            }
          ],
          "references": [
            {
              "field": "caseFile",
              "target": "documents",
              "meaning": "the row attaching this object to a case, absent for a draft artifact file"
            },
            {
              "field": "caseArtifact",
              "target": "documents",
              "meaning": "the AI artifact this file is the rendered output of"
            },
            {
              "field": "attachmentCommunicationId",
              "target": "email",
              "meaning": "the filed Outlook message this file was an attachment of"
            }
          ],
          "lifecycle": "aiIngestionV3Status: NOT_REQUESTED → PENDING → SUCCESS / FAILED",
          "grouped": [],
          "flags": [
            "three-ingestion-generations"
          ]
        },
        {
          "key": "app/FilePreview",
          "name": "FilePreview",
          "table": null,
          "datastore": "app",
          "domain": "documents",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 877,
          "idPrefix": "filepre_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "file",
              "type": "File",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "File",
              "onDelete": null
            },
            {
              "name": "fileId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "s3Key",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "contentType",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "FilePreviewStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "file",
              "target": "File",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "fileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/File",
              "targetDomain": "documents"
            }
          ],
          "relationsIn": [
            {
              "model": "File",
              "field": "preview",
              "fk": false,
              "list": false,
              "sourceKey": "app/File",
              "sourceDomain": "documents"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "findMany": 1,
              "findUnique": 2,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/files",
                "reads": 2,
                "writes": 1,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/files/service/handlePreviewGenerationResult.ts",
                "line": 26,
                "op": "updateMany"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "api/files",
                "n": 3
              }
            ],
            "typeMentions": 1,
            "typeMentionsByArea": [
              {
                "area": "api/files",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The renderable version of a File. Images, audio, video and PDFs preview themselves and point at the original key; anything else is converted by a job behind an SNS topic.",
          "keyFields": [
            {
              "name": "fileId",
              "meaning": "Unique, so a file has at most one preview."
            },
            {
              "name": "s3Key",
              "meaning": "Key of the rendered preview, or the original key when the file previews itself."
            },
            {
              "name": "contentType",
              "meaning": "Content type of the preview. Video and audio previews cannot join a PDF bundle."
            },
            {
              "name": "status",
              "meaning": "pending until the converter reports back. A success is never overwritten by a later result."
            }
          ],
          "references": [
            {
              "field": "fileId",
              "target": "documents",
              "meaning": "the file being previewed"
            }
          ],
          "lifecycle": "pending → success / failed",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseFile",
          "name": "CaseFile",
          "table": null,
          "datastore": "app",
          "domain": "documents",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 898,
          "idPrefix": "casfil_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 19,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "file",
              "type": "File",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "File",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "fileId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "uploadingPerson",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "uploadingPersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "visibility",
              "type": "CaseFileVisibility",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "CaseFileSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "folders",
              "type": "CaseFileFolder",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFileFolder",
              "onDelete": null
            },
            {
              "name": "caseArtifact",
              "type": "CaseArtifact",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseArtifact",
              "onDelete": null
            },
            {
              "name": "caseArtifactId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "riskAssessment",
              "type": "RiskAssessment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "RiskAssessment",
              "onDelete": null
            },
            {
              "name": "riskAssessmentId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankTransferIntent",
              "type": "BankTransferIntent",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransferIntent",
              "onDelete": null
            },
            {
              "name": "outboundMailDocuments",
              "type": "OutboundMailDocument",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailDocument",
              "onDelete": null
            },
            {
              "name": "clientAgreements",
              "type": "ClientAgreement",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "Reverse relation for externally signed agreements (one file can be used for multiple agreements)",
              "fk": false,
              "relationTarget": "ClientAgreement",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([caseId, fileId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "file",
              "target": "File",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "fileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/File",
              "targetDomain": "documents"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "uploadingPerson",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "uploadingPersonId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "folders",
              "target": "CaseFileFolder",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFileFolder",
              "targetDomain": "documents"
            },
            {
              "field": "caseArtifact",
              "target": "CaseArtifact",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseArtifactId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseArtifact",
              "targetDomain": "documents"
            },
            {
              "field": "riskAssessment",
              "target": "RiskAssessment",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "riskAssessmentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/RiskAssessment",
              "targetDomain": "compliance"
            },
            {
              "field": "bankTransferIntent",
              "target": "BankTransferIntent",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransferIntent",
              "targetDomain": "money"
            },
            {
              "field": "outboundMailDocuments",
              "target": "OutboundMailDocument",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailDocument",
              "targetDomain": "post"
            },
            {
              "field": "clientAgreements",
              "target": "ClientAgreement",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreement",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "BankTransferIntent",
              "field": "supportingEvidence",
              "fk": false,
              "list": true,
              "sourceKey": "app/BankTransferIntent",
              "sourceDomain": "money"
            },
            {
              "model": "Case",
              "field": "caseFiles",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseArtifact",
              "field": "caseFile",
              "fk": false,
              "list": false,
              "sourceKey": "app/CaseArtifact",
              "sourceDomain": "documents"
            },
            {
              "model": "CaseFileFolder",
              "field": "files",
              "fk": false,
              "list": true,
              "sourceKey": "app/CaseFileFolder",
              "sourceDomain": "documents"
            },
            {
              "model": "ClientAgreement",
              "field": "externalSignedFile",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreement",
              "sourceDomain": "compliance"
            },
            {
              "model": "File",
              "field": "caseFile",
              "fk": false,
              "list": false,
              "sourceKey": "app/File",
              "sourceDomain": "documents"
            },
            {
              "model": "OutboundMailDocument",
              "field": "caseFile",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailDocument",
              "sourceDomain": "post"
            },
            {
              "model": "Person",
              "field": "uploadedCaseFiles",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "RiskAssessment",
              "field": "caseFiles",
              "fk": false,
              "list": true,
              "sourceKey": "app/RiskAssessment",
              "sourceDomain": "compliance"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "uploadingPerson"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "RiskAssessment",
              "field": "riskAssessment"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "BankTransferIntent",
              "field": "bankTransferIntent"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailDocument",
              "field": "outboundMailDocuments"
            },
            {
              "dir": "out",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "clientAgreements"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "BankTransferIntent",
              "field": "supportingEvidence"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "caseFiles"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "ClientAgreement",
              "field": "externalSignedFile"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailDocument",
              "field": "caseFile"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "uploadedCaseFiles"
            },
            {
              "dir": "in",
              "domain": "compliance",
              "model": "RiskAssessment",
              "field": "caseFiles"
            }
          ],
          "usage": {
            "total": 47,
            "reads": 36,
            "writes": 11,
            "ops": {
              "findMany": 14,
              "findUnique": 12,
              "create": 6,
              "update": 5,
              "findUniqueOrThrow": 7,
              "count": 2,
              "findFirst": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 20,
                "writes": 7,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/ai",
                "reads": 8,
                "writes": 0,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/agreements",
                "reads": 1,
                "writes": 1,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/document-editor",
                "reads": 2,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/case-internal-reviews",
                "reads": 1,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/outbound-mail",
                "reads": 1,
                "writes": 0,
                "domain": "post",
                "kind": "api-module"
              },
              {
                "area": "api/raw-asset-retrieval",
                "reads": 1,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/workflows-v2",
                "reads": 0,
                "writes": 1,
                "domain": "ai",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/inngest/addThereforeDocument.ts",
                "line": 129,
                "op": "create"
              },
              {
                "file": "packages/api/src/integrations/v1/cases/copyFilesFromLegacyBucket.ts",
                "line": 141,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/agreements/service/completeAgreementWithExternalFile.ts",
                "line": 150,
                "op": "update"
              }
            ],
            "nested": 26,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 11
              },
              {
                "area": "api/outbound-mail",
                "n": 6
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "api/payments",
                "n": 3
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 1
              }
            ],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A File attached to a Case, with who filed it, who can see it and where it came from. This is the row the case documents tab lists and the row the rest of the product points at when it needs a document.",
          "keyFields": [
            {
              "name": "source",
              "meaning": "upload, email for Mailgun, externalEmail and externalEmailAttachment for the Outlook add-in, import for v1, caseArtifact."
            },
            {
              "name": "visibility",
              "meaning": "all means the client sees it, solicitors hides it from the client. Changes emit a visibility notification."
            },
            {
              "name": "uploadingPersonId",
              "meaning": "The person credited in the UI. For an AI draft it is the lawyer who accepted it, not the generator."
            },
            {
              "name": "caseArtifactId",
              "meaning": "Set when this row is an accepted artifact. Unique, so one artifact becomes at most one case file."
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter the document belongs to"
            },
            {
              "field": "fileId",
              "target": "documents",
              "meaning": "the S3 object, unique so a file lives on one case"
            },
            {
              "field": "uploadingPersonId",
              "target": "people",
              "meaning": "who filed it"
            },
            {
              "field": "caseArtifactId",
              "target": "documents",
              "meaning": "the AI draft this file came from"
            },
            {
              "field": "riskAssessmentId",
              "target": "compliance",
              "meaning": "the risk assessment this file supports, which also blocks deletion"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseFileFolder",
          "name": "CaseFileFolder",
          "table": null,
          "datastore": "app",
          "domain": "documents",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 945,
          "idPrefix": "caseFilFol_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "title",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "colour",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "order",
              "type": "Decimal",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "files",
              "type": "CaseFile",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([order])",
            "@@index([caseId, order])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "files",
              "target": "CaseFile",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseFileFolders",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseFile",
              "field": "folders",
              "fk": false,
              "list": true,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "caseFileFolders"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 7,
            "writes": 3,
            "ops": {
              "findMany": 3,
              "create": 1,
              "update": 1,
              "delete": 1,
              "findFirst": 1,
              "findUnique": 2,
              "count": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 6,
                "writes": 3,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/files/folders/events.ts",
                "line": 16,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/files/folders/events.ts",
                "line": 29,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/files/folders/events.ts",
                "line": 41,
                "op": "delete"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/officeAddin",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A named, coloured folder on one case's documents tab. Files sit in folders many to many, so a case file can appear in several folders at once.",
          "keyFields": [
            {
              "name": "title",
              "meaning": "What the lawyer called the folder."
            },
            {
              "name": "colour",
              "meaning": "Folder colour picked in the UI."
            },
            {
              "name": "order",
              "meaning": "Decimal, so a folder can be dropped between two others without renumbering the rest."
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case whose documents tab shows this folder"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseArtifact",
          "name": "CaseArtifact",
          "table": null,
          "datastore": "app",
          "domain": "documents",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2960,
          "idPrefix": "casart_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "CaseArtifactType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CaseArtifactStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "file",
              "type": "File",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "File",
              "onDelete": null
            },
            {
              "name": "fileId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseFile",
              "type": "CaseFile",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "generatedByWorkflowId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "LegalFormCaseArtifact",
              "type": "LegalFormCaseArtifact",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LegalFormCaseArtifact",
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "generatedByWorkflowId"
          ],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "file",
              "target": "File",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "fileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/File",
              "targetDomain": "documents"
            },
            {
              "field": "caseFile",
              "target": "CaseFile",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            },
            {
              "field": "LegalFormCaseArtifact",
              "target": "LegalFormCaseArtifact",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalFormCaseArtifact",
              "targetDomain": "catalog"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseArtifacts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseFile",
              "field": "caseArtifact",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "File",
              "field": "caseArtifact",
              "fk": false,
              "list": false,
              "sourceKey": "app/File",
              "sourceDomain": "documents"
            },
            {
              "model": "LegalFormCaseArtifact",
              "field": "caseArtifact",
              "fk": true,
              "list": false,
              "sourceKey": "app/LegalFormCaseArtifact",
              "sourceDomain": "catalog"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "catalog",
              "model": "LegalFormCaseArtifact",
              "field": "LegalFormCaseArtifact"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "caseArtifacts"
            },
            {
              "dir": "in",
              "domain": "catalog",
              "model": "LegalFormCaseArtifact",
              "field": "caseArtifact"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 8,
            "writes": 2,
            "ops": {
              "findMany": 2,
              "findFirst": 3,
              "create": 1,
              "update": 1,
              "findUnique": 3
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 7,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/caseArtifact/caseArtifactEventsRouter.ts",
                "line": 30,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/caseArtifact/caseArtifactEventsRouter.ts",
                "line": 38,
                "op": "update"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Something the AI produced for a case: a briefing note, an advice note, a filled legal form or a generated letter. It starts as a draft only the legal team sees and becomes a case file when a lawyer accepts it.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "briefingNote, adviceNote, filledForm or generatedLetter. Decides the asset type sent to the ingestion service."
            },
            {
              "name": "status",
              "meaning": "draft while under review. Accepting flips it to final and creates the CaseFile; rejecting sets discarded."
            },
            {
              "name": "content",
              "meaning": "The document body as JSON, for artifacts that have no rendered file."
            },
            {
              "name": "fileId",
              "meaning": "The rendered PDF. Unique, and accepting a draft without a file is rejected."
            },
            {
              "name": "generatedByWorkflowId",
              "meaning": "The workflow run that produced it. A plain string with no foreign key."
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter the artifact was generated for"
            },
            {
              "field": "fileId",
              "target": "documents",
              "meaning": "the rendered PDF of the artifact"
            },
            {
              "field": "caseFile",
              "target": "documents",
              "meaning": "the case file created when the draft was accepted"
            },
            {
              "field": "generatedByWorkflowId",
              "target": "ai",
              "meaning": "the workflow run behind the generation, held as a loose id"
            },
            {
              "field": "LegalFormCaseArtifact",
              "target": "catalog",
              "meaning": "for a filled form, which legal form it is and how completely it was filled"
            }
          ],
          "lifecycle": "draft → final / discarded",
          "grouped": [],
          "flags": []
        }
      ]
    },
    {
      "id": "money",
      "order": 9,
      "groups": [
        {
          "id": "bills",
          "label": "Bills and fees",
          "models": [
            "app/Bill",
            "app/BillLineItem",
            "app/BillScopeItem",
            "app/BillReview",
            "app/BillAssessment",
            "app/BillReceipt",
            "app/BillPayout",
            "app/FeePayment",
            "app/FeePaymentItem",
            "app/FeePlan",
            "app/FeePlanOverride",
            "app/FeePlanPromotion",
            "app/FeeAllowance",
            "app/FeeAllowanceItem",
            "app/TimeTrackingEntry"
          ]
        },
        {
          "id": "movement",
          "label": "Payments and banking",
          "models": [
            "app/PaymentRequest",
            "app/CasePayment",
            "app/CasePaymentRefund",
            "app/ClientMoneyRemittance",
            "app/ClientMoneyRecovery",
            "app/ClientRefundRecovery",
            "app/Payout",
            "app/BankAccount",
            "app/FirmBankAccount",
            "app/FirmEmployeeBankAccount",
            "app/FirmPaymentSource",
            "app/BankTransfer",
            "app/BankTransferIntent",
            "app/Counterparty",
            "app/OfficeAccountTransfer",
            "app/OfficeAccountTransferReconciliation",
            "app/BulkDisbursementPosting",
            "app/PaymentAuthorisationRequest",
            "app/PaymentAuthorisation",
            "app/PaymentAuthorisationCancellation",
            "app/ReferralPayment"
          ]
        },
        {
          "id": "ledger",
          "label": "Ledger",
          "models": [
            "app/Ledger",
            "app/LedgerEntry",
            "app/CaseLedger",
            "app/CaseOfficeAccountLedger",
            "app/NonBillableLedger",
            "app/CustomerLedger",
            "app/FirmEmployeeLedger",
            "app/FirmEmployeeDisbursementLedger",
            "app/FirmOfficeAccountLedger",
            "app/FirmExternalLedger"
          ]
        }
      ],
      "name": "Money: bills, payments, ledger",
      "tagline": "Taking client money, billing against it, keeping the fee, paying the lawyer",
      "whatItIs": "Money covers everything financial that happens on a case: asking the client to pay, holding what they paid, billing against it, keeping Lawhive's cut and paying the rest to the lawyer. It splits into three groups. Bills and fees is the lawyer facing half: a Bill of line items raised against the money on account, the review that approves it, the FeePlan arithmetic that produces the platform fee and the lead fee, and the BillPayout that sends the balance out. Payments and banking is the client and bank half: PaymentRequest and CasePayment take money in, refunds and recoveries send it back, Payout and BankTransfer move it out, and PaymentAuthorisation records permission to charge a saved card. Ledger is the bookkeeping underneath both: one Ledger per account, LedgerEntry debits and credits in matched pairs, and eight typed wrapper tables that pin a ledger to a case, a customer, a firm employee or a firm office account.",
      "howItConnects": "Cases is the anchor. Almost every row here hangs off a Case, and a bill can only be raised by the case owner for work on that case. Quotes fixed what the client agreed to pay, so bill line items point back at quote line items and bill scope items at quote scopes. Firms supplies the lawyer, the firm, the legal entity printed on the receipt and the bank account the payout lands in. Compliance decides whether money can be requested at all. Two pieces live outside the monolith: the lawyer incentive scheme that picks a fee tier is a separate incentive service, and Lawrence's automated bill assessment is an OpenAI call traced through Langfuse. A paid bill emits app/case/bills/bill.paid, which the incentive scheme and the referral payment processor both pick up.",
      "lifecycle": "ON ACCOUNT → REQUESTED → APPROVED / REJECTED → PAID → PAID OUT",
      "flows": [
        {
          "id": "bill-review",
          "title": "Raising a bill and getting it approved",
          "mermaid": "flowchart TD\n  RAISE[Lawyer raises bill] --> SRC{Case source}\n  SRC -->|byoc| PAY[payBill]\n  SRC -->|lawhive| REV[BillReview pending]\n  REV --> AUTO{Auto billing allowed}\n  AUTO -->|no| ADMIN[Admin reviews]\n  AUTO -->|yes| LAW[Lawrence BillAssessment]\n  LAW -->|readyToBill| PAY\n  LAW -->|not ready| ADMIN\n  ADMIN -->|approve| PAY\n  ADMIN -->|reject| REJ[Bill rejected]\n  ADMIN -->|dismiss| DIS[Bill dismissed]\n  REJ --> RESUB[Lawyer resubmits, new review]\n  RESUB --> REV\n  PAY --> PAID[Bill paid, BillPayout created]",
          "caption": "Bills on a BYOC case are paid straight away. Marketplace bills get a BillReview: Lawrence auto approves when it judges the work in scope, otherwise an admin decides. Every approval path checks the bill total against the money on account first."
        },
        {
          "id": "fee-calculation",
          "title": "How the platform fee and lead fee are worked out",
          "mermaid": "flowchart TD\n  WHO[Case owner and case source] --> PLAN[FeePlan: employee, incentive tier, or firm]\n  PROMO[FeePlanPromotion] --> OVR[Case FeePlanOverride]\n  ADMIN[Admin override] --> OVR\n  PLAN --> DEC{Overrides applied}\n  OVR --> DEC\n  DEC -->|blended total lower, or shouldAlwaysOverride| USEO[Override percentages]\n  DEC -->|otherwise| USEP[Plan percentages]\n  USEO --> ITEMS[Platform fee and lead fee]\n  USEP --> ITEMS\n  ITEMS --> ALLOW[FeeAllowance credits deducted]\n  ALLOW --> FPMT[FeePayment with FeePaymentItem rows]\n  FPMT --> RCPT[BillReceipt totals]",
          "caption": "The plan is resolved per case source: a firm employee plan wins, then the plan attached to the lawyer's incentive tier, then the firm base plan. A lead fee is only charged when the lead came from Lawhive. Case overrides only apply if they leave the lawyer better off overall or are flagged shouldAlwaysOverride."
        },
        {
          "id": "money-path",
          "title": "Where the money actually goes",
          "mermaid": "flowchart LR\n  PR[PaymentRequest] --> CP[CasePayment]\n  CP --> ACC[Money on account]\n  ACC --> BILL[Bill]\n  BILL --> FEE[FeePayment keeps the fees]\n  BILL --> BPO[BillPayout]\n  BPO --> PO[Payout via Stripe]\n  BILL --> LE[LedgerEntry pairs]\n  BILL --> RP[ReferralPayment]",
          "caption": "A bill can never exceed the money on the billable account, checked at raise, approve and pay. Paying it charges the fees, writes the receipt, posts the ledger pairs, then transfers and pays out whatever is left."
        }
      ],
      "notes": [
        {
          "kind": "misfiled",
          "body": "TimeTrackingEntry is assigned to money but it is a record of case work, written by api/modules/cases/timeTracking. It only touches money because a BillLineItem can point at one. Cases would be a better home."
        },
        {
          "kind": "status",
          "body": "BillScopeItem is flagged unreferenced by the extractor, but it is not dead. raiseBill builds the nested createMany into a local variable, which the extractor cannot see, and payBill, approveBillReview, getBillById and the admin bill modal all include it. Every marketplace bill gets scope rows."
        },
        {
          "kind": "legacy",
          "body": "FeePayment.type has an invoiceItem branch and a stripeInvoiceItemId column that nothing writes. chargeFeesForBill always creates clientMoneyRecovery rows and carries a comment saying invoice items would come later. FeePlanOverrideLevel has one value, case, and BillReviewerType has one value, lawrence."
        },
        {
          "kind": "status",
          "body": "BillReceipt was added after bills already existed, so old paid bills have no receipt. calculateBillEarnings is explicitly commented as a hack for that: it reads totalFeeShare from the receipt when there is one and recomputes the fee share from the line items when there is not."
        },
        {
          "kind": "companion",
          "body": "FeePlan.incentiveSchemeTierId is a plain string with no foreign key. Tiers, points and scheme membership live in a separate incentive service that the api reaches over HTTP, so the fee plan for a tier is only joined up in application code."
        },
        {
          "kind": "duplication",
          "body": "The ledger group has eight typed wrapper tables around Ledger. Most have no direct Prisma calls and are only reached through nested writes and includes, and FirmOfficeAccountLedger is not referenced anywhere at all."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/earnings",
          "kind": "api-module",
          "label": "earnings",
          "path": "packages/api/src/modules/earnings",
          "files": 5,
          "prismaSites": 4,
          "procedures": {
            "queries": 1,
            "mutations": 2
          }
        },
        {
          "id": "api/feePlanPromotions",
          "kind": "api-module",
          "label": "feePlanPromotions",
          "path": "packages/api/src/modules/feePlanPromotions",
          "files": 9,
          "prismaSites": 9,
          "procedures": {
            "queries": 1,
            "mutations": 2
          }
        },
        {
          "id": "api/finance",
          "kind": "api-module",
          "label": "finance",
          "path": "packages/api/src/modules/finance",
          "files": 2,
          "prismaSites": 4,
          "procedures": {
            "queries": 0,
            "mutations": 0
          }
        },
        {
          "id": "api/incentives",
          "kind": "api-module",
          "label": "incentives",
          "path": "packages/api/src/modules/incentives",
          "files": 10,
          "prismaSites": 5,
          "procedures": {
            "queries": 3,
            "mutations": 4
          }
        },
        {
          "id": "api/payments",
          "kind": "api-module",
          "label": "payments",
          "path": "packages/api/src/modules/payments",
          "files": 80,
          "prismaSites": 70,
          "procedures": {
            "queries": 4,
            "mutations": 13
          }
        },
        {
          "id": "ui/bill",
          "kind": "ui-feature",
          "label": "bill",
          "path": "apps/platform/src/features/bill",
          "files": 9,
          "prismaSites": 0
        },
        {
          "id": "ui/earnings",
          "kind": "ui-feature",
          "label": "earnings",
          "path": "apps/platform/src/features/earnings",
          "files": 3,
          "prismaSites": 0
        },
        {
          "id": "ui/paymentRequests",
          "kind": "ui-feature",
          "label": "paymentRequests",
          "path": "apps/platform/src/features/paymentRequests",
          "files": 3,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/incentive/scheme-member/create.requested",
            "namespace": "app",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/service/createSchemeMemberForEachFirmEmployee.ts",
            "line": 26,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/incentive/scheme-member/create-all.requested",
            "namespace": "app",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/service/createSchemeMemberForEachFirmEmployee.ts",
            "line": 8,
            "live": "silent"
          },
          {
            "name": "app/incentive/scheme-member/create.requested",
            "namespace": "app",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/service/createSchemeMemberForEachFirmEmployee.ts",
            "line": 40,
            "live": "silent"
          },
          {
            "name": "incentive-service/schemeMemberTier.upgraded",
            "namespace": "incentive-service",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/emails/sendLISTierUpgradeEmail.ts",
            "line": 28,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/bill-assessment/lawrence-assessment.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/lawrence-assessments/billAssessment.service.ts",
            "line": 178,
            "live": "rare",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "cases"
            ]
          },
          {
            "name": "app/case/bills/bill.paid",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/bills/service/payBill.ts",
            "line": 152,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/incentive/scheme-member/create-all.requested",
            "namespace": "app",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/service/createSchemeMemberForEachFirmEmployee.ts",
            "line": 8,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "money"
            ]
          },
          {
            "name": "app/incentive/scheme-member/create.requested",
            "namespace": "app",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/service/createSchemeMemberForEachFirmEmployee.ts",
            "line": 26,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "money"
            ],
            "consumers": [
              "money"
            ]
          },
          {
            "name": "app/incentive/scheme-member/scheme-id.updated",
            "namespace": "app",
            "area": "api/solicitors",
            "file": "packages/api/src/modules/solicitors/procedures/setExclusivityStatus.handler.ts",
            "line": 39,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "people"
            ],
            "consumers": []
          },
          {
            "name": "app/lawyer-tier-review/check-all",
            "namespace": "app",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/lawyer-tier-review/check-individual",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/lawyerTierReviewAlerts.ts",
            "line": 39,
            "live": "active",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "incentive-service/schemeMemberTier.upgraded",
            "namespace": "incentive-service",
            "area": "api/incentives",
            "file": "packages/api/src/modules/incentives/emails/sendLISTierUpgradeEmail.ts",
            "line": 28,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "money"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "BankAccountStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2065,
          "doc": null,
          "values": [
            {
              "name": "new",
              "doc": null
            },
            {
              "name": "validated",
              "doc": null
            },
            {
              "name": "verified",
              "doc": null
            },
            {
              "name": "verificationFailed",
              "doc": null
            },
            {
              "name": "errored",
              "doc": null
            },
            {
              "name": "deleted",
              "doc": null
            }
          ],
          "usedBy": [
            "BankAccount"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BankAccountType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2060,
          "doc": null,
          "values": [
            {
              "name": "firm",
              "doc": null
            },
            {
              "name": "firmSolicitor",
              "doc": null
            }
          ],
          "usedBy": [
            "BankAccount"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BankTransferIntentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1698,
          "doc": null,
          "values": [
            {
              "name": "awaitingReview",
              "doc": null
            },
            {
              "name": "invalidDetails",
              "doc": null
            },
            {
              "name": "readyToBePaid",
              "doc": null
            },
            {
              "name": "awaitingExternalBankingApproval",
              "doc": null
            },
            {
              "name": "paid",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "BankTransferIntent"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BankTransferType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1736,
          "doc": null,
          "values": [
            {
              "name": "credit",
              "doc": null
            },
            {
              "name": "debit",
              "doc": null
            }
          ],
          "usedBy": [
            "BankTransfer",
            "BankTransferIntent"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BillApprovalType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2173,
          "doc": null,
          "values": [
            {
              "name": "admin",
              "doc": null
            },
            {
              "name": "auto",
              "doc": null
            }
          ],
          "usedBy": [
            "BillReview"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BillReviewerType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3198,
          "doc": null,
          "values": [
            {
              "name": "lawrence",
              "doc": null
            }
          ],
          "usedBy": [
            "BillAssessment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BillReviewStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2166,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "approved",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            },
            {
              "name": "dismissed",
              "doc": null
            }
          ],
          "usedBy": [
            "BillReview"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "BillStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2138,
          "doc": null,
          "values": [
            {
              "name": "requested",
              "doc": null
            },
            {
              "name": "approved",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            },
            {
              "name": "paid",
              "doc": null
            },
            {
              "name": "dismissed",
              "doc": null
            }
          ],
          "usedBy": [
            "Bill"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CasePaymentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1644,
          "doc": null,
          "values": [
            {
              "name": "paid",
              "doc": null
            },
            {
              "name": "partialRefunded",
              "doc": null
            },
            {
              "name": "refunded",
              "doc": null
            }
          ],
          "usedBy": [
            "CasePayment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseSource",
          "file": "packages/db/prisma/schema.prisma",
          "line": 663,
          "doc": null,
          "values": [
            {
              "name": "lawhive",
              "doc": null
            },
            {
              "name": "byoc",
              "doc": null
            },
            {
              "name": "followOn",
              "doc": null
            }
          ],
          "usedBy": [
            "Case",
            "FeePlan",
            "FeePlanPromotion"
          ],
          "datastore": "app",
          "shared": true
        },
        {
          "name": "ClientMoneyRecoveryStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1961,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "error",
              "doc": null
            },
            {
              "name": "recovered",
              "doc": null
            }
          ],
          "usedBy": [
            "ClientMoneyRecovery"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "ClientMoneyRecoveryType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1967,
          "doc": null,
          "values": [
            {
              "name": "clientRefund",
              "doc": null
            },
            {
              "name": "billPayout",
              "doc": null
            }
          ],
          "usedBy": [
            "ClientMoneyRecovery"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CounterpartyType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1766,
          "doc": null,
          "values": [
            {
              "name": "business",
              "doc": null
            },
            {
              "name": "individual",
              "doc": null
            }
          ],
          "usedBy": [
            "Counterparty"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "Currency",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1594,
          "doc": null,
          "values": [
            {
              "name": "gbp",
              "doc": null
            }
          ],
          "usedBy": [
            "BankAccount",
            "BankTransfer",
            "BankTransferIntent",
            "Bill",
            "BillLineItem",
            "BillReceipt",
            "CasePayment",
            "CasePaymentRefund",
            "ClientMoneyRecovery",
            "FeePayment",
            "FeePaymentItem",
            "FirmPaymentSource",
            "PaymentAuthorisation",
            "PaymentRequest",
            "Payout",
            "ProductOptionLineItem",
            "Quote",
            "QuoteLineItem"
          ],
          "datastore": "app",
          "shared": true
        },
        {
          "name": "FeePaymentItemType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2325,
          "doc": null,
          "values": [
            {
              "name": "plan",
              "doc": null
            },
            {
              "name": "allowance",
              "doc": null
            },
            {
              "name": "override",
              "doc": null
            }
          ],
          "usedBy": [
            "FeePaymentItem"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FeePaymentType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2290,
          "doc": null,
          "values": [
            {
              "name": "clientMoneyRecovery",
              "doc": null
            },
            {
              "name": "invoiceItem",
              "doc": null
            }
          ],
          "usedBy": [
            "FeePayment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FeePlanOverrideLevel",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2382,
          "doc": null,
          "values": [
            {
              "name": "case",
              "doc": null
            }
          ],
          "usedBy": [
            "FeePlanOverride"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FeePlanPromotionStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2412,
          "doc": null,
          "values": [
            {
              "name": "active",
              "doc": null
            },
            {
              "name": "used",
              "doc": null
            }
          ],
          "usedBy": [
            "FeePlanPromotion"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FeeType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2417,
          "doc": null,
          "values": [
            {
              "name": "platform",
              "doc": null
            },
            {
              "name": "lead",
              "doc": null
            }
          ],
          "usedBy": [
            "FeePaymentItem",
            "FeePlanOverride",
            "FeePlanPromotion"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FirmBankAccountType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2020,
          "doc": null,
          "values": [
            {
              "name": "client",
              "doc": null
            }
          ],
          "usedBy": [
            "FirmBankAccount"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FirmPaymentSourceStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1995,
          "doc": null,
          "values": [
            {
              "name": "incomplete",
              "doc": null
            },
            {
              "name": "incompleteExpired",
              "doc": null
            },
            {
              "name": "active",
              "doc": null
            },
            {
              "name": "pastDue",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            },
            {
              "name": "unpaid",
              "doc": null
            }
          ],
          "usedBy": [
            "FirmPaymentSource"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "FirmPaymentSourceType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1990,
          "doc": null,
          "values": [
            {
              "name": "clientMoneyAccount",
              "doc": null
            },
            {
              "name": "officeAccount",
              "doc": null
            }
          ],
          "usedBy": [
            "FirmPaymentSource"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "LegalEntityType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 375,
          "doc": null,
          "values": [
            {
              "name": "individual",
              "doc": null
            },
            {
              "name": "company",
              "doc": null
            }
          ],
          "usedBy": [
            "BillReceipt",
            "LegalEntity"
          ],
          "datastore": "app",
          "shared": true
        },
        {
          "name": "OfficeAccountTransferStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2674,
          "doc": null,
          "values": [
            {
              "name": "awaiting_reconciliation",
              "doc": null
            },
            {
              "name": "reconciled",
              "doc": null
            }
          ],
          "usedBy": [
            "OfficeAccountTransfer"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "PaymentAuthorisationCancellationSource",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1156,
          "doc": null,
          "values": [
            {
              "name": "manual",
              "doc": null
            },
            {
              "name": "automatic",
              "doc": null
            }
          ],
          "usedBy": [
            "PaymentAuthorisationCancellation"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "PaymentAuthorisationStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1133,
          "doc": null,
          "values": [
            {
              "name": "authorised",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "PaymentAuthorisation"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "PaymentRequestStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1588,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "paid",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "PaymentRequest"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "PayoutStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2097,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "success",
              "doc": null
            },
            {
              "name": "failed",
              "doc": null
            }
          ],
          "usedBy": [
            "Payout"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "PayoutType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2092,
          "doc": null,
          "values": [
            {
              "name": "clientMoneyRemittance",
              "doc": null
            },
            {
              "name": "billPayout",
              "doc": null
            }
          ],
          "usedBy": [
            "Payout"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "ReferralPaymentStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2942,
          "doc": null,
          "values": [
            {
              "name": "paid",
              "doc": null
            },
            {
              "name": "pending",
              "doc": null
            }
          ],
          "usedBy": [
            "ReferralPayment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "RefundSource",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1681,
          "doc": null,
          "values": [
            {
              "name": "solicitor",
              "doc": null
            },
            {
              "name": "lawhive",
              "doc": null
            }
          ],
          "usedBy": [
            "CasePaymentRefund"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "RefundStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1675,
          "doc": null,
          "values": [
            {
              "name": "requested",
              "doc": null
            },
            {
              "name": "success",
              "doc": null
            },
            {
              "name": "failed",
              "doc": null
            }
          ],
          "usedBy": [
            "CasePaymentRefund"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 123,
        "writes": 89
      },
      "models": [
        {
          "key": "app/Bill",
          "name": "Bill",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2103,
          "idPrefix": "bl_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 24,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "BillStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lineItems",
              "type": "BillLineItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillLineItem",
              "onDelete": null
            },
            {
              "name": "scopes",
              "type": "BillScopeItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillScopeItem",
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "admin",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "adminId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paidAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requestedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "messageToClient",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billReceipt",
              "type": "BillReceipt",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillReceipt",
              "onDelete": null
            },
            {
              "name": "billPayout",
              "type": "BillPayout",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillPayout",
              "onDelete": null
            },
            {
              "name": "feePayment",
              "type": "FeePayment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePayment",
              "onDelete": null
            },
            {
              "name": "officeAccountTransfer",
              "type": "OfficeAccountTransfer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OfficeAccountTransfer",
              "onDelete": null
            },
            {
              "name": "referralPayment",
              "type": "ReferralPayment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ReferralPayment",
              "onDelete": null
            },
            {
              "name": "billAssessments",
              "type": "BillAssessment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillAssessment",
              "onDelete": null
            },
            {
              "name": "billReviews",
              "type": "BillReview",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillReview",
              "onDelete": null
            },
            {
              "name": "outboundMailRequest",
              "type": "OutboundMailRequest",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "lineItems",
              "target": "BillLineItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillLineItem",
              "targetDomain": "money"
            },
            {
              "field": "scopes",
              "target": "BillScopeItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillScopeItem",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "admin",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "adminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "billReceipt",
              "target": "BillReceipt",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillReceipt",
              "targetDomain": "money"
            },
            {
              "field": "billPayout",
              "target": "BillPayout",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillPayout",
              "targetDomain": "money"
            },
            {
              "field": "feePayment",
              "target": "FeePayment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePayment",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountTransfer",
              "target": "OfficeAccountTransfer",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransfer",
              "targetDomain": "money"
            },
            {
              "field": "referralPayment",
              "target": "ReferralPayment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ReferralPayment",
              "targetDomain": "money"
            },
            {
              "field": "billAssessments",
              "target": "BillAssessment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillAssessment",
              "targetDomain": "money"
            },
            {
              "field": "billReviews",
              "target": "BillReview",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillReview",
              "targetDomain": "money"
            },
            {
              "field": "outboundMailRequest",
              "target": "OutboundMailRequest",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "bills",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "BillAssessment",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillAssessment",
              "sourceDomain": "money"
            },
            {
              "model": "BillLineItem",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillLineItem",
              "sourceDomain": "money"
            },
            {
              "model": "BillPayout",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillPayout",
              "sourceDomain": "money"
            },
            {
              "model": "BillReceipt",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillReceipt",
              "sourceDomain": "money"
            },
            {
              "model": "BillReview",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillReview",
              "sourceDomain": "money"
            },
            {
              "model": "BillScopeItem",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillScopeItem",
              "sourceDomain": "money"
            },
            {
              "model": "Case",
              "field": "bills",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FeePayment",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePayment",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "bills",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "OfficeAccountTransfer",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/OfficeAccountTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "OutboundMailRequest",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            },
            {
              "model": "ReferralPayment",
              "field": "bill",
              "fk": true,
              "list": false,
              "sourceKey": "app/ReferralPayment",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "admin"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "outboundMailRequest"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "bills"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "bills"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "bills"
            },
            {
              "dir": "in",
              "domain": "post",
              "model": "OutboundMailRequest",
              "field": "bill"
            }
          ],
          "usage": {
            "total": 24,
            "reads": 18,
            "writes": 6,
            "ops": {
              "findUniqueOrThrow": 6,
              "count": 3,
              "findFirstOrThrow": 3,
              "update": 4,
              "findMany": 3,
              "create": 1,
              "findFirst": 2,
              "createMany": 1,
              "findUnique": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 13,
                "writes": 6,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/earnings",
                "reads": 2,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/procedures/dismissBillRequest.ts",
                "line": 30,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/bills/procedures/raiseBill.ts",
                "line": 108,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/bills/procedures/resubmitRejectedBillReview.ts",
                "line": 88,
                "op": "update"
              }
            ],
            "nested": 46,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 24
              },
              {
                "area": "admin",
                "n": 13
              },
              {
                "area": "api/finance",
                "n": 3
              },
              {
                "area": "api/customers",
                "n": 2
              },
              {
                "area": "api/instructions",
                "n": 2
              },
              {
                "area": "api/earnings",
                "n": 1
              },
              {
                "area": "api/outbound-mail",
                "n": 1
              }
            ],
            "typeMentions": 67,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 18
              },
              {
                "area": "pkg/ui",
                "n": 13
              },
              {
                "area": "admin",
                "n": 11
              },
              {
                "area": "ui/cases",
                "n": 9
              },
              {
                "area": "ui/_app",
                "n": 7
              },
              {
                "area": "ui/bill",
                "n": 5
              },
              {
                "area": "api/earnings",
                "n": 3
              },
              {
                "area": "ui/earnings",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One request by a lawyer to be paid for work on a case, made up of line items and drawn against the client money already on account. A bill starts REQUESTED, becomes APPROVED then PAID, or ends REJECTED or DISMISSED.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "REQUESTED, APPROVED, PAID, REJECTED or DISMISSED"
            },
            {
              "name": "requestedAt",
              "meaning": "when the lawyer submitted it"
            },
            {
              "name": "paidAt",
              "meaning": "set by payBill at the same moment status flips to PAID"
            },
            {
              "name": "messageToClient",
              "meaning": "note sent into case chat when the bill is approved"
            },
            {
              "name": "currency",
              "meaning": "gbp is the only value the Currency enum has"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter being billed"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the case owner who gets paid"
            },
            {
              "field": "adminId",
              "target": "people",
              "meaning": "set only on admin raised firm disbursement bills, which are created already PAID"
            }
          ],
          "lifecycle": "REQUESTED → APPROVED → PAID / REJECTED / DISMISSED",
          "grouped": [
            "BillLineItem",
            "BillScopeItem"
          ],
          "flags": [
            "dual-origin"
          ]
        },
        {
          "key": "app/BillLineItem",
          "name": "BillLineItem",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2178,
          "idPrefix": "blli_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quoteLineItem",
              "type": "QuoteLineItem",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "QuoteLineItem",
              "onDelete": null
            },
            {
              "name": "quoteLineItemId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "LineItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "timeTrackingEntry",
              "type": "TimeTrackingEntry",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "TimeTrackingEntry",
              "onDelete": null
            },
            {
              "name": "timeTrackingEntryId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([billId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "quoteLineItem",
              "target": "QuoteLineItem",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "quoteLineItemId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteLineItem",
              "targetDomain": "quotes"
            },
            {
              "field": "timeTrackingEntry",
              "target": "TimeTrackingEntry",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "timeTrackingEntryId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/TimeTrackingEntry",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "lineItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "QuoteLineItem",
              "field": "billLineItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/QuoteLineItem",
              "sourceDomain": "quotes"
            },
            {
              "model": "TimeTrackingEntry",
              "field": "billLineItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/TimeTrackingEntry",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteLineItem",
              "field": "quoteLineItem"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteLineItem",
              "field": "billLineItems"
            }
          ],
          "usage": {
            "total": 3,
            "reads": 2,
            "writes": 1,
            "ops": {
              "aggregate": 2,
              "createMany": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/raiseFirmDisbursementBill.ts",
                "line": 150,
                "op": "createMany"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 2
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One charge on a bill, either a fee for legal work or a disbursement paid out on the client's behalf. Fees are what the platform and lead fee percentages are applied to; disbursements pass through untouched.",
          "keyFields": [
            {
              "name": "amount",
              "meaning": "pence"
            },
            {
              "name": "description",
              "meaning": "what the lawyer is charging for"
            },
            {
              "name": "type",
              "meaning": "fee or disbursement"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "the bill it belongs to"
            },
            {
              "field": "quoteLineItemId",
              "target": "quotes",
              "meaning": "the quoted item this bills against"
            },
            {
              "field": "timeTrackingEntryId",
              "target": "money",
              "meaning": "the recorded time being billed, on hourly work"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/BillScopeItem",
          "name": "BillScopeItem",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2198,
          "idPrefix": "blsi_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quoteScope",
              "type": "QuoteScopeItem",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "QuoteScopeItem",
              "onDelete": null
            },
            {
              "name": "quoteScopeItemId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hourlyFeeQuoteScope",
              "type": "HourlyFeeQuoteStageScopeItem",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "HourlyFeeQuoteStageScopeItem",
              "onDelete": null
            },
            {
              "name": "hourlyFeeQuoteScopeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "quoteScope",
              "target": "QuoteScopeItem",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "quoteScopeItemId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/QuoteScopeItem",
              "targetDomain": "quotes"
            },
            {
              "field": "hourlyFeeQuoteScope",
              "target": "HourlyFeeQuoteStageScopeItem",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "hourlyFeeQuoteScopeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/HourlyFeeQuoteStageScopeItem",
              "targetDomain": "quotes"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "scopes",
              "fk": false,
              "list": true,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "HourlyFeeQuoteStageScopeItem",
              "field": "billScopeItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/HourlyFeeQuoteStageScopeItem",
              "sourceDomain": "quotes"
            },
            {
              "model": "QuoteScopeItem",
              "field": "billScopeItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/QuoteScopeItem",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "QuoteScopeItem",
              "field": "quoteScope"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "HourlyFeeQuoteStageScopeItem",
              "field": "hourlyFeeQuoteScope"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "HourlyFeeQuoteStageScopeItem",
              "field": "billScopeItems"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "QuoteScopeItem",
              "field": "billScopeItems"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": true,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A copy of one piece of quoted scope that the lawyer says this bill covers. Written as part of the bill create in raiseBill and read back when a bill is displayed or reviewed.",
          "keyFields": [
            {
              "name": "description",
              "meaning": "the scope wording as it stood when the bill was raised"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "the bill it belongs to"
            },
            {
              "field": "quoteScopeItemId",
              "target": "quotes",
              "meaning": "fixed fee quote scope, when the id starts qtsi_"
            },
            {
              "field": "hourlyFeeQuoteScopeId",
              "target": "quotes",
              "meaning": "hourly fee stage scope, when the id starts hfqtsi_"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "written-nested-only"
          ]
        },
        {
          "key": "app/BillReview",
          "name": "BillReview",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2146,
          "idPrefix": "blrev_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewerType",
              "type": "BillApprovalType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "BillReviewStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewedByAdmin",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "reviewedByAdminId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lawrenceAssessment",
              "type": "BillAssessment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillAssessment",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "reviewedByAdmin",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "reviewedByAdminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "lawrenceAssessment",
              "target": "BillAssessment",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillAssessment",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "billReviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Bill",
              "field": "billReviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "BillAssessment",
              "field": "billReview",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillAssessment",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "reviewedByAdmin"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "billReviews"
            }
          ],
          "usage": {
            "total": 14,
            "reads": 9,
            "writes": 5,
            "ops": {
              "findUniqueOrThrow": 6,
              "findMany": 3,
              "updateMany": 1,
              "create": 2,
              "update": 2
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 3,
                "writes": 5,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 6,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/procedures/dismissBillRequest.ts",
                "line": 39,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/cases/bills/procedures/raiseBill.ts",
                "line": 124,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/bills/procedures/rejectBillRequest.ts",
                "line": 16,
                "op": "update"
              }
            ],
            "nested": 10,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 8
              },
              {
                "area": "admin",
                "n": 2
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One round of approval on a marketplace bill. Created PENDING when the bill is raised, and settled APPROVED, REJECTED or DISMISSED. A rejected bill can be resubmitted, which creates a fresh review rather than reopening the old one.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PENDING, APPROVED, REJECTED or DISMISSED"
            },
            {
              "name": "reviewerType",
              "meaning": "admin on creation, rewritten to auto when Lawrence approves it"
            },
            {
              "name": "details",
              "meaning": "the rejection reason, sent to the lawyer by notification"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "the bill under review"
            },
            {
              "field": "reviewedByAdminId",
              "target": "people",
              "meaning": "the admin who approved, rejected or dismissed it"
            }
          ],
          "lifecycle": "PENDING → APPROVED / REJECTED / DISMISSED",
          "grouped": [],
          "flags": [
            "reviewer-type-rewritten"
          ]
        },
        {
          "key": "app/BillAssessment",
          "name": "BillAssessment",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3170,
          "idPrefix": "blas_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 18,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billReview",
              "type": "BillReview",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BillReview",
              "onDelete": null
            },
            {
              "name": "billReviewId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewerType",
              "type": "BillReviewerType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseSummary",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "scopeOfWork",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billLineItems",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "readyToBill",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "conclusionExplanation",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lawyerFeedback",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "billReview",
              "target": "BillReview",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billReviewId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillReview",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "billAssessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "BillReview",
              "field": "lawrenceAssessment",
              "fk": false,
              "list": false,
              "sourceKey": "app/BillReview",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "billAssessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "billAssessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "billAssessments"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "billAssessments"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "findUniqueOrThrow": 3,
              "create": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/lawrence-assessments/billAssessment.events.ts",
                "line": 45,
                "op": "create"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 3
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Lawrence's read of a bill: it is handed the case scope, notes, messages, emails, documents and time entries and answers whether the work is done and the charges are in scope. When it says readyToBill and the lawyer is not marked a brand risk, the review is auto approved and the bill is paid without an admin.",
          "keyFields": [
            {
              "name": "readyToBill",
              "meaning": "the verdict that triggers auto approval and payout"
            },
            {
              "name": "conclusionExplanation",
              "meaning": "why it reached that verdict"
            },
            {
              "name": "scopeOfWork",
              "meaning": "JSON: per scope item, complete or not, with an explanation"
            },
            {
              "name": "billLineItems",
              "meaning": "JSON: per line item, appropriate to bill or not, with the scope items it maps to"
            },
            {
              "name": "lawyerFeedback",
              "meaning": "wording aimed at the lawyer"
            },
            {
              "name": "caseSummary",
              "meaning": "the model's summary of the matter"
            }
          ],
          "references": [
            {
              "field": "billReviewId",
              "target": "money",
              "meaning": "the review this assessment answers"
            },
            {
              "field": "billId",
              "target": "money",
              "meaning": "the bill assessed"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the lawyer whose bill it is"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "their firm"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "ai-written",
            "langfuse-scored"
          ]
        },
        {
          "key": "app/BillReceipt",
          "name": "BillReceipt",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2230,
          "idPrefix": "blrct_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 22,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePayment",
              "type": "FeePayment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FeePayment",
              "onDelete": null
            },
            {
              "name": "feePaymentId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalEntity",
              "type": "LegalEntity",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "LegalEntity",
              "onDelete": null
            },
            {
              "name": "legalEntityId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalEntityType",
              "type": "LegalEntityType",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": "Snapshot Legal Entity Data",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalEntityVatNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalEntityName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalEntityAddress",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "legalEntityCompanyNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "includesVat",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalLegalFees",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Snapshot all total calculations",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalDisbursements",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalFeeDeductions",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalFeeShare",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "vat",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalPayout",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "feePayment",
              "target": "FeePayment",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "feePaymentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePayment",
              "targetDomain": "money"
            },
            {
              "field": "legalEntity",
              "target": "LegalEntity",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "legalEntityId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LegalEntity",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "billReceipt",
              "fk": false,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "FeePayment",
              "field": "billReceipt",
              "fk": false,
              "list": false,
              "sourceKey": "app/FeePayment",
              "sourceDomain": "money"
            },
            {
              "model": "LegalEntity",
              "field": "billReceipts",
              "fk": false,
              "list": true,
              "sourceKey": "app/LegalEntity",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "LegalEntity",
              "field": "legalEntity"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "LegalEntity",
              "field": "billReceipts"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/createReceiptForBill.ts",
                "line": 11,
                "op": "create"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "api/earnings",
                "n": 2
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "pkg/ui",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The frozen arithmetic of a paid bill, written once by payBill. It copies the lawyer's legal entity details and every total so the self billing invoice still reads correctly years later, after the entity has been renamed, moved or re registered for VAT.",
          "keyFields": [
            {
              "name": "totalLegalFees",
              "meaning": "fee line items before deductions"
            },
            {
              "name": "totalFeeDeductions",
              "meaning": "what Lawhive kept, after allowances"
            },
            {
              "name": "totalFeeShare",
              "meaning": "the lawyer's share of the fees, and what earnings reporting reads"
            },
            {
              "name": "totalDisbursements",
              "meaning": "passed straight through"
            },
            {
              "name": "vat",
              "meaning": "charged on the fee share only when the legal entity is VAT registered"
            },
            {
              "name": "totalPayout",
              "meaning": "fee share plus disbursements plus VAT, the amount sent to the bank"
            },
            {
              "name": "legalEntityName",
              "meaning": "one of five snapshot columns, alongside type, address, VAT number and company number"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "one receipt per bill"
            },
            {
              "field": "legalEntityId",
              "target": "firms",
              "meaning": "the live entity the snapshot was taken from"
            },
            {
              "field": "feePaymentId",
              "target": "money",
              "meaning": "the fee charge the totals came from"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "snapshot",
            "backfill-gap"
          ]
        },
        {
          "key": "app/BillPayout",
          "name": "BillPayout",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2212,
          "idPrefix": "blpo_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "payout",
              "type": "Payout",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Payout",
              "onDelete": null
            },
            {
              "name": "payoutId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployeeBankAccount",
              "type": "FirmEmployeeBankAccount",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployeeBankAccount",
              "onDelete": null
            },
            {
              "name": "firmEmployeeBankAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ledgerEntry",
              "type": "LedgerEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LedgerEntry",
              "onDelete": null
            },
            {
              "name": "clientMoneyRecovery",
              "type": "ClientMoneyRecovery",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientMoneyRecovery",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "payout",
              "target": "Payout",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "payoutId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Payout",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployeeBankAccount",
              "target": "FirmEmployeeBankAccount",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeBankAccountId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeBankAccount",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "ledgerEntry",
              "target": "LedgerEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LedgerEntry",
              "targetDomain": "money"
            },
            {
              "field": "clientMoneyRecovery",
              "target": "ClientMoneyRecovery",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRecovery",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "billPayout",
              "fk": false,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRecovery",
              "field": "billPayout",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientMoneyRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "billPayouts",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployeeBankAccount",
              "field": "billPayouts",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployeeBankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "LedgerEntry",
              "field": "billPayout",
              "fk": true,
              "list": false,
              "sourceKey": "app/LedgerEntry",
              "sourceDomain": "money"
            },
            {
              "model": "Payout",
              "field": "billPayout",
              "fk": false,
              "list": false,
              "sourceKey": "app/Payout",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "billPayouts"
            }
          ],
          "usage": {
            "total": 3,
            "reads": 2,
            "writes": 1,
            "ops": {
              "create": 1,
              "findUnique": 1,
              "findFirst": 1
            },
            "byArea": [
              {
                "area": "api/earnings",
                "reads": 2,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/payBill.ts",
                "line": 118,
                "op": "create"
              }
            ],
            "nested": 9,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "api/earnings",
                "n": 2
              }
            ],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The record that a paid bill was settled with the lawyer, naming the bank account it went to and carrying the ledger entries and the client money recovery for it. It is created even when nothing was transferred, so the lawyer can still see why the payout was zero.",
          "keyFields": [
            {
              "name": "payoutId",
              "meaning": "the Stripe backed Payout, null when totalPayout was zero"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "one payout per bill"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the lawyer paid"
            },
            {
              "field": "firmEmployeeBankAccountId",
              "target": "money",
              "meaning": "their active bank account at the time of payment"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FeePayment",
          "name": "FeePayment",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2264,
          "idPrefix": "feepmt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billFeeChargeableAmount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmSolicitor",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "items",
              "type": "FeePaymentItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePaymentItem",
              "onDelete": null
            },
            {
              "name": "billReceipt",
              "type": "BillReceipt",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillReceipt",
              "onDelete": null
            },
            {
              "name": "type",
              "type": "FeePaymentType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientMoneyRecovery",
              "type": "ClientMoneyRecovery",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "Client Money Recovery",
              "fk": true,
              "relationTarget": "ClientMoneyRecovery",
              "onDelete": null
            },
            {
              "name": "clientMoneyRecoveryId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeInvoiceItemId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Invoice Item",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripeInvoiceItemId"
          ],
          "relationsOut": [
            {
              "field": "firmSolicitor",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "items",
              "target": "FeePaymentItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePaymentItem",
              "targetDomain": "money"
            },
            {
              "field": "billReceipt",
              "target": "BillReceipt",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillReceipt",
              "targetDomain": "money"
            },
            {
              "field": "clientMoneyRecovery",
              "target": "ClientMoneyRecovery",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "clientMoneyRecoveryId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRecovery",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "feePayment",
              "fk": false,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "BillReceipt",
              "field": "feePayment",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillReceipt",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRecovery",
              "field": "feePayments",
              "fk": false,
              "list": true,
              "sourceKey": "app/ClientMoneyRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "FeePaymentItem",
              "field": "feePayment",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePaymentItem",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "feePayments",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmSolicitor"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "feePayments"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/chargeFeesForBill.ts",
                "line": 24,
                "op": "create"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/earnings",
                "n": 1
              }
            ],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Lawhive's charge against one bill: the total it kept and the itemised reason for each part. Written inside a transaction by chargeFeesForBill, together with the debits against any allowance it drew on.",
          "keyFields": [
            {
              "name": "amount",
              "meaning": "total fees kept, in pence"
            },
            {
              "name": "billFeeChargeableAmount",
              "meaning": "the fee portion of the bill the percentages were applied to"
            },
            {
              "name": "type",
              "meaning": "always clientMoneyRecovery in practice; invoiceItem is unused"
            },
            {
              "name": "stripeInvoiceItemId",
              "meaning": "never written, left for the invoicing path that was not built"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "the bill charged"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the lawyer the fee is taken from"
            },
            {
              "field": "clientMoneyRecoveryId",
              "target": "money",
              "meaning": "the recovery of client money that funded this"
            }
          ],
          "lifecycle": null,
          "grouped": [
            "FeePaymentItem"
          ],
          "flags": [
            "unused-enum-branch"
          ]
        },
        {
          "key": "app/FeePaymentItem",
          "name": "FeePaymentItem",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2295,
          "idPrefix": "fi_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 18,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePayment",
              "type": "FeePayment",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FeePayment",
              "onDelete": null
            },
            {
              "name": "feePaymentId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "FeePaymentItemType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "plan",
              "type": "FeePlan",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "Plan",
              "fk": true,
              "relationTarget": "FeePlan",
              "onDelete": null
            },
            {
              "name": "planId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "planFeeType",
              "type": "FeeType",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "planPercentage",
              "type": "Decimal",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePlanOverride",
              "type": "FeePlanOverride",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "Plan Override",
              "fk": true,
              "relationTarget": "FeePlanOverride",
              "onDelete": null
            },
            {
              "name": "feePlanOverrideId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "allowance",
              "type": "FeeAllowance",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "Allowance",
              "fk": true,
              "relationTarget": "FeeAllowance",
              "onDelete": null
            },
            {
              "name": "allowanceId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "allowanceItem",
              "type": "FeeAllowanceItem",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeeAllowanceItem",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "feePayment",
              "target": "FeePayment",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "feePaymentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePayment",
              "targetDomain": "money"
            },
            {
              "field": "plan",
              "target": "FeePlan",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "planId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlan",
              "targetDomain": "money"
            },
            {
              "field": "feePlanOverride",
              "target": "FeePlanOverride",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "feePlanOverrideId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlanOverride",
              "targetDomain": "money"
            },
            {
              "field": "allowance",
              "target": "FeeAllowance",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "allowanceId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeeAllowance",
              "targetDomain": "money"
            },
            {
              "field": "allowanceItem",
              "target": "FeeAllowanceItem",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeeAllowanceItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "FeeAllowance",
              "field": "feePaymentItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeeAllowance",
              "sourceDomain": "money"
            },
            {
              "model": "FeeAllowanceItem",
              "field": "feePaymentItem",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeeAllowanceItem",
              "sourceDomain": "money"
            },
            {
              "model": "FeePayment",
              "field": "items",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeePayment",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlan",
              "field": "feePaymentItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeePlan",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlanOverride",
              "field": "feePaymentItems",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeePlanOverride",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 1,
            "reads": 1,
            "writes": 0,
            "ops": {
              "aggregate": 1
            },
            "byArea": [
              {
                "area": "api/_utils",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 1,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One line of the fee breakdown: a plan fee, an override fee, or an allowance credit that reduces the total. Allowance items carry a negative amount. The plan percentage is copied onto the row so the charge stays explainable after the plan changes.",
          "keyFields": [
            {
              "name": "amount",
              "meaning": "pence, negative for allowance credits"
            },
            {
              "name": "description",
              "meaning": "the plan, override or allowance name shown to the lawyer"
            },
            {
              "name": "type",
              "meaning": "plan, override or allowance"
            },
            {
              "name": "planFeeType",
              "meaning": "platform or lead, on plan rows"
            },
            {
              "name": "planPercentage",
              "meaning": "the percentage as it stood when the fee was charged"
            }
          ],
          "references": [
            {
              "field": "feePaymentId",
              "target": "money",
              "meaning": "the charge it belongs to"
            },
            {
              "field": "planId",
              "target": "money",
              "meaning": "the FeePlan used, on plan rows"
            },
            {
              "field": "feePlanOverrideId",
              "target": "money",
              "meaning": "the override used, on override rows"
            },
            {
              "field": "allowanceId",
              "target": "money",
              "meaning": "the allowance drawn down, on allowance rows"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FeePlan",
          "name": "FeePlan",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2331,
          "idPrefix": "fp_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 15,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "leadFeePercentage",
              "type": "Decimal",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "platformFeePercentage",
              "type": "Decimal",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseSource",
              "type": "CaseSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "active",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "incentiveSchemeTierId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePaymentItems",
              "type": "FeePaymentItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePaymentItem",
              "onDelete": null
            },
            {
              "name": "cases",
              "type": "Case",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "incentiveSchemeTierId"
          ],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "feePaymentItems",
              "target": "FeePaymentItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePaymentItem",
              "targetDomain": "money"
            },
            {
              "field": "cases",
              "target": "Case",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "baseFeePlan",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FeePaymentItem",
              "field": "plan",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePaymentItem",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "feePlans",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "feePlans",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "cases"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "baseFeePlan"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "feePlans"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "feePlans"
            }
          ],
          "usage": {
            "total": 12,
            "reads": 7,
            "writes": 5,
            "ops": {
              "findMany": 6,
              "update": 1,
              "updateMany": 2,
              "create": 2,
              "findFirstOrThrow": 1
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 5,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 5,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "pkg/db",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "package"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/firms/firmEmployees/procedures/deactivateFirmEmployeeFeePlan.ts",
                "line": 14,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/firms/firmEmployees/service/setFirmEmployeeFeePlan.ts",
                "line": 20,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/firms/firmEmployees/service/setFirmEmployeeFeePlan.ts",
                "line": 25,
                "op": "create"
              }
            ],
            "nested": 14,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "api/firms",
                "n": 3
              },
              {
                "area": "api/incentives",
                "n": 3
              },
              {
                "area": "pkg/db",
                "n": 2
              },
              {
                "area": "api/test-data",
                "n": 1
              }
            ],
            "typeMentions": 25,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 21
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/firms",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The commercial terms for a firm or one of its lawyers, per case source: what percentage Lawhive keeps as a platform fee and what it keeps as a lead fee. Resolution order is firm employee plan, then the plan attached to the lawyer's incentive tier, then the firm base plan.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "shown on the fee line, for example Platform fee - Standard"
            },
            {
              "name": "platformFeePercentage",
              "meaning": "always charged"
            },
            {
              "name": "leadFeePercentage",
              "meaning": "only charged when the lead came from Lawhive, so not on byoc cases"
            },
            {
              "name": "caseSource",
              "meaning": "lawhive, byoc or followOn: a plan applies to one source"
            },
            {
              "name": "active",
              "meaning": "deactivating is how plans are replaced; old rows stay for old charges"
            },
            {
              "name": "incentiveSchemeTierId",
              "meaning": "loose link to a tier in the external incentive service, no foreign key"
            }
          ],
          "references": [
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "firm level plan"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "lawyer level plan, which beats the firm plan"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "cross-service-ref",
            "written-by-firms"
          ]
        },
        {
          "key": "app/FeePlanOverride",
          "name": "FeePlanOverride",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2356,
          "idPrefix": "fpo_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "level",
              "type": "FeePlanOverrideLevel",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "promotion",
              "type": "FeePlanPromotion",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FeePlanPromotion",
              "onDelete": null
            },
            {
              "name": "promotionId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feeType",
              "type": "FeeType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "percentage",
              "type": "Decimal",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePaymentItems",
              "type": "FeePaymentItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePaymentItem",
              "onDelete": null
            },
            {
              "name": "shouldAlwaysOverride",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([caseId, feeType])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "promotion",
              "target": "FeePlanPromotion",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "promotionId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlanPromotion",
              "targetDomain": "money"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "feePaymentItems",
              "target": "FeePaymentItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePaymentItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "feePlanOverrides",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FeePaymentItem",
              "field": "feePlanOverride",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePaymentItem",
              "sourceDomain": "money"
            },
            {
              "model": "FeePlanPromotion",
              "field": "overridesCreated",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeePlanPromotion",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "feePlanOverrides"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 3,
            "writes": 4,
            "ops": {
              "findMany": 1,
              "findUnique": 2,
              "upsert": 1,
              "delete": 1,
              "createMany": 1,
              "deleteMany": 1
            },
            "byArea": [
              {
                "area": "api/feePlanPromotions",
                "reads": 0,
                "writes": 3,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/instructions",
                "reads": 0,
                "writes": 1,
                "domain": "instructions",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feePlanPromotions/events.ts",
                "line": 22,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/feePlanPromotions/events.ts",
                "line": 45,
                "op": "delete"
              },
              {
                "file": "packages/api/src/modules/feePlanPromotions/service/addEligiblePromotionsToCase.ts",
                "line": 33,
                "op": "createMany"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 2
              }
            ],
            "typeMentions": 10,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 8
              },
              {
                "area": "api/incentives",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A replacement percentage for one fee type on one case, from a promotion, a quote discount or an admin. Only one override per case and fee type exists, and it is applied only if the blended total leaves the lawyer better off or the row is flagged shouldAlwaysOverride.",
          "keyFields": [
            {
              "name": "feeType",
              "meaning": "platform or lead"
            },
            {
              "name": "percentage",
              "meaning": "the percentage that replaces the plan's"
            },
            {
              "name": "shouldAlwaysOverride",
              "meaning": "apply even when it makes the lawyer worse off"
            },
            {
              "name": "level",
              "meaning": "case is the only value the enum has"
            },
            {
              "name": "name",
              "meaning": "the label that ends up on the fee line"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case it applies to, unique per fee type"
            },
            {
              "field": "promotionId",
              "target": "money",
              "meaning": "the promotion that spawned it, when it came from one"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FeePlanPromotion",
          "name": "FeePlanPromotion",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2386,
          "idPrefix": "fppro_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 15,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "startDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "endDate",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "FeePlanPromotionStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "eligibleSources",
              "type": "CaseSource",
              "list": true,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feeType",
              "type": "FeeType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "percentage",
              "type": "Decimal",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "remainingCaseCount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "usedCaseCount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "overridesCreated",
              "type": "FeePlanOverride",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePlanOverride",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "overridesCreated",
              "target": "FeePlanOverride",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePlanOverride",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "FeePlanOverride",
              "field": "promotion",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePlanOverride",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "feePlanPromotions",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "feePlanPromotions"
            }
          ],
          "usage": {
            "total": 6,
            "reads": 3,
            "writes": 3,
            "ops": {
              "findMany": 3,
              "updateMany": 2,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/feePlanPromotions",
                "reads": 2,
                "writes": 3,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/feePlanPromotions/service/addEligiblePromotionsToCase.ts",
                "line": 44,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/feePlanPromotions/service/addEligiblePromotionsToCase.ts",
                "line": 52,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/feePlanPromotions/service/addFirmEmployeePromotion.ts",
                "line": 14,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A discount offered to one lawyer, good for a set number of cases: reduce this fee type to this percentage on the next N eligible cases. Each case that claims it consumes one, and the promotion goes USED when the count reaches zero.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "ACTIVE or USED"
            },
            {
              "name": "feeType",
              "meaning": "platform or lead"
            },
            {
              "name": "percentage",
              "meaning": "the promotional rate"
            },
            {
              "name": "eligibleSources",
              "meaning": "which case sources it can be claimed on"
            },
            {
              "name": "remainingCaseCount",
              "meaning": "decremented per case; hitting zero flips status to USED"
            },
            {
              "name": "startDate",
              "meaning": "with the optional endDate, the window it can be claimed in"
            }
          ],
          "references": [
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the lawyer offered the promotion"
            }
          ],
          "lifecycle": "ACTIVE → USED",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FeeAllowance",
          "name": "FeeAllowance",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2422,
          "idPrefix": "fal_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "items",
              "type": "FeeAllowanceItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeeAllowanceItem",
              "onDelete": null
            },
            {
              "name": "feePaymentItems",
              "type": "FeePaymentItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePaymentItem",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "items",
              "target": "FeeAllowanceItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeeAllowanceItem",
              "targetDomain": "money"
            },
            {
              "field": "feePaymentItems",
              "target": "FeePaymentItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePaymentItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "feeAllowances",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FeeAllowanceItem",
              "field": "feeAllowance",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeeAllowanceItem",
              "sourceDomain": "money"
            },
            {
              "model": "FeePaymentItem",
              "field": "allowance",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePaymentItem",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "feeAllowances",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "feeAllowances"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "feeAllowances"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 1,
            "writes": 0,
            "ops": {
              "findMany": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 1
              }
            ],
            "typeMentions": 4,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A pot of credit against future fees, held either on a case or on a lawyer. The common source is a discounted fixed fee quote: accepting the instruction creates an allowance for the discount so the lawyer is not the one absorbing it.",
          "keyFields": [
            {
              "name": "amount",
              "meaning": "the credit in pence; what is left is worked out from the items"
            },
            {
              "name": "name",
              "meaning": "why it exists, for example Fees decreased to offset discount"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "case scoped allowance"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "lawyer scoped allowance, applied to any of their cases"
            }
          ],
          "lifecycle": null,
          "grouped": [
            "FeeAllowanceItem"
          ],
          "flags": [
            "created-nested-only"
          ]
        },
        {
          "key": "app/FeeAllowanceItem",
          "name": "FeeAllowanceItem",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2441,
          "idPrefix": "fai_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "debit",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "credit",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feeAllowance",
              "type": "FeeAllowance",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FeeAllowance",
              "onDelete": null
            },
            {
              "name": "feeAllowanceId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePaymentItem",
              "type": "FeePaymentItem",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FeePaymentItem",
              "onDelete": null
            },
            {
              "name": "feePaymentItemId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "feeAllowance",
              "target": "FeeAllowance",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "feeAllowanceId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeeAllowance",
              "targetDomain": "money"
            },
            {
              "field": "feePaymentItem",
              "target": "FeePaymentItem",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "feePaymentItemId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePaymentItem",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "FeeAllowance",
              "field": "items",
              "fk": false,
              "list": true,
              "sourceKey": "app/FeeAllowance",
              "sourceDomain": "money"
            },
            {
              "model": "FeePaymentItem",
              "field": "allowanceItem",
              "fk": false,
              "list": false,
              "sourceKey": "app/FeePaymentItem",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 2,
            "reads": 1,
            "writes": 1,
            "ops": {
              "findMany": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/chargeFeesForBill.ts",
                "line": 74,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 1,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One movement against an allowance, written when a bill's fees draw it down. Remaining credit is the allowance amount less the debits plus the credits, recomputed every time fees are calculated rather than stored.",
          "keyFields": [
            {
              "name": "debit",
              "meaning": "amount taken off the allowance"
            },
            {
              "name": "credit",
              "meaning": "amount put back"
            }
          ],
          "references": [
            {
              "field": "feeAllowanceId",
              "target": "money",
              "meaning": "the allowance being moved"
            },
            {
              "field": "feePaymentItemId",
              "target": "money",
              "meaning": "the fee line that caused the movement"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/TimeTrackingEntry",
          "name": "TimeTrackingEntry",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2878,
          "idPrefix": "tte_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 15,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "date",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "narrative",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "grade",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hours",
              "type": "Decimal",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "hourlyRate",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billLineItems",
              "type": "BillLineItem",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillLineItem",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "billLineItems",
              "target": "BillLineItem",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillLineItem",
              "targetDomain": "money"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "BillLineItem",
              "field": "timeTrackingEntry",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillLineItem",
              "sourceDomain": "money"
            },
            {
              "model": "Case",
              "field": "timeTrackingEntries",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "timeTrackingEntries",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "timeTrackingEntries"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "timeTrackingEntries"
            }
          ],
          "usage": {
            "total": 9,
            "reads": 6,
            "writes": 3,
            "ops": {
              "findMany": 3,
              "aggregate": 1,
              "findUnique": 2,
              "update": 2,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 5,
                "writes": 3,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/timeTracking/service/deleteEntry.ts",
                "line": 56,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/timeTracking/service/upsertEntry.ts",
                "line": 84,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/timeTracking/service/upsertEntry.ts",
                "line": 99,
                "op": "create"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 3
              }
            ],
            "typeMentions": 12,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 10
              },
              {
                "area": "api/cases",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A block of time a lawyer recorded against a case: date, narrative, hours and rate. On hourly work these are the raw material for bill line items, and Lawrence is shown all of them when it assesses a bill.",
          "keyFields": [
            {
              "name": "date",
              "meaning": "when the work was done"
            },
            {
              "name": "narrative",
              "meaning": "what was done, quoted to the client and to Lawrence"
            },
            {
              "name": "hours",
              "meaning": "decimal hours"
            },
            {
              "name": "hourlyRate",
              "meaning": "pence per hour, optional"
            },
            {
              "name": "type",
              "meaning": "free text kind of work, not an enum"
            },
            {
              "name": "grade",
              "meaning": "fee earner grade, optional"
            },
            {
              "name": "deleted",
              "meaning": "soft delete; entries are flagged, not removed"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter worked on"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "who recorded the time"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "soft-delete",
            "arguably-cases"
          ]
        },
        {
          "key": "app/PaymentRequest",
          "name": "PaymentRequest",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1598,
          "idPrefix": "pr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "PaymentRequestStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "creator",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "creatorId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "casePayments",
              "type": "CasePayment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CasePayment",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([quoteId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "creator",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "creatorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "casePayments",
              "target": "CasePayment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePayment",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "paymentRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CasePayment",
              "field": "request",
              "fk": true,
              "list": false,
              "sourceKey": "app/CasePayment",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "paymentRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Quote",
              "field": "paymentRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quote"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "creator"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "paymentRequests"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "paymentRequests"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "paymentRequests"
            }
          ],
          "usage": {
            "total": 15,
            "reads": 8,
            "writes": 7,
            "ops": {
              "findMany": 4,
              "findUniqueOrThrow": 2,
              "create": 3,
              "update": 3,
              "updateMany": 1,
              "findFirst": 2
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 4,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/quotes",
                "reads": 5,
                "writes": 0,
                "domain": "quotes",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 0,
                "writes": 2,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/go",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/paymentRequests/service/paymentRequestService.ts",
                "line": 56,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/paymentRequests/service/paymentRequestService.ts",
                "line": 84,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/paymentRequests/service/paymentRequestService.ts",
                "line": 97,
                "op": "update"
              }
            ],
            "nested": 9,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/quotes",
                "n": 1
              },
              {
                "area": "api/test-data",
                "n": 1
              }
            ],
            "typeMentions": 23,
            "typeMentionsByArea": [
              {
                "area": "ui/_app",
                "n": 5
              },
              {
                "area": "ui/paymentRequests",
                "n": 4
              },
              {
                "area": "ui/quote",
                "n": 3
              },
              {
                "area": "pkg/ui",
                "n": 3
              },
              {
                "area": "api/instructions",
                "n": 2
              },
              {
                "area": "api/_root",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/payments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "An ask for money from the client against a quote on a live case, holding the amount and the PENDING state that makes it payable. A public checkout link is built from its id, so the quote owner or a third party can pay it. Two paths create one: a lawyer raising a request through api/cases, and acceptInstruction, which creates one per authorised hold before capturing it.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PENDING, PAID or CANCELLED. Only PENDING is payable, cancellable or repriceable"
            },
            {
              "name": "amount",
              "meaning": "Pence requested. Can be under the quote total, in which case generic line items go to Stripe"
            },
            {
              "name": "creatorId",
              "meaning": "The firm employee who raised it. Blocked unless their firm has a Stripe connected account"
            },
            {
              "name": "casePayments",
              "meaning": "The payments received against it, normally one, written by the Stripe webhook"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "The quote being billed, which supplies the checkout line items"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "The matter the money is for"
            },
            {
              "field": "creatorId",
              "target": "firms",
              "meaning": "The lawyer or team member who raised the request"
            }
          ],
          "lifecycle": "PENDING → PAID / CANCELLED",
          "grouped": [],
          "flags": [
            "public-checkout"
          ]
        },
        {
          "key": "app/CasePayment",
          "name": "CasePayment",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1620,
          "idPrefix": "caspmt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 19,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripePaymentIntentId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "CasePaymentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "refunds",
              "type": "CasePaymentRefund",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CasePaymentRefund",
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paidBy",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "request",
              "type": "PaymentRequest",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "PaymentRequest",
              "onDelete": null
            },
            {
              "name": "requestId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "processingFeePaid",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentMethod",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paidAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amountRefunded",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientMoneyRemittances",
              "type": "ClientMoneyRemittance",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientMoneyRemittance",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripePaymentIntentId"
          ],
          "relationsOut": [
            {
              "field": "refunds",
              "target": "CasePaymentRefund",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePaymentRefund",
              "targetDomain": "money"
            },
            {
              "field": "paidBy",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "request",
              "target": "PaymentRequest",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentRequest",
              "targetDomain": "money"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "clientMoneyRemittances",
              "target": "ClientMoneyRemittance",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRemittance",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "payments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CasePaymentRefund",
              "field": "payment",
              "fk": true,
              "list": false,
              "sourceKey": "app/CasePaymentRefund",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRemittance",
              "field": "payment",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientMoneyRemittance",
              "sourceDomain": "money"
            },
            {
              "model": "Customer",
              "field": "casePayments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "PaymentRequest",
              "field": "casePayments",
              "fk": false,
              "list": true,
              "sourceKey": "app/PaymentRequest",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "paidBy"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "payments"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "casePayments"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 5,
            "writes": 2,
            "ops": {
              "aggregate": 2,
              "findUniqueOrThrow": 1,
              "findMany": 1,
              "findUnique": 1,
              "create": 1,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 1,
                "writes": 2,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/_utils",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/procedures/handleSuccessfulPaymentRequestPayment.ts",
                "line": 83,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handleSuccessfulRefund.ts",
                "line": 153,
                "op": "update"
              }
            ],
            "nested": 16,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 7
              },
              {
                "area": "admin",
                "n": 4
              },
              {
                "area": "api/payments",
                "n": 4
              },
              {
                "area": "api/quotes",
                "n": 1
              }
            ],
            "typeMentions": 12,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 8
              },
              {
                "area": "api/payments",
                "n": 3
              },
              {
                "area": "api/quotes",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Money that actually arrived from a client, one row per successful Stripe payment intent. Only the handleSuccessfulPaymentRequestPayment webhook creates it, never a user action, and the same handler flips the request to PAID and remits the funds to the firm.",
          "keyFields": [
            {
              "name": "stripePaymentIntentId",
              "meaning": "The captured intent. Unique, and the handler refuses to run twice against it"
            },
            {
              "name": "status",
              "meaning": "PAID on every live row. partialRefunded and refunded exist in the enum but nothing writes them"
            },
            {
              "name": "amount",
              "meaning": "Pence received, read off the Stripe intent rather than off the request"
            },
            {
              "name": "processingFeePaid",
              "meaning": "The Stripe fee pulled from the balance transaction, so the cost per payment sits on the row"
            },
            {
              "name": "amountRefunded",
              "meaning": "Running total refunded, incremented as each refund succeeds. Drives the refundable balance"
            },
            {
              "name": "paymentMethod",
              "meaning": "Json snapshot of the card or bank method used, kept because Stripe methods get detached"
            },
            {
              "name": "paidAt",
              "meaning": "When the webhook recorded it. Refund planning walks a client's payments oldest first"
            }
          ],
          "references": [
            {
              "field": "customerId",
              "target": "people",
              "meaning": "Who paid, possibly a third party created during checkout rather than the quote owner"
            },
            {
              "field": "requestId",
              "target": "money",
              "meaning": "The PaymentRequest satisfied"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "The matter whose client money account the funds belong to"
            }
          ],
          "lifecycle": "PAID",
          "grouped": [],
          "flags": [
            "webhook-written",
            "unused-enum-values"
          ]
        },
        {
          "key": "app/CasePaymentRefund",
          "name": "CasePaymentRefund",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1650,
          "idPrefix": "re_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 18,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeRefundId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "payment",
              "type": "CasePayment",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CasePayment",
              "onDelete": null
            },
            {
              "name": "paymentId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reason",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "RefundSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "RefundStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "instigator",
              "type": "RefundSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "admin",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "adminId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientRefundRecovery",
              "type": "ClientRefundRecovery",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientRefundRecovery",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripeRefundId"
          ],
          "relationsOut": [
            {
              "field": "payment",
              "target": "CasePayment",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "paymentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePayment",
              "targetDomain": "money"
            },
            {
              "field": "admin",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "adminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "clientRefundRecovery",
              "target": "ClientRefundRecovery",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientRefundRecovery",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "caseRefunds",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "CasePayment",
              "field": "refunds",
              "fk": false,
              "list": true,
              "sourceKey": "app/CasePayment",
              "sourceDomain": "money"
            },
            {
              "model": "ClientRefundRecovery",
              "field": "refund",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientRefundRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "caseRefunds",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "admin"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "caseRefunds"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "caseRefunds"
            }
          ],
          "usage": {
            "total": 9,
            "reads": 5,
            "writes": 4,
            "ops": {
              "count": 1,
              "aggregate": 1,
              "findUniqueOrThrow": 3,
              "create": 1,
              "update": 3
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 2,
                "writes": 2,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/payments/refundArbitraryAmountForCase.ts",
                "line": 124,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/payments/refundArbitraryAmountForCase.ts",
                "line": 158,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handleFailedRefund.ts",
                "line": 48,
                "op": "update"
              }
            ],
            "nested": 7,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 5
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/payments",
                "n": 1
              }
            ],
            "typeMentions": 9,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 6
              },
              {
                "area": "api/_root",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One refund attempt against one CasePayment. A refund of an arbitrary amount is planned across the client's payments oldest first and each slice becomes a row, all under a per-case lock so two concurrent requests cannot both pass the balance check.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "REQUESTED when the row is written, then SUCCESS or FAILED from the Stripe charge webhook"
            },
            {
              "name": "amount",
              "meaning": "Pence taken off this payment. Capped by the money still on the case's billable account"
            },
            {
              "name": "source",
              "meaning": "Whose money bears the refund, SOLICITOR or LAWHIVE"
            },
            {
              "name": "instigator",
              "meaning": "Who asked for it. Separate from source, so Lawhive can absorb a refund a lawyer requested"
            },
            {
              "name": "reason",
              "meaning": "Picked from a fixed reason list and copied onto the Stripe intent metadata"
            },
            {
              "name": "stripeRefundId",
              "meaning": "Filled in after Stripe accepts the refund, so a row can briefly exist with no Stripe object"
            }
          ],
          "references": [
            {
              "field": "paymentId",
              "target": "money",
              "meaning": "The payment being clawed back"
            },
            {
              "field": "adminId",
              "target": "people",
              "meaning": "Set when Lawhive instigated the refund"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "Set when the lawyer instigated the refund"
            }
          ],
          "lifecycle": "REQUESTED → SUCCESS / FAILED",
          "grouped": [],
          "flags": [
            "per-case-lock"
          ]
        },
        {
          "key": "app/ClientMoneyRemittance",
          "name": "ClientMoneyRemittance",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1927,
          "idPrefix": "cmrem_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "payout",
              "type": "Payout",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Payout",
              "onDelete": null
            },
            {
              "name": "payoutId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankAccount",
              "type": "FirmBankAccount",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmBankAccount",
              "onDelete": null
            },
            {
              "name": "bankAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeTransferId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "payment",
              "type": "CasePayment",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CasePayment",
              "onDelete": null
            },
            {
              "name": "paymentId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ledgerEntries",
              "type": "LedgerEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LedgerEntry",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripeTransferId"
          ],
          "relationsOut": [
            {
              "field": "payout",
              "target": "Payout",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "payoutId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Payout",
              "targetDomain": "money"
            },
            {
              "field": "bankAccount",
              "target": "FirmBankAccount",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "bankAccountId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmBankAccount",
              "targetDomain": "money"
            },
            {
              "field": "payment",
              "target": "CasePayment",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "paymentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePayment",
              "targetDomain": "money"
            },
            {
              "field": "ledgerEntries",
              "target": "LedgerEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LedgerEntry",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "CasePayment",
              "field": "clientMoneyRemittances",
              "fk": false,
              "list": true,
              "sourceKey": "app/CasePayment",
              "sourceDomain": "money"
            },
            {
              "model": "FirmBankAccount",
              "field": "clientMoneyRemittances",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmBankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "LedgerEntry",
              "field": "clientMoneyRemittance",
              "fk": true,
              "list": false,
              "sourceKey": "app/LedgerEntry",
              "sourceDomain": "money"
            },
            {
              "model": "Payout",
              "field": "clientMoney",
              "fk": false,
              "list": false,
              "sourceKey": "app/Payout",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/procedures/handleSuccessfulPaymentRequestPayment.ts",
                "line": 159,
                "op": "create"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "admin",
                "n": 1
              }
            ],
            "typeMentions": 1,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The record that a client payment was pushed straight out to the firm's client account. Lawhive does not hold client money, so every CasePayment is transferred to the firm's Stripe connected account and paid out to its client bank account within the same handler, and this row ties the payment, the Stripe transfer and the Payout together. It is written from that one place and read only through its ledger entries.",
          "keyFields": [
            {
              "name": "stripeTransferId",
              "meaning": "The transfer from the platform balance into the firm's connected account. Unique"
            },
            {
              "name": "payoutId",
              "meaning": "The Payout on to the firm's real bank. Unique, one payout per remittance"
            },
            {
              "name": "ledgerEntries",
              "meaning": "The pair posted here: credit the case CMA1, debit the paying customer's ledger"
            }
          ],
          "references": [
            {
              "field": "paymentId",
              "target": "money",
              "meaning": "The client payment being remitted"
            },
            {
              "field": "bankAccountId",
              "target": "money",
              "meaning": "The firm's client-type FirmBankAccount the money went to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "created-once-in-payments"
          ]
        },
        {
          "key": "app/ClientMoneyRecovery",
          "name": "ClientMoneyRecovery",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1942,
          "idPrefix": "cmrec_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 15,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeInvoiceItemId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "ClientMoneyRecoveryStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentSource",
              "type": "FirmPaymentSource",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmPaymentSource",
              "onDelete": null
            },
            {
              "name": "paymentSourceId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "ClientMoneyRecoveryType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientRefundRecovery",
              "type": "ClientRefundRecovery",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientRefundRecovery",
              "onDelete": null
            },
            {
              "name": "billPayout",
              "type": "BillPayout",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BillPayout",
              "onDelete": null
            },
            {
              "name": "billPayoutId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "feePayments",
              "type": "FeePayment",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FeePayment",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripeInvoiceItemId"
          ],
          "relationsOut": [
            {
              "field": "paymentSource",
              "target": "FirmPaymentSource",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "paymentSourceId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmPaymentSource",
              "targetDomain": "money"
            },
            {
              "field": "clientRefundRecovery",
              "target": "ClientRefundRecovery",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientRefundRecovery",
              "targetDomain": "money"
            },
            {
              "field": "billPayout",
              "target": "BillPayout",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "billPayoutId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillPayout",
              "targetDomain": "money"
            },
            {
              "field": "feePayments",
              "target": "FeePayment",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FeePayment",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BillPayout",
              "field": "clientMoneyRecovery",
              "fk": false,
              "list": true,
              "sourceKey": "app/BillPayout",
              "sourceDomain": "money"
            },
            {
              "model": "ClientRefundRecovery",
              "field": "recovery",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientRefundRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "FeePayment",
              "field": "clientMoneyRecovery",
              "fk": true,
              "list": false,
              "sourceKey": "app/FeePayment",
              "sourceDomain": "money"
            },
            {
              "model": "FirmPaymentSource",
              "field": "clientMoneyRecoveries",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmPaymentSource",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 2,
            "reads": 0,
            "writes": 2,
            "ops": {
              "update": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 2,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/procedures/handleSuccessfulInvoicePayment.ts",
                "line": 76,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/payments/utils/recoverClientMoney.ts",
                "line": 83,
                "op": "create"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "api/payments",
                "n": 1
              }
            ],
            "typeMentions": 5,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "api/_root",
                "n": 2
              },
              {
                "area": "api/payments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Money being pulled back out of a firm, raised as a Stripe invoice item on the firm's client-money subscription. It is the mirror of remittance: because client money went to the firm on receipt, Lawhive has to invoice the firm when a client refund or a lawyer's fee payout needs funding. recoverClientMoney finalises the firm's current invoice early if the next line would breach Stripe's line count or total.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "CLIENT_REFUND (funding a refund to the client) or BILL_PAYOUT (funding a lawyer's fees)"
            },
            {
              "name": "status",
              "meaning": "PENDING until the firm's invoice is paid, then RECOVERED. ERROR is in the enum but unwritten"
            },
            {
              "name": "stripeInvoiceItemId",
              "meaning": "The invoice item on the firm's subscription. Unique, and the key the invoice webhook looks up by"
            },
            {
              "name": "amount",
              "meaning": "Pence to recover, charged to the firm's stored payment method on its next invoice"
            },
            {
              "name": "paymentSourceId",
              "meaning": "The firm's clientMoneyAccount FirmPaymentSource the item is attached to"
            }
          ],
          "references": [
            {
              "field": "paymentSourceId",
              "target": "money",
              "meaning": "The firm subscription being invoiced"
            },
            {
              "field": "billPayoutId",
              "target": "money",
              "meaning": "Set when the recovery funds a bill payout to a lawyer"
            }
          ],
          "lifecycle": "PENDING → RECOVERED",
          "grouped": [],
          "flags": [
            "stripe-invoice-item"
          ]
        },
        {
          "key": "app/ClientRefundRecovery",
          "name": "ClientRefundRecovery",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1686,
          "idPrefix": "cmr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recovery",
              "type": "ClientMoneyRecovery",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientMoneyRecovery",
              "onDelete": null
            },
            {
              "name": "recoveryId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "refund",
              "type": "CasePaymentRefund",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CasePaymentRefund",
              "onDelete": null
            },
            {
              "name": "refundId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ledgerEntries",
              "type": "LedgerEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LedgerEntry",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "recovery",
              "target": "ClientMoneyRecovery",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "recoveryId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRecovery",
              "targetDomain": "money"
            },
            {
              "field": "refund",
              "target": "CasePaymentRefund",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "refundId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CasePaymentRefund",
              "targetDomain": "money"
            },
            {
              "field": "ledgerEntries",
              "target": "LedgerEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LedgerEntry",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "CasePaymentRefund",
              "field": "clientRefundRecovery",
              "fk": false,
              "list": false,
              "sourceKey": "app/CasePaymentRefund",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRecovery",
              "field": "clientRefundRecovery",
              "fk": false,
              "list": false,
              "sourceKey": "app/ClientMoneyRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "LedgerEntry",
              "field": "clientRefundRecovery",
              "fk": true,
              "list": false,
              "sourceKey": "app/LedgerEntry",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/procedures/handleSuccessfulRefund.ts",
                "line": 132,
                "op": "create"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "admin",
                "n": 1
              }
            ],
            "typeMentions": 1,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The 1:1 link between a refund that succeeded at Stripe and the recovery that took the money back off the firm. It also owns the refund's ledger pair: debit the case CMA1, credit the client's ledger. Its id prefix is cmr_ while ClientMoneyRecovery uses cmrec_, which reads backwards from the model names.",
          "keyFields": [
            {
              "name": "refundId",
              "meaning": "The CasePaymentRefund that succeeded. Unique"
            },
            {
              "name": "recoveryId",
              "meaning": "The ClientMoneyRecovery invoicing the firm for it. Unique"
            },
            {
              "name": "ledgerEntries",
              "meaning": "The refund postings, created in the same write as the row"
            }
          ],
          "references": [
            {
              "field": "refundId",
              "target": "money",
              "meaning": "The refund paid to the client"
            },
            {
              "field": "recoveryId",
              "target": "money",
              "meaning": "The firm invoice item funding it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "id-prefix-mismatch"
          ]
        },
        {
          "key": "app/Payout",
          "name": "Payout",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2074,
          "idPrefix": "po_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripePayoutId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankAccount",
              "type": "BankAccount",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BankAccount",
              "onDelete": null
            },
            {
              "name": "bankAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientMoney",
              "type": "ClientMoneyRemittance",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientMoneyRemittance",
              "onDelete": null
            },
            {
              "name": "billPayout",
              "type": "BillPayout",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillPayout",
              "onDelete": null
            },
            {
              "name": "type",
              "type": "PayoutType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reference",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "PayoutStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripePayoutId"
          ],
          "relationsOut": [
            {
              "field": "bankAccount",
              "target": "BankAccount",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "bankAccountId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankAccount",
              "targetDomain": "money"
            },
            {
              "field": "clientMoney",
              "target": "ClientMoneyRemittance",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRemittance",
              "targetDomain": "money"
            },
            {
              "field": "billPayout",
              "target": "BillPayout",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillPayout",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BankAccount",
              "field": "payouts",
              "fk": false,
              "list": true,
              "sourceKey": "app/BankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "BillPayout",
              "field": "payout",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillPayout",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRemittance",
              "field": "payout",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientMoneyRemittance",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 8,
            "reads": 4,
            "writes": 4,
            "ops": {
              "findMany": 1,
              "findUniqueOrThrow": 1,
              "update": 3,
              "findFirstOrThrow": 2,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 3,
                "writes": 4,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/procedures/adminRetryFailedPayout.handler.ts",
                "line": 45,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handleFailedPayout.ts",
                "line": 74,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handleSuccessfulPayout.ts",
                "line": 20,
                "op": "update"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/earnings",
                "n": 1
              },
              {
                "area": "api/firms",
                "n": 1
              }
            ],
            "typeMentions": 17,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 7
              },
              {
                "area": "ui/_app",
                "n": 3
              },
              {
                "area": "api/_root",
                "n": 3
              },
              {
                "area": "pkg/db",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "pkg/ui",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Money leaving a Stripe connected account for a real bank account, and the row Lawhive tracks the Stripe payout's fate on. transferAndPayout creates every one: it transfers from the platform balance to the connected account, creates the payout there, then records this row as PENDING.",
          "keyFields": [
            {
              "name": "stripePayoutId",
              "meaning": "The Stripe payout. Unique, and overwritten in place when an admin retries a failed one"
            },
            {
              "name": "type",
              "meaning": "CLIENT_MONEY_REMITTANCE (client funds to the firm) or BILL_PAYOUT (fees to a lawyer)"
            },
            {
              "name": "status",
              "meaning": "PENDING at creation, then SUCCESS or FAILED from the Stripe payout webhooks"
            },
            {
              "name": "description",
              "meaning": "Human text such as Client funds for Case #1234, also copied into reference"
            },
            {
              "name": "amount",
              "meaning": "Pence paid out, always the whole transferred amount"
            }
          ],
          "references": [
            {
              "field": "bankAccountId",
              "target": "money",
              "meaning": "The BankAccount whose Stripe external account receives it"
            }
          ],
          "lifecycle": "PENDING → SUCCESS / FAILED",
          "grouped": [],
          "flags": [
            "retryable"
          ]
        },
        {
          "key": "app/BankAccount",
          "name": "BankAccount",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2041,
          "idPrefix": "ba_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeConnectedAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeExternalAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "BankAccountType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "BankAccountStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmBankAccount",
              "type": "FirmBankAccount",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmBankAccount",
              "onDelete": null
            },
            {
              "name": "firmEmployeeBankAccount",
              "type": "FirmEmployeeBankAccount",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeBankAccount",
              "onDelete": null
            },
            {
              "name": "payouts",
              "type": "Payout",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Payout",
              "onDelete": null
            },
            {
              "name": "stripeConnectTransfersEnabled",
              "type": "Boolean",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeConnectPayoutsEnabled",
              "type": "Boolean",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripeConnectedAccountId",
            "stripeExternalAccountId"
          ],
          "relationsOut": [
            {
              "field": "firmBankAccount",
              "target": "FirmBankAccount",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmBankAccount",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployeeBankAccount",
              "target": "FirmEmployeeBankAccount",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeBankAccount",
              "targetDomain": "money"
            },
            {
              "field": "payouts",
              "target": "Payout",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Payout",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmBankAccount",
              "field": "bankAccount",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmBankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeBankAccount",
              "field": "bankAccount",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeBankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "Payout",
              "field": "bankAccount",
              "fk": true,
              "list": false,
              "sourceKey": "app/Payout",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 4,
            "reads": 1,
            "writes": 3,
            "ops": {
              "findUniqueOrThrow": 1,
              "update": 1,
              "updateMany": 2
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 1,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 2,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/firms/firmEmployees/service/canBankAccountConnectAccountTransferAndPayout.ts",
                "line": 23,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handleConnectAccountCapabilityUpdated.ts",
                "line": 21,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handleConnectAccountUpdated.ts",
                "line": 11,
                "op": "updateMany"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/solicitors",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A pair of Stripe Connect ids: a connected account and one external (real) bank account on it. No account number is stored here, only Stripe's handles, and everything that pays money out reads this row. Rows are only ever created nested, by firm onboarding or by the firmEmployee bankAccountCreated event.",
          "keyFields": [
            {
              "name": "stripeConnectedAccountId",
              "meaning": "The Connect account funds are transferred into. Shared by every account on the same firm"
            },
            {
              "name": "stripeExternalAccountId",
              "meaning": "The external bank account on that Connect account that payouts are sent to"
            },
            {
              "name": "type",
              "meaning": "FIRM (the firm's client account) or FIRM_SOLICITOR (one lawyer's fee account)"
            },
            {
              "name": "status",
              "meaning": "NEW for firm onboarding, VALIDATED for lawyer accounts. The other four values are never written"
            },
            {
              "name": "stripeConnectTransfersEnabled",
              "meaning": "Mirrored from Stripe's transfers capability webhook. Null means Stripe never reported"
            },
            {
              "name": "stripeConnectPayoutsEnabled",
              "meaning": "Mirrored from account.updated. False means the firm or lawyer cannot take work, and Slack is told"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "stripe-connect",
            "nested-write-only",
            "unused-enum-values"
          ]
        },
        {
          "key": "app/FirmBankAccount",
          "name": "FirmBankAccount",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2004,
          "idPrefix": "frmba_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankAccount",
              "type": "BankAccount",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BankAccount",
              "onDelete": null
            },
            {
              "name": "bankAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "FirmBankAccountType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientMoneyRemittances",
              "type": "ClientMoneyRemittance",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientMoneyRemittance",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([firmId, type])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "bankAccount",
              "target": "BankAccount",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "bankAccountId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankAccount",
              "targetDomain": "money"
            },
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "clientMoneyRemittances",
              "target": "ClientMoneyRemittance",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRemittance",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BankAccount",
              "field": "firmBankAccount",
              "fk": false,
              "list": false,
              "sourceKey": "app/BankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRemittance",
              "field": "bankAccount",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientMoneyRemittance",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "bankAccounts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "bankAccounts"
            }
          ],
          "usage": {
            "total": 3,
            "reads": 3,
            "writes": 0,
            "ops": {
              "findMany": 2,
              "findUniqueOrThrow": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 3,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The firm's client account: the link saying this BankAccount is where a firm's client money is remitted. api/payments only reads it; the row is created nested when an admin onboards a firm with a client account token, and the unique firm-plus-type index is how the remittance handler finds it.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "CLIENT is the only value in the enum, so a firm has at most one of these"
            },
            {
              "name": "bankAccountId",
              "meaning": "The Connect account pair. Unique, so no two firms share one"
            },
            {
              "name": "clientMoneyRemittances",
              "meaning": "Every client payment remitted into this account"
            }
          ],
          "references": [
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "The firm holding the client account"
            },
            {
              "field": "bankAccountId",
              "target": "money",
              "meaning": "The Connect account and external account used"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "single-value-enum",
            "read-only-in-payments"
          ]
        },
        {
          "key": "app/FirmEmployeeBankAccount",
          "name": "FirmEmployeeBankAccount",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2024,
          "idPrefix": "frmempba_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankAccount",
              "type": "BankAccount",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BankAccount",
              "onDelete": null
            },
            {
              "name": "bankAccountId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isActive",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isOnPersonalConnectAccount",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billPayouts",
              "type": "BillPayout",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BillPayout",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "bankAccount",
              "target": "BankAccount",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "bankAccountId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankAccount",
              "targetDomain": "money"
            },
            {
              "field": "billPayouts",
              "target": "BillPayout",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillPayout",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BankAccount",
              "field": "firmEmployeeBankAccount",
              "fk": false,
              "list": false,
              "sourceKey": "app/BankAccount",
              "sourceDomain": "money"
            },
            {
              "model": "BillPayout",
              "field": "firmEmployeeBankAccount",
              "fk": true,
              "list": false,
              "sourceKey": "app/BillPayout",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "bankAccounts",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "bankAccounts"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 3,
            "writes": 2,
            "ops": {
              "updateMany": 1,
              "create": 1,
              "findMany": 3
            },
            "byArea": [
              {
                "area": "api/firms",
                "reads": 1,
                "writes": 2,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 2,
                "writes": 0,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/firms/firmEmployees/events.ts",
                "line": 30,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/firms/firmEmployees/events.ts",
                "line": 35,
                "op": "create"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/payments",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A lawyer's own bank account for receiving fees. Only an admin can add one, and adding it deactivates the lawyer's earlier accounts in the same transaction, so bill payouts have exactly one place to go. If there is no active account, transferAndPayout throws and the fees sit in the platform balance with a Slack alert.",
          "keyFields": [
            {
              "name": "isActive",
              "meaning": "Only the newest account is true. Payout lookups filter on it"
            },
            {
              "name": "isOnPersonalConnectAccount",
              "meaning": "True if the external account sits on the lawyer's own Connect account, false if on the firm's"
            },
            {
              "name": "bankAccountId",
              "meaning": "The Connect account pair. Unique per BankAccount"
            },
            {
              "name": "billPayouts",
              "meaning": "The fee payouts sent to this account"
            }
          ],
          "references": [
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "The lawyer or team member being paid"
            },
            {
              "field": "bankAccountId",
              "target": "money",
              "meaning": "The Connect account and external account used"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "one-active-per-lawyer"
          ]
        },
        {
          "key": "app/FirmPaymentSource",
          "name": "FirmPaymentSource",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1972,
          "idPrefix": "frmps_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripeSubscriptionId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripePaymentMethodId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "FirmPaymentSourceType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "FirmPaymentSourceStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientMoneyRecoveries",
              "type": "ClientMoneyRecovery",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientMoneyRecovery",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([firmId, type])"
          ],
          "looseRefs": [
            "stripeSubscriptionId",
            "stripePaymentMethodId"
          ],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "clientMoneyRecoveries",
              "target": "ClientMoneyRecovery",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRecovery",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "ClientMoneyRecovery",
              "field": "paymentSource",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientMoneyRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "paymentSources",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "paymentSources"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 2,
            "writes": 3,
            "ops": {
              "upsert": 2,
              "findUnique": 2,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 2,
                "writes": 1,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/firms",
                "reads": 0,
                "writes": 1,
                "domain": "firms",
                "kind": "api-module"
              },
              {
                "area": "api/payments",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "apps/admin/src/app/(with-sidebar)/firms/FirmOnboardingTable.tsx",
                "line": 56,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/firms/service/createFirm.ts",
                "line": 68,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/payments/procedures/handlePaymentMethodDetached.ts",
                "line": 6,
                "op": "updateMany"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 2
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/_root",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A firm's stored way of paying Lawhive back, modelled as a Stripe subscription plus a payment method. createFirm upserts the clientMoneyAccount row as INCOMPLETE, and the ACTIVE rows are written by a server action in the admin app rather than by api/payments.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "CLIENT_MONEY_ACCOUNT (invoiced for recoveries) or OFFICE_ACCOUNT. Unique per firm and type"
            },
            {
              "name": "status",
              "meaning": "INCOMPLETE at firm creation, ACTIVE once a method is attached, CANCELLED when Stripe detaches it"
            },
            {
              "name": "stripeSubscriptionId",
              "meaning": "The subscription that recovery invoice items are attached to"
            },
            {
              "name": "stripePaymentMethodId",
              "meaning": "The direct debit or card. Null until an admin sets it up in the admin app"
            }
          ],
          "references": [
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "The firm on the hook for recoveries"
            }
          ],
          "lifecycle": "INCOMPLETE → ACTIVE → CANCELLED",
          "grouped": [],
          "flags": [
            "admin-app-writes",
            "unused-enum-values"
          ]
        },
        {
          "key": "app/BankTransfer",
          "name": "BankTransfer",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1741,
          "idPrefix": "bt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 18,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "BankTransferType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paidAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reference",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ledgerEntries",
              "type": "LedgerEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LedgerEntry",
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "createdByAdminId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "senderId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sender",
              "type": "Counterparty",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Counterparty",
              "onDelete": null
            },
            {
              "name": "receiverId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "receiver",
              "type": "Counterparty",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Counterparty",
              "onDelete": null
            },
            {
              "name": "bankTransferIntentId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankTransferIntent",
              "type": "BankTransferIntent",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BankTransferIntent",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": "TODO This shouldn't be unique!\n@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "ledgerEntries",
              "target": "LedgerEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LedgerEntry",
              "targetDomain": "money"
            },
            {
              "field": "createdBy",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdByAdminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "sender",
              "target": "Counterparty",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "senderId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Counterparty",
              "targetDomain": "money"
            },
            {
              "field": "receiver",
              "target": "Counterparty",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "receiverId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Counterparty",
              "targetDomain": "money"
            },
            {
              "field": "bankTransferIntent",
              "target": "BankTransferIntent",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "bankTransferIntentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransferIntent",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "bankTransfer",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "BankTransferIntent",
              "field": "bankTransfer",
              "fk": false,
              "list": false,
              "sourceKey": "app/BankTransferIntent",
              "sourceDomain": "money"
            },
            {
              "model": "Counterparty",
              "field": "bankTransfersReceived",
              "fk": false,
              "list": true,
              "sourceKey": "app/Counterparty",
              "sourceDomain": "money"
            },
            {
              "model": "Counterparty",
              "field": "bankTransfersSent",
              "fk": false,
              "list": true,
              "sourceKey": "app/Counterparty",
              "sourceDomain": "money"
            },
            {
              "model": "LedgerEntry",
              "field": "BankTransfer",
              "fk": true,
              "list": false,
              "sourceKey": "app/LedgerEntry",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "bankTransfer"
            }
          ],
          "usage": {
            "total": 6,
            "reads": 4,
            "writes": 2,
            "ops": {
              "findMany": 2,
              "findUnique": 1,
              "create": 1,
              "update": 1,
              "findFirst": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 1,
                "writes": 2,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/bankTransfer/bankTransferEventRouter.ts",
                "line": 44,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/payments/bankTransfer/bankTransferEventRouter.ts",
                "line": 69,
                "op": "update"
              }
            ],
            "nested": 7,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 5
              },
              {
                "area": "admin",
                "n": 2
              }
            ],
            "typeMentions": 31,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 13
              },
              {
                "area": "ui/cases",
                "n": 10
              },
              {
                "area": "pkg/ui",
                "n": 4
              },
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "api/payments",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Money that has actually moved in or out of a client money account by bank transfer, recorded after the fact by an admin. Every row owns the ledger pair it posted, so it is both the banking record and the reason a client money balance changed. Admin picks the account (CMA1 for billable funds, CMA2 for non-billable) and the direction, and the handler works out which ledgers and which firm counterparty to use.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "CREDIT (money in) or DEBIT (money out), which decides which way the ledger pair posts"
            },
            {
              "name": "paidAt",
              "meaning": "The bank's value date, used as the ledger timestamp instead of createdAt"
            },
            {
              "name": "reference",
              "meaning": "The bank reference finance matches against the statement"
            },
            {
              "name": "ledgerEntries",
              "meaning": "The pair posted with the row: one leg on the case account, one on the firm external ledger"
            },
            {
              "name": "bankTransferIntentId",
              "meaning": "Set when the transfer settles a lawyer's intent, null for admin-entered ones. Unique"
            },
            {
              "name": "createdByAdminId",
              "meaning": "The admin who recorded it. There is no lawyer-facing write path"
            },
            {
              "name": "createdAt",
              "meaning": "Carries a @unique that the schema comment admits is wrong, so two rows cannot share a millisecond"
            }
          ],
          "references": [
            {
              "field": "senderId",
              "target": "money",
              "meaning": "Who paid, a Counterparty"
            },
            {
              "field": "receiverId",
              "target": "money",
              "meaning": "Who was paid, a Counterparty"
            },
            {
              "field": "bankTransferIntentId",
              "target": "money",
              "meaning": "The lawyer request this settles, when there was one"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "unique-createdAt-bug",
            "event-sourced-writes"
          ]
        },
        {
          "key": "app/BankTransferIntent",
          "name": "BankTransferIntent",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1707,
          "idPrefix": "bti_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 22,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "BankTransferType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "BankTransferIntentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reference",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "transferDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "allowTransferBeforeDate",
              "type": "Boolean",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sourceOfFunds",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requestedBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "requestedByFirmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "supportingEvidence",
              "type": "CaseFile",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "senderId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sender",
              "type": "Counterparty",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Counterparty",
              "onDelete": null
            },
            {
              "name": "receiverId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "receiver",
              "type": "Counterparty",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Counterparty",
              "onDelete": null
            },
            {
              "name": "bankTransfer",
              "type": "BankTransfer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransfer",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "requestedBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestedByFirmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "supportingEvidence",
              "target": "CaseFile",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            },
            {
              "field": "sender",
              "target": "Counterparty",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "senderId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Counterparty",
              "targetDomain": "money"
            },
            {
              "field": "receiver",
              "target": "Counterparty",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "receiverId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Counterparty",
              "targetDomain": "money"
            },
            {
              "field": "bankTransfer",
              "target": "BankTransfer",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransfer",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BankTransfer",
              "field": "bankTransferIntent",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "Case",
              "field": "bankTransferIntents",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseFile",
              "field": "bankTransferIntent",
              "fk": false,
              "list": true,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "Counterparty",
              "field": "bankTransferIntentsReceived",
              "fk": false,
              "list": true,
              "sourceKey": "app/Counterparty",
              "sourceDomain": "money"
            },
            {
              "model": "Counterparty",
              "field": "bankTransferIntentsSent",
              "fk": false,
              "list": true,
              "sourceKey": "app/Counterparty",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployee",
              "field": "bankTransferIntents",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "requestedBy"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFile",
              "field": "supportingEvidence"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "bankTransferIntents"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFile",
              "field": "bankTransferIntent"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "bankTransferIntents"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 7,
            "writes": 3,
            "ops": {
              "findFirstOrThrow": 1,
              "findMany": 3,
              "count": 1,
              "create": 1,
              "update": 2,
              "findFirst": 2
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 3,
                "writes": 3,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 4,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/bankTransferIntent/bankTransferIntentEventsRouter.ts",
                "line": 95,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/payments/bankTransferIntent/bankTransferIntentEventsRouter.ts",
                "line": 112,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/payments/bankTransferIntent/bankTransferIntentEventsRouter.ts",
                "line": 136,
                "op": "update"
              }
            ],
            "nested": 3,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 2
              },
              {
                "area": "api/payments",
                "n": 1
              }
            ],
            "typeMentions": 6,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 6
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A lawyer's request to send money out of client money to an outside party, before anything has moved. It goes to the Lawhive cashier for review rather than straight to a bank, which is why the source of funds, the reference and the supporting evidence all sit on the row. When the cashier marks it paid, one route posts against the case CMA2 ledger and the other posts against the firm's office ledger and raises a disbursement bill.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "AWAITING_REVIEW, INVALID_DETAILS, READY_TO_BE_PAID, AWAITING_EXTERNAL_BANKING_APPROVAL, PAID, CANCELLED"
            },
            {
              "name": "sourceOfFunds",
              "meaning": "Which pot the lawyer says the money comes from. Required, and part of the cashier's check"
            },
            {
              "name": "transferDate",
              "meaning": "The date the lawyer wants the money sent"
            },
            {
              "name": "allowTransferBeforeDate",
              "meaning": "Whether the cashier may send it early"
            },
            {
              "name": "reference",
              "meaning": "Bank reference. Defaults to one built from case number, client name and amount"
            },
            {
              "name": "supportingEvidence",
              "meaning": "Case files attached as proof, for example the invoice being paid"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "The matter whose client money is being spent"
            },
            {
              "field": "requestedByFirmEmployeeId",
              "target": "firms",
              "meaning": "The lawyer who raised it"
            },
            {
              "field": "senderId",
              "target": "money",
              "meaning": "The paying side, seeded from the firm's non-billable funds (CMA2) counterparty"
            },
            {
              "field": "receiverId",
              "target": "money",
              "meaning": "The outside party being paid, created fresh from what the lawyer typed"
            }
          ],
          "lifecycle": "AWAITING_REVIEW → READY_TO_BE_PAID → AWAITING_EXTERNAL_BANKING_APPROVAL → PAID / CANCELLED",
          "grouped": [],
          "flags": [
            "cashier-review",
            "event-sourced-writes"
          ]
        },
        {
          "key": "app/Counterparty",
          "name": "Counterparty",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1771,
          "idPrefix": "cp_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 23,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firstName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lastName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "companyName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "CounterpartyType",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "accountNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sortCode",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "iban",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bicswift",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ncc",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankAddress",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "country",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "nonBillableFundsFirm",
              "type": "Firm",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "billableFundsFirm",
              "type": "Firm",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "bankTransfersReceived",
              "type": "BankTransfer",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransfer",
              "onDelete": null
            },
            {
              "name": "bankTransfersSent",
              "type": "BankTransfer",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransfer",
              "onDelete": null
            },
            {
              "name": "bankTransferIntentsReceived",
              "type": "BankTransferIntent",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransferIntent",
              "onDelete": null
            },
            {
              "name": "bankTransferIntentsSent",
              "type": "BankTransferIntent",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "BankTransferIntent",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "nonBillableFundsFirm",
              "target": "Firm",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "nonBillableFundsCounterparty",
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "billableFundsFirm",
              "target": "Firm",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "billableFundsCounterparty",
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "bankTransfersReceived",
              "target": "BankTransfer",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "receiver",
              "onDelete": null,
              "targetKey": "app/BankTransfer",
              "targetDomain": "money"
            },
            {
              "field": "bankTransfersSent",
              "target": "BankTransfer",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "sender",
              "onDelete": null,
              "targetKey": "app/BankTransfer",
              "targetDomain": "money"
            },
            {
              "field": "bankTransferIntentsReceived",
              "target": "BankTransferIntent",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "receiver",
              "onDelete": null,
              "targetKey": "app/BankTransferIntent",
              "targetDomain": "money"
            },
            {
              "field": "bankTransferIntentsSent",
              "target": "BankTransferIntent",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "sender",
              "onDelete": null,
              "targetKey": "app/BankTransferIntent",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BankTransfer",
              "field": "sender",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "BankTransfer",
              "field": "receiver",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "BankTransferIntent",
              "field": "sender",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransferIntent",
              "sourceDomain": "money"
            },
            {
              "model": "BankTransferIntent",
              "field": "receiver",
              "fk": true,
              "list": false,
              "sourceKey": "app/BankTransferIntent",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "nonBillableFundsCounterparty",
              "fk": true,
              "list": false,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "Firm",
              "field": "billableFundsCounterparty",
              "fk": true,
              "list": false,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "nonBillableFundsFirm"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "billableFundsFirm"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "nonBillableFundsCounterparty"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "billableFundsCounterparty"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 1,
            "writes": 6,
            "ops": {
              "create": 6,
              "findFirst": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 1,
                "writes": 6,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/bankTransfer/procedures/createBankTransfer.handler.ts",
                "line": 190,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/payments/bankTransfer/procedures/createBankTransfer.handler.ts",
                "line": 196,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/payments/bankTransfer/procedures/createBankTransfer.handler.ts",
                "line": 200,
                "op": "create"
              }
            ],
            "nested": 19,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 12
              },
              {
                "area": "admin",
                "n": 4
              },
              {
                "area": "api/messages",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Whoever is at the other end of a bank transfer: a client, a court, an expert, or one of the firm's own pots. This is the one table in the domain holding real bank details rather than Stripe handles, because an off-platform transfer has to record who was paid. Each firm has two long-lived rows standing in for its CMA1 and CMA2, while every other row is created fresh per transfer with no dedupe.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "Display name, built from the company name or the first and last name the lawyer entered"
            },
            {
              "name": "type",
              "meaning": "BUSINESS or INDIVIDUAL. Optional, and null on rows created before it existed"
            },
            {
              "name": "accountNumber",
              "meaning": "UK account number. With sortCode, iban and bicswift this is real bank data"
            },
            {
              "name": "sortCode",
              "meaning": "UK sort code for the receiving account"
            },
            {
              "name": "nonBillableFundsFirm",
              "meaning": "Set when the row is a firm's standing CMA2 handle rather than an outside party"
            },
            {
              "name": "billableFundsFirm",
              "meaning": "Set when the row is a firm's standing CMA1 handle"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "duplicates-accumulate",
            "holds-bank-details"
          ]
        },
        {
          "key": "app/OfficeAccountTransfer",
          "name": "OfficeAccountTransfer",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2649,
          "idPrefix": "oat_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "OfficeAccountTransferStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ledgerEntries",
              "type": "LedgerEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LedgerEntry",
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "createdByAdminId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reconciliation",
              "type": "OfficeAccountTransferReconciliation",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "OfficeAccountTransferReconciliation",
              "onDelete": null
            },
            {
              "name": "reconciliationId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "ledgerEntries",
              "target": "LedgerEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LedgerEntry",
              "targetDomain": "money"
            },
            {
              "field": "createdBy",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdByAdminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "reconciliation",
              "target": "OfficeAccountTransferReconciliation",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "reconciliationId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransferReconciliation",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "officeAccountTransfers",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Bill",
              "field": "officeAccountTransfer",
              "fk": false,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "Firm",
              "field": "officeAccountTransfers",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "LedgerEntry",
              "field": "officeAccountTransfer",
              "fk": true,
              "list": false,
              "sourceKey": "app/LedgerEntry",
              "sourceDomain": "money"
            },
            {
              "model": "OfficeAccountTransferReconciliation",
              "field": "transfers",
              "fk": false,
              "list": true,
              "sourceKey": "app/OfficeAccountTransferReconciliation",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "officeAccountTransfers"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "officeAccountTransfers"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 3,
            "writes": 2,
            "ops": {
              "findMany": 3,
              "createMany": 1,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/finance",
                "reads": 1,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/raiseFirmDisbursementBill.ts",
                "line": 151,
                "op": "createMany"
              },
              {
                "file": "packages/api/src/modules/finance/service/reconcileOfficeAccountTransfers.ts",
                "line": 134,
                "op": "updateMany"
              }
            ],
            "nested": 7,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "api/firms",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/finance",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One bill's worth of money owed from a firm's client account to its office account, waiting for the cashier to make the real bank transfer. Raising a firm disbursement bill creates it and posts only the case office debit, so that account sits in deficit on purpose. Reconciliation posts the second leg: debit the case CMA1, credit the firm office ledger and credit the case office ledger, unwinding the IOU.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "AWAITING_RECONCILIATION by default, RECONCILED once the cashier matches a bank reference"
            },
            {
              "name": "amount",
              "meaning": "Pence to sweep, the disbursement total on the bill"
            },
            {
              "name": "billId",
              "meaning": "The firm disbursement bill it came from. Unique, so one transfer per bill"
            },
            {
              "name": "ledgerEntries",
              "meaning": "Both legs hang off this row, the raise-time debit and the three-line sweep"
            },
            {
              "name": "reconciliationId",
              "meaning": "Null until batched. Set in the same transaction that flips status to RECONCILED"
            }
          ],
          "references": [
            {
              "field": "billId",
              "target": "money",
              "meaning": "The disbursement bill being funded"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "The firm whose two accounts the money moves between"
            },
            {
              "field": "createdByAdminId",
              "target": "people",
              "meaning": "The admin who posted the disbursement"
            }
          ],
          "lifecycle": "AWAITING_RECONCILIATION → RECONCILED",
          "grouped": [],
          "flags": [
            "two-leg-posting",
            "cma1-may-go-negative"
          ]
        },
        {
          "key": "app/OfficeAccountTransferReconciliation",
          "name": "OfficeAccountTransferReconciliation",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2679,
          "idPrefix": "oatrec_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bankReference",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reconciledBy",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "reconciledByAdminId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "transfers",
              "type": "OfficeAccountTransfer",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OfficeAccountTransfer",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "reconciledBy",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "reconciledByAdminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "transfers",
              "target": "OfficeAccountTransfer",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransfer",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "officeAccountTransferReconciliations",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Firm",
              "field": "officeAccountTransferReconciliations",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "OfficeAccountTransfer",
              "field": "reconciliation",
              "fk": true,
              "list": false,
              "sourceKey": "app/OfficeAccountTransfer",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "reconciledBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "officeAccountTransferReconciliations"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "officeAccountTransferReconciliations"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "findUniqueOrThrow": 1,
              "count": 1,
              "findMany": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/finance",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/finance/service/reconcileOfficeAccountTransfers.ts",
                "line": 124,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One real bank transfer from a firm's client account to its office account, covering a batch of OfficeAccountTransfers for a single firm. reconcileOfficeAccountTransfers in api/finance writes it in one transaction with the status flips and the leg-two postings, and reuses its createdAt as the accounting date on every line. Underfunded transfers are left out of the batch by the cashier and picked up once the case is in funds.",
          "keyFields": [
            {
              "name": "bankReference",
              "meaning": "The reference on the real bank payment, written into every ledger line in the batch"
            },
            {
              "name": "amount",
              "meaning": "Pence, the sum of the transfers in the batch"
            },
            {
              "name": "transfers",
              "meaning": "The transfers this settles. All must be one firm's and still unreconciled"
            }
          ],
          "references": [
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "The firm whose accounts the sweep is between"
            },
            {
              "field": "reconciledByAdminId",
              "target": "people",
              "meaning": "The cashier who confirmed it. Optional on the row, required by the service"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "batched",
            "admin-read-surface"
          ]
        },
        {
          "key": "app/BulkDisbursementPosting",
          "name": "BulkDisbursementPosting",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3542,
          "idPrefix": "bdp_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 12,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "admin",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "adminId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sourceFileName",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sourceFileType",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "invoiceDate",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "postedCount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "failedCount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalAmountPosted",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "postedCsvS3Key",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "failedCsvS3Key",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([adminId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "admin",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "adminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "bulkDisbursementPostings",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "admin"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "bulkDisbursementPostings"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "create": 1,
              "findUnique": 1,
              "findMany": 1,
              "count": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 3,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/procedures/bulkCreateDisbursements.ts",
                "line": 108,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The receipt for one CSV upload of disbursements: how many rows posted, how many failed, and where the two result files went in S3. It is an audit record of an admin batch rather than money, written and read only by the bills procedures in api/cases, and each posted row raises a firm disbursement bill that in turn creates an OfficeAccountTransfer.",
          "keyFields": [
            {
              "name": "sourceFileName",
              "meaning": "The uploaded file, kept so a posting can be traced back to a supplier invoice"
            },
            {
              "name": "invoiceDate",
              "meaning": "The date the disbursements are posted under"
            },
            {
              "name": "postedCount",
              "meaning": "Rows that became firm disbursement bills. failedCount is the rest"
            },
            {
              "name": "postedCsvS3Key",
              "meaning": "S3 key of the results CSV, fetched through a signed URL. failedCsvS3Key holds the rejects"
            }
          ],
          "references": [
            {
              "field": "adminId",
              "target": "people",
              "meaning": "The admin who ran the upload"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "audit-record",
            "s3-backed",
            "belongs-with-bills"
          ]
        },
        {
          "key": "app/PaymentAuthorisationRequest",
          "name": "PaymentAuthorisationRequest",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1574,
          "idPrefix": "par_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentAuthorisation",
              "type": "PaymentAuthorisation",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentAuthorisation",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([quoteId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "paymentAuthorisation",
              "target": "PaymentAuthorisation",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisation",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "PaymentAuthorisation",
              "field": "request",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentAuthorisation",
              "sourceDomain": "money"
            },
            {
              "model": "Quote",
              "field": "paymentAuthorisationRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quote"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "paymentAuthorisationRequests"
            }
          ],
          "usage": {
            "total": 6,
            "reads": 4,
            "writes": 2,
            "ops": {
              "updateMany": 1,
              "findUniqueOrThrow": 1,
              "findFirst": 2,
              "findMany": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/quotes",
                "reads": 3,
                "writes": 1,
                "domain": "quotes",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/go",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/service/completeCase.ts",
                "line": 36,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/quotes/service/requestPaymentAuthorisation.ts",
                "line": 42,
                "op": "create"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 2
              },
              {
                "area": "api/quotes",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              }
            ],
            "typeMentions": 6,
            "typeMentionsByArea": [
              {
                "area": "ui/_app",
                "n": 4
              },
              {
                "area": "api/_root",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "An invitation for the client to pay upfront for a fixed-fee quote. It carries no amount and no status: it exists so the Stripe checkout link has something stable to point at, and so quotes can ask whether a quote was ever sent for payment.",
          "keyFields": [
            {
              "name": "quoteId",
              "meaning": "The quote being paid for. A quote can have several requests if earlier links lapsed"
            },
            {
              "name": "paymentAuthorisation",
              "meaning": "Set once the client completes checkout. Absent means the link was never used"
            },
            {
              "name": "createdAt",
              "meaning": "When the link was generated. Quotes lists the unpaid requests by this"
            }
          ],
          "references": [
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "The fixed-fee quote whose total is being authorised"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "thin-join",
            "fixed-fee-only"
          ]
        },
        {
          "key": "app/PaymentAuthorisation",
          "name": "PaymentAuthorisation",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1107,
          "idPrefix": "pmtauth_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "currency",
              "type": "Currency",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "instruction",
              "type": "Instruction",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Instruction",
              "onDelete": null
            },
            {
              "name": "instructionId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "stripePaymentIntentId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "PaymentAuthorisationStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "cancellation",
              "type": "PaymentAuthorisationCancellation",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "PaymentAuthorisationCancellation",
              "onDelete": null
            },
            {
              "name": "request",
              "type": "PaymentAuthorisationRequest",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "PaymentAuthorisationRequest",
              "onDelete": null
            },
            {
              "name": "requestId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "authorisedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "captureBefore",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [
            "stripePaymentIntentId"
          ],
          "relationsOut": [
            {
              "field": "instruction",
              "target": "Instruction",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "instructionId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Instruction",
              "targetDomain": "instructions"
            },
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "cancellation",
              "target": "PaymentAuthorisationCancellation",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisationCancellation",
              "targetDomain": "money"
            },
            {
              "field": "request",
              "target": "PaymentAuthorisationRequest",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisationRequest",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Customer",
              "field": "paymentAuthorisations",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "Instruction",
              "field": "paymentAuthorisations",
              "fk": false,
              "list": true,
              "sourceKey": "app/Instruction",
              "sourceDomain": "instructions"
            },
            {
              "model": "PaymentAuthorisationCancellation",
              "field": "paymentAuthorisation",
              "fk": true,
              "list": false,
              "sourceKey": "app/PaymentAuthorisationCancellation",
              "sourceDomain": "money"
            },
            {
              "model": "PaymentAuthorisationRequest",
              "field": "paymentAuthorisation",
              "fk": false,
              "list": false,
              "sourceKey": "app/PaymentAuthorisationRequest",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "instructions",
              "model": "Instruction",
              "field": "instruction"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "paymentAuthorisations"
            },
            {
              "dir": "in",
              "domain": "instructions",
              "model": "Instruction",
              "field": "paymentAuthorisations"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 4,
            "writes": 3,
            "ops": {
              "create": 1,
              "findMany": 1,
              "updateMany": 1,
              "update": 1,
              "findUniqueOrThrow": 2,
              "findUnique": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 3,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              },
              {
                "area": "api/instructions",
                "reads": 1,
                "writes": 1,
                "domain": "instructions",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
                "line": 299,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/instructions/service/updatePaymentAuthorisationDetailsForNewlyImportedInstruction.ts",
                "line": 86,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/payments/paymentEvents.ts",
                "line": 30,
                "op": "update"
              }
            ],
            "nested": 9,
            "nestedByArea": [
              {
                "area": "api/instructions",
                "n": 3
              },
              {
                "area": "api/payments",
                "n": 2
              },
              {
                "area": "api/quotes",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/_integrations",
                "n": 1
              }
            ],
            "typeMentions": 3,
            "typeMentionsByArea": [
              {
                "area": "api/_root",
                "n": 2
              },
              {
                "area": "api/instructions",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A card hold: the client has passed checkout and Stripe has the money reserved but not taken. The intent is created with manual capture, so nothing is charged until a lawyer accepts the instruction, and the instruction is created the moment the hold succeeds.",
          "keyFields": [
            {
              "name": "stripePaymentIntentId",
              "meaning": "The uncaptured Stripe intent. Unique, so the webhook cannot record the same hold twice"
            },
            {
              "name": "status",
              "meaning": "AUTHORISED or CANCELLED. There is no captured state: capture turns the hold into a PaymentRequest"
            },
            {
              "name": "captureBefore",
              "meaning": "Stripe's deadline for taking the money. The lawyer's feed of work counts down to it"
            },
            {
              "name": "authorisedAt",
              "meaning": "When the hold was placed, used with captureBefore to show how long is left"
            },
            {
              "name": "amount",
              "meaning": "Pence held, the discounted quote total as Stripe computed it at checkout"
            },
            {
              "name": "requestId",
              "meaning": "The PaymentAuthorisationRequest it came from. Unique, so one hold per request"
            }
          ],
          "references": [
            {
              "field": "instructionId",
              "target": "instructions",
              "meaning": "The instruction created from the quote as soon as the hold succeeded"
            },
            {
              "field": "customerId",
              "target": "people",
              "meaning": "The client whose card is on hold"
            }
          ],
          "lifecycle": "AUTHORISED → CANCELLED",
          "grouped": [],
          "flags": [
            "stripe-manual-capture"
          ]
        },
        {
          "key": "app/PaymentAuthorisationCancellation",
          "name": "PaymentAuthorisationCancellation",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1138,
          "idPrefix": "authcan_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "PaymentAuthorisationCancellationSource",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "paymentAuthorisation",
              "type": "PaymentAuthorisation",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "PaymentAuthorisation",
              "onDelete": null
            },
            {
              "name": "paymentAuthorisationId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "admin",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "adminId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reason",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "paymentAuthorisation",
              "target": "PaymentAuthorisation",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "paymentAuthorisationId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/PaymentAuthorisation",
              "targetDomain": "money"
            },
            {
              "field": "admin",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "adminId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "cancelledPaymentAuthorisations",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "PaymentAuthorisation",
              "field": "cancellation",
              "fk": false,
              "list": false,
              "sourceKey": "app/PaymentAuthorisation",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "admin"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "cancelledPaymentAuthorisations"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 2
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The reason a card hold was released, one row per authorisation. MANUAL means an admin cancelled an instruction and cancelPaymentAuthorisation released the Stripe intent, AUTOMATIC means Stripe let the hold expire. No code writes it directly: rows appear nested inside the payments.authorisations.cancelled event effect, which flips the authorisation to CANCELLED in the same write.",
          "keyFields": [
            {
              "name": "source",
              "meaning": "MANUAL or AUTOMATIC. Decides whether the client is emailed asking them to pay again"
            },
            {
              "name": "reason",
              "meaning": "Free text, truncated to 499 characters before it goes into the Stripe intent metadata"
            },
            {
              "name": "adminId",
              "meaning": "Set on manual cancellations only"
            }
          ],
          "references": [
            {
              "field": "paymentAuthorisationId",
              "target": "money",
              "meaning": "The hold that was released. Unique, so a hold cannot be cancelled twice"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-write-only"
          ]
        },
        {
          "key": "app/ReferralPayment",
          "name": "ReferralPayment",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2925,
          "idPrefix": "refpmnt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "ReferralPaymentStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "referral",
              "type": "ClientReferral",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientReferral",
              "onDelete": null
            },
            {
              "name": "referralId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amount",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "referral",
              "target": "ClientReferral",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "referralId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientReferral",
              "targetDomain": "people"
            },
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Bill",
              "field": "referralPayment",
              "fk": false,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "ClientReferral",
              "field": "payments",
              "fk": false,
              "list": true,
              "sourceKey": "app/ClientReferral",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "ClientReferral",
              "field": "referral"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "ClientReferral",
              "field": "payments"
            }
          ],
          "usage": {
            "total": 2,
            "reads": 1,
            "writes": 1,
            "ops": {
              "findFirst": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/customers",
                "reads": 0,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/customers/_referrals/events.ts",
                "line": 45,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The referral fee owed on one paid bill, a percentage of the bill's legal fees with disbursements excluded, rounded up to the penny. The referral processor creates it when a bill is paid, skipping the case if the referrer works at the firm that owns it. Nothing in the codebase pays it out or moves it off PENDING.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "Defaults to PENDING. No code sets PAID, so every row stays PENDING"
            },
            {
              "name": "amount",
              "meaning": "Pence owed, the referral percentage of the bill's fee lines, ceilinged"
            },
            {
              "name": "billId",
              "meaning": "The paid bill it was calculated from. Unique, so one referral fee per bill"
            }
          ],
          "references": [
            {
              "field": "referralId",
              "target": "people",
              "meaning": "The ClientReferral being rewarded"
            },
            {
              "field": "billId",
              "target": "money",
              "meaning": "The bill that triggered it"
            }
          ],
          "lifecycle": "PENDING",
          "grouped": [],
          "flags": [
            "status-never-advances",
            "written-by-api-customers"
          ]
        },
        {
          "key": "app/Ledger",
          "name": "Ledger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1800,
          "idPrefix": "ldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "entries",
              "type": "LedgerEntry",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "LedgerEntry",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "CaseLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseLedger",
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployeeLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeLedger",
              "onDelete": null
            },
            {
              "name": "firmEmployeeDisbursements",
              "type": "FirmEmployeeDisbursementLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployeeDisbursementLedger",
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "CustomerLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CustomerLedger",
              "onDelete": null
            },
            {
              "name": "firmOfficeAccount",
              "type": "FirmOfficeAccountLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmOfficeAccountLedger",
              "onDelete": null
            },
            {
              "name": "nonBillable",
              "type": "NonBillableLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "NonBillableLedger",
              "onDelete": null
            },
            {
              "name": "firmExternal",
              "type": "FirmExternalLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmExternalLedger",
              "onDelete": null
            },
            {
              "name": "caseOfficeAccount",
              "type": "CaseOfficeAccountLedger",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseOfficeAccountLedger",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "entries",
              "target": "LedgerEntry",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/LedgerEntry",
              "targetDomain": "money"
            },
            {
              "field": "case",
              "target": "CaseLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseLedger",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployeeLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeLedger",
              "targetDomain": "money"
            },
            {
              "field": "firmEmployeeDisbursements",
              "target": "FirmEmployeeDisbursementLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployeeDisbursementLedger",
              "targetDomain": "money"
            },
            {
              "field": "customer",
              "target": "CustomerLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CustomerLedger",
              "targetDomain": "money"
            },
            {
              "field": "firmOfficeAccount",
              "target": "FirmOfficeAccountLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmOfficeAccountLedger",
              "targetDomain": "money"
            },
            {
              "field": "nonBillable",
              "target": "NonBillableLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/NonBillableLedger",
              "targetDomain": "money"
            },
            {
              "field": "firmExternal",
              "target": "FirmExternalLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmExternalLedger",
              "targetDomain": "money"
            },
            {
              "field": "caseOfficeAccount",
              "target": "CaseOfficeAccountLedger",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseOfficeAccountLedger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseLedger",
              "sourceDomain": "money"
            },
            {
              "model": "CaseOfficeAccountLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseOfficeAccountLedger",
              "sourceDomain": "money"
            },
            {
              "model": "CustomerLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/CustomerLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeDisbursementLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeDisbursementLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmEmployeeLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployeeLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmExternalLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmExternalLedger",
              "sourceDomain": "money"
            },
            {
              "model": "FirmOfficeAccountLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmOfficeAccountLedger",
              "sourceDomain": "money"
            },
            {
              "model": "LedgerEntry",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/LedgerEntry",
              "sourceDomain": "money"
            },
            {
              "model": "NonBillableLedger",
              "field": "ledger",
              "fk": true,
              "list": false,
              "sourceKey": "app/NonBillableLedger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 3,
            "reads": 0,
            "writes": 3,
            "ops": {
              "update": 3
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 3,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/caseEvents.ts",
                "line": 128,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/caseEvents.ts",
                "line": 133,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/cases/caseEvents.ts",
                "line": 138,
                "op": "update"
              }
            ],
            "nested": 53,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 15
              },
              {
                "area": "pkg/db",
                "n": 13
              },
              {
                "area": "api/firms",
                "n": 10
              },
              {
                "area": "admin",
                "n": 7
              },
              {
                "area": "api/test-data",
                "n": 3
              },
              {
                "area": "api/customers",
                "n": 2
              },
              {
                "area": "api/payments",
                "n": 2
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 50,
            "typeMentionsByArea": [
              {
                "area": "api/firms",
                "n": 10
              },
              {
                "area": "pkg/db",
                "n": 10
              },
              {
                "area": "admin",
                "n": 7
              },
              {
                "area": "ui/cases",
                "n": 7
              },
              {
                "area": "api/cases",
                "n": 6
              },
              {
                "area": "pkg/ui",
                "n": 5
              },
              {
                "area": "ui/_app",
                "n": 3
              },
              {
                "area": "api/customers",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One account in the double-entry books, with no owner column of its own: its balance is the sum of its entries' credits minus their debits. Instead of a polymorphic owner, eight thin 1:1 wrapper models each claim a Ledger and say whose account of which kind it is, so the foreign keys stay typed and a Case cannot end up with two CMA1s.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "Display label, rewritten right after creation to carry the case number or the person's name"
            },
            {
              "name": "entries",
              "meaning": "Every posting against this account; there is no stored balance, only the sum of these"
            },
            {
              "name": "case",
              "meaning": "Set if this is a case's CMA1 client money account"
            },
            {
              "name": "nonBillable",
              "meaning": "Set if this is a case's CMA2 non-billable account"
            },
            {
              "name": "caseOfficeAccount",
              "meaning": "Set if this is a case's office account"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [
            "CaseLedger",
            "NonBillableLedger",
            "CaseOfficeAccountLedger",
            "CustomerLedger",
            "FirmEmployeeLedger",
            "FirmEmployeeDisbursementLedger",
            "FirmOfficeAccountLedger",
            "FirmExternalLedger"
          ],
          "flags": [
            "eight-typed-wrappers",
            "written-via-nested-create"
          ]
        },
        {
          "key": "app/LedgerEntry",
          "name": "LedgerEntry",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1817,
          "idPrefix": "ldgent_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 20,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "credit",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "debit",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "timestamp",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientRefundRecovery",
              "type": "ClientRefundRecovery",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientRefundRecovery",
              "onDelete": null
            },
            {
              "name": "clientRefundRecoveryId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "clientMoneyRemittance",
              "type": "ClientMoneyRemittance",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientMoneyRemittance",
              "onDelete": null
            },
            {
              "name": "clientMoneyRemittanceId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "officeAccountTransfer",
              "type": "OfficeAccountTransfer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "OfficeAccountTransfer",
              "onDelete": null
            },
            {
              "name": "officeAccountTransferId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "BankTransfer",
              "type": "BankTransfer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BankTransfer",
              "onDelete": null
            },
            {
              "name": "bankTransferId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "billPayout",
              "type": "BillPayout",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "BillPayout",
              "onDelete": null
            },
            {
              "name": "billPayoutId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "backfillSource",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([ledgerId])",
            "@@index([backfillSource])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            },
            {
              "field": "clientRefundRecovery",
              "target": "ClientRefundRecovery",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "clientRefundRecoveryId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientRefundRecovery",
              "targetDomain": "money"
            },
            {
              "field": "clientMoneyRemittance",
              "target": "ClientMoneyRemittance",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "clientMoneyRemittanceId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientMoneyRemittance",
              "targetDomain": "money"
            },
            {
              "field": "officeAccountTransfer",
              "target": "OfficeAccountTransfer",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "officeAccountTransferId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OfficeAccountTransfer",
              "targetDomain": "money"
            },
            {
              "field": "BankTransfer",
              "target": "BankTransfer",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "bankTransferId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BankTransfer",
              "targetDomain": "money"
            },
            {
              "field": "billPayout",
              "target": "BillPayout",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "billPayoutId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/BillPayout",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "BankTransfer",
              "field": "ledgerEntries",
              "fk": false,
              "list": true,
              "sourceKey": "app/BankTransfer",
              "sourceDomain": "money"
            },
            {
              "model": "BillPayout",
              "field": "ledgerEntry",
              "fk": false,
              "list": true,
              "sourceKey": "app/BillPayout",
              "sourceDomain": "money"
            },
            {
              "model": "ClientMoneyRemittance",
              "field": "ledgerEntries",
              "fk": false,
              "list": true,
              "sourceKey": "app/ClientMoneyRemittance",
              "sourceDomain": "money"
            },
            {
              "model": "ClientRefundRecovery",
              "field": "ledgerEntries",
              "fk": false,
              "list": true,
              "sourceKey": "app/ClientRefundRecovery",
              "sourceDomain": "money"
            },
            {
              "model": "Ledger",
              "field": "entries",
              "fk": false,
              "list": true,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            },
            {
              "model": "OfficeAccountTransfer",
              "field": "ledgerEntries",
              "fk": false,
              "list": true,
              "sourceKey": "app/OfficeAccountTransfer",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 9,
            "reads": 6,
            "writes": 3,
            "ops": {
              "findMany": 3,
              "createMany": 2,
              "create": 1,
              "aggregate": 3
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 3,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/finance",
                "reads": 0,
                "writes": 1,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/bills/service/raiseFirmDisbursementBill.ts",
                "line": 152,
                "op": "createMany"
              },
              {
                "file": "packages/api/src/modules/cases/ledgerEntries/service/postManualLedgerEntries.ts",
                "line": 63,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/finance/service/reconcileOfficeAccountTransfers.ts",
                "line": 140,
                "op": "createMany"
              }
            ],
            "nested": 26,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 10
              },
              {
                "area": "api/payments",
                "n": 10
              },
              {
                "area": "admin",
                "n": 5
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 7,
            "typeMentionsByArea": [
              {
                "area": "pkg/ui",
                "n": 4
              },
              {
                "area": "api/cases",
                "n": 3
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One posting line: a credit or a debit in pence against a single Ledger, with a description and the timestamp finance sorts and reconciles by. Exactly one of credit and debit is set on a row.",
          "keyFields": [
            {
              "name": "description",
              "meaning": "The line finance reads in the ledger table, e.g. Bill for case #1234 (Fees)"
            },
            {
              "name": "credit",
              "meaning": "Money into this account, in pence. Null on a debit row"
            },
            {
              "name": "debit",
              "meaning": "Money out of this account, in pence. Null on a credit row"
            },
            {
              "name": "timestamp",
              "meaning": "The accounting date, set by the posting service and sometimes nudged 1ms to force leg order"
            },
            {
              "name": "ledgerId",
              "meaning": "The account this line posts to"
            },
            {
              "name": "backfillSource",
              "meaning": "Provenance for rows written by a migration, shaped v{n}/{kind}/{source_id}. Null on live postings"
            }
          ],
          "references": [
            {
              "field": "clientMoneyRemittanceId",
              "target": "money",
              "meaning": "The client payment remittance that posted this pair"
            },
            {
              "field": "clientRefundRecoveryId",
              "target": "money",
              "meaning": "The refund recovery that posted this pair"
            },
            {
              "field": "billPayoutId",
              "target": "money",
              "meaning": "The bill payout that posted the fee and disbursement legs"
            },
            {
              "field": "officeAccountTransferId",
              "target": "money",
              "meaning": "The office account transfer, at raise time and again at reconciliation"
            },
            {
              "field": "bankTransferId",
              "target": "money",
              "meaning": "The bank transfer that moved the money in or out"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "posted-in-pairs",
            "backfilled-rows"
          ]
        },
        {
          "key": "app/CaseLedger",
          "name": "CaseLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1857,
          "idPrefix": "csldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Ledger",
              "field": "case",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "caseLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 16,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 7
              },
              {
                "area": "api/payments",
                "n": 3
              },
              {
                "area": "api/finance",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/test-data",
                "n": 1
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 6,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "api/payments",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The 1:1 join that gives a Case its client money account 1 (CMA1), the billable funds held for that matter. Admin labels it CMA1 in the manual posting form.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the CMA1 postings; unique, so one case ledger per Ledger"
            }
          ],
          "references": [
            {
              "field": "case",
              "target": "cases",
              "meaning": "The matter whose client money this is"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "created-with-the-case"
          ]
        },
        {
          "key": "app/CaseOfficeAccountLedger",
          "name": "CaseOfficeAccountLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1867,
          "idPrefix": "coaldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "officeAccountLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Ledger",
              "field": "caseOfficeAccount",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "officeAccountLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 4,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The case-level office account, where the firm's disbursement spend on a matter is parked between the two legs of the posting flow. It is allowed to sit in deficit until the office account transfer is reconciled.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the office account postings for this case"
            }
          ],
          "references": [
            {
              "field": "case",
              "target": "cases",
              "meaning": "The matter whose office account spend this tracks"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "added-2026",
            "backfilled-per-case"
          ]
        },
        {
          "key": "app/NonBillableLedger",
          "name": "NonBillableLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1847,
          "idPrefix": "nbldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "nonBillableLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Ledger",
              "field": "nonBillable",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "nonBillableLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 22,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 9
              },
              {
                "area": "admin",
                "n": 6
              },
              {
                "area": "api/payments",
                "n": 5
              },
              {
                "area": "api/test-data",
                "n": 1
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The same case's client money account 2 (CMA2): funds held for the matter that are not yet billable. Created alongside CaseLedger when the case is created.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the CMA2 postings"
            }
          ],
          "references": [
            {
              "field": "case",
              "target": "cases",
              "meaning": "The matter whose non-billable funds these are"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "cma2"
          ]
        },
        {
          "key": "app/CustomerLedger",
          "name": "CustomerLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1897,
          "idPrefix": "cstldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Customer",
              "field": "customerLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            },
            {
              "model": "Ledger",
              "field": "customer",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "customerLedger"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "update": 1
            },
            "byArea": [
              {
                "area": "api/customers",
                "reads": 0,
                "writes": 1,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/customers/service/createCustomer.ts",
                "line": 143,
                "op": "update"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "pkg/db",
                "n": 4
              },
              {
                "area": "api/customers",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The paying client's own account, one per Customer. It carries the mirror side of every case payment and refund: debited when their money lands on a case, credited when a refund goes back.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the client's postings; its name is resynced when the person is renamed"
            }
          ],
          "references": [
            {
              "field": "customer",
              "target": "people",
              "meaning": "The client hat that pays and gets refunded"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FirmEmployeeLedger",
          "name": "FirmEmployeeLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1877,
          "idPrefix": "frmempldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployee",
              "field": "firmEmployeeLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Ledger",
              "field": "firmEmployee",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployeeLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/firms",
                "n": 4
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ],
            "typeMentions": 4,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A lawyer's fees account, named \"<name> - Fees Ledger\" when the firm employee is created. It is credited with fees plus VAT when a bill is paid out.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the fee credits earned by this employee"
            }
          ],
          "references": [
            {
              "field": "firmEmployee",
              "target": "firms",
              "meaning": "The lawyer or firm staff member earning the fees"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FirmEmployeeDisbursementLedger",
          "name": "FirmEmployeeDisbursementLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1887,
          "idPrefix": "frmempdisldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployee",
              "field": "firmEmployeeDisbursementLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "Ledger",
              "field": "firmEmployeeDisbursements",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployeeDisbursementLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/firms",
                "n": 4
              },
              {
                "area": "pkg/db",
                "n": 2
              }
            ],
            "typeMentions": 4,
            "typeMentionsByArea": [
              {
                "area": "api/cases",
                "n": 4
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The disbursements half of the same lawyer's books, kept separate from fees so recoverable outlay and earned fees never mix. Credited with the disbursement portion of a bill payout.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the disbursement credits for this employee"
            }
          ],
          "references": [
            {
              "field": "firmEmployee",
              "target": "firms",
              "meaning": "The lawyer or firm staff member who incurred the disbursements"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/FirmOfficeAccountLedger",
          "name": "FirmOfficeAccountLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1907,
          "idPrefix": "frmoaldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Firm",
              "field": "officeAccountLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "Ledger",
              "field": "firmOfficeAccount",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "officeAccountLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": true,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The firm's own office account across all its matters, created with the Firm and required on it. Credited when an office account transfer is reconciled and debited when the firm pays a third party out of the office account.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the firm's office account postings"
            }
          ],
          "references": [
            {
              "field": "firm",
              "target": "firms",
              "meaning": "The firm whose office account this is"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "usage-map-blind-spot"
          ]
        },
        {
          "key": "app/FirmExternalLedger",
          "name": "FirmExternalLedger",
          "table": null,
          "datastore": "app",
          "domain": "money",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1917,
          "idPrefix": "frmextldg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "ledger",
              "type": "Ledger",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Ledger",
              "onDelete": null
            },
            {
              "name": "ledgerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "ledger",
              "target": "Ledger",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ledgerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Ledger",
              "targetDomain": "money"
            }
          ],
          "relationsIn": [
            {
              "model": "Firm",
              "field": "firmExternalLedger",
              "fk": true,
              "list": false,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "Ledger",
              "field": "firmExternal",
              "fk": false,
              "list": false,
              "sourceKey": "app/Ledger",
              "sourceDomain": "money"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "firmExternalLedger"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 7,
            "nestedByArea": [
              {
                "area": "api/payments",
                "n": 5
              },
              {
                "area": "api/firms",
                "n": 1
              },
              {
                "area": "pkg/db",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The firm's contra account for money leaving the accounts Lawhive tracks. Every bank transfer out of CMA2 or the firm office account credits it against the debit on the account the money left.",
          "keyFields": [
            {
              "name": "ledgerId",
              "meaning": "The Ledger holding the outbound contra postings"
            }
          ],
          "references": [
            {
              "field": "firm",
              "target": "firms",
              "meaning": "The firm whose outbound money this balances"
            },
            {
              "field": "ledgerId",
              "target": "money",
              "meaning": "The account the entries post to"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        }
      ]
    },
    {
      "id": "chat",
      "order": 10,
      "groups": [],
      "name": "Chat: client and lawyer messaging",
      "tagline": "The Sendbird group channel on a case, mirrored into four Postgres tables",
      "whatItIs": "Chat is the message thread on a case, the one the client and the lawyer both see. The actual chat runs on Sendbird: the browser talks to the Sendbird UIKit directly, and every channel, membership and message body lives in Sendbird's app. What v2 keeps in Postgres is a mirror. A Channel row holds the sendbirdChannelId, a CaseChannel row pins that channel to a case, ChannelMember records who is in it, and a Message row lands for every message Sendbird tells us about. Through the messages module you can get a case's primary channelId, mint a Sendbird session token for the current person, send a text message as yourself, freeze a channel, drop an admin notice into a case, and read the history back. Reads that render the thread go straight to the Sendbird API (getInfinite hits sendbird.message.listMessages), so the mirror is not what the user sees. The mirror is what other services read: getById and getAllForCase are inter-service procedures over the Message table.",
      "howItConnects": "A channel only exists because of a case: CaseChannel is the join, and case parties drive membership, so adding or removing a party in Cases pushes an invite or a leave into Sendbird. Every stored message credits a Person as its author, or nobody at all when Sendbird sent it as an admin message. Inbound email that Mailgun relays into a case is turned into an ordinary chat message with customType email, so Post and Email traffic can surface in the same thread. On each stored message the module emits app/case/message.received, which Case quality turns into a communication span and Lawrence uses to refresh proactive case context. Case quality also listens for messaging-service/message.created from the v3 messaging service, so both the v2 Sendbird path and its v3 replacement feed the same downstream.",
      "lifecycle": null,
      "flows": [
        {
          "id": "chat-send-and-mirror",
          "title": "Sending a message and mirroring it back",
          "mermaid": "flowchart TD\n  UI[Sendbird UIKit in platform app] -->|sends directly| SB[Sendbird group channel]\n  TRPC[messages.sendMessage] --> GOC[getOrCreateChannelForCase]\n  GOC --> SB\n  SB -->|message_send webhook| WH[api/webhook/sendbird]\n  WH --> HMS[handleSendbirdMessageSent]\n  HMS --> MSG[Message row created]\n  HMS --> KNOCK[Knock notify other parties]\n  MSG --> EV[app/case/message.received]\n  MSG --> ACT[Channel.lastActivity and ChannelMember.lastActivity]",
          "caption": "Writes go to Sendbird first. The Message row exists only because the webhook came back."
        },
        {
          "id": "chat-primary-channel",
          "title": "How a case gets its primary channel",
          "mermaid": "flowchart TD\n  START[getOrCreateChannelForCase caseId] --> Q{CaseChannel with isPrimary?}\n  Q -->|yes| ENS[Check the Sendbird channel still exists and has every party]\n  Q -->|no| LOOK{Sendbird channel for caseId?}\n  LOOK -->|found| ATTACH[Upsert Channel, create CaseChannel isPrimary true]\n  LOOK -->|none| NEW[Create Sendbird channel caseId_primary, then Channel plus CaseChannel]\n  ENS --> CH[Channel]\n  ATTACH --> CH\n  NEW --> CH",
          "caption": "Only one channel per case is marked isPrimary, and every read path filters on it."
        },
        {
          "id": "chat-party-removal",
          "title": "Removing a party from the channel",
          "mermaid": "flowchart TD\n  RM[removePartyFromCase] -->|inngest.send| EV[app/case/party.sendbirdRemoval.requested]\n  EV --> FN[handleCasePartySendbirdRemoval, throttled 5/s]\n  FN --> LEAVE[sendbird gcLeaveChannel]\n  FN -->|customer only| ADMIN[Admin message: X was removed from the case]\n  LEAVE -->|leave webhook| CM[ChannelMember isRemoved true, removedAt set]",
          "caption": "Removal is queued through Inngest to dodge Sendbird rate limits, and the ChannelMember flag is only set once the leave webhook comes back."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "Live, and still written to today. handleSendbirdMessageSent creates a Message row on every send, and the join and leave handlers upsert ChannelMember, all driven by the webhook at apps/platform/src/pages/api/webhook/sendbird.ts. Nothing here is dormant."
        },
        {
          "kind": "duplication",
          "body": "v3 has its own messaging service with its own messaging-db. Case quality subscribes to both app/case/message.received and messaging-service/message.created, so the two systems are running side by side and v2's tables are not the long term home."
        },
        {
          "kind": "legacy",
          "body": "The schema is littered with fields that were mirrored from Sendbird and then abandoned: Message has tags, flagCount, reactions, reactionsCount, childrenNumber and channelSegment commented out, and ChannelMember has readToSegment commented out. The live ones left over from the same effort are unused too. Nothing writes Message.editedAt, Message.metadata, Channel.metadata or ChannelMember.isMuted, and no code sets parentId, so message threading exists in the schema and not in the product."
        },
        {
          "kind": "status",
          "body": "Sendbird is the source of truth for message content. The admin and inter-service getInfinite procedures and getChannelForCase both call sendbird.message.listMessages and parse the response; only getById and getAllForCase read the Message table, and both are server side procedures for other services rather than the UI."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/messages",
          "kind": "api-module",
          "label": "messages",
          "path": "packages/api/src/modules/messages",
          "files": 36,
          "prismaSites": 31,
          "procedures": {
            "queries": 6,
            "mutations": 1
          }
        },
        {
          "id": "ui/messaging",
          "kind": "ui-feature",
          "label": "messaging",
          "path": "apps/platform/src/features/messaging",
          "files": 11,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/case/message.received",
            "namespace": "app",
            "area": "api/messages",
            "file": "packages/api/src/modules/messages/service/emitMessageReceivedInngestEvent.ts",
            "line": 21,
            "live": "active"
          }
        ],
        "consumes": [],
        "owns": [
          {
            "name": "app/case/message.received",
            "namespace": "app",
            "area": "api/messages",
            "file": "packages/api/src/modules/messages/service/emitMessageReceivedInngestEvent.ts",
            "line": 21,
            "live": "active",
            "via": "rule",
            "emitters": [
              "chat"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "app/case/party.sendbirdRemoval.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/service/removePartyFromCase.ts",
            "line": 39,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "cases"
            ]
          },
          {
            "name": "messaging-service/message.created",
            "namespace": "messaging-service",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "quality"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "ChannelMemberType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 1059,
          "doc": null,
          "values": [
            {
              "name": "member",
              "doc": null
            }
          ],
          "usedBy": [
            "ChannelMember"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "MessageType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 998,
          "doc": null,
          "values": [
            {
              "name": "admin",
              "doc": null
            },
            {
              "name": "text",
              "doc": null
            },
            {
              "name": "file",
              "doc": null
            },
            {
              "name": "unknown",
              "doc": null
            }
          ],
          "usedBy": [
            "Message"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 22,
        "writes": 11
      },
      "models": [
        {
          "key": "app/Channel",
          "name": "Channel",
          "table": null,
          "datastore": "app",
          "domain": "chat",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1005,
          "idPrefix": "chn_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sendbirdChannelId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "messages",
              "type": "Message",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Message",
              "onDelete": null
            },
            {
              "name": "members",
              "type": "ChannelMember",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ChannelMember",
              "onDelete": null
            },
            {
              "name": "cases",
              "type": "CaseChannel",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseChannel",
              "onDelete": null
            },
            {
              "name": "lastActivity",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "metadata",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "displayName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([sendbirdChannelId])"
          ],
          "looseRefs": [
            "sendbirdChannelId"
          ],
          "relationsOut": [
            {
              "field": "messages",
              "target": "Message",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Message",
              "targetDomain": "chat"
            },
            {
              "field": "members",
              "target": "ChannelMember",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ChannelMember",
              "targetDomain": "chat"
            },
            {
              "field": "cases",
              "target": "CaseChannel",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseChannel",
              "targetDomain": "chat"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseChannel",
              "field": "channel",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseChannel",
              "sourceDomain": "chat"
            },
            {
              "model": "ChannelMember",
              "field": "channel",
              "fk": true,
              "list": false,
              "sourceKey": "app/ChannelMember",
              "sourceDomain": "chat"
            },
            {
              "model": "Message",
              "field": "channel",
              "fk": true,
              "list": false,
              "sourceKey": "app/Message",
              "sourceDomain": "chat"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 12,
            "reads": 8,
            "writes": 4,
            "ops": {
              "findUniqueOrThrow": 3,
              "findFirst": 3,
              "findFirstOrThrow": 2,
              "update": 2,
              "upsert": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/messages",
                "reads": 6,
                "writes": 4,
                "domain": "chat",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/persons",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/messages/service/getOrCreateChannel.ts",
                "line": 89,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/messages/service/getOrCreateChannel.ts",
                "line": 158,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/messages/service/getOrCreateChannel.ts",
                "line": 205,
                "op": "create"
              }
            ],
            "nested": 25,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 11
              },
              {
                "area": "api/messages",
                "n": 7
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "api/persons",
                "n": 2
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 2
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 31,
            "typeMentionsByArea": [
              {
                "area": "ui/messaging",
                "n": 13
              },
              {
                "area": "api/messages",
                "n": 13
              },
              {
                "area": "api/_integrations",
                "n": 2
              },
              {
                "area": "api/cases",
                "n": 2
              },
              {
                "area": "ui/cases",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One Sendbird group channel, as v2 knows it. The row is a local handle: the messages, the freeze state and the read receipts all live in Sendbird.",
          "keyFields": [
            {
              "name": "sendbirdChannelId",
              "meaning": "The Sendbird channel_url, unique. Every lookup from a webhook comes in through this."
            },
            {
              "name": "displayName",
              "meaning": "Copied from Sendbird, set to Case <humanReadableId> when we create the channel."
            },
            {
              "name": "lastActivity",
              "meaning": "Stamped by updateChatActivity on every sent, edited or deleted message. Also bumps the case's last activity."
            },
            {
              "name": "metadata",
              "meaning": "Free JSON. Nothing in the code writes or reads it."
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "sendbird-mirror"
          ]
        },
        {
          "key": "app/CaseChannel",
          "name": "CaseChannel",
          "table": null,
          "datastore": "app",
          "domain": "chat",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1022,
          "idPrefix": "caschn_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "channel",
              "type": "Channel",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Channel",
              "onDelete": null
            },
            {
              "name": "channelId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isPrimary",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([channelId, caseId])",
            "@@index([channelId])",
            "@@index([caseId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "channel",
              "target": "Channel",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "channelId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Channel",
              "targetDomain": "chat"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "channels",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Channel",
              "field": "cases",
              "fk": false,
              "list": true,
              "sourceKey": "app/Channel",
              "sourceDomain": "chat"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "channels"
            }
          ],
          "usage": {
            "total": 10,
            "reads": 10,
            "writes": 0,
            "ops": {
              "findFirst": 5,
              "findFirstOrThrow": 5
            },
            "byArea": [
              {
                "area": "api/messages",
                "reads": 7,
                "writes": 0,
                "domain": "chat",
                "kind": "api-module"
              },
              {
                "area": "api/raw-asset-retrieval",
                "reads": 2,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [],
            "nested": 17,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 10
              },
              {
                "area": "api/persons",
                "n": 2
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/instructions",
                "n": 1
              },
              {
                "area": "api/messages",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "Puts a channel on a case. One row per case per channel, and the row flagged isPrimary is the case's Messages tab.",
          "keyFields": [
            {
              "name": "isPrimary",
              "meaning": "The main case thread. Every read path filters on isPrimary true; only one row per case ever gets it."
            }
          ],
          "references": [
            {
              "field": "channelId",
              "target": "chat",
              "meaning": "the Sendbird-backed channel"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case whose thread this is"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "join-table"
          ]
        },
        {
          "key": "app/ChannelMember",
          "name": "ChannelMember",
          "table": null,
          "datastore": "app",
          "domain": "chat",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 1038,
          "idPrefix": "chnmb_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "ChannelMemberType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isMuted",
              "type": "Boolean",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "lastActivity",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "channel",
              "type": "Channel",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Channel",
              "onDelete": null
            },
            {
              "name": "channelId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "person",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "personId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isRemoved",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "removedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([personId, channelId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "channel",
              "target": "Channel",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "channelId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Channel",
              "targetDomain": "chat"
            },
            {
              "field": "person",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "personId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Channel",
              "field": "members",
              "fk": false,
              "list": true,
              "sourceKey": "app/Channel",
              "sourceDomain": "chat"
            },
            {
              "model": "Person",
              "field": "channelMembers",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "person"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "channelMembers"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 0,
            "writes": 4,
            "ops": {
              "upsert": 4
            },
            "byArea": [
              {
                "area": "api/messages",
                "reads": 0,
                "writes": 3,
                "domain": "chat",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/sendbird/members.ts",
                "line": 39,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/messages/sendbird/handleChannelJoined.ts",
                "line": 43,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/messages/sendbird/handleChannelLeft.ts",
                "line": 11,
                "op": "upsert"
              }
            ],
            "nested": 7,
            "nestedByArea": [
              {
                "area": "api/messages",
                "n": 5
              },
              {
                "area": "api/raw-asset-retrieval",
                "n": 2
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A person's seat in a channel, mirrored from Sendbird's member list. Sendbird decides who can actually post; this row is the local copy.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "ChannelMemberType, which has exactly one value: member. No roles were ever added."
            },
            {
              "name": "isRemoved",
              "meaning": "Set true by the Sendbird leave webhook, back to false on rejoin. Written but never read back."
            },
            {
              "name": "removedAt",
              "meaning": "When the leave webhook arrived."
            },
            {
              "name": "lastActivity",
              "meaning": "Bumped when this person sends a message. The upsert also backfills members missed during lawyer reassignment."
            }
          ],
          "references": [
            {
              "field": "channelId",
              "target": "chat",
              "meaning": "the channel"
            },
            {
              "field": "personId",
              "target": "people",
              "meaning": "the member, also the Sendbird user_id"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "sendbird-mirror",
            "write-only-flags"
          ]
        },
        {
          "key": "app/Message",
          "name": "Message",
          "table": null,
          "datastore": "app",
          "domain": "chat",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 962,
          "idPrefix": "msg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "MessageType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "data",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "editedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sendbirdMessageId",
              "type": "BigInt",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "metadata",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "channel",
              "type": "Channel",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Channel",
              "onDelete": null
            },
            {
              "name": "channelId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "author",
              "type": "Person",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "authorId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "parent",
              "type": "Message",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Message",
              "onDelete": null
            },
            {
              "name": "parentId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "children",
              "type": "Message",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Message",
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([sendbirdMessageId])",
            "@@index([channelId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "channel",
              "target": "Channel",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "channelId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Channel",
              "targetDomain": "chat"
            },
            {
              "field": "author",
              "target": "Person",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "authorId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "parent",
              "target": "Message",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "parentId"
              ],
              "references": [
                "id"
              ],
              "relationName": "Parent",
              "onDelete": null,
              "targetKey": "app/Message",
              "targetDomain": "chat"
            },
            {
              "field": "children",
              "target": "Message",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": "Parent",
              "onDelete": null,
              "targetKey": "app/Message",
              "targetDomain": "chat"
            }
          ],
          "relationsIn": [
            {
              "model": "Channel",
              "field": "messages",
              "fk": false,
              "list": true,
              "sourceKey": "app/Channel",
              "sourceDomain": "chat"
            },
            {
              "model": "Message",
              "field": "parent",
              "fk": true,
              "list": false,
              "sourceKey": "app/Message",
              "sourceDomain": "chat"
            },
            {
              "model": "Message",
              "field": "children",
              "fk": false,
              "list": true,
              "sourceKey": "app/Message",
              "sourceDomain": "chat"
            },
            {
              "model": "Person",
              "field": "messages",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "author"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "messages"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 4,
            "writes": 3,
            "ops": {
              "findMany": 1,
              "findFirst": 2,
              "update": 2,
              "create": 1,
              "findUniqueOrThrow": 1
            },
            "byArea": [
              {
                "area": "api/messages",
                "reads": 4,
                "writes": 3,
                "domain": "chat",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/messages/sendbird/handleMessageDeleted.ts",
                "line": 37,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/messages/sendbird/handleMessageSent.ts",
                "line": 117,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/messages/sendbird/handleMessageUpdated.ts",
                "line": 41,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 154,
            "typeMentionsByArea": [
              {
                "area": "ui/ai",
                "n": 33
              },
              {
                "area": "api/messages",
                "n": 16
              },
              {
                "area": "admin",
                "n": 15
              },
              {
                "area": "ui/cases",
                "n": 13
              },
              {
                "area": "service/case-quality",
                "n": 11
              },
              {
                "area": "ui/_app",
                "n": 9
              },
              {
                "area": "api/officeAddin",
                "n": 8
              },
              {
                "area": "ui/workflows",
                "n": 7
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One message on a case thread, written after Sendbird has already delivered it. The chat UI never reads these rows; other services do.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "MessageType: text from a person, admin from the system, file, or unknown. file and unknown are dropped before the row is written."
            },
            {
              "name": "data",
              "meaning": "JSON body. For text it is { type, message, userId }; for admin it carries an excludedPersonId so the sender is not notified."
            },
            {
              "name": "sendbirdMessageId",
              "meaning": "The Sendbird message id, indexed. The only way the update and delete webhooks find the row again."
            },
            {
              "name": "isDeleted",
              "meaning": "Soft delete, set by handleSendbirdMessageDeleted. Rows are never removed."
            },
            {
              "name": "editedAt",
              "meaning": "Never written. The update webhook rewrites data and leaves this null."
            }
          ],
          "references": [
            {
              "field": "channelId",
              "target": "chat",
              "meaning": "the channel it was sent in"
            },
            {
              "field": "authorId",
              "target": "people",
              "meaning": "the sender, null for admin messages Sendbird generated"
            },
            {
              "field": "parentId",
              "target": "chat",
              "meaning": "self-relation for threaded replies. Nothing sets it."
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "sendbird-mirror",
            "soft-delete",
            "unused-threading"
          ]
        }
      ]
    },
    {
      "id": "email",
      "order": 11,
      "groups": [],
      "name": "Email: the Outlook add-in",
      "tagline": "Emails a lawyer files from Outlook, kept as .eml files on a case",
      "whatItIs": "This is the record of emails a lawyer has filed onto a case from Outlook. The add-in is a small Next.js page (apps/platform/src/app/(outlook)/outlook-addin/file-email) that Outlook loads in an iframe; packages/outlook-addin itself only holds the manifest template and the script that fills it in. Open an email in Outlook, hit the add-in, and getEmailDetails pulls the whole conversation from Microsoft Graph, ranks the cases the email probably belongs to, and shows you which messages and attachments are already filed. You tick the ones you want, pick a case, optionally a case folder, and choose whether the filing date is today or the email's own date. The import then runs in Inngest: the message MIME is written to S3 as an .eml, each attachment is uploaded separately, both become CaseFiles, and a Communication row records that this Outlook message is now on this case. The add-in also tags the message with a \"Filed to Lawhive\" category in Outlook so the lawyer can see it from their inbox.",
      "howItConnects": "Everything filed here lands in documents: registerUploadComplete creates the CaseFile and File rows, with source externalEmail for the message and externalEmailAttachment for its attachments, visibility solicitors, so filed email is subject to the same preview generation, AI ingestion and folder rules as any other case document. Communication and CommunicationThread hang off a Case and add only the extra fact that a file came from a specific Outlook message in a specific conversation. Voice is a separate domain with its own Call model for Twilio calls, despite the phoneCall value sitting in CommunicationType here. Deletion is driven from documents: the file deleted event soft-deletes the File and hard-deletes any Communication pointing at it. Downstream, AI reads these rows through the proactive case-data endpoint, and case quality raises MAIL_UPLOADED alerts from app/case/mail.uploaded in v2 and from the v3 email service's email-service/message.uploaded.",
      "lifecycle": "notAttempted → inProgress → complete",
      "flows": [
        {
          "id": "filing",
          "title": "Filing an email from Outlook",
          "mermaid": "flowchart TD\n  A[Add-in in Outlook] --> B[getEmailDetails via Graph]\n  B --> C[likely cases ranked]\n  C --> D[requestOutlookEmailImport]\n  D --> E[CommunicationThread upsert]\n  D --> F[Redis in-progress keys]\n  D --> G[emailImport.requested per email]\n  G --> H[MIME to S3 as .eml]\n  H --> I[registerUploadComplete: CaseFile + File]\n  I --> J[Communication upsert]\n  G --> K[attachments to S3]\n  K --> L[attachmentFiles connect]\n  J --> M[Filed to Lawhive category in Outlook]",
          "caption": "The mutation validates that every selected message shares one Graph conversationId, upserts the thread, marks each item in Vercel KV with a 30 minute TTL, then fans out one app/outlookIntegration/emailImport.requested event per email. The Inngest function does the S3 work and writes the Communication in a finalise step."
        },
        {
          "id": "thread",
          "title": "Where the thread actually comes from",
          "mermaid": "flowchart LR\n  G[Graph: conversationId eq X] --> S[sort by conversationIndex]\n  S --> U[thread list in add-in]\n  U --> P[import status per message]\n  P --> C[Communication rows by externalId]\n  C --> T[CommunicationThread per case]",
          "caption": "The list of messages in a thread is read live from Graph, not from the database. CommunicationThread only groups the messages that were filed, one row per case and conversationId, and getImportStatusForOutlookEmail uses it to report how many emails and attachments of that thread are already on the case."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "CommunicationType has a phoneCall value that nothing ever writes. Both write sites hardcode type: \"email\", and calls live in the voice domain on Call with its Twilio sid and recording. The value is left over from an intent to keep calls and emails in one timeline."
        },
        {
          "kind": "status",
          "body": "The import status a lawyer sees is not stored on the row. complete means a Communication with that externalId exists, inProgress means a Vercel KV key for the Outlook item id is still alive, and anything else is notAttempted. The KV keys expire after 30 minutes, so a stuck import silently falls back to notAttempted."
        },
        {
          "kind": "status",
          "body": "No case page in the platform app reads these rows. The only readers are the add-in's own import status check and the proactive Lawrence case-data endpoint, which selects communications with their linkedFile summary and the bare communicationThreads list for backtesting."
        },
        {
          "kind": "status",
          "body": "Communication and CommunicationThread share the comm_ id prefix, so an id alone does not tell you which of the two tables it came from. Both generate it in the database with concat('comm_', nanoid())."
        },
        {
          "kind": "status",
          "body": "Communication is deleted, not soft-deleted, when its file goes. The file deleted event in api/modules/cases/files/fileEvents.ts sets File.isDeleted then runs communication.deleteMany on linkedFileId in the same transaction, which also drops the row's place in the thread."
        },
        {
          "kind": "companion",
          "body": "v3 has its own email service, outside this repo, that files mail against a Matter and emits email-service/message.uploaded with a filingSource of OUTLOOK_ADDIN or AUTO_FILING_ONE_LIKELY_MATTER. Nothing in this repo emits that event; case-quality only consumes it, alongside v2's app/case/mail.uploaded. The v3 side has auto filing when exactly one matter matches, which v2 does not: here the lawyer always picks the case from a ranked list."
        },
        {
          "kind": "status",
          "body": "Graph is called with application credentials against /users/{userPrincipalName}, not a delegated token. The add-in sends an Office.js token in x-lawhive-outlook-token, and outlookProcedure matches its preferred_username to a Person emailAddress, so a lawyer who changes their email in Lawhive loses the add-in."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/officeAddin",
          "kind": "api-module",
          "label": "officeAddin",
          "path": "packages/api/src/modules/officeAddin",
          "files": 15,
          "prismaSites": 8,
          "procedures": {
            "queries": 1,
            "mutations": 1
          }
        },
        {
          "id": "pkg/outlook-addin",
          "kind": "package",
          "label": "outlook-addin",
          "path": "packages/outlook-addin",
          "files": 5,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/outlookIntegration/emailImport.requested",
            "namespace": "app",
            "area": "api/officeAddin",
            "file": "packages/api/src/modules/officeAddin/procedures/requestOutlookEmailImport.handler.ts",
            "line": 105,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/outlookIntegration/emailImport.requested",
            "namespace": "app",
            "area": "api/officeAddin",
            "file": "packages/api/src/modules/officeAddin/service/outlookImportOrchestrator.ts",
            "line": 15,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/outlookIntegration/emailImport.requested",
            "namespace": "app",
            "area": "api/officeAddin",
            "file": "packages/api/src/modules/officeAddin/procedures/requestOutlookEmailImport.handler.ts",
            "line": 105,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "email"
            ],
            "consumers": [
              "email"
            ]
          },
          {
            "name": "email-service/message.uploaded",
            "namespace": "email-service",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "quality"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "CommunicationType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3008,
          "doc": null,
          "values": [
            {
              "name": "phoneCall",
              "doc": null
            },
            {
              "name": "email",
              "doc": null
            }
          ],
          "usedBy": [
            "Communication"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 2,
        "writes": 4
      },
      "models": [
        {
          "key": "app/Communication",
          "name": "Communication",
          "table": null,
          "datastore": "app",
          "domain": "email",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2980,
          "idPrefix": "comm_",
          "idPrefixShared": [
            "app/CommunicationThread"
          ],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "externalId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "timestamp",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "CommunicationType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "subject",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "communicationThread",
              "type": "CommunicationThread",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CommunicationThread",
              "onDelete": null
            },
            {
              "name": "communicationThreadId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "linkedFile",
              "type": "File",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "File",
              "onDelete": null
            },
            {
              "name": "linkedFileId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "attachmentFiles",
              "type": "File",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "File",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([externalId, communicationThreadId])",
            "@@index([caseId])",
            "@@index([communicationThreadId])"
          ],
          "looseRefs": [
            "externalId"
          ],
          "relationsOut": [
            {
              "field": "communicationThread",
              "target": "CommunicationThread",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "communicationThreadId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CommunicationThread",
              "targetDomain": "email"
            },
            {
              "field": "linkedFile",
              "target": "File",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "linkedFileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/File",
              "targetDomain": "documents"
            },
            {
              "field": "attachmentFiles",
              "target": "File",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/File",
              "targetDomain": "documents"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "communications",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CommunicationThread",
              "field": "communications",
              "fk": false,
              "list": true,
              "sourceKey": "app/CommunicationThread",
              "sourceDomain": "email"
            },
            {
              "model": "File",
              "field": "communication",
              "fk": false,
              "list": false,
              "sourceKey": "app/File",
              "sourceDomain": "documents"
            },
            {
              "model": "File",
              "field": "attachmentCommunication",
              "fk": true,
              "list": false,
              "sourceKey": "app/File",
              "sourceDomain": "documents"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "documents",
              "model": "File",
              "field": "linkedFile"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "File",
              "field": "attachmentFiles"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "communications"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "File",
              "field": "communication"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "File",
              "field": "attachmentCommunication"
            }
          ],
          "usage": {
            "total": 4,
            "reads": 1,
            "writes": 3,
            "ops": {
              "deleteMany": 1,
              "findMany": 1,
              "upsert": 1,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/officeAddin",
                "reads": 1,
                "writes": 2,
                "domain": "email",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/files/fileEvents.ts",
                "line": 49,
                "op": "deleteMany"
              },
              {
                "file": "packages/api/src/modules/officeAddin/service/outlookImportOrchestrator.ts",
                "line": 75,
                "op": "upsert"
              },
              {
                "file": "packages/api/src/modules/officeAddin/service/outlookImportOrchestrator.ts",
                "line": 132,
                "op": "update"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/officeAddin",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "pkg/db",
                "n": 1
              },
              {
                "area": "service/case-quality",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One email that a lawyer filed from Outlook onto a case, pointing at the .eml stored for it and at any attachments filed with it. The type enum also allows phoneCall, but nothing writes that.",
          "keyFields": [
            {
              "name": "externalId",
              "meaning": "the Graph immutable message id, unique table-wide, so one Outlook email can be filed to only one case"
            },
            {
              "name": "type",
              "meaning": "email or phoneCall; every write site hardcodes email"
            },
            {
              "name": "subject",
              "meaning": "the Outlook subject, or \"No subject\"; also used as the file's displayName"
            },
            {
              "name": "timestamp",
              "meaning": "the message's Graph createdDateTime, the date the add-in files under if you pick emailDate"
            },
            {
              "name": "createdAt",
              "meaning": "when the import ran, which is usually later than timestamp"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case the lawyer filed the email to"
            },
            {
              "field": "linkedFileId",
              "target": "documents",
              "meaning": "unique one-to-one link to the File holding the .eml MIME dump in S3"
            },
            {
              "field": "attachmentFiles",
              "target": "documents",
              "meaning": "Files for the attachments filed with this message, connected one by one as each upload finishes"
            },
            {
              "field": "communicationThreadId",
              "target": "email",
              "meaning": "the Outlook conversation this message belongs to; optional in the schema, always set by the importer"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "shared-id-prefix"
          ]
        },
        {
          "key": "app/CommunicationThread",
          "name": "CommunicationThread",
          "table": null,
          "datastore": "app",
          "domain": "email",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3013,
          "idPrefix": "comm_",
          "idPrefixShared": [
            "app/Communication"
          ],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "externalId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "communications",
              "type": "Communication",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Communication",
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([caseId, externalId])",
            "@@index([externalId])"
          ],
          "looseRefs": [
            "externalId"
          ],
          "relationsOut": [
            {
              "field": "communications",
              "target": "Communication",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Communication",
              "targetDomain": "email"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "communicationThreads",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Communication",
              "field": "communicationThread",
              "fk": true,
              "list": false,
              "sourceKey": "app/Communication",
              "sourceDomain": "email"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "communicationThreads"
            }
          ],
          "usage": {
            "total": 2,
            "reads": 1,
            "writes": 1,
            "ops": {
              "upsert": 1,
              "findMany": 1
            },
            "byArea": [
              {
                "area": "api/officeAddin",
                "reads": 1,
                "writes": 1,
                "domain": "email",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/officeAddin/procedures/requestOutlookEmailImport.handler.ts",
                "line": 79,
                "op": "upsert"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/officeAddin",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One Outlook conversation as far as a single case is concerned. It is upserted the moment a lawyer files the first message of a thread, and it exists to group later messages from the same conversation under the same case.",
          "keyFields": [
            {
              "name": "externalId",
              "meaning": "the Graph conversationId; unique per case, not globally, so the same thread can be filed to two cases"
            },
            {
              "name": "id",
              "meaning": "comm_ prefixed, the same prefix Communication uses"
            },
            {
              "name": "createdAt",
              "meaning": "when the thread was first filed to this case; read by the proactive case-data endpoint"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case this conversation was filed to, part of the caseId plus externalId unique key"
            },
            {
              "field": "communications",
              "target": "email",
              "meaning": "the messages of the conversation that have actually been filed; the full thread is read live from Graph"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "shared-id-prefix"
          ]
        }
      ]
    },
    {
      "id": "voice",
      "order": 12,
      "groups": [],
      "name": "Voice: calls on a case",
      "tagline": "One table: a Twilio conference on a case, recorded, transcribed, written up",
      "whatItIs": "Voice is one model and one module. A lawyer on a case opens the call composer, types the numbers of the people to bring in, and calls.createCall dials them into a Twilio conference. Lawhive is the host: the platform calls the lawyer first, asks them to press 1, then rings every other party and drops them into a conference named after the call id. The point is not the phone call, it is what comes out of it. Twilio records from the first second, the recording lands in the case files S3 bucket, Deepgram transcribes it with speaker labels, and the transcript is turned into an attendance note on the case without anyone asking. Beyond creating a call the module is read only: firm employees list the calls on their case and open one to see the parties, the duration and the formatted transcript, and admins can also presign the recording for download.",
      "howItConnects": "Every Call hangs off a Case, and the schema still says caseId is \"required for now\", so there is no such thing as a call outside a matter. initiatedBy points at People, always the Person behind a FirmEmployee in practice, because createCall is a firmEmployee procedure and refuses anyone who is not a party on the case. The recording and the transcript go to the same S3 bucket Documents uses but get no File or CaseFile row, so they exist only through the Call. The last hop belongs to AI: app/cases/attendanceNote.generationRequested is handled in the ai module, which reads the transcript, runs the Langfuse attendance_note prompt through OpenAI, and writes the result as a CaseNote on the case. That handler is the only code outside this module that writes to Call, and all three of its writes are to attendanceNoteStatus.",
      "lifecycle": "in_progress → completed / failed",
      "flows": [
        {
          "id": "call-lifecycle",
          "title": "Placing a call and the conference dial-out",
          "mermaid": "flowchart TD\n  M[createCall mutation] --> ROW[Call row in_progress]\n  ROW --> DIAL[Twilio dials the initiator]\n  DIAL --> SID[twilioSid saved]\n  SID --> GREET[TwiML gather press 1]\n  GREET -->|other digit or timeout| F[call.failed sets failed]\n  GREET -->|1| CONF[dial conference named callId]\n  CONF --> OTHERS[callOtherParties dials each party]\n  OTHERS --> JOIN[party-join TwiML starts the conference]\n  JOIN --> S[conference-start sets startedAt]\n  S --> E[conference-end sets completedAt duration completed]\n  E --> REC[recording.completed]\n  DIAL -->|busy no-answer failed| F",
          "caption": "The conference name is the call id, which is how every later webhook finds its row. The initiator's leg has endConferenceOnExit true, so the lawyer hanging up ends the call for everyone."
        },
        {
          "id": "recording-to-note",
          "title": "Recording to attendance note",
          "mermaid": "flowchart LR\n  TW[Twilio recordings bucket] --> COPY[S3 CopyObject]\n  COPY --> RU[recordingUrl s3 key]\n  RU --> DG[Deepgram nova-3 diarized]\n  DG --> J[transcription json]\n  DG --> T[transcript txt]\n  J --> TU[transcriptionUrl]\n  T --> ING[AI transcript ingestion]\n  TU --> GEN[generateAttendanceNoteForCall]\n  GEN --> NOTE[CaseNote on the case]\n  GEN --> OK[attendanceNoteStatus success]",
          "caption": "Each step chains to the next by event: recording.completed sends transcription.requested, which sends attendanceNote.generationRequested if the initiator is a firm employee."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "If the initial Twilio calls.create throws, createCall sets completedAt and rethrows but never sets callStatus to failed, so the row sits at in_progress with a null twilioSid. listCaseCallsService filters on twilioSid not null, which is what keeps those stillborn rows out of the case's call list."
        },
        {
          "kind": "status",
          "body": "There is no CallParty table because most participants are not people Lawhive knows: an opposing solicitor, a court clerk, the client's accountant. personId is optional in the JSON and read paths label a party \"Case Contact\" when it is set and \"External\" when it is not. The cost is that every reader casts the JSON by hand, and handleCallTranscriptionRequested safeParses it and falls back to an empty keyterm list for Deepgram when the shape does not match."
        },
        {
          "kind": "status",
          "body": "twilioSid holds the Call SID of the initiator's leg, nothing else. The other parties' SIDs are logged and dropped, and the conference SID arrives on every webhook but is only written into the S3 object metadata, never onto the row."
        },
        {
          "kind": "status",
          "body": "recordingUrl and transcriptionUrl hold S3 keys, not URLs. adminGetRecordingDownloadUrl checks with new URL() whether the value parses as a real URL and returns it directly if so, which is the leftover path for rows written before the bucket copy existed."
        },
        {
          "kind": "status",
          "body": "The recording and both transcript objects land in the case files bucket under cases/<caseId>/call-recordings/ but get no File or CaseFile row, so Documents cannot see them and only the Call row knows they exist."
        },
        {
          "kind": "status",
          "body": "/api/webhook/twilio-calls takes action and callId from the query string and verifies no Twilio signature. The TwiML for a call is whatever that route is asked for."
        },
        {
          "kind": "status",
          "body": "participant-join and participant-leave conference events are received and logged with a comment saying they could be tracked in a table. They are not, so per-participant timing does not exist anywhere."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/calls",
          "kind": "api-module",
          "label": "calls",
          "path": "packages/api/src/modules/calls",
          "files": 21,
          "prismaSites": 18,
          "procedures": {
            "queries": 4,
            "mutations": 3
          }
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/calls/call.failed",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/service/twilioCallWebhooks.ts",
            "line": 125,
            "live": "rare"
          },
          {
            "name": "app/calls/conference.status",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/service/twilioCallWebhooks.ts",
            "line": 160,
            "live": "silent"
          },
          {
            "name": "app/calls/recording.completed",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/service/twilioCallWebhooks.ts",
            "line": 203,
            "live": "silent"
          },
          {
            "name": "app/calls/transcription.requested",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleCallRecordingCompleted.ts",
            "line": 106,
            "live": "silent"
          },
          {
            "name": "app/cases/attendanceNote.generationRequested",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleCallTranscriptionRequested.ts",
            "line": 175,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/calls/call.failed",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleCallFailed.ts",
            "line": 6,
            "live": "rare"
          },
          {
            "name": "app/calls/conference.status",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleConferenceStatusUpdate.ts",
            "line": 8,
            "live": "silent"
          },
          {
            "name": "app/calls/recording.completed",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleCallRecordingCompleted.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "app/calls/transcription.requested",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleCallTranscriptionRequested.ts",
            "line": 16,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/calls/call.failed",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/service/twilioCallWebhooks.ts",
            "line": 125,
            "live": "rare",
            "via": "rule",
            "emitters": [
              "voice"
            ],
            "consumers": [
              "voice"
            ]
          },
          {
            "name": "app/calls/conference.status",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/service/twilioCallWebhooks.ts",
            "line": 160,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "voice"
            ],
            "consumers": [
              "voice"
            ]
          },
          {
            "name": "app/calls/recording.completed",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/service/twilioCallWebhooks.ts",
            "line": 203,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "voice"
            ],
            "consumers": [
              "voice"
            ]
          },
          {
            "name": "app/calls/transcription.requested",
            "namespace": "app",
            "area": "api/calls",
            "file": "packages/api/src/modules/calls/inngest/handleCallRecordingCompleted.ts",
            "line": 106,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "voice"
            ],
            "consumers": [
              "voice"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "AttendanceNoteStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3239,
          "doc": null,
          "values": [
            {
              "name": "not_requested",
              "doc": null
            },
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "success",
              "doc": null
            },
            {
              "name": "failed",
              "doc": null
            }
          ],
          "usedBy": [
            "Call"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CallStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3246,
          "doc": null,
          "values": [
            {
              "name": "in_progress",
              "doc": null
            },
            {
              "name": "completed",
              "doc": null
            },
            {
              "name": "failed",
              "doc": null
            }
          ],
          "usedBy": [
            "Call"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 7,
        "writes": 12
      },
      "models": [
        {
          "key": "app/Call",
          "name": "Call",
          "table": null,
          "datastore": "app",
          "domain": "voice",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3252,
          "idPrefix": "call_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "initiatedById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Who initiated the call",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "initiatedBy",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Associated case (required for now)",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "parties",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Call participants (flexible)\n[{ phoneNumber?: String, name?: String, personId?: String }]",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "twilioSid",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": "Twilio / recording",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recordingUrl",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "transcriptionUrl",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "durationSeconds",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Timing",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "startedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "completedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "callStatus",
              "type": "CallStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "attendanceNoteStatus",
              "type": "AttendanceNoteStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "initiatedBy",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "initiatedById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "calls",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Person",
              "field": "calls",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "initiatedBy"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "calls"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "calls"
            }
          ],
          "usage": {
            "total": 19,
            "reads": 7,
            "writes": 12,
            "ops": {
              "update": 11,
              "findUnique": 5,
              "findUniqueOrThrow": 1,
              "findMany": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/calls",
                "reads": 7,
                "writes": 9,
                "domain": "voice",
                "kind": "api-module"
              },
              {
                "area": "api/ai",
                "reads": 0,
                "writes": 3,
                "domain": "ai",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/ai/service/generateAttendanceNoteForCall.ts",
                "line": 22,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/ai/service/generateAttendanceNoteForCall.ts",
                "line": 33,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/ai/service/generateAttendanceNoteForCall.ts",
                "line": 136,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 65,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 16
              },
              {
                "area": "ui/cases",
                "n": 16
              },
              {
                "area": "api/calls",
                "n": 14
              },
              {
                "area": "api/_integrations",
                "n": 4
              },
              {
                "area": "ui/assessments",
                "n": 3
              },
              {
                "area": "ui/_app",
                "n": 3
              },
              {
                "area": "ui/meetings",
                "n": 2
              },
              {
                "area": "api/ai",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One Twilio conference call held about a case: who dialled it, who was on it, how long it ran, and where its recording, transcript and attendance note got to.",
          "keyFields": [
            {
              "name": "parties",
              "meaning": "the participants as JSON: name, E.164 phoneNumber, and personId only when the party is on the platform"
            },
            {
              "name": "twilioSid",
              "meaning": "Call SID of the initiator's leg, unique, and null until Twilio accepts the dial"
            },
            {
              "name": "recordingUrl",
              "meaning": "S3 key in the case files bucket after the recording is copied out of Twilio's bucket"
            },
            {
              "name": "transcriptionUrl",
              "meaning": "S3 key of the Deepgram JSON; a sibling .txt key holds the plain transcript"
            },
            {
              "name": "durationSeconds",
              "meaning": "computed at conference-end from startedAt, so it is null if the conference never started"
            },
            {
              "name": "callStatus",
              "meaning": "the telephony leg: in_progress on create, completed at conference-end, failed on cancel or a busy or no-answer leg"
            },
            {
              "name": "attendanceNoteStatus",
              "meaning": "the AI write-up: not_requested, pending while the ai handler runs, success once the CaseNote exists, failed on its onFailure"
            }
          ],
          "references": [
            {
              "field": "initiatedById",
              "target": "people",
              "meaning": "the Person who dialled, and the firm employee the attendance note is credited to"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter the call is about, required, and the S3 prefix the recording is filed under"
            }
          ],
          "lifecycle": "in_progress → completed / failed",
          "grouped": [],
          "flags": [
            "json-parties",
            "s3-key-in-url-field"
          ]
        }
      ]
    },
    {
      "id": "post",
      "order": 13,
      "groups": [],
      "name": "Post: outbound mail",
      "tagline": "Physical mail: a lawyer asks for it, the admin mailroom prints and posts it.",
      "whatItIs": "Post covers paper mail sent out on a case. A lawyer on the case picks case files, picks one or more recipients and a delivery method, and gets one OutboundMailRequest per recipient. Admins in the mailroom sweep the PENDING pool into an OutboundMailBatch, and a background job turns that batch into merged print bundles plus a sheet of 4x6 thermal address labels in S3. The operator scans the cover sheet of a bundle to move that request to PROCESSING, then marks it SENT with a tracking number and the postage actually paid. The whole feature sits behind the outbound-mail PostHog flag.",
      "howItConnects": "Every request hangs off a Case and names the FirmEmployee who asked for it, and the files it prints are CaseFiles from the documents domain. Postage costs money, so outbound-mail/request.sent raises a firm disbursement Bill in the money domain and writes its id back onto the request, which is how the client ends up charged. Admins own the delivery-method catalogue and the global address book, so people appears as the creator on those tables. request.created also posts a webhook to n8n, the older mailroom workflow that runs alongside the in-platform batch printer.",
      "lifecycle": "PENDING → PROCESSING → SENT / CANCELLED",
      "flows": [
        {
          "id": "request-to-sent",
          "title": "Request to sent",
          "mermaid": "flowchart TD\n  Lawyer[Lawyer on the case] -->|requests.create| Req[OutboundMailRequest PENDING]\n  Req -->|request.created| N8n[n8n webhook]\n  Req --> Claim[Claimed into a batch]\n  Claim --> Scan[Operator scans cover sheet]\n  Scan -->|startProcessing| Proc[PROCESSING processedBy processedAt]\n  Proc -->|markSent| Sent[SENT tracking postageCost sentAt]\n  Sent -->|request.sent| Bill[Firm disbursement Bill linked via billId]\n  Sent -->|request.sent| Notify[Knock notifies the lawyer]\n  Proc -->|releaseToPending| Req\n  Req -->|cancel| Cancelled[CANCELLED with reason]\n  Proc -->|cancelAdmin| Cancelled",
          "caption": "A lawyer creates the request, an admin walks it to SENT. Only the admin cancel path works after PROCESSING; a lawyer can only cancel while the request is still PENDING."
        },
        {
          "id": "batch-preparation",
          "title": "How a batch claims and prints requests",
          "mermaid": "flowchart TD\n  Admin[Admin] -->|batch.prepare| Tx[One transaction]\n  Tx --> New[OutboundMailBatch PREPARING]\n  Tx --> Stamp[updateMany batchId null and PENDING gets this batchId]\n  Stamp --> Count[totalRequests set from the claim count]\n  Count -->|batch.prepare-requested| Job[prepare-batch Inngest job]\n  Job --> Pack[packIntoParts 250MB input budget per part]\n  Pack --> Pdf[Cover sheet plus printable copies per request]\n  Pdf --> S3[Parts and label PDF uploaded to S3]\n  S3 --> Ready[Batch READY with parts JSON]\n  Job -->|retries exhausted| Failed[Batch FAILED and requests freed]\n  Ready -->|discard| Discarded[Batch DISCARDED and requests returned to PENDING]",
          "caption": "Batching is a sweep, not a selection: every request with batchId null and status PENDING is claimed at once. The claim and the batch row are written in one transaction, so a request can never point at a batch that does not exist."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "The lawyer-facing UI is four files in apps/platform/src/features/outbound-mail and is gated on the outbound-mail PostHog flag (useOutboundMailEnabled). All 61 Prisma call sites live in packages/api/src/modules/outbound-mail; nothing outside that module touches these tables."
        },
        {
          "kind": "duplication",
          "body": "Two fulfilment paths coexist. outbound-mail/request.created POSTs the request to OUTBOUND_MAIL_N8N_TRIGGER_URL for the n8n mailroom workflow, while the batch procedures and the prepare-batch job build print bundles inside the platform. Nothing in the code reconciles the two."
        },
        {
          "kind": "status",
          "body": "releaseToPending puts a PROCESSING request back to PENDING and clears processedById and processedAt, but leaves batchId set. Since batching only claims rows with batchId null, a released request will not be picked up by the next batch until its batch is discarded."
        },
        {
          "kind": "companion",
          "body": "postageCost and indicativePrice are integers in pence. Billing only fires when postageCost is above zero, skipBilling is false, and the request has a processedBy admin to attribute the disbursement to."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/outbound-mail",
          "kind": "api-module",
          "label": "outbound-mail",
          "path": "packages/api/src/modules/outbound-mail",
          "files": 51,
          "prismaSites": 61,
          "procedures": {
            "queries": 13,
            "mutations": 14
          }
        },
        {
          "id": "ui/outbound-mail",
          "kind": "ui-feature",
          "label": "outbound-mail",
          "path": "apps/platform/src/features/outbound-mail",
          "files": 4,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "outbound-mail/batch.prepare-requested",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/prepare-batch.ts",
            "line": 42,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.cancelled",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/cancel-request.ts",
            "line": 45,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.created",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/create-requests.ts",
            "line": 122,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.processing-started",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/start-processing.ts",
            "line": 45,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.sent",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/mark-sent.ts",
            "line": 45,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "outbound-mail/batch.prepare-requested",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/inngest/prepare-batch.ts",
            "line": 13,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.cancelled",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/inngest/handle-request-cancelled.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.created",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/inngest/handle-request-created.ts",
            "line": 31,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.processing-started",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/inngest/handle-request-processing-started.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "outbound-mail/request.sent",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/inngest/handle-request-sent.ts",
            "line": 7,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "outbound-mail/batch.prepare-requested",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/prepare-batch.ts",
            "line": 42,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "post"
            ],
            "consumers": [
              "post"
            ]
          },
          {
            "name": "outbound-mail/request.cancelled",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/cancel-request.ts",
            "line": 45,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "post"
            ],
            "consumers": [
              "post"
            ]
          },
          {
            "name": "outbound-mail/request.created",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/create-requests.ts",
            "line": 122,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "post"
            ],
            "consumers": [
              "post"
            ]
          },
          {
            "name": "outbound-mail/request.processing-started",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/start-processing.ts",
            "line": 45,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "post"
            ],
            "consumers": [
              "post"
            ]
          },
          {
            "name": "outbound-mail/request.sent",
            "namespace": "outbound-mail",
            "area": "api/outbound-mail",
            "file": "packages/api/src/modules/outbound-mail/procedures/mark-sent.ts",
            "line": 45,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "post"
            ],
            "consumers": [
              "post"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "OutboundDocumentType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3462,
          "doc": null,
          "values": [
            {
              "name": "PRINTED_COPY",
              "doc": "Print the file from the platform and send"
            },
            {
              "name": "CERTIFIED_COPY",
              "doc": "A certified copy of the document"
            },
            {
              "name": "PHYSICAL_ORIGINAL",
              "doc": "The physical original document from storage"
            }
          ],
          "usedBy": [
            "OutboundMailDocument"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "OutboundMailBatchStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3436,
          "doc": null,
          "values": [
            {
              "name": "PREPARING",
              "doc": null
            },
            {
              "name": "READY",
              "doc": null
            },
            {
              "name": "FAILED",
              "doc": null
            },
            {
              "name": "DISCARDED",
              "doc": null
            }
          ],
          "usedBy": [
            "OutboundMailBatch"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "OutboundMailRequestStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3443,
          "doc": null,
          "values": [
            {
              "name": "PENDING",
              "doc": null
            },
            {
              "name": "PROCESSING",
              "doc": null
            },
            {
              "name": "SENT",
              "doc": null
            },
            {
              "name": "CANCELLED",
              "doc": null
            }
          ],
          "usedBy": [
            "OutboundMailRequest"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 31,
        "writes": 25
      },
      "models": [
        {
          "key": "app/OutboundMailRequest",
          "name": "OutboundMailRequest",
          "table": null,
          "datastore": "app",
          "domain": "post",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3361,
          "idPrefix": "omr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 37,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "humanReadableId",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requestedBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "requestedById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "OutboundMailRequestStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "deliveryMethod",
              "type": "OutboundMailDeliveryMethod",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "OutboundMailDeliveryMethod",
              "onDelete": "Restrict"
            },
            {
              "name": "deliveryMethodId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientName",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientAddressLine1",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientAddressLine2",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientCity",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientCounty",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientPostcode",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientCountry",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "recipientGooglePlaceId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseMailContact",
              "type": "CaseMailContact",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseMailContact",
              "onDelete": null
            },
            {
              "name": "caseMailContactId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "globalMailContact",
              "type": "GlobalMailContact",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "GlobalMailContact",
              "onDelete": null
            },
            {
              "name": "globalMailContactId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "notes",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "trackingNumber",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "postageCost",
              "type": "Int",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "processedBy",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "processedById",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "processedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sentAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "documents",
              "type": "OutboundMailDocument",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailDocument",
              "onDelete": null
            },
            {
              "name": "bill",
              "type": "Bill",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Bill",
              "onDelete": null
            },
            {
              "name": "billId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "batch",
              "type": "OutboundMailBatch",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "The batch this request is currently part of (claimed when a batch is prepared; null = available).",
              "fk": true,
              "relationTarget": "OutboundMailBatch",
              "onDelete": null
            },
            {
              "name": "batchId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "cancellationReason",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([status])",
            "@@index([caseId])",
            "@@index([requestedById])",
            "@@index([deliveryMethodId])",
            "@@index([batchId])"
          ],
          "looseRefs": [
            "recipientGooglePlaceId"
          ],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "requestedBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestedById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "deliveryMethod",
              "target": "OutboundMailDeliveryMethod",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "deliveryMethodId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Restrict",
              "targetKey": "app/OutboundMailDeliveryMethod",
              "targetDomain": "post"
            },
            {
              "field": "caseMailContact",
              "target": "CaseMailContact",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseMailContactId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseMailContact",
              "targetDomain": "post"
            },
            {
              "field": "globalMailContact",
              "target": "GlobalMailContact",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "globalMailContactId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/GlobalMailContact",
              "targetDomain": "post"
            },
            {
              "field": "processedBy",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "processedById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "documents",
              "target": "OutboundMailDocument",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailDocument",
              "targetDomain": "post"
            },
            {
              "field": "bill",
              "target": "Bill",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "billId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Bill",
              "targetDomain": "money"
            },
            {
              "field": "batch",
              "target": "OutboundMailBatch",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "batchId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailBatch",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "processedOutboundMailRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "Bill",
              "field": "outboundMailRequest",
              "fk": false,
              "list": false,
              "sourceKey": "app/Bill",
              "sourceDomain": "money"
            },
            {
              "model": "Case",
              "field": "outboundMailRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseMailContact",
              "field": "outboundMailRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/CaseMailContact",
              "sourceDomain": "post"
            },
            {
              "model": "FirmEmployee",
              "field": "outboundMailRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "GlobalMailContact",
              "field": "outboundMailRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/GlobalMailContact",
              "sourceDomain": "post"
            },
            {
              "model": "OutboundMailBatch",
              "field": "requests",
              "fk": false,
              "list": true,
              "sourceKey": "app/OutboundMailBatch",
              "sourceDomain": "post"
            },
            {
              "model": "OutboundMailDeliveryMethod",
              "field": "outboundMailRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/OutboundMailDeliveryMethod",
              "sourceDomain": "post"
            },
            {
              "model": "OutboundMailDocument",
              "field": "request",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailDocument",
              "sourceDomain": "post"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "requestedBy"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "processedBy"
            },
            {
              "dir": "out",
              "domain": "money",
              "model": "Bill",
              "field": "bill"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "processedOutboundMailRequests"
            },
            {
              "dir": "in",
              "domain": "money",
              "model": "Bill",
              "field": "outboundMailRequest"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "outboundMailRequests"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "outboundMailRequests"
            }
          ],
          "usage": {
            "total": 31,
            "reads": 19,
            "writes": 12,
            "ops": {
              "findUnique": 10,
              "update": 6,
              "updateMany": 5,
              "findMany": 3,
              "findFirst": 2,
              "create": 1,
              "count": 1,
              "groupBy": 2,
              "aggregate": 1
            },
            "byArea": [
              {
                "area": "api/outbound-mail",
                "reads": 19,
                "writes": 12,
                "domain": "post",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/outbound-mail/inngest/handle-request-sent.ts",
                "line": 71,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/inngest/prepare-batch.ts",
                "line": 22,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/cancel-request.ts",
                "line": 37,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One envelope to one recipient: what to print, where to send it, and by which postal service. Created PENDING by a lawyer on the case, walked to SENT by the admin mailroom.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PENDING, PROCESSING (an admin has it), SENT, or CANCELLED"
            },
            {
              "name": "humanReadableId",
              "meaning": "the short number on the cover sheet and the scan barcode"
            },
            {
              "name": "description",
              "meaning": "the lawyer's stated purpose, printed on the cover sheet"
            },
            {
              "name": "trackingNumber",
              "meaning": "captured at markSent for tracked services such as Signed For"
            },
            {
              "name": "postageCost",
              "meaning": "pence actually paid, entered at markSent and billed as a disbursement"
            },
            {
              "name": "sentAt",
              "meaning": "set by markSent; processedAt records when an admin picked it up"
            },
            {
              "name": "cancellationReason",
              "meaning": "free text required by both the admin and the lawyer cancel paths"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter the post belongs to"
            },
            {
              "field": "requestedById",
              "target": "firms",
              "meaning": "the FirmEmployee who asked for it"
            },
            {
              "field": "deliveryMethodId",
              "target": "post",
              "meaning": "the postal service chosen; onDelete Restrict keeps used methods alive"
            },
            {
              "field": "caseMailContactId",
              "target": "post",
              "meaning": "the case address book entry the address was copied from"
            },
            {
              "field": "globalMailContactId",
              "target": "post",
              "meaning": "the shared address book entry the address was copied from"
            },
            {
              "field": "processedById",
              "target": "people",
              "meaning": "the Admin who took it into PROCESSING"
            },
            {
              "field": "billId",
              "target": "money",
              "meaning": "unique link to the firm disbursement Bill raised for the postage"
            },
            {
              "field": "batchId",
              "target": "post",
              "meaning": "the batch that claimed it; null means available to batch"
            }
          ],
          "lifecycle": "PENDING → PROCESSING → SENT / CANCELLED",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/OutboundMailBatch",
          "name": "OutboundMailBatch",
          "table": null,
          "datastore": "app",
          "domain": "post",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3418,
          "idPrefix": "omb_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "humanReadableId",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "OutboundMailBatchStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "totalRequests",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "parts",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Array of { key, partNumber, totalParts, requestCount } once the merge job has uploaded the parts.",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([status])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "createdBy",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "requests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "outboundMailBatches",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "OutboundMailRequest",
              "field": "batch",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "outboundMailBatches"
            }
          ],
          "usage": {
            "total": 8,
            "reads": 2,
            "writes": 6,
            "ops": {
              "updateMany": 3,
              "update": 2,
              "findUnique": 1,
              "findMany": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/outbound-mail",
                "reads": 2,
                "writes": 6,
                "domain": "post",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/outbound-mail/inngest/prepare-batch.ts",
                "line": 23,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/inngest/prepare-batch.ts",
                "line": 153,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/discard-batch.ts",
                "line": 22,
                "op": "update"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/outbound-mail",
                "n": 2
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/outbound-mail",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One print run for the mailroom. It claims all the PENDING requests at the moment an admin presses prepare, then holds the S3 keys of the merged PDFs the operator prints.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "PREPARING while the job runs, then READY, FAILED, or DISCARDED"
            },
            {
              "name": "totalRequests",
              "meaning": "how many requests the claim transaction stamped into this batch"
            },
            {
              "name": "parts",
              "meaning": "JSON array of { key, partNumber, totalParts, requestCount }, bundles plus one labels PDF"
            },
            {
              "name": "humanReadableId",
              "meaning": "the batch number the mailroom refers to"
            }
          ],
          "references": [
            {
              "field": "createdById",
              "target": "people",
              "meaning": "the Admin who pressed prepare"
            }
          ],
          "lifecycle": "PREPARING → READY / FAILED / DISCARDED",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/OutboundMailDeliveryMethod",
          "name": "OutboundMailDeliveryMethod",
          "table": null,
          "datastore": "app",
          "domain": "post",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3335,
          "idPrefix": "omdm_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 13,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "code",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": "Short franking code printed in the envelope window, e.g. \"1C\" (1st class), \"1SF\" (1st class signed for).",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "description",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "indicativePrice",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isTracked",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Tracked services (e.g. Signed For, Special Delivery) require a tracking barcode scan at send time.",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sortOrder",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isActive",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "outboundMailRequests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([isActive, sortOrder])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "createdBy",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "outboundMailRequests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "outboundMailDeliveryMethods",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "OutboundMailRequest",
              "field": "deliveryMethod",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "outboundMailDeliveryMethods"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 5,
            "writes": 2,
            "ops": {
              "create": 1,
              "findUnique": 2,
              "findMany": 3,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/outbound-mail",
                "reads": 5,
                "writes": 2,
                "domain": "post",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/create-delivery-method.ts",
                "line": 9,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/update-delivery-method.ts",
                "line": 22,
                "op": "update"
              }
            ],
            "nested": 6,
            "nestedByArea": [
              {
                "area": "api/outbound-mail",
                "n": 6
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One postal service the mailroom can frank, such as 1st class or 1st class signed for. Admins maintain the list; lawyers pick from the active entries.",
          "keyFields": [
            {
              "name": "code",
              "meaning": "short franking code printed on the label, e.g. 1C or 1SF"
            },
            {
              "name": "indicativePrice",
              "meaning": "pence shown to the lawyer when choosing; the real cost is entered at markSent"
            },
            {
              "name": "isTracked",
              "meaning": "true means the operator must scan a tracking barcode before marking it sent"
            },
            {
              "name": "isActive",
              "meaning": "inactive methods are rejected by requests.create and hidden from the picker"
            }
          ],
          "references": [
            {
              "field": "createdById",
              "target": "people",
              "meaning": "the Admin who added the method"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/OutboundMailDocument",
          "name": "OutboundMailDocument",
          "table": null,
          "datastore": "app",
          "domain": "post",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3450,
          "idPrefix": "omd_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "request",
              "type": "OutboundMailRequest",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "OutboundMailRequest",
              "onDelete": "Cascade"
            },
            {
              "name": "requestId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseFile",
              "type": "CaseFile",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "caseFileId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "documentType",
              "type": "OutboundDocumentType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "copies",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "request",
              "target": "OutboundMailRequest",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "requestId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Cascade",
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            },
            {
              "field": "caseFile",
              "target": "CaseFile",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseFileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            }
          ],
          "relationsIn": [
            {
              "model": "CaseFile",
              "field": "outboundMailDocuments",
              "fk": false,
              "list": true,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "OutboundMailRequest",
              "field": "documents",
              "fk": false,
              "list": true,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFile",
              "field": "caseFile"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFile",
              "field": "outboundMailDocuments"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 11,
            "nestedByArea": [
              {
                "area": "api/outbound-mail",
                "n": 11
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One line on a request's pick list: which case file goes in the envelope, how many copies, and whether it is printed, certified, or the physical original pulled from storage.",
          "keyFields": [
            {
              "name": "documentType",
              "meaning": "PRINTED_COPY, CERTIFIED_COPY, or PHYSICAL_ORIGINAL; only the first two get merged into the PDF"
            },
            {
              "name": "copies",
              "meaning": "how many copies to print, and it multiplies the request's byte budget when packing parts"
            }
          ],
          "references": [
            {
              "field": "requestId",
              "target": "post",
              "meaning": "the request it belongs to; cascades on delete"
            },
            {
              "field": "caseFileId",
              "target": "documents",
              "meaning": "the CaseFile to print or retrieve"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-only-writes"
          ]
        },
        {
          "key": "app/CaseMailContact",
          "name": "CaseMailContact",
          "table": null,
          "datastore": "app",
          "domain": "post",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3472,
          "idPrefix": "cmc_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 17,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "addressLine1",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "addressLine2",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "city",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "county",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "postcode",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "country",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "googlePlaceId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "outboundMailRequests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId])"
          ],
          "looseRefs": [
            "googlePlaceId"
          ],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "createdBy",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "outboundMailRequests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "caseMailContacts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "FirmEmployee",
              "field": "caseMailContacts",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "OutboundMailRequest",
              "field": "caseMailContact",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "caseMailContacts"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "caseMailContacts"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 2,
            "writes": 3,
            "ops": {
              "create": 2,
              "findMany": 1,
              "findFirst": 1,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/outbound-mail",
                "reads": 2,
                "writes": 3,
                "domain": "post",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/create-case-contact.ts",
                "line": 29,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/create-requests.ts",
                "line": 68,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/update-case-contact.ts",
                "line": 29,
                "op": "update"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/outbound-mail",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "An address saved against one case by the lawyer, for example the other side's solicitor. Created either directly or automatically when a lawyer ticks save to contacts while raising a request.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "who the address belongs to; copied onto the request as recipientName"
            },
            {
              "name": "postcode",
              "meaning": "part of the address copied onto the request at creation time"
            },
            {
              "name": "isDeleted",
              "meaning": "soft delete; the lists filter it out but old requests keep their link"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case this address book belongs to; visible only to parties on that case"
            },
            {
              "field": "createdById",
              "target": "firms",
              "meaning": "the FirmEmployee who saved it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/GlobalMailContact",
          "name": "GlobalMailContact",
          "table": null,
          "datastore": "app",
          "domain": "post",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3500,
          "idPrefix": "gmc_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "Admin",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "category",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "addressLine1",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "addressLine2",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "city",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "county",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "postcode",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "country",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "googlePlaceId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isDeleted",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "outboundMailRequests",
              "type": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "OutboundMailRequest",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([category])"
          ],
          "looseRefs": [
            "googlePlaceId"
          ],
          "relationsOut": [
            {
              "field": "createdBy",
              "target": "Admin",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            },
            {
              "field": "outboundMailRequests",
              "target": "OutboundMailRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/OutboundMailRequest",
              "targetDomain": "post"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "globalMailContacts",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            },
            {
              "model": "OutboundMailRequest",
              "field": "globalMailContact",
              "fk": true,
              "list": false,
              "sourceKey": "app/OutboundMailRequest",
              "sourceDomain": "post"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "globalMailContacts"
            }
          ],
          "usage": {
            "total": 5,
            "reads": 3,
            "writes": 2,
            "ops": {
              "create": 1,
              "findMany": 2,
              "findUnique": 1,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/outbound-mail",
                "reads": 3,
                "writes": 2,
                "domain": "post",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/create-global-contact.ts",
                "line": 9,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/outbound-mail/procedures/update-global-contact.ts",
                "line": 22,
                "op": "update"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/outbound-mail",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "An address in the shared address book that every case can use, such as a court or the Land Registry. Only admins create and edit these; lawyers get a read-only list.",
          "keyFields": [
            {
              "name": "name",
              "meaning": "the organisation or person, copied onto the request as recipientName"
            },
            {
              "name": "category",
              "meaning": "free-text grouping used to sort and filter the list, indexed"
            },
            {
              "name": "isDeleted",
              "meaning": "soft delete; admins can list deleted entries, lawyers cannot"
            }
          ],
          "references": [
            {
              "field": "createdById",
              "target": "people",
              "meaning": "the Admin who added it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        }
      ]
    },
    {
      "id": "compliance",
      "order": 14,
      "groups": [],
      "name": "Compliance: agreements, KYC, conflicts, risk",
      "tagline": "The checks a case must pass before it opens: signed paperwork, ID, risk, conflicts.",
      "whatItIs": "Compliance holds the regulatory gates around a matter. Agreements are the paperwork a client signs: one terms of business per case, a client care letter and sometimes a conditional fee agreement per quote, and a letter of authority for each non-lead customer party. KYC is the Onfido identity check on a Customer. Risk assessments are the lawyer's own AML and operational scoring of the case, with an admin review when the score comes out high. Address checks are the postcode conflict search a lawyer triggers by adding an address to a case. CaseInternalReview is the odd one out: it is a quality-assurance review written by Lawrence on a nightly schedule, not by a person.",
      "howItConnects": "Almost everything here feeds openCaseIfReady in the cases domain. That function asks two questions: has the lead client signed terms of business, the client care letter and any CFA, and is their KYC approved or in review; and has the owning lawyer filed a RiskAssessment that is either low or medium risk or has an accepted RiskAssessmentReview. Only then does the Case flip to ACTIVE. Signing a client care letter also accepts the linked Quote in the quotes domain. Agreements point at Case, Quote and Firm, and the external signing path stores a CaseFile from documents. KYC hangs off Customer in people and is driven by Onfido webhooks, which publish kyc/workflowRun.statusUpdated and app/kyc/saveReportToS3.requested. Lawrence's reviews come from the ai domain's case context builder and land in Intercom when they score highRisk.",
      "lifecycle": null,
      "flows": [
        {
          "id": "agreement-signing",
          "title": "How an agreement gets signed and snapshotted",
          "mermaid": "flowchart TD\n  Case[Case created] --> GetOrCreate[getOrCreateAgreementsForCase]\n  GetOrCreate --> TOB[ClientAgreement termsOfBusiness pending]\n  GetOrCreate --> Quote[getOrCreateAgreementsForQuote]\n  Quote --> CCL[clientCareLetter if requiresClientCareLetter]\n  Quote --> CFA[conditionalFeeAgreement if cfaQuote]\n  TOB --> Reqs[One SignatureRequest per CUSTOMER party]\n  CCL --> Reqs\n  CFA --> Reqs\n  Reqs -->|Knock agreementSignatureRequested| Client[Client notified]\n  Client -->|signAgreement| Sig[ClientAgreementSignature snapshotHash ipAddress signedAt]\n  Sig --> Count[Count remaining pending requests]\n  Count -->|zero left| Complete[completeAgreement]\n  Complete --> S3[HTML plus metadata header uploaded to S3]\n  S3 --> Done[status completed, completedAgreementSnapshotS3Key set]\n  Sig -->|type is clientCareLetter| Accept[acceptQuoteIfNotAccepted]\n  Done --> Open[openCaseIfReady]",
          "caption": "The client's browser posts back the HTML it displayed; the server MD5s it into snapshotHash so a signature is tied to exactly what was on screen. The agreement only completes when every signature request is signed, and the snapshot in S3 carries a version 2 metadata block listing each signer, their IP, sign time and content hash."
        },
        {
          "id": "kyc-run",
          "title": "An Onfido workflow run",
          "mermaid": "flowchart TD\n  Trigger[Client or their lawyer calls requestKycCheck] --> App[Find or create Onfido applicant on Customer]\n  App --> New[createWorkflowRun, KycWorkflowRun row, Customer awaiting_input]\n  New --> Sdk[Onfido SDK token returned to the browser]\n  Sdk -->|markKycCheckProcessing| Proc[Run and Customer both processing]\n  Proc --> Hook[Onfido webhook]\n  Hook --> Status[approved / review / declined / error / abandoned]\n  Status -->|kyc.statusUpdated| Cust[Customer kycStatus updated]\n  Status --> Slack[Slack onfidoReviews for review, declined, error]\n  Status --> S3[saveKycReportToS3 Inngest job]\n  Status -->|review| N8n[sendReviewResultToN8n]\n  Cust -->|approved or review| Open[openCaseIfReady for every case the person is on]\n  Admin[Admin] -->|getWorkflowRunUrlForCustomer| Manual[manual workflow run]\n  Admin -->|updateCustomerKycStatus| Cust",
          "caption": "A run is requested by the customer themselves or by a solicitor who has them as a FirmEmployeeClient. approved, review and declined are terminal: neither the webhook nor a later run will overwrite them. Admins can force a Customer's status by hand, which also writes a Comment on the customer."
        },
        {
          "id": "address-conflict-check",
          "title": "Address conflict check and its review",
          "mermaid": "flowchart TD\n  Lawyer[Lawyer adds an address to a case] --> Addr[Address type CASE]\n  Addr --> Run[AddressCheckService.runCheck]\n  Run --> Search[Same firm, same postcode, different case]\n  Search -->|no matches| Clean[AddressCheck COMPLETED, outcome NO_CONFLICT]\n  Search -->|matches| Flag[AddressCheck REVIEWING, matches saved to searchResults JSON]\n  Flag --> Link[searchResultAddresses connected to the matched Address rows]\n  Flag -->|lawyer or admin resolve| Res[RESOLVED with outcome, reviewedBy, reviewedAt, reviewNote]\n  Res --> Out[CONFLICT or RISK_OF_CONFLICT or NO_CONFLICT]",
          "caption": "The search is an exact match on the normalised postcode within the same firm, nothing fuzzier. Creating an address always creates a check, so the table is an audit log rather than an on-demand tool."
        }
      ],
      "notes": [
        {
          "kind": "duplication",
          "body": "Two unrelated things are called a conflict check. The AddressCheck tables are the postcode search, and their UI lives in apps/platform/src/features/cases/components/Addresses (AddressList, ResolveConflictModal) plus the admin conflict-checks pages. The separate apps/platform/src/features/conflict-checks feature is a name search over the firm's clients and a case's external parties, and it touches none of these models."
        },
        {
          "kind": "status",
          "body": "RiskAssessment has two result shapes side by side. createRiskAssessment scores an operational and an AML questionnaire in @lawhive/shared and writes resultsSchemaVersion 1 with operationalRiskRating and amlRiskRating filled in. createRiskAssessmentV2 stores the raw answers, derives overallRiskRating from risk markers only, and writes resultsSchemaVersion 2 with both sub-ratings left null. Anything reading the ratings has to handle the nulls."
        },
        {
          "kind": "status",
          "body": "The RiskAssessment code lives under packages/api/src/modules/cases/riskAssessments, not in a compliance module, and the usage map shows api/cases owning the writes. The domain map still files it here with the other case-opening gates."
        },
        {
          "kind": "misfiled",
          "body": "CaseInternalReview is arguably an AI or case-quality record rather than a compliance one. It is written only by the Lawrence review event handler, its reviewerType enum has exactly one value (lawrence), and its firmEmployeeId is the case owner being reviewed rather than a reviewer. Nothing in the product blocks on it."
        },
        {
          "kind": "legacy",
          "body": "agreements.admin.migrate (adminDoMassAgreementMigration) is a one-shot backfill: it walks every Case and Quote with no ClientAgreement rows, creates them, and fills htmlContent where it is null. It stays wired into the admin router."
        },
        {
          "kind": "companion",
          "body": "ClientAgreementStatus has a revoked value but no code sets it. Revoking happens at the signature-request level through the case.agreements.revokeSignatureRequest event, and uncompleteAgreement pushes a completed agreement back to pending when new customer parties join the case."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/agreements",
          "kind": "api-module",
          "label": "agreements",
          "path": "packages/api/src/modules/agreements",
          "files": 53,
          "prismaSites": 37,
          "procedures": {
            "queries": 7,
            "mutations": 5
          }
        },
        {
          "id": "api/kyc",
          "kind": "api-module",
          "label": "kyc",
          "path": "packages/api/src/modules/kyc",
          "files": 16,
          "prismaSites": 22,
          "procedures": {
            "queries": 4,
            "mutations": 5
          }
        },
        {
          "id": "api/addresses",
          "kind": "api-module",
          "label": "addresses",
          "path": "packages/api/src/modules/addresses",
          "files": 3,
          "prismaSites": 6,
          "procedures": {
            "queries": 1,
            "mutations": 3
          }
        },
        {
          "id": "api/addressChecks",
          "kind": "api-module",
          "label": "addressChecks",
          "path": "packages/api/src/modules/addressChecks",
          "files": 10,
          "prismaSites": 9,
          "procedures": {
            "queries": 3,
            "mutations": 2
          }
        },
        {
          "id": "api/case-internal-reviews",
          "kind": "api-module",
          "label": "case-internal-reviews",
          "path": "packages/api/src/modules/case-internal-reviews",
          "files": 8,
          "prismaSites": 5,
          "procedures": {
            "queries": 0,
            "mutations": 1
          }
        },
        {
          "id": "ui/agreements",
          "kind": "ui-feature",
          "label": "agreements",
          "path": "apps/platform/src/features/agreements",
          "files": 3,
          "prismaSites": 0
        },
        {
          "id": "ui/kyc",
          "kind": "ui-feature",
          "label": "kyc",
          "path": "apps/platform/src/features/kyc",
          "files": 4,
          "prismaSites": 0
        },
        {
          "id": "ui/conflict-checks",
          "kind": "ui-feature",
          "label": "conflict-checks",
          "path": "apps/platform/src/features/conflict-checks",
          "files": 9,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/case-internal-reviews/lawrence-review.requested",
            "namespace": "app",
            "area": "api/case-internal-reviews",
            "file": "packages/api/src/modules/case-internal-reviews/caseInternalReview.service.ts",
            "line": 133,
            "live": "active"
          }
        ],
        "consumes": [
          {
            "name": "app/case-internal-reviews/lawrence-review.queue-if-changed",
            "namespace": "app",
            "area": "api/case-internal-reviews",
            "file": "packages/api/src/modules/case-internal-reviews/caseInternalReview.cron.ts",
            "line": 32,
            "live": "active"
          },
          {
            "name": "app/case-internal-reviews/lawrence-review.requested",
            "namespace": "app",
            "area": "api/case-internal-reviews",
            "file": "packages/api/src/modules/case-internal-reviews/event-handlers/handleLawrenceCaseInternalReviewRequested.ts",
            "line": 5,
            "live": "active"
          },
          {
            "name": "app/kyc/saveReportToS3.requested",
            "namespace": "app",
            "area": "api/kyc",
            "file": "packages/api/src/modules/kyc/service/saveKycReportToS3.ts",
            "line": 15,
            "live": "silent"
          },
          {
            "name": "kyc/workflowRun.statusUpdated",
            "namespace": "kyc",
            "area": "api/kyc",
            "file": "packages/api/src/modules/kyc/service/saveKycReportToS3.ts",
            "line": 15,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "app/case-internal-reviews/lawrence-review.queue-if-changed",
            "namespace": "app",
            "area": "api/case-internal-reviews",
            "file": "packages/api/src/modules/case-internal-reviews/caseInternalReview.cron.ts",
            "line": 32,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "compliance"
            ]
          },
          {
            "name": "app/case-internal-reviews/lawrence-review.requested",
            "namespace": "app",
            "area": "api/case-internal-reviews",
            "file": "packages/api/src/modules/case-internal-reviews/caseInternalReview.service.ts",
            "line": 133,
            "live": "active",
            "via": "rule",
            "emitters": [
              "compliance"
            ],
            "consumers": [
              "compliance"
            ]
          },
          {
            "name": "app/kyc/saveReportToS3.requested",
            "namespace": "app",
            "area": "api/kyc",
            "file": "packages/api/src/modules/kyc/service/saveKycReportToS3.ts",
            "line": 15,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "compliance"
            ]
          },
          {
            "name": "kyc/workflowRun.statusUpdated",
            "namespace": "kyc",
            "area": "api/kyc",
            "file": "packages/api/src/modules/kyc/service/saveKycReportToS3.ts",
            "line": 15,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "compliance"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "AddressCheckOutcome",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3645,
          "doc": null,
          "values": [
            {
              "name": "NO_CONFLICT",
              "doc": null
            },
            {
              "name": "CONFLICT",
              "doc": null
            },
            {
              "name": "RISK_OF_CONFLICT",
              "doc": null
            }
          ],
          "usedBy": [
            "AddressCheck"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "AddressCheckStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3639,
          "doc": null,
          "values": [
            {
              "name": "COMPLETED",
              "doc": null
            },
            {
              "name": "REVIEWING",
              "doc": null
            },
            {
              "name": "RESOLVED",
              "doc": null
            }
          ],
          "usedBy": [
            "AddressCheck"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "AddressType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3635,
          "doc": null,
          "values": [
            {
              "name": "CASE",
              "doc": null
            }
          ],
          "usedBy": [
            "Address"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseInternalReviewerType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3158,
          "doc": null,
          "values": [
            {
              "name": "lawrence",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseInternalReview"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseInternalReviewRiskScore",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3162,
          "doc": null,
          "values": [
            {
              "name": "highRisk",
              "doc": null
            },
            {
              "name": "moderateRisk",
              "doc": null
            },
            {
              "name": "neutralRisk",
              "doc": null
            },
            {
              "name": "lowRisk",
              "doc": null
            },
            {
              "name": "minimalRisk",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseInternalReview"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "CaseInternalReviewType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3154,
          "doc": null,
          "values": [
            {
              "name": "qualityAssurance",
              "doc": null
            }
          ],
          "usedBy": [
            "CaseInternalReview"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "ClientAgreementSignatureRequestStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2553,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "signed",
              "doc": null
            },
            {
              "name": "cancelled",
              "doc": null
            }
          ],
          "usedBy": [
            "ClientAgreementSignatureRequest"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "ClientAgreementStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2510,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "completed",
              "doc": null
            },
            {
              "name": "revoked",
              "doc": null
            }
          ],
          "usedBy": [
            "ClientAgreement"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "ClientAgreementType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2503,
          "doc": null,
          "values": [
            {
              "name": "termsOfBusiness",
              "doc": null
            },
            {
              "name": "clientCareLetter",
              "doc": null
            },
            {
              "name": "conditionalFeeAgreement",
              "doc": null
            },
            {
              "name": "letterOfAuthority",
              "doc": null
            }
          ],
          "usedBy": [
            "ClientAgreement"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "KycWorkflowRunStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 540,
          "doc": null,
          "values": [
            {
              "name": "not_started",
              "doc": null
            },
            {
              "name": "awaiting_input",
              "doc": null
            },
            {
              "name": "processing",
              "doc": null
            },
            {
              "name": "abandoned",
              "doc": null
            },
            {
              "name": "error",
              "doc": null
            },
            {
              "name": "approved",
              "doc": null
            },
            {
              "name": "review",
              "doc": null
            },
            {
              "name": "declined",
              "doc": null
            }
          ],
          "usedBy": [
            "Customer",
            "KycWorkflowRun"
          ],
          "datastore": "app",
          "shared": true
        },
        {
          "name": "KycWorkflowRunType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 514,
          "doc": null,
          "values": [
            {
              "name": "initialVerification",
              "doc": null
            },
            {
              "name": "ongoingMonitoring",
              "doc": null
            },
            {
              "name": "manual",
              "doc": null
            }
          ],
          "usedBy": [
            "KycWorkflowRun"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "RiskAssessmentRating",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2606,
          "doc": null,
          "values": [
            {
              "name": "low",
              "doc": null
            },
            {
              "name": "medium",
              "doc": null
            },
            {
              "name": "high",
              "doc": null
            },
            {
              "name": "highest",
              "doc": null
            }
          ],
          "usedBy": [
            "RiskAssessment"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "RiskAssessmentReviewStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 2613,
          "doc": null,
          "values": [
            {
              "name": "accepted",
              "doc": null
            },
            {
              "name": "rejected",
              "doc": null
            }
          ],
          "usedBy": [
            "RiskAssessmentReview"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 50,
        "writes": 32
      },
      "models": [
        {
          "key": "app/ClientAgreement",
          "name": "ClientAgreement",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2472,
          "idPrefix": "cliag_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 18,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "quote",
              "type": "Quote",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Quote",
              "onDelete": null
            },
            {
              "name": "quoteId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "title",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "htmlContent",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "ClientAgreementType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "version",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "signatureRequests",
              "type": "ClientAgreementSignatureRequest",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreementSignatureRequest",
              "onDelete": null
            },
            {
              "name": "status",
              "type": "ClientAgreementStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "completedAgreementSnapshotS3Key",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "externalSignedFile",
              "type": "CaseFile",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": "Reference to the case file containing the externally signed document (e.g. scanned PDF)",
              "fk": true,
              "relationTarget": "CaseFile",
              "onDelete": "Restrict"
            },
            {
              "name": "externalSignedFileCaseFileId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "quote",
              "target": "Quote",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "quoteId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Quote",
              "targetDomain": "quotes"
            },
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "signatureRequests",
              "target": "ClientAgreementSignatureRequest",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreementSignatureRequest",
              "targetDomain": "compliance"
            },
            {
              "field": "externalSignedFile",
              "target": "CaseFile",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "externalSignedFileCaseFileId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Restrict",
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "clientAgreements",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseFile",
              "field": "clientAgreements",
              "fk": false,
              "list": true,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "ClientAgreementSignatureRequest",
              "field": "agreement",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreementSignatureRequest",
              "sourceDomain": "compliance"
            },
            {
              "model": "Firm",
              "field": "clientAgreements",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "Quote",
              "field": "clientAgreements",
              "fk": false,
              "list": true,
              "sourceKey": "app/Quote",
              "sourceDomain": "quotes"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "quotes",
              "model": "Quote",
              "field": "quote"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFile",
              "field": "externalSignedFile"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "clientAgreements"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFile",
              "field": "clientAgreements"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "clientAgreements"
            },
            {
              "dir": "in",
              "domain": "quotes",
              "model": "Quote",
              "field": "clientAgreements"
            }
          ],
          "usage": {
            "total": 27,
            "reads": 18,
            "writes": 9,
            "ops": {
              "findUnique": 5,
              "findMany": 8,
              "count": 1,
              "findUniqueOrThrow": 4,
              "update": 5,
              "create": 3,
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/agreements",
                "reads": 14,
                "writes": 7,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 3,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/agreements/service/completeAgreement.ts",
                "line": 83,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/agreements/service/completeAgreementWithExternalFile.ts",
                "line": 140,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/agreements/service/getAgreementHtml.ts",
                "line": 128,
                "op": "update"
              }
            ],
            "nested": 22,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 12
              },
              {
                "area": "api/agreements",
                "n": 8
              },
              {
                "area": "ui/_app",
                "n": 1
              },
              {
                "area": "api/quotes",
                "n": 1
              }
            ],
            "typeMentions": 7,
            "typeMentionsByArea": [
              {
                "area": "api/quotes",
                "n": 2
              },
              {
                "area": "api/_root",
                "n": 2
              },
              {
                "area": "pkg/shared",
                "n": 2
              },
              {
                "area": "api/agreements",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One document a client has to sign on a case: terms of business, a client care letter, a conditional fee agreement, or a letter of authority. It holds the generated HTML while pending and the S3 key of the signed snapshot once completed.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "termsOfBusiness (per case), clientCareLetter and conditionalFeeAgreement (per quote), letterOfAuthority (per party)"
            },
            {
              "name": "status",
              "meaning": "pending until every signature request is signed, then completed; revoked exists but is never written"
            },
            {
              "name": "htmlContent",
              "meaning": "the rendered document as shown to the signer, generated from firm and quote templates at creation"
            },
            {
              "name": "version",
              "meaning": "the template version the HTML came from, copied into the signed snapshot metadata"
            },
            {
              "name": "completedAgreementSnapshotS3Key",
              "meaning": "cases/<caseId>/agreements/<id>-<type>-xxxx.html, or the case file's own key on the external path"
            },
            {
              "name": "title",
              "meaning": "display title, includes the quote's human readable id for quote-level agreements"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter the paperwork belongs to"
            },
            {
              "field": "quoteId",
              "target": "quotes",
              "meaning": "set for client care letters and CFAs, null for terms of business and letters of authority"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "the owning firm, whose templates produced the HTML"
            },
            {
              "field": "externalSignedFileCaseFileId",
              "target": "documents",
              "meaning": "a scanned signed PDF an admin attached instead of in-app signing"
            }
          ],
          "lifecycle": "pending → completed",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/ClientAgreementSignatureRequest",
          "name": "ClientAgreementSignatureRequest",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2516,
          "idPrefix": "sigreq_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "agreement",
              "type": "ClientAgreement",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientAgreement",
              "onDelete": null
            },
            {
              "name": "agreementId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "ClientAgreementSignatureRequestStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "signature",
              "type": "ClientAgreementSignature",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "ClientAgreementSignature",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([agreementId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "agreement",
              "target": "ClientAgreement",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "agreementId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreement",
              "targetDomain": "compliance"
            },
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            },
            {
              "field": "signature",
              "target": "ClientAgreementSignature",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreementSignature",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "ClientAgreement",
              "field": "signatureRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/ClientAgreement",
              "sourceDomain": "compliance"
            },
            {
              "model": "ClientAgreementSignature",
              "field": "signatureRequest",
              "fk": true,
              "list": false,
              "sourceKey": "app/ClientAgreementSignature",
              "sourceDomain": "compliance"
            },
            {
              "model": "Customer",
              "field": "clientAgreementSignatureRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "clientAgreementSignatureRequests"
            }
          ],
          "usage": {
            "total": 9,
            "reads": 4,
            "writes": 5,
            "ops": {
              "update": 3,
              "create": 1,
              "count": 2,
              "findUnique": 1,
              "findUniqueOrThrow": 1,
              "deleteMany": 1
            },
            "byArea": [
              {
                "area": "api/agreements",
                "reads": 3,
                "writes": 3,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/cases",
                "reads": 1,
                "writes": 2,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/agreements/service/completeAgreementWithExternalFile.ts",
                "line": 123,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/agreements/service/createSignatureRequestForAgreement.ts",
                "line": 26,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/agreements/signatures/service/signAgreement.ts",
                "line": 23,
                "op": "update"
              }
            ],
            "nested": 26,
            "nestedByArea": [
              {
                "area": "api/agreements",
                "n": 18
              },
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "api/_root",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "An ask for one Customer to sign one agreement. Terms of business, client care letters and CFAs get one per CUSTOMER party on the case; a letter of authority gets exactly one, created with the agreement.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "pending until signed; cancelled is the revoke path"
            }
          ],
          "references": [
            {
              "field": "agreementId",
              "target": "compliance",
              "meaning": "the document to sign"
            },
            {
              "field": "customerId",
              "target": "people",
              "meaning": "the Customer being asked; Knock notifies their Person if notifyClient is set"
            }
          ],
          "lifecycle": "pending → signed / cancelled",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/ClientAgreementSignature",
          "name": "ClientAgreementSignature",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2535,
          "idPrefix": "clagsig_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "signatureRequest",
              "type": "ClientAgreementSignatureRequest",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "ClientAgreementSignatureRequest",
              "onDelete": null
            },
            {
              "name": "signatureRequestId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "signingPerson",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": null
            },
            {
              "name": "signingPersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "snapshotHash",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ipAddress",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "signedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "signatureRequest",
              "target": "ClientAgreementSignatureRequest",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "signatureRequestId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/ClientAgreementSignatureRequest",
              "targetDomain": "compliance"
            },
            {
              "field": "signingPerson",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "signingPersonId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "ClientAgreementSignatureRequest",
              "field": "signature",
              "fk": false,
              "list": false,
              "sourceKey": "app/ClientAgreementSignatureRequest",
              "sourceDomain": "compliance"
            },
            {
              "model": "Person",
              "field": "clientAgreementSignatures",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "signingPerson"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "clientAgreementSignatures"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "deleteMany": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/service/removePartyFromCase.ts",
                "line": 73,
                "op": "deleteMany"
              }
            ],
            "nested": 11,
            "nestedByArea": [
              {
                "area": "api/agreements",
                "n": 9
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "ui/_app",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The evidence that a named person signed. One row per signature request, created in the same update that flips the request to signed.",
          "keyFields": [
            {
              "name": "snapshotHash",
              "meaning": "base64 MD5 of the exact HTML the signer's browser posted back; external signing writes the literal string external-file"
            },
            {
              "name": "ipAddress",
              "meaning": "the signer's IP; external signing writes external-signing:admin:<adminId> instead"
            },
            {
              "name": "signedAt",
              "meaning": "server timestamp at signing, printed in the snapshot metadata and the UI"
            }
          ],
          "references": [
            {
              "field": "signatureRequestId",
              "target": "compliance",
              "meaning": "unique, so a request can only ever carry one signature"
            },
            {
              "field": "signingPersonId",
              "target": "people",
              "meaning": "the Person who signed; on the external path this is the requested customer's Person"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-only-writes"
          ]
        },
        {
          "key": "app/RiskAssessment",
          "name": "RiskAssessment",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2559,
          "idPrefix": "ra_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 16,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseFiles",
              "type": "CaseFile",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "CaseFile",
              "onDelete": null
            },
            {
              "name": "assessingFirmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "assessingFirmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "operationalRiskRating",
              "type": "RiskAssessmentRating",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "amlRiskRating",
              "type": "RiskAssessmentRating",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "overallRiskRating",
              "type": "RiskAssessmentRating",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "results",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Format: { id, category, question, answer }",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "review",
              "type": "RiskAssessmentReview",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "RiskAssessmentReview",
              "onDelete": null
            },
            {
              "name": "ipAddress",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "version",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "resultsSchemaVersion",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "caseFiles",
              "target": "CaseFile",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/CaseFile",
              "targetDomain": "documents"
            },
            {
              "field": "assessingFirmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "assessingFirmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "review",
              "target": "RiskAssessmentReview",
              "list": false,
              "optional": true,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/RiskAssessmentReview",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "riskAssessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "CaseFile",
              "field": "riskAssessment",
              "fk": true,
              "list": false,
              "sourceKey": "app/CaseFile",
              "sourceDomain": "documents"
            },
            {
              "model": "FirmEmployee",
              "field": "riskAssessments",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "RiskAssessmentReview",
              "field": "riskAssessment",
              "fk": true,
              "list": false,
              "sourceKey": "app/RiskAssessmentReview",
              "sourceDomain": "compliance"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "documents",
              "model": "CaseFile",
              "field": "caseFiles"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "assessingFirmEmployee"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "riskAssessments"
            },
            {
              "dir": "in",
              "domain": "documents",
              "model": "CaseFile",
              "field": "riskAssessment"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "riskAssessments"
            }
          ],
          "usage": {
            "total": 12,
            "reads": 7,
            "writes": 5,
            "ops": {
              "findUniqueOrThrow": 1,
              "findMany": 3,
              "create": 4,
              "findFirst": 3,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 5,
                "writes": 3,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "ui/cases",
                "reads": 0,
                "writes": 2,
                "domain": "cases",
                "kind": "ui-feature"
              }
            ],
            "writeSites": [
              {
                "file": "apps/platform/src/features/cases/components/Details/DetailsList.tsx",
                "line": 195,
                "op": "create"
              },
              {
                "file": "apps/platform/src/features/cases/components/Details/DetailsList.tsx",
                "line": 231,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/cases/riskAssessments/procedures/createRiskAssessment.ts",
                "line": 75,
                "op": "create"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/solicitors",
                "n": 1
              }
            ],
            "typeMentions": 59,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 34
              },
              {
                "area": "ui/_app",
                "n": 9
              },
              {
                "area": "pkg/ui",
                "n": 6
              },
              {
                "area": "api/cases",
                "n": 4
              },
              {
                "area": "pkg/shared",
                "n": 4
              },
              {
                "area": "admin",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "The owning lawyer's AML and operational risk scoring of a case, filed once from the case details screen. A case cannot open without one, and a high or highest rating needs an admin review to accept it.",
          "keyFields": [
            {
              "name": "overallRiskRating",
              "meaning": "low, medium, high or highest; low and medium open the case on their own"
            },
            {
              "name": "operationalRiskRating",
              "meaning": "scored questionnaire rating, only set by the v1 procedure"
            },
            {
              "name": "amlRiskRating",
              "meaning": "geographic, service and client answers rolled up, only set by the v1 procedure"
            },
            {
              "name": "results",
              "meaning": "the full answer set as JSON; shape depends on resultsSchemaVersion"
            },
            {
              "name": "resultsSchemaVersion",
              "meaning": "1 for the scored questionnaire, 2 for the risk-marker answers written by createRiskAssessmentV2"
            },
            {
              "name": "ipAddress",
              "meaning": "the assessing employee's IP, captured for the audit trail"
            },
            {
              "name": "version",
              "meaning": "the questionnaire version the lawyer filled in"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter being assessed"
            },
            {
              "field": "assessingFirmEmployeeId",
              "target": "firms",
              "meaning": "the FirmEmployee who filled the questionnaire in"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "two-schema-versions"
          ]
        },
        {
          "key": "app/RiskAssessmentReview",
          "name": "RiskAssessmentReview",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 2589,
          "idPrefix": "rarev_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "riskAssessment",
              "type": "RiskAssessment",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "RiskAssessment",
              "onDelete": null
            },
            {
              "name": "riskAssessmentId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewingFirmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "reviewingFirmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "RiskAssessmentReviewStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "notes",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "riskAssessment",
              "target": "RiskAssessment",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "riskAssessmentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/RiskAssessment",
              "targetDomain": "compliance"
            },
            {
              "field": "reviewingFirmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "reviewingFirmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            }
          ],
          "relationsIn": [
            {
              "model": "FirmEmployee",
              "field": "riskAssessmentReviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            },
            {
              "model": "RiskAssessment",
              "field": "review",
              "fk": false,
              "list": false,
              "sourceKey": "app/RiskAssessment",
              "sourceDomain": "compliance"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "reviewingFirmEmployee"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "riskAssessmentReviews"
            }
          ],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/riskAssessments/procedures/addRiskAssessmentReview.ts",
                "line": 18,
                "op": "create"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 4
              },
              {
                "area": "api/solicitors",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "An admin's decision on a high or highest risk assessment. An accepted review is what lets openCaseIfReady take the case ACTIVE anyway; rejected leaves it blocked.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "accepted or rejected"
            },
            {
              "name": "notes",
              "meaning": "the reviewer's reasoning, optional"
            }
          ],
          "references": [
            {
              "field": "riskAssessmentId",
              "target": "compliance",
              "meaning": "unique, so one assessment carries at most one review"
            },
            {
              "field": "reviewingFirmEmployeeId",
              "target": "firms",
              "meaning": "the FirmEmployee credited with the review, passed in by the admin"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/KycWorkflowRun",
          "name": "KycWorkflowRun",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 520,
          "idPrefix": "kyc_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "onfidoWorkflowRunId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": true,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "KycWorkflowRunType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "customer",
              "type": "Customer",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Customer",
              "onDelete": null
            },
            {
              "name": "customerId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "KycWorkflowRunStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "extractedFirstName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "extractedLastName",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([customerId, status, createdAt(sort: Desc)])"
          ],
          "looseRefs": [
            "onfidoWorkflowRunId"
          ],
          "relationsOut": [
            {
              "field": "customer",
              "target": "Customer",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "customerId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Customer",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Customer",
              "field": "kycWorkflowRuns",
              "fk": false,
              "list": true,
              "sourceKey": "app/Customer",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Customer",
              "field": "customer"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Customer",
              "field": "kycWorkflowRuns"
            }
          ],
          "usage": {
            "total": 16,
            "reads": 11,
            "writes": 5,
            "ops": {
              "findFirstOrThrow": 1,
              "update": 4,
              "findUniqueOrThrow": 3,
              "findFirst": 3,
              "findMany": 2,
              "create": 1,
              "findUnique": 2
            },
            "byArea": [
              {
                "area": "api/kyc",
                "reads": 9,
                "writes": 3,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/_integrations",
                "reads": 2,
                "writes": 2,
                "domain": "plumbing",
                "kind": "api-core"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/onfido/webhooks.ts",
                "line": 72,
                "op": "update"
              },
              {
                "file": "packages/api/src/integrations/onfido/webhooks.ts",
                "line": 146,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/kyc/procedures/markKycCheckProcessing.ts",
                "line": 30,
                "op": "update"
              }
            ],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/search",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              }
            ],
            "typeMentions": 7,
            "typeMentionsByArea": [
              {
                "area": "api/kyc",
                "n": 7
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One Onfido identity check on a Customer. The row mirrors the Onfido workflow run and is updated from the Onfido webhook; the Customer's own kycStatus is the summary the rest of the product reads.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "awaiting_input, processing, then error or abandoned; approved, review and declined are final and never overwritten"
            },
            {
              "name": "type",
              "meaning": "initialVerification (client-driven), ongoingMonitoring (solicitor, at most weekly), manual (admin link)"
            },
            {
              "name": "onfidoWorkflowRunId",
              "meaning": "unique Onfido id, the lookup key for webhooks and for fetching the report and images"
            },
            {
              "name": "extractedFirstName",
              "meaning": "name read off the document by Onfido, filled in by the updateWorkflowRunWithName job"
            },
            {
              "name": "extractedLastName",
              "meaning": "the surname from the same parsed report, used to compare against the Person's name"
            }
          ],
          "references": [
            {
              "field": "customerId",
              "target": "people",
              "meaning": "the Customer being verified; their onfidoApplicantId is created on first request"
            }
          ],
          "lifecycle": "awaiting_input → processing → approved / review / declined / error / abandoned",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/Address",
          "name": "Address",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3564,
          "idPrefix": "addr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 17,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "AddressType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "line1",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "line2",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "line3",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "town",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "postcode",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "udprn",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "label",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "addressChecks",
              "type": "AddressCheck",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AddressCheck",
              "onDelete": null
            },
            {
              "name": "addressCheckMatches",
              "type": "AddressCheck",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AddressCheck",
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([firmId])",
            "@@index([postcode])",
            "@@index([udprn])",
            "@@index([caseId])",
            "@@index([firmId, postcode])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "addressChecks",
              "target": "AddressCheck",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AddressCheck",
              "targetDomain": "compliance"
            },
            {
              "field": "addressCheckMatches",
              "target": "AddressCheck",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/AddressCheck",
              "targetDomain": "compliance"
            }
          ],
          "relationsIn": [
            {
              "model": "AddressCheck",
              "field": "address",
              "fk": true,
              "list": false,
              "sourceKey": "app/AddressCheck",
              "sourceDomain": "compliance"
            },
            {
              "model": "AddressCheck",
              "field": "searchResultAddresses",
              "fk": false,
              "list": true,
              "sourceKey": "app/AddressCheck",
              "sourceDomain": "compliance"
            },
            {
              "model": "Case",
              "field": "addresses",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Firm",
              "field": "addresses",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "addresses"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "addresses"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 4,
            "writes": 3,
            "ops": {
              "findMany": 2,
              "findUniqueOrThrow": 1,
              "findUnique": 1,
              "create": 1,
              "update": 1,
              "delete": 1
            },
            "byArea": [
              {
                "area": "api/addresses",
                "reads": 2,
                "writes": 3,
                "domain": "compliance",
                "kind": "api-module"
              },
              {
                "area": "api/addressChecks",
                "reads": 2,
                "writes": 0,
                "domain": "compliance",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/addresses/service.ts",
                "line": 9,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/addresses/service.ts",
                "line": 15,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/addresses/service.ts",
                "line": 25,
                "op": "delete"
              }
            ],
            "nested": 4,
            "nestedByArea": [
              {
                "area": "api/addressChecks",
                "n": 2
              },
              {
                "area": "api/addresses",
                "n": 1
              },
              {
                "area": "api/search",
                "n": 1
              }
            ],
            "typeMentions": 52,
            "typeMentionsByArea": [
              {
                "area": "ui/cases",
                "n": 19
              },
              {
                "area": "admin",
                "n": 17
              },
              {
                "area": "api/outbound-mail",
                "n": 4
              },
              {
                "area": "api/test-data",
                "n": 3
              },
              {
                "area": "ui/outbound-mail",
                "n": 2
              },
              {
                "area": "api/addresses",
                "n": 2
              },
              {
                "area": "ui/earnings",
                "n": 1
              },
              {
                "area": "ui/kyc",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "A UK address recorded against a case by a lawyer, for example the property in a conveyance. It exists so it can be searched against every other address the firm holds.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "AddressType has one value, CASE, and the service hardcodes it"
            },
            {
              "name": "postcode",
              "meaning": "normalised on input and the only thing the conflict search matches on; indexed with firmId"
            },
            {
              "name": "label",
              "meaning": "what the address is on this case, chosen by the lawyer"
            },
            {
              "name": "udprn",
              "meaning": "the Royal Mail delivery point number from the lookup, stored and indexed but not used in matching"
            }
          ],
          "references": [
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "the firm that owns the address and the boundary the conflict search stays inside"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the matter the address belongs to; optional in the schema, always set by the lawyer create path"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/AddressCheck",
          "name": "AddressCheck",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3597,
          "idPrefix": "achk_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 20,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "addressId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Links to address, case, and firm",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "address",
              "type": "Address",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Address",
              "onDelete": "Restrict"
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": "Restrict"
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": "Restrict"
            },
            {
              "name": "ranBy",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Audit: Who ran the check and when",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "runner",
              "type": "Person",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": "Restrict"
            },
            {
              "name": "ranAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "AddressCheckStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": "Status and outcome",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "outcome",
              "type": "AddressCheckOutcome",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "searchResults",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Search results stored as JSON for audit trail",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "searchResultAddresses",
              "type": "Address",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "Address",
              "onDelete": null
            },
            {
              "name": "reviewedBy",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Compliance review (admin only)",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewer",
              "type": "Person",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Person",
              "onDelete": "SetNull"
            },
            {
              "name": "reviewedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewNote",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([firmId, status])",
            "@@index([caseId])",
            "@@index([addressId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "address",
              "target": "Address",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "addressId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Restrict",
              "targetKey": "app/Address",
              "targetDomain": "compliance"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Restrict",
              "targetKey": "app/Case",
              "targetDomain": "cases"
            },
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": "Restrict",
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "runner",
              "target": "Person",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "ranBy"
              ],
              "references": [
                "id"
              ],
              "relationName": "AddressCheckRunner",
              "onDelete": "Restrict",
              "targetKey": "app/Person",
              "targetDomain": "people"
            },
            {
              "field": "searchResultAddresses",
              "target": "Address",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Address",
              "targetDomain": "compliance"
            },
            {
              "field": "reviewer",
              "target": "Person",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "reviewedBy"
              ],
              "references": [
                "id"
              ],
              "relationName": "AddressCheckReviewer",
              "onDelete": "SetNull",
              "targetKey": "app/Person",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Address",
              "field": "addressChecks",
              "fk": false,
              "list": true,
              "sourceKey": "app/Address",
              "sourceDomain": "compliance"
            },
            {
              "model": "Address",
              "field": "addressCheckMatches",
              "fk": false,
              "list": true,
              "sourceKey": "app/Address",
              "sourceDomain": "compliance"
            },
            {
              "model": "Case",
              "field": "addressChecks",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Firm",
              "field": "addressChecks",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "Person",
              "field": "addressChecksRun",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            },
            {
              "model": "Person",
              "field": "addressChecksReviewed",
              "fk": false,
              "list": true,
              "sourceKey": "app/Person",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "runner"
            },
            {
              "dir": "out",
              "domain": "people",
              "model": "Person",
              "field": "reviewer"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "addressChecks"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "addressChecks"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "addressChecksRun"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Person",
              "field": "addressChecksReviewed"
            }
          ],
          "usage": {
            "total": 6,
            "reads": 4,
            "writes": 2,
            "ops": {
              "findFirst": 1,
              "findMany": 1,
              "findUnique": 2,
              "updateMany": 1,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/addressChecks",
                "reads": 4,
                "writes": 2,
                "domain": "compliance",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/addressChecks/service.ts",
                "line": 85,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/addressChecks/service.ts",
                "line": 165,
                "op": "create"
              }
            ],
            "nested": 2,
            "nestedByArea": [
              {
                "area": "api/addressChecks",
                "n": 1
              },
              {
                "area": "api/addresses",
                "n": 1
              }
            ],
            "typeMentions": 2,
            "typeMentionsByArea": [
              {
                "area": "admin",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One run of the conflict search for one address, kept as an audit record. Created automatically whenever a lawyer adds an address, and left REVIEWING if the search found another case at the same postcode.",
          "keyFields": [
            {
              "name": "status",
              "meaning": "COMPLETED when nothing matched, REVIEWING when it did, RESOLVED once someone has judged it"
            },
            {
              "name": "outcome",
              "meaning": "NO_CONFLICT set automatically on a clean run, otherwise CONFLICT or RISK_OF_CONFLICT chosen by the reviewer"
            },
            {
              "name": "searchResults",
              "meaning": "JSON { query, matches } holding the postcode searched and the matched addresses as they were"
            },
            {
              "name": "ranAt",
              "meaning": "when the search ran; the list and the per-address view both order by it"
            },
            {
              "name": "reviewNote",
              "meaning": "required free text explaining the resolution"
            },
            {
              "name": "reviewedAt",
              "meaning": "set together with reviewedBy and the outcome when the check is resolved"
            }
          ],
          "references": [
            {
              "field": "addressId",
              "target": "compliance",
              "meaning": "the address that was checked; Restrict, so a checked address cannot be deleted"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case the address was added to, excluded from its own search"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "the firm whose address book was searched"
            },
            {
              "field": "ranBy",
              "target": "people",
              "meaning": "the Person who added the address and so triggered the check"
            },
            {
              "field": "reviewedBy",
              "target": "people",
              "meaning": "whoever resolved it; the schema comment says admin only but resolve-lawyer lets a case lawyer do it too"
            }
          ],
          "lifecycle": "REVIEWING → RESOLVED (or COMPLETED straight away when nothing matched)",
          "grouped": [],
          "flags": []
        },
        {
          "key": "app/CaseInternalReview",
          "name": "CaseInternalReview",
          "table": null,
          "datastore": "app",
          "domain": "compliance",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3125,
          "idPrefix": "cintrev_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 14,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firm",
              "type": "Firm",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Firm",
              "onDelete": null
            },
            {
              "name": "firmId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "firmEmployee",
              "type": "FirmEmployee",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "FirmEmployee",
              "onDelete": null
            },
            {
              "name": "firmEmployeeId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseVersion",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "CaseInternalReviewType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "reviewerType",
              "type": "CaseInternalReviewerType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "riskScore",
              "type": "CaseInternalReviewRiskScore",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "details",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId])",
            "@@index([firmId])",
            "@@index([firmEmployeeId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "firm",
              "target": "Firm",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Firm",
              "targetDomain": "firms"
            },
            {
              "field": "firmEmployee",
              "target": "FirmEmployee",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "firmEmployeeId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/FirmEmployee",
              "targetDomain": "firms"
            },
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "reviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            },
            {
              "model": "Firm",
              "field": "internalReviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/Firm",
              "sourceDomain": "firms"
            },
            {
              "model": "FirmEmployee",
              "field": "internalReviews",
              "fk": false,
              "list": true,
              "sourceKey": "app/FirmEmployee",
              "sourceDomain": "firms"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "firms",
              "model": "Firm",
              "field": "firm"
            },
            {
              "dir": "out",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "firmEmployee"
            },
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "reviews"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "Firm",
              "field": "internalReviews"
            },
            {
              "dir": "in",
              "domain": "firms",
              "model": "FirmEmployee",
              "field": "internalReviews"
            }
          ],
          "usage": {
            "total": 3,
            "reads": 2,
            "writes": 1,
            "ops": {
              "findMany": 2,
              "create": 1
            },
            "byArea": [
              {
                "area": "admin",
                "reads": 2,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/case-internal-reviews",
                "reads": 0,
                "writes": 1,
                "domain": "compliance",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/case-internal-reviews/caseInternalReview.events.ts",
                "line": 27,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A quality-assurance opinion on a live case, written by Lawrence rather than by a human reviewer. A 2am cron queues every PENDING, OPENING and ACTIVE case, and a review only runs if the case context hash changed since last time.",
          "keyFields": [
            {
              "name": "riskScore",
              "meaning": "highRisk, moderateRisk, neutralRisk, lowRisk or minimalRisk, straight from the model's structured output"
            },
            {
              "name": "reviewerType",
              "meaning": "the enum has one value, lawrence; nothing writes a human reviewer"
            },
            {
              "name": "type",
              "meaning": "the enum has one value, qualityAssurance"
            },
            {
              "name": "caseVersion",
              "meaning": "the SHA-256 hash of the case context the review was based on, also the change detector in KV"
            },
            {
              "name": "details",
              "meaning": "the model's written findings; a highRisk result opens an Intercom conversation about the case"
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case reviewed"
            },
            {
              "field": "firmId",
              "target": "firms",
              "meaning": "the owning firm, taken from the case owner"
            },
            {
              "field": "firmEmployeeId",
              "target": "firms",
              "meaning": "the case owner whose work is being judged, not a reviewer"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "ai-written",
            "admin-read-only"
          ]
        }
      ]
    },
    {
      "id": "quality",
      "order": 15,
      "groups": [],
      "name": "Case quality: watching every conversation",
      "tagline": "Spans of client and lawyer contact, LLM classification, and the alerts lawyers act on",
      "whatItIs": "This domain watches the conversation on a case and tells the lawyer when the client is waiting. Every message, filed email and phone-call note is recorded as a spanCommunication and attached to a span, which is one stretch of contact by one side. When a client span goes quiet, an LLM classifies it for sentiment and whether it needs a REPLY or just an ACKNOWLEDGEMENT, writes a classification, and stamps a one-line summary onto the span. If the classification scores high enough, an alert is raised OPEN with a rank from 1 to 9, and a cron job walks the rank upward while nobody answers. Lawyers see the alerts in the platform alerts panel and in a weekday digest email, and they can resolve one by hand or just reply to the client, which resolves it for them. Admins can snooze an alert to get it out of the way.",
      "howItConnects": "Everything here hangs off a matter id that lives somewhere else, either a v2 `Case` or a v3 matter, and off person ids from people. The inputs come from chat, email and cases: `app/case/message.received`, `app/case/note.created`, `app/case/file.ingestionSucceeded`, `app/case/mail.uploaded`, `app/case/case.opened` and `app/case/case.cancelled` on the v2 side, with `messaging-service/message.created`, `matter-service/note.created`, `email-service/message.uploaded`, `matter-service/matter.created` and `matter-service/matter.cancelled` as the v3 twins. The service is the only v2 domain behind its own deployable with its own Postgres database, and it uses Drizzle rather than Prisma. It never reads the v2 or v3 databases: it pulls case details, notes, messages and emails back over tRPC to the v2 API and over a generated HTTP client to v3. Outbound it publishes the `cqs/case-alert/*` events, which the v2 API turns into Knock notifications and which the service's own Intercom module turns into lawyer support tickets.",
      "lifecycle": "OPEN → USER_RESOLVED → CONFIRMED_RESOLVED / CANCELLED",
      "flows": [
        {
          "id": "communication-to-alert",
          "title": "From a communication to an alert",
          "mermaid": "flowchart TD\n  MSG[chat message] --> HM[handleMessageReceived]\n  NOTE[case note] --> PRE[preprocessCaseNote LLM]\n  EML[filed eml or msg file] --> HF[handleFileIngestionSucceeded]\n  PRE --> CN[clientContacted true]\n  CN --> HN[handleCaseNoteClassificationSucceeded]\n  HM --> SPAN[getOrCreateSpan for matter and role]\n  HN --> SPAN\n  HF --> SPAN\n  SPAN --> SC[insert spanCommunication]\n  SC --> EV[cqs/span/communication.created]\n  EV -->|senderRole CLIENT| CLS[classifySpan LLM]\n  EV -->|senderRole LAWYER| RES[confirm-resolve open alerts on matter]\n  CLS --> REC[classification plus span sentiment and summary]\n  REC --> RANK[rank from requiresAction, sentiment, expedited]\n  RANK -->|rank above zero| AL[alert OPEN plus alertEvent CREATION]\n  RANK -->|rank zero| NONE[no alert]\n  AL --> OUT[cqs/case-alert/alert.created]",
          "caption": "A span is opened or reused per matter and role, communications land on it, and only a CLIENT span gets classified. Lawyer communications resolve instead of classify."
        },
        {
          "id": "alert-states",
          "title": "How an alert ends",
          "mermaid": "flowchart LR\n  OPEN[OPEN] -->|escalateAlerts cron bumps rank| OPEN\n  OPEN -->|markAlertResolved| USER[USER_RESOLVED]\n  OPEN -->|lawyer communication on matter| CONF[CONFIRMED_RESOLVED]\n  USER -->|lawyer communication on matter| CONF\n  OPEN -->|case or matter cancelled| CANC[CANCELLED]\n  USER -->|markAlertOpen| OPEN\n  CONF -->|markAlertOpen| OPEN",
          "caption": "USER_RESOLVED is the lawyer's claim that it is handled. CONFIRMED_RESOLVED is the service seeing an actual lawyer communication. Snoozing is a separate boolean and does not change alertStatus."
        }
      ],
      "notes": [
        {
          "kind": "status",
          "body": "`span.replyTime` is declared as a Postgres interval and nothing in the service ever writes or reads it. The column was meant to hold how long the client waited for a reply on that span. Today it is always null."
        },
        {
          "kind": "status",
          "body": "The `alert_resolution_type` enum in the Drizzle schema is spread from the span communication types, so its real values are PHONE_CALL, EMAIL, MESSAGE and NO_ACTION_REQUIRED. The extractor only picked up the literal NO_ACTION_REQUIRED."
        },
        {
          "kind": "status",
          "body": "`apiSource` V2 or V3 is stamped on every span and spanCommunication and decides which platform the service calls back into for case details, messages, notes and emails. V3 work is also gated on the `v3-case-alerts-enabled` PostHog flag and on the firm's `caseAlertsEnabled` setting."
        },
        {
          "kind": "status",
          "body": "The Intercom ticket integration is V2 only. `cqs/case-alert/alert.created`, `escalated` and `unsnoozed` are emitted with `source: \"V2\"` only, so V3 alerts are readable over the API but raise no notification."
        },
        {
          "kind": "status",
          "body": "`cqs/case-alert/generateForCase.requested` has a handler (`generateLatestAlertForCase`) but no emitter anywhere in the repo. It is a backfill entry point, fired by hand, that reconstructs the last client and lawyer spans from case message history."
        },
        {
          "kind": "companion",
          "body": "`apps/platform/src/features/alerts` is the v2 reader: the alerts list, the resolve menu and the reply, case-note and file-email modals. It holds no tables of its own and talks to `packages/api/src/modules/cases/case-alerts`, which proxies to the service over signed tRPC."
        },
        {
          "kind": "duplication",
          "body": "sentiment and requiresAction exist on both `classification` and `span`. The classification row is the history, one per LLM run; the span columns are the latest values copied over in the same transaction."
        }
      ],
      "datastores": [
        "case_quality"
      ],
      "areas": [
        {
          "id": "service/case-quality",
          "kind": "service",
          "label": "case-quality",
          "path": "services/case-quality",
          "files": 115,
          "prismaSites": 58
        },
        {
          "id": "ui/alerts",
          "kind": "ui-feature",
          "label": "alerts",
          "path": "apps/platform/src/features/alerts",
          "files": 26,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/case/file.ingestionSucceeded",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleFileIngestionSucceeded.ts",
            "line": 78,
            "live": "silent"
          },
          {
            "name": "Case Quality - Classify Span",
            "namespace": "Case Quality - Classify Span",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-classification/classifySpan.ts",
            "line": 114,
            "live": "silent"
          },
          {
            "name": "Case Quality - Preprocess Case Note",
            "namespace": "Case Quality - Preprocess Case Note",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/case-note-preprocessing/preprocessCaseNote.ts",
            "line": 58,
            "live": "silent"
          },
          {
            "name": "cqs/case-alert/alert.cancelled",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleCaseCancelled.ts",
            "line": 67,
            "live": "rare"
          },
          {
            "name": "cqs/case-alert/alert.created",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleCaseOpened.ts",
            "line": 106,
            "live": "rare"
          },
          {
            "name": "cqs/case-alert/alert.escalated",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleSpanClassificationCreated.ts",
            "line": 141,
            "live": "active"
          },
          {
            "name": "cqs/case-alert/alert.resolved",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleLawyerSpanCommunicationCreated.ts",
            "line": 51,
            "live": "active"
          },
          {
            "name": "cqs/case-alert/alert.snoozed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/markAlertSnoozed.ts",
            "line": 58,
            "live": "silent"
          },
          {
            "name": "cqs/case-alert/alert.unsnoozed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/markAlertUnsnoozed.ts",
            "line": 58,
            "live": "silent"
          },
          {
            "name": "cqs/case-note/preprocessing.completed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/case-note-preprocessing/preprocessCaseNote.ts",
            "line": 58,
            "live": "active"
          },
          {
            "name": "cqs/span/classification.completed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/generateLatestAlertForCase.ts",
            "line": 242,
            "live": "active"
          },
          {
            "name": "cqs/span/communication.created",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleCaseNoteClassificationSucceeded.ts",
            "line": 47,
            "live": "active"
          }
        ],
        "consumes": [
          {
            "name": "app/case/case.cancelled",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleCaseCancelled.ts",
            "line": 10,
            "live": "silent"
          },
          {
            "name": "app/case/case.opened",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleCaseOpened.ts",
            "line": 14,
            "live": "silent"
          },
          {
            "name": "app/case/file.ingestionSucceeded",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleFileIngestionSucceeded.ts",
            "line": 14,
            "live": "silent"
          },
          {
            "name": "app/case/mail.uploaded",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleMailUploaded.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "app/case/message.received",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleMessageReceived.ts",
            "line": 12,
            "live": "active"
          },
          {
            "name": "app/case/note.created",
            "namespace": "app",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/case-note-preprocessing/preprocessCaseNote.ts",
            "line": 10,
            "live": "silent"
          },
          {
            "name": "cqs/case-alert/alert.cancelled",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-intercom/handleAlertResolvedForIntercom.ts",
            "line": 15,
            "live": "rare"
          },
          {
            "name": "cqs/case-alert/alert.created",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-intercom/handleAlertCreatedForIntercom.ts",
            "line": 16,
            "live": "rare"
          },
          {
            "name": "cqs/case-alert/alert.escalated",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-intercom/handleAlertCreatedForIntercom.ts",
            "line": 16,
            "live": "active"
          },
          {
            "name": "cqs/case-alert/alert.resolved",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-intercom/handleAlertResolvedForIntercom.ts",
            "line": 15,
            "live": "active"
          },
          {
            "name": "cqs/case-alert/alert.snoozed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-intercom/handleAlertResolvedForIntercom.ts",
            "line": 15,
            "live": "silent"
          },
          {
            "name": "cqs/case-alert/alert.unsnoozed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-intercom/handleAlertCreatedForIntercom.ts",
            "line": 16,
            "live": "silent"
          },
          {
            "name": "cqs/case-alert/generateForCase.requested",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/generateLatestAlertForCase.ts",
            "line": 14,
            "live": "silent"
          },
          {
            "name": "cqs/case-note/preprocessing.completed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleCaseNoteClassificationSucceeded.ts",
            "line": 6,
            "live": "active"
          },
          {
            "name": "cqs/span/classification.completed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleSpanClassificationCreated.ts",
            "line": 18,
            "live": "active"
          },
          {
            "name": "cqs/span/communication.created",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleLawyerSpanCommunicationCreated.ts",
            "line": 7,
            "live": "active"
          },
          {
            "name": "email-service/message.uploaded",
            "namespace": "email-service",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleMailUploaded.ts",
            "line": 12,
            "live": "active"
          },
          {
            "name": "matter-service/matter.cancelled",
            "namespace": "matter-service",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleCaseCancelled.ts",
            "line": 10,
            "live": "active"
          },
          {
            "name": "matter-service/matter.created",
            "namespace": "matter-service",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleCaseOpened.ts",
            "line": 14,
            "live": "active"
          },
          {
            "name": "matter-service/note.created",
            "namespace": "matter-service",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/case-note-preprocessing/preprocessCaseNote.ts",
            "line": 10,
            "live": "active"
          },
          {
            "name": "messaging-service/message.created",
            "namespace": "messaging-service",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleMessageReceived.ts",
            "line": 12,
            "live": "active"
          }
        ],
        "owns": [
          {
            "name": "Case Quality - Classify Span",
            "namespace": "Case Quality - Classify Span",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-classification/classifySpan.ts",
            "line": 114,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": []
          },
          {
            "name": "Case Quality - Preprocess Case Note",
            "namespace": "Case Quality - Preprocess Case Note",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/case-note-preprocessing/preprocessCaseNote.ts",
            "line": 58,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": []
          },
          {
            "name": "cqs/case-alert/alert.cancelled",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleCaseCancelled.ts",
            "line": 67,
            "live": "rare",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "cases",
              "quality"
            ]
          },
          {
            "name": "cqs/case-alert/alert.created",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleCaseOpened.ts",
            "line": 106,
            "live": "rare",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "cases",
              "quality"
            ]
          },
          {
            "name": "cqs/case-alert/alert.escalated",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/handleSpanClassificationCreated.ts",
            "line": 141,
            "live": "active",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "cqs/case-alert/alert.resolved",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/handleLawyerSpanCommunicationCreated.ts",
            "line": 51,
            "live": "active",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "cases",
              "quality"
            ]
          },
          {
            "name": "cqs/case-alert/alert.snoozed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/markAlertSnoozed.ts",
            "line": 58,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "cqs/case-alert/alert.unsnoozed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-management/markAlertUnsnoozed.ts",
            "line": 58,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "cqs/case-alert/generateForCase.requested",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/generateLatestAlertForCase.ts",
            "line": 14,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "cqs/case-note/preprocessing.completed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/case-note-preprocessing/preprocessCaseNote.ts",
            "line": 58,
            "live": "active",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "cqs/span/classification.completed",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/alert-creation/generateLatestAlertForCase.ts",
            "line": 242,
            "live": "active",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "quality"
            ]
          },
          {
            "name": "cqs/span/communication.created",
            "namespace": "cqs",
            "area": "service/case-quality",
            "file": "services/case-quality/src/modules/span-communication-creation/handleCaseNoteClassificationSucceeded.ts",
            "line": 47,
            "live": "active",
            "via": "rule",
            "emitters": [
              "quality"
            ],
            "consumers": [
              "quality"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "action_requirement",
          "export": "actionRequirement",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 41,
          "doc": null,
          "values": [
            {
              "name": "REPLY",
              "doc": null
            },
            {
              "name": "ACKNOWLEDGEMENT",
              "doc": null
            }
          ],
          "usedBy": [
            "classification",
            "span"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "alert_event_type",
          "export": "alertEventType",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 49,
          "doc": null,
          "values": [
            {
              "name": "CREATION",
              "doc": null
            },
            {
              "name": "ESCALATION",
              "doc": null
            },
            {
              "name": "CANCELLATION",
              "doc": null
            }
          ],
          "usedBy": [
            "alertEvent"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "alert_resolution_type",
          "export": "alertResolutionMethod",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 51,
          "doc": null,
          "values": [
            {
              "name": "NO_ACTION_REQUIRED",
              "doc": null
            }
          ],
          "usedBy": [
            "alert"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "alert_status",
          "export": "alertStatus",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 43,
          "doc": null,
          "values": [
            {
              "name": "OPEN",
              "doc": null
            },
            {
              "name": "USER_RESOLVED",
              "doc": null
            },
            {
              "name": "CONFIRMED_RESOLVED",
              "doc": null
            },
            {
              "name": "CANCELLED",
              "doc": null
            }
          ],
          "usedBy": [
            "alert"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "alert_trigger_type",
          "export": "alertTriggerType",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 55,
          "doc": null,
          "values": [
            {
              "name": "SPAN_CLASSIFICATION",
              "doc": null
            },
            {
              "name": "CASE_OPENING",
              "doc": null
            },
            {
              "name": "MAIL_UPLOADED",
              "doc": null
            }
          ],
          "usedBy": [
            "alert"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "api_source",
          "export": "apiSource",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 34,
          "doc": null,
          "values": [
            {
              "name": "V2",
              "doc": null
            },
            {
              "name": "V3",
              "doc": null
            }
          ],
          "usedBy": [
            "span",
            "spanCommunication"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "external_record_type",
          "export": "externalRecordType",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 36,
          "doc": null,
          "values": [
            {
              "name": "CASE_NOTE",
              "doc": null
            },
            {
              "name": "CASE_FILE",
              "doc": null
            },
            {
              "name": "MESSAGE",
              "doc": null
            }
          ],
          "usedBy": [
            "spanCommunication"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "sentiment",
          "export": "sentiment",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 42,
          "doc": null,
          "values": [
            {
              "name": "POSITIVE",
              "doc": null
            },
            {
              "name": "NEUTRAL",
              "doc": null
            },
            {
              "name": "NEGATIVE",
              "doc": null
            }
          ],
          "usedBy": [
            "classification",
            "span"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "span_communication_type",
          "export": "spanCommunicationType",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 35,
          "doc": null,
          "values": [
            {
              "name": "PHONE_CALL",
              "doc": null
            },
            {
              "name": "EMAIL",
              "doc": null
            },
            {
              "name": "MESSAGE",
              "doc": null
            }
          ],
          "usedBy": [
            "spanCommunication"
          ],
          "datastore": "case_quality",
          "shared": false
        },
        {
          "name": "span_role",
          "export": "spanRole",
          "file": "services/case-quality/src/db/schema.ts",
          "line": 50,
          "doc": null,
          "values": [
            {
              "name": "CLIENT",
              "doc": null
            },
            {
              "name": "LAWYER",
              "doc": null
            }
          ],
          "usedBy": [
            "span",
            "spanCommunication"
          ],
          "datastore": "case_quality",
          "shared": false
        }
      ],
      "usage": {
        "reads": 26,
        "writes": 32
      },
      "models": [
        {
          "key": "case_quality/span",
          "name": "span",
          "table": "span",
          "datastore": "case_quality",
          "domain": "quality",
          "isView": false,
          "file": "services/case-quality/src/db/schema.ts",
          "line": 81,
          "idPrefix": "span_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "matterId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "senderRole",
              "type": "span_role",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sentiment",
              "type": "sentiment",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "summary",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requiresAction",
              "type": "action_requirement",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "api_source",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "replyTime",
              "type": "Interval",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@relations(communications: many(spanCommunication), classifications: many(classification), alerts: many(alert),)"
          ],
          "looseRefs": [
            "matterId"
          ],
          "relationsOut": [],
          "relationsIn": [
            {
              "model": "alert",
              "field": "spanId",
              "fk": true,
              "list": false,
              "sourceKey": "case_quality/alert",
              "sourceDomain": "quality"
            },
            {
              "model": "classification",
              "field": "spanId",
              "fk": true,
              "list": false,
              "sourceKey": "case_quality/classification",
              "sourceDomain": "quality"
            },
            {
              "model": "spanCommunication",
              "field": "spanId",
              "fk": true,
              "list": false,
              "sourceKey": "case_quality/spanCommunication",
              "sourceDomain": "quality"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 14,
            "reads": 9,
            "writes": 5,
            "ops": {
              "insert": 3,
              "update": 2,
              "leftJoin": 7,
              "innerJoin": 1,
              "select": 1
            },
            "byArea": [
              {
                "area": "service/case-quality",
                "reads": 9,
                "writes": 5,
                "domain": "quality",
                "kind": "service"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One unbroken stretch of contact on a matter from one side, either the CLIENT or the LAWYER. A new span opens when the side speaking changes, so a case reads as alternating client and lawyer spans.",
          "keyFields": [
            {
              "name": "senderRole",
              "meaning": "CLIENT or LAWYER. Fixed when the span opens; a role change opens a new span instead."
            },
            {
              "name": "sentiment",
              "meaning": "POSITIVE, NEUTRAL or NEGATIVE from the latest classification of this span."
            },
            {
              "name": "requiresAction",
              "meaning": "REPLY or ACKNOWLEDGEMENT, or null when the LLM said neither is needed."
            },
            {
              "name": "summary",
              "meaning": "One line telling the lawyer what the client wants, written by the classification LLM."
            },
            {
              "name": "source",
              "meaning": "V2 or V3: which platform this matter lives on, and which one the service calls back into."
            },
            {
              "name": "replyTime",
              "meaning": "Postgres interval for how long the reply took. Never written by any code path."
            }
          ],
          "references": [
            {
              "field": "matterId",
              "target": "cases",
              "meaning": "the v2 Case id, or a v3 matter id when source is V3"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "cross-platform",
            "unwritten-column"
          ]
        },
        {
          "key": "case_quality/spanCommunication",
          "name": "spanCommunication",
          "table": "span_communication",
          "datastore": "case_quality",
          "domain": "quality",
          "isView": false,
          "file": "services/case-quality/src/db/schema.ts",
          "line": 61,
          "idPrefix": "spancom_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "spanCommunicationType",
              "type": "span_communication_type",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "externalRecordType",
              "type": "external_record_type",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "externalRecordId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "spanId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "span",
              "onDelete": null
            },
            {
              "name": "senderRole",
              "type": "span_role",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "senderPersonId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "source",
              "type": "api_source",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@relations(span: one(span, { fields: [spanCommunication.spanId], references: [span.id] }),)",
            "@@index([matterId])",
            "@@index([matterId, alertStatus])"
          ],
          "looseRefs": [
            "externalRecordId",
            "senderPersonId"
          ],
          "relationsOut": [
            {
              "field": "spanId",
              "target": "span",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "spanId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "case_quality/span",
              "targetDomain": "quality"
            }
          ],
          "relationsIn": [],
          "crossDomainRelations": [],
          "usage": {
            "total": 10,
            "reads": 5,
            "writes": 5,
            "ops": {
              "insert": 5,
              "innerJoin": 1,
              "from": 3,
              "select": 1
            },
            "byArea": [
              {
                "area": "service/case-quality",
                "reads": 5,
                "writes": 5,
                "domain": "quality",
                "kind": "service"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One concrete act of communication attached to a span: a chat message, an email filed to the case, or a phone call recorded as a case note. It stores only a pointer, and the content is fetched from the owning platform when needed.",
          "keyFields": [
            {
              "name": "spanCommunicationType",
              "meaning": "PHONE_CALL, EMAIL or MESSAGE. A case note that says the client was contacted becomes PHONE_CALL."
            },
            {
              "name": "externalRecordType",
              "meaning": "CASE_NOTE, CASE_FILE or MESSAGE: which kind of record externalRecordId points at."
            },
            {
              "name": "externalRecordId",
              "meaning": "Id of the message, case file or case note in v2 or v3. Nothing here is copied locally."
            },
            {
              "name": "senderRole",
              "meaning": "CLIENT or LAWYER. v2 CUSTOMER maps to CLIENT; SOLICITOR and TEAM_MEMBER both map to LAWYER."
            },
            {
              "name": "source",
              "meaning": "V2 or V3, picked from which platform event created this row."
            }
          ],
          "references": [
            {
              "field": "spanId",
              "target": "quality",
              "meaning": "the span this communication extends"
            },
            {
              "field": "senderPersonId",
              "target": "people",
              "meaning": "the Person who sent it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "pointer-only"
          ]
        },
        {
          "key": "case_quality/classification",
          "name": "classification",
          "table": "classification",
          "datastore": "case_quality",
          "domain": "quality",
          "isView": false,
          "file": "services/case-quality/src/db/schema.ts",
          "line": 99,
          "idPrefix": "class_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "spanId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "span",
              "onDelete": null
            },
            {
              "name": "sentiment",
              "type": "sentiment",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "requiresAction",
              "type": "action_requirement",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "assessedForAlert",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@relations(span: one(span, { fields: [classification.spanId], references: [span.id] }),)"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "spanId",
              "target": "span",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "spanId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "case_quality/span",
              "targetDomain": "quality"
            }
          ],
          "relationsIn": [
            {
              "model": "alertEvent",
              "field": "triggeredByClassificationId",
              "fk": true,
              "list": false,
              "sourceKey": "case_quality/alertEvent",
              "sourceDomain": "quality"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 6,
            "reads": 1,
            "writes": 5,
            "ops": {
              "insert": 2,
              "select": 1,
              "update": 3
            },
            "byArea": [
              {
                "area": "service/case-quality",
                "reads": 1,
                "writes": 5,
                "domain": "quality",
                "kind": "service"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One LLM verdict on a client span: how the client sounds and whether the lawyer owes them a reply. Written by the `classifySpan` Inngest function, which prompts OpenAI through a Langfuse-managed prompt and traces the call.",
          "keyFields": [
            {
              "name": "sentiment",
              "meaning": "POSITIVE, NEUTRAL or NEGATIVE as the model read the client's messages."
            },
            {
              "name": "requiresAction",
              "meaning": "REPLY or ACKNOWLEDGEMENT, null when the model answered NONE."
            },
            {
              "name": "assessedForAlert",
              "meaning": "Inserted false, flipped true once the alert handler has raised, escalated or skipped an alert for it."
            }
          ],
          "references": [
            {
              "field": "spanId",
              "target": "quality",
              "meaning": "the client span that was classified"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "llm-written"
          ]
        },
        {
          "key": "case_quality/alert",
          "name": "alert",
          "table": "alert",
          "datastore": "case_quality",
          "domain": "quality",
          "isView": false,
          "file": "services/case-quality/src/db/schema.ts",
          "line": 116,
          "idPrefix": "alrt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 19,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "spanId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "span",
              "onDelete": null
            },
            {
              "name": "matterId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "title",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rank",
              "type": "BigInt",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "alertStatus",
              "type": "alert_status",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "userResolvedMethod",
              "type": "alert_resolution_type",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "userResolvedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "confirmedResolvedMethod",
              "type": "alert_resolution_type",
              "list": false,
              "optional": true,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "confirmedResolvedAt",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "resolvedBySpanId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "resolvedByPersonId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isForExpeditedMatter",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "triggerType",
              "type": "alert_trigger_type",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "emailId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "adminSnoozed",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "adminSnoozedByPersonId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@relations(span: one(span, { fields: [alert.spanId], references: [span.id] }), events: many(alertEvent),)"
          ],
          "looseRefs": [
            "matterId",
            "resolvedBySpanId",
            "resolvedByPersonId",
            "emailId",
            "adminSnoozedByPersonId"
          ],
          "relationsOut": [
            {
              "field": "spanId",
              "target": "span",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "spanId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "case_quality/span",
              "targetDomain": "quality"
            }
          ],
          "relationsIn": [
            {
              "model": "alertEvent",
              "field": "alertId",
              "fk": true,
              "list": false,
              "sourceKey": "case_quality/alertEvent",
              "sourceDomain": "quality"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 21,
            "reads": 10,
            "writes": 11,
            "ops": {
              "insert": 3,
              "from": 10,
              "update": 8
            },
            "byArea": [
              {
                "area": "service/case-quality",
                "reads": 10,
                "writes": 11,
                "domain": "quality",
                "kind": "service"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One thing a lawyer needs to do on a matter, shown in the platform alerts panel and in the weekday digest email. Ranked 1 to 9 at creation, mapped to LOW, HIGH or URGENT for display, and pushed higher by the escalation cron while it stays OPEN.",
          "keyFields": [
            {
              "name": "alertStatus",
              "meaning": "OPEN, USER_RESOLVED, CONFIRMED_RESOLVED or CANCELLED. A partial unique index allows one OPEN alert per matter and span."
            },
            {
              "name": "rank",
              "meaning": "Urgency score. Built from requiresAction, sentiment and expedition, then incremented by the escalateAlerts cron."
            },
            {
              "name": "triggerType",
              "meaning": "SPAN_CLASSIFICATION, CASE_OPENING or MAIL_UPLOADED: why this alert exists."
            },
            {
              "name": "title",
              "meaning": "The sentence the lawyer reads. Rewritten on escalation for reply and case-opening alerts."
            },
            {
              "name": "userResolvedMethod",
              "meaning": "How the lawyer says they dealt with it: PHONE_CALL, EMAIL, MESSAGE or NO_ACTION_REQUIRED."
            },
            {
              "name": "confirmedResolvedMethod",
              "meaning": "How the service actually saw it dealt with, taken from the lawyer communication that closed it."
            },
            {
              "name": "adminSnoozed",
              "meaning": "Admin has parked the alert. Independent of alertStatus, and unsnoozing on V2 re-notifies the lawyer."
            }
          ],
          "references": [
            {
              "field": "matterId",
              "target": "cases",
              "meaning": "the v2 Case or v3 matter the alert is about"
            },
            {
              "field": "spanId",
              "target": "quality",
              "meaning": "the client span that triggered it; null for CASE_OPENING and MAIL_UPLOADED alerts"
            },
            {
              "field": "resolvedBySpanId",
              "target": "quality",
              "meaning": "the lawyer span whose communication confirmed the resolution"
            },
            {
              "field": "resolvedByPersonId",
              "target": "people",
              "meaning": "the Person who resolved it"
            },
            {
              "field": "adminSnoozedByPersonId",
              "target": "people",
              "meaning": "the admin who snoozed it"
            }
          ],
          "lifecycle": "OPEN → USER_RESOLVED → CONFIRMED_RESOLVED / CANCELLED",
          "grouped": [],
          "flags": [
            "cross-platform"
          ]
        },
        {
          "key": "case_quality/alertEvent",
          "name": "alertEvent",
          "table": "alert_event",
          "datastore": "case_quality",
          "domain": "quality",
          "isView": false,
          "file": "services/case-quality/src/db/schema.ts",
          "line": 153,
          "idPrefix": "alrtevt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "timestamp",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "alertId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "alert",
              "onDelete": null
            },
            {
              "name": "type",
              "type": "alert_event_type",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "triggeredByClassificationId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "classification",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@relations(alert: one(alert, { fields: [alertEvent.alertId], references: [alert.id] }), classification: one(classification, { fields: [alertEvent.triggeredByClassificationId], references: [classification.id], }))"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "alertId",
              "target": "alert",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "alertId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "case_quality/alert",
              "targetDomain": "quality"
            },
            {
              "field": "triggeredByClassificationId",
              "target": "classification",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "triggeredByClassificationId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "case_quality/classification",
              "targetDomain": "quality"
            }
          ],
          "relationsIn": [],
          "crossDomainRelations": [],
          "usage": {
            "total": 7,
            "reads": 1,
            "writes": 6,
            "ops": {
              "insert": 6,
              "from": 1
            },
            "byArea": [
              {
                "area": "service/case-quality",
                "reads": 1,
                "writes": 6,
                "domain": "quality",
                "kind": "service"
              }
            ],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The audit trail of an alert: one row per CREATION, ESCALATION or CANCELLATION. The escalation cron reads the newest row per alert to decide whether enough time has passed to bump the rank again.",
          "keyFields": [
            {
              "name": "type",
              "meaning": "CREATION, ESCALATION or CANCELLATION. Resolution is not recorded here, only on the alert itself."
            },
            {
              "name": "timestamp",
              "meaning": "When the event happened. Distinct from createdAt, which the escalation query actually uses."
            }
          ],
          "references": [
            {
              "field": "alertId",
              "target": "quality",
              "meaning": "the alert this event belongs to"
            },
            {
              "field": "triggeredByClassificationId",
              "target": "quality",
              "meaning": "the classification that caused it; null for cron escalations, case-opening and cancellation"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "append-only"
          ]
        }
      ]
    },
    {
      "id": "ai",
      "order": 16,
      "groups": [],
      "name": "AI: Lawrence and the workflows",
      "tagline": "Lawrence the AI paralegal: its own database, its chat threads, and case workflows",
      "whatItIs": "Lawrence is the AI paralegal a lawyer talks to from the case screen, and this domain is the small amount of state behind it. Six of the eight models live in a second Postgres database reached through AI_DATABASE_URL, not the app database: a chat thread per case and user, its messages, thumbs up or down on an assistant reply, and a pgvector store of chunked case-file text. The other two are in the app database. From here you open the Lawrence popover and ask questions about the case or the law, rate an answer, ask for a briefing note, an advice note, a filled legal form or a letter, watch the generation progress, and work through the checklist of steps a case workflow suggests. Lawrence itself does very little of the thinking: it collects case context, calls out to an artifact generation service, a search service and a python service, and turns what comes back into a draft and a notification.",
      "howItConnects": "Everything is scoped by caseId, but because the ai database is separate there is no foreign key on it, so AIThread.caseId and AIEmbedding.caseId are loose strings and AIThread.userId points at a User in people the same way. Generated output does not stay here: it is published as a CaseArtifact in documents, and once a lawyer accepts the draft it becomes a CaseFile. Context flows the other way, from cases and documents into the prompt, and a new case file triggers ingestion so the file becomes searchable. Lawrence also reaches into chat for the Sendbird message history when a tool asks for it. Four services outside the monolith do the real work: the ingestion management service indexes files, the search service answers retrieval queries, the artifact-generation-service Inngest app drafts briefing notes, advice notes and letters, and a proactive Lawrence service suggests next steps and pulls the case data it needs back through a signed API route. The domain publishes and consumes the largest event surface in v2, 47 of 112 events, mostly the app/case artifact chains and app/workflows state machine traffic.",
      "lifecycle": null,
      "flows": [
        {
          "id": "artifact-generation",
          "title": "How a briefing note, advice note or letter gets made",
          "mermaid": "flowchart TD\n  T[Lawyer asks or workflow step fires] --> R[requestGenerationForCase]\n  R --> KV[Workflow status in Vercel KV]\n  R --> E1[app/case/briefing_note.called]\n  E1 --> H[handleBriefingNoteCalled]\n  H --> AG[artifact-generation-service generate_artifact]\n  AG --> PG[artifact_generation.progressed]\n  AG --> FA[artifact_generation.final_asset_generated]\n  AG --> FL[artifact_generation.failed]\n  PG --> KV\n  FL --> KV\n  FA --> CA[CaseArtifact draft in documents]\n  FA --> NO[Lawrence notification view-draft]",
          "caption": "The three note types share one path. requestBriefingNoteGenerationForCase builds a reduced case context, mints a workflow_id, seeds a step list in Vercel KV and sends app/case/briefing_note.called; the handler invokes generate_artifact on the artifact-generation-service Inngest app. Progress and failure only ever update the KV entry, so nothing about generation state is in Postgres. On success handleArtifactGenerationComplete publishes case.artifacts.created as a draft and Lawrence posts a view-draft notification."
        },
        {
          "id": "form-filling",
          "title": "How a legal form gets filled",
          "mermaid": "flowchart TD\n  A[Lawrence form suggestion accepted] --> B[app/case/form-filling.requested]\n  B --> C[handleFillFormCalled]\n  C --> D[OneAdvanced getFieldMap]\n  D --> E[form-filling-v2]\n  E --> F[python enrich_form]\n  F --> G[Enriched groups in Vercel KV by form hash]\n  E --> H[python populate_form]\n  H --> I[Search service per field]\n  H --> J[Filled field values]\n  J --> K[OneAdvanced createForm and getPdfString]\n  K --> L[saveFormPDF to S3]\n  L --> M[CaseArtifact filledForm]\n  M --> N[app/case/form-filling.completed]",
          "caption": "Form filling is the only python-service path with a live caller. enrich_form groups the OneAdvanced field map and writes a richer description per field into Vercel KV keyed by a hash of the form shape, so the expensive step is cached across cases. populate_form reads it back, retrieves case chunks per field and returns name and value pairs; the TypeScript side renders the PDF, stores it and saves the CaseArtifact with a filling score. A failure sends Lawrence's offer to generate an empty form instead."
        },
        {
          "id": "workflow-run",
          "title": "A workflow run advancing",
          "mermaid": "flowchart TD\n  S[app/workflows/start.requested] --> W[WorkflowRun RUNNING at next version]\n  W --> U[app/workflows/state.updated]\n  TR[Case turns ACTIVE] --> U\n  TF[Tally form processed] --> U\n  FI[File ingestion succeeded] --> U\n  U --> P[civilLitProcessor]\n  P --> AP[Step key appended to state.completedSteps]\n  AP --> Q{Any step left}\n  Q -->|yes| UN[snoozedUntil cleared]\n  Q -->|no| DN[status COMPLETED]\n  UN --> AC[getWorkflowActions offers the next action]",
          "caption": "workflows-v2 is a JSON state machine, not a graph of rows. The step list for a workflowType is hardcoded in workflowRegistry and the run only records which keys are done, in state.completedSteps. The processor listens on app/workflows/state.updated, appends the step, then either completes the run or clears the snooze; the first uncompleted step's suggestedAction is what the lawyer sees, either a message to send, a call to make, or an artifact for Lawrence to generate."
        }
      ],
      "notes": [
        {
          "kind": "legacy",
          "body": "AIDocument, AIDocumentElement and AIEmbedding are the first-generation retrieval store, and no code queries the vectors any more. There is no similarity query anywhere in the monolith or the python service: searchCaseContextV3 goes over signed HTTP to the search service instead, and ingestion goes to the ingestion management service. AIEmbedding.caseId and isSearchable exist for a filter that only one caller still touches, deleteFile flipping isSearchable to false. AIDocument is still read, but only for its extracted text when building briefing note context."
        },
        {
          "kind": "status",
          "body": "Generation progress is not in Postgres. createWorkflowStatus and updateWorkflowStatus keep a per-workflow_id step list in Vercel KV with the step names hardcoded in workflowStatusTracking.ts, and the UI polls that. Nothing about a briefing note run survives in a table until the CaseArtifact appears."
        },
        {
          "kind": "duplication",
          "body": "Two briefing note paths coexist. The live one is app/case/briefing_note.called into the artifact-generation-service. The older one is app/case/briefing-note.requested to ai/case/briefing-note.started to ai/case/briefing-note.created, answered by a python handler that is openly a demo: it sleeps for a few seconds and returns hardcoded copy about fictional parties. The context builder it uses is marked \"Refactor this later when existing briefing notes are deprecated\"."
        },
        {
          "kind": "misfiled",
          "body": "WorkflowRun is not really an AI model. workflows-v2 is a case checklist engine: a step list per workflowType, manual and event-driven step completion, snoozing, and a suggested next action. Only one of the four suggested action types asks Lawrence for anything. It sits closer to cases than to this domain."
        },
        {
          "kind": "status",
          "body": "Of the sixteen Inngest functions the python service registers, only enrich_form and populate_form still have a TypeScript caller. The case_assessments, letter_generation and information_requests functions were superseded by the artifact-generation-service and have no remaining trigger, and the legal research fallback still ships a 13 MB gzipped textbook corpus in the repo. The service reads no database at all: its AI_DATABASE_URL config line is commented out and every payload arrives from TypeScript with the document text already inlined."
        }
      ],
      "datastores": [
        "ai",
        "app"
      ],
      "areas": [
        {
          "id": "api/ai",
          "kind": "api-module",
          "label": "ai",
          "path": "packages/api/src/modules/ai",
          "files": 43,
          "prismaSites": 42,
          "procedures": {
            "queries": 5,
            "mutations": 4
          }
        },
        {
          "id": "api/lawrence",
          "kind": "api-module",
          "label": "lawrence",
          "path": "packages/api/src/modules/lawrence",
          "files": 14,
          "prismaSites": 4,
          "procedures": {
            "queries": 1,
            "mutations": 0
          }
        },
        {
          "id": "api/proactiveLawrence",
          "kind": "api-module",
          "label": "proactiveLawrence",
          "path": "packages/api/src/modules/proactiveLawrence",
          "files": 5,
          "prismaSites": 0,
          "procedures": {
            "queries": 1,
            "mutations": 1
          }
        },
        {
          "id": "api/workflows",
          "kind": "api-module",
          "label": "workflows",
          "path": "packages/api/src/modules/workflows",
          "files": 1,
          "prismaSites": 0,
          "procedures": {
            "queries": 0,
            "mutations": 0
          }
        },
        {
          "id": "api/workflows-v2",
          "kind": "api-module",
          "label": "workflows-v2",
          "path": "packages/api/src/modules/workflows-v2",
          "files": 27,
          "prismaSites": 27,
          "procedures": {
            "queries": 3,
            "mutations": 5
          }
        },
        {
          "id": "pkg/db-ai",
          "kind": "package",
          "label": "db-ai",
          "path": "packages/db-ai",
          "files": 17,
          "prismaSites": 0
        },
        {
          "id": "pkg/lawrence-proactive-client",
          "kind": "package",
          "label": "lawrence-proactive-client",
          "path": "packages/lawrence-proactive-client",
          "files": 3,
          "prismaSites": 0
        },
        {
          "id": "ui/ai",
          "kind": "ui-feature",
          "label": "ai",
          "path": "apps/platform/src/features/ai",
          "files": 41,
          "prismaSites": 0
        },
        {
          "id": "ui/workflows",
          "kind": "ui-feature",
          "label": "workflows",
          "path": "apps/platform/src/features/workflows",
          "files": 6,
          "prismaSites": 0
        },
        {
          "id": "ui/veyo",
          "kind": "ui-feature",
          "label": "veyo",
          "path": "apps/platform/src/features/veyo",
          "files": 2,
          "prismaSites": 0
        },
        {
          "id": "python/_root",
          "kind": "python",
          "label": "python-service",
          "path": "apps/python-service",
          "files": 23,
          "prismaSites": 0
        },
        {
          "id": "python/lawrence",
          "kind": "python",
          "label": "python lawrence",
          "path": "apps/python-service/src/lawrence",
          "files": 7,
          "prismaSites": 0
        },
        {
          "id": "python/case_assessments",
          "kind": "python",
          "label": "python case_assessments",
          "path": "apps/python-service/src/case_assessments",
          "files": 9,
          "prismaSites": 0
        },
        {
          "id": "python/form_filling",
          "kind": "python",
          "label": "python form_filling",
          "path": "apps/python-service/src/form_filling",
          "files": 20,
          "prismaSites": 0
        },
        {
          "id": "python/letter_generation",
          "kind": "python",
          "label": "python letter_generation",
          "path": "apps/python-service/src/letter_generation",
          "files": 10,
          "prismaSites": 0
        },
        {
          "id": "python/legal_research",
          "kind": "python",
          "label": "python legal_research",
          "path": "apps/python-service/src/legal_research",
          "files": 9,
          "prismaSites": 0
        },
        {
          "id": "python/information_requests",
          "kind": "python",
          "label": "python information_requests",
          "path": "apps/python-service/src/information_requests",
          "files": 4,
          "prismaSites": 0
        },
        {
          "id": "python/contracts",
          "kind": "python",
          "label": "python contracts",
          "path": "apps/python-service/src/contracts",
          "files": 6,
          "prismaSites": 0
        },
        {
          "id": "python/config",
          "kind": "python",
          "label": "python config",
          "path": "apps/python-service/src/config",
          "files": 2,
          "prismaSites": 0
        },
        {
          "id": "python/utils",
          "kind": "python",
          "label": "python utils",
          "path": "apps/python-service/src/utils",
          "files": 11,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "ai/case/briefing-note.created",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/event_handlers/handle_briefing_note_requested.py",
            "line": 172,
            "live": "silent"
          },
          {
            "name": "ai/case/briefing-note.started",
            "namespace": "ai",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleBriefingNoteRequested.ts",
            "line": 18,
            "live": "silent"
          },
          {
            "name": "ai/case/lawrence-action.suggested",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 98,
            "live": "silent"
          },
          {
            "name": "ai/case/processing.ended",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 23,
            "live": "silent"
          },
          {
            "name": "ai/case/processing.started",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "ai/case/summary.created",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 32,
            "live": "silent"
          },
          {
            "name": "app/case/context-update.requested",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/lawrence.service.ts",
            "line": 18,
            "live": "rare"
          },
          {
            "name": "app/case/context.updated",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleCaseContextUpdateRequested.ts",
            "line": 23,
            "live": "rare"
          },
          {
            "name": "app/case/file.ingestionSucceeded",
            "namespace": "app",
            "area": "api/ai",
            "file": "packages/api/src/modules/ai/service/emitIngestionCompleteInngestEvent.ts",
            "line": 23,
            "live": "silent"
          },
          {
            "name": "app/workflows/calendly.processed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/calendly/handleCalendlyWebhookReceived.ts",
            "line": 72,
            "live": "silent"
          },
          {
            "name": "app/workflows/start.requested",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/procedures/startWorkflow.ts",
            "line": 27,
            "live": "silent"
          },
          {
            "name": "app/workflows/state.updated",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/service.ts",
            "line": 74,
            "live": "silent"
          },
          {
            "name": "app/workflows/tallyForm.processed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/tally/handleTallyWebhookReceived.ts",
            "line": 117,
            "live": "silent"
          },
          {
            "name": "lawrence/letter_generation.failed",
            "namespace": "lawrence",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 358,
            "live": "silent"
          },
          {
            "name": "lawrence/letter_generation.progressed",
            "namespace": "lawrence",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 117,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "ai/case/briefing-note.created",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/event_handlers/handle_briefing_note_created.py",
            "line": 24,
            "live": "silent"
          },
          {
            "name": "ai/case/briefing-note.started",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/event_handlers/handle_briefing_note_requested.py",
            "line": 24,
            "live": "silent"
          },
          {
            "name": "ai/case/lawrence-action.suggested",
            "namespace": "ai",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleCaseLawrenceActionSuggested.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "ai/case/processing.ended",
            "namespace": "ai",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleCaseProcessing.ts",
            "line": 19,
            "live": "silent"
          },
          {
            "name": "ai/case/processing.started",
            "namespace": "ai",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleCaseProcessing.ts",
            "line": 5,
            "live": "silent"
          },
          {
            "name": "app/case/advice_note.draft_advice_note",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 242,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.answer_factual_qa",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 186,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.answer_legal_question",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 123,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.draft_briefing_note",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 217,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.generate_contextual_qa",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 62,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.generate_factual_qa",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 158,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.generate_legal_questions",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 91,
            "live": "silent"
          },
          {
            "name": "app/case/briefing-note.requested",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleBriefingNoteRequested.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "app/case/context-update.requested",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleCaseContextUpdateRequested.ts",
            "line": 11,
            "live": "rare"
          },
          {
            "name": "app/case/context.updated",
            "namespace": "app",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/event_handlers/handle_case_context_updated.py",
            "line": 42,
            "live": "rare"
          },
          {
            "name": "app/case/file.ingestionSucceeded",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/workflows/civilLitigation/eventHandler.ts",
            "line": 51,
            "live": "silent"
          },
          {
            "name": "app/case/form_filling.enrich_field_group",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_enrichment/enrich_field_groups.py",
            "line": 31,
            "live": "silent"
          },
          {
            "name": "app/case/form_filling.enrich_form.requested",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_enrichment/main.py",
            "line": 32,
            "live": "silent"
          },
          {
            "name": "app/case/form_filling.populate_form_field",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_population/fill_form/main.py",
            "line": 27,
            "live": "silent"
          },
          {
            "name": "app/case/form_filling.populate_form.requested",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_population/main.py",
            "line": 30,
            "live": "silent"
          },
          {
            "name": "app/case/information_request_message.requested",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 267,
            "live": "silent"
          },
          {
            "name": "app/case/letter_generation.dry_run_requested",
            "namespace": "app",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 35,
            "live": "silent"
          },
          {
            "name": "app/case/letter_generation.requested",
            "namespace": "app",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 35,
            "live": "silent"
          },
          {
            "name": "app/case/status.changed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/workflows/caseNursery/eventHandler.ts",
            "line": 9,
            "live": "silent"
          },
          {
            "name": "app/cases/attendanceNote.generationRequested",
            "namespace": "app",
            "area": "api/ai",
            "file": "packages/api/src/modules/ai/service/generateAttendanceNoteForCall.ts",
            "line": 17,
            "live": "silent"
          },
          {
            "name": "app/workflows/calendly.processed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/workflows/civilLitigation/eventHandler.ts",
            "line": 93,
            "live": "silent"
          },
          {
            "name": "app/workflows/start.requested",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/inngest/startWorkflow.ts",
            "line": 4,
            "live": "silent"
          },
          {
            "name": "app/workflows/state.updated",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/workflows/civilLitigation/processor.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "app/workflows/tallyForm.processed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/workflows/caseNursery/eventHandler.ts",
            "line": 30,
            "live": "silent"
          },
          {
            "name": "webhooks/calendly/invitee.created",
            "namespace": "webhooks",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/calendly/handleCalendlyWebhookReceived.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "webhooks/tally/submission.received",
            "namespace": "webhooks",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/tally/handleTallyWebhookReceived.ts",
            "line": 17,
            "live": "silent"
          }
        ],
        "owns": [
          {
            "name": "ai/case/briefing-note.created",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/event_handlers/handle_briefing_note_requested.py",
            "line": 172,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "ai/case/briefing-note.started",
            "namespace": "ai",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleBriefingNoteRequested.ts",
            "line": 18,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "ai/case/lawrence-action.suggested",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 98,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "ai/case/processing.ended",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 23,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "ai/case/processing.started",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 12,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "ai/case/summary.created",
            "namespace": "ai",
            "area": "python/lawrence",
            "file": "apps/python-service/src/lawrence/lawrence_events.py",
            "line": 32,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": []
          },
          {
            "name": "app/case/advice_note.called",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/adviceNotes/service/requestAdviceNoteGenerationForCase.ts",
            "line": 30,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/advice_note.draft_advice_note",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 242,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/advice_note.is_empty",
            "namespace": "app",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/artifact_generation.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/letterGeneration/letterGenerationService.ts",
            "line": 51,
            "live": "active",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": []
          },
          {
            "name": "app/case/briefing_note.answer_factual_qa",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 186,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/briefing_note.answer_legal_question",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 123,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/briefing_note.called",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/briefingNotes/service/requestBriefingNoteGenerationForCase.ts",
            "line": 46,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/briefing_note.draft_briefing_note",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 217,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/briefing_note.generate_contextual_qa",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 62,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/briefing_note.generate_factual_qa",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 158,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/briefing_note.generate_legal_questions",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 91,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/briefing-note.requested",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleBriefingNoteRequested.ts",
            "line": 6,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/context-update.requested",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/lawrence.service.ts",
            "line": 18,
            "live": "rare",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/context.updated",
            "namespace": "app",
            "area": "api/lawrence",
            "file": "packages/api/src/modules/lawrence/event-handlers/handleCaseContextUpdateRequested.ts",
            "line": 23,
            "live": "rare",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/dry-run/form-filling.requested",
            "namespace": "app",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/empty-form-generation.completed",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/generateEmptyForm.ts",
            "line": 111,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/empty-form-generation.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/forms/service/requestEmptyFormGenerationForCase.ts",
            "line": 33,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/form_filling.enrich_field_group",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_enrichment/enrich_field_groups.py",
            "line": 31,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/form_filling.enrich_form.requested",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_enrichment/main.py",
            "line": 32,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/form_filling.populate_form_field",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_population/fill_form/main.py",
            "line": 27,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/form_filling.populate_form.requested",
            "namespace": "app",
            "area": "python/form_filling",
            "file": "apps/python-service/src/form_filling/form_population/main.py",
            "line": 30,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/form-filling.completed",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 310,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/form-filling.requested",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 42,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing",
              "cases"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/case/information_request_message.generated",
            "namespace": "app",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": []
          },
          {
            "name": "app/case/information_request_message.requested",
            "namespace": "app",
            "area": "python/_root",
            "file": "apps/python-service/api/index.py",
            "line": 267,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/letter_generation.dry_run_requested",
            "namespace": "app",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 35,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/letter_generation.requested",
            "namespace": "app",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 35,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/case/therefore-document-add.requested",
            "namespace": "app",
            "area": "api/cases",
            "file": "packages/api/src/modules/cases/files/procedures/adminAddThereforeDocument.handler.ts",
            "line": 22,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "cases",
              "documents"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/cases/attendanceNote.generationRequested",
            "namespace": "app",
            "area": "api/ai",
            "file": "packages/api/src/modules/ai/service/generateAttendanceNoteForCall.ts",
            "line": 17,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "voice"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/form_filling/form-field-override-enrichment",
            "namespace": "app",
            "area": "api/legalForms",
            "file": "packages/api/src/modules/legalForms/procedures/adminEnrichFormV2.ts",
            "line": 29,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "catalog"
            ],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/form_filling/form-filling-v2",
            "namespace": "app",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "plumbing"
            ]
          },
          {
            "name": "app/workflows/calendly.processed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/calendly/handleCalendlyWebhookReceived.ts",
            "line": 72,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/workflows/start.requested",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/procedures/startWorkflow.ts",
            "line": 27,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "instructions",
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/workflows/state.updated",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/service.ts",
            "line": 74,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "app/workflows/tallyForm.processed",
            "namespace": "app",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/tally/handleTallyWebhookReceived.ts",
            "line": 117,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": [
              "ai"
            ]
          },
          {
            "name": "artifact_generation.failed",
            "namespace": "artifact_generation",
            "area": null,
            "file": null,
            "line": null,
            "live": "silent",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "cases"
            ]
          },
          {
            "name": "artifact_generation.final_asset_generated",
            "namespace": "artifact_generation",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "cases"
            ]
          },
          {
            "name": "artifact_generation.progressed",
            "namespace": "artifact_generation",
            "area": null,
            "file": null,
            "line": null,
            "live": "active",
            "via": "rule",
            "emitters": [],
            "consumers": [
              "cases"
            ]
          },
          {
            "name": "lawrence/letter_generation.failed",
            "namespace": "lawrence",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 358,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": []
          },
          {
            "name": "lawrence/letter_generation.progressed",
            "namespace": "lawrence",
            "area": "python/letter_generation",
            "file": "apps/python-service/src/letter_generation/main.py",
            "line": 117,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "ai"
            ],
            "consumers": []
          },
          {
            "name": "webhooks/tally/submission.received",
            "namespace": "webhooks",
            "area": "api/workflows-v2",
            "file": "packages/api/src/modules/workflows-v2/common/tally/handleTallyWebhookReceived.ts",
            "line": 17,
            "live": "silent",
            "via": "rule",
            "emitters": [
              "plumbing"
            ],
            "consumers": [
              "ai"
            ]
          }
        ]
      },
      "enums": [
        {
          "name": "WorkflowStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3301,
          "doc": null,
          "values": [
            {
              "name": "RUNNING",
              "doc": null
            },
            {
              "name": "COMPLETED",
              "doc": null
            },
            {
              "name": "FAILED",
              "doc": null
            },
            {
              "name": "CANCELLED",
              "doc": null
            }
          ],
          "usedBy": [
            "WorkflowRun"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "AIDocumentSourceEntityType",
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 34,
          "doc": null,
          "values": [
            {
              "name": "CASE_FILE",
              "doc": null
            }
          ],
          "usedBy": [
            "AIDocument"
          ],
          "datastore": "ai",
          "shared": false
        },
        {
          "name": "AIFeedbackRating",
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 131,
          "doc": null,
          "values": [
            {
              "name": "POSITIVE",
              "doc": null
            },
            {
              "name": "NEGATIVE",
              "doc": null
            }
          ],
          "usedBy": [
            "AIFeedback"
          ],
          "datastore": "ai",
          "shared": false
        },
        {
          "name": "AIThreadMode",
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 87,
          "doc": null,
          "values": [
            {
              "name": "LAWRENCE",
              "doc": null
            },
            {
              "name": "LETTER_CONTEXT",
              "doc": null
            }
          ],
          "usedBy": [
            "AIThread"
          ],
          "datastore": "ai",
          "shared": false
        }
      ],
      "usage": {
        "reads": 33,
        "writes": 22
      },
      "models": [
        {
          "key": "ai/AIThread",
          "name": "AIThread",
          "table": null,
          "datastore": "ai",
          "domain": "ai",
          "isView": false,
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 72,
          "idPrefix": "aithrd_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "userId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "mode",
              "type": "AIThreadMode",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "messages",
              "type": "AIMessage",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AIMessage",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([caseId, userId])"
          ],
          "looseRefs": [
            "caseId",
            "userId"
          ],
          "relationsOut": [
            {
              "field": "messages",
              "target": "AIMessage",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIMessage",
              "targetDomain": "ai"
            }
          ],
          "relationsIn": [
            {
              "model": "AIMessage",
              "field": "thread",
              "fk": true,
              "list": false,
              "sourceKey": "ai/AIMessage",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 14,
            "reads": 9,
            "writes": 5,
            "ops": {
              "findMany": 3,
              "findUnique": 4,
              "update": 4,
              "findFirst": 2,
              "upsert": 1
            },
            "byArea": [
              {
                "area": "api/ai",
                "reads": 6,
                "writes": 5,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "ui/_app",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "ui-other"
              },
              {
                "area": "api/lawrence",
                "reads": 1,
                "writes": 0,
                "domain": "ai",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/ai/agents/lawrence/lawrence.ts",
                "line": 420,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/ai/agents/letter-context/letterContextAgent.ts",
                "line": 174,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/ai/agents/letter-context/letterContextAgent.ts",
                "line": 191,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One lawyer's private Lawrence conversation about one case, unique on caseId and userId. Two people on the same case get two threads and never see each other's messages.",
          "keyFields": [
            {
              "name": "caseId",
              "meaning": "The case being discussed. A loose string: the ai database has no foreign keys into the app database."
            },
            {
              "name": "userId",
              "meaning": "The firm employee whose thread this is. Combined with caseId it is the unique key."
            },
            {
              "name": "mode",
              "meaning": "LAWRENCE is the normal agent. LETTER_CONTEXT hands the same thread to the letter-gathering sub-agent until it finishes or gives up."
            },
            {
              "name": "createdAt",
              "meaning": "Set when getOrCreateCaseThread first upserts the thread and seeds the greeting message."
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case the thread is about, by id only"
            },
            {
              "field": "userId",
              "target": "people",
              "meaning": "the User who owns this thread"
            }
          ],
          "lifecycle": "mode: LAWRENCE → LETTER_CONTEXT → LAWRENCE",
          "grouped": [],
          "flags": [
            "cross-database-id",
            "per-user-thread"
          ]
        },
        {
          "key": "ai/AIMessage",
          "name": "AIMessage",
          "table": null,
          "datastore": "ai",
          "domain": "ai",
          "isView": false,
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 92,
          "idPrefix": "aimsg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "role",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sendingUserId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "thread",
              "type": "AIThread",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "AIThread",
              "onDelete": null
            },
            {
              "name": "threadId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ratings",
              "type": "AIFeedback",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AIFeedback",
              "onDelete": null
            },
            {
              "name": "omitFromGenerationContext",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "toolInvocations",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "openaiData",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Stores complete OpenAI.ChatCompletionMessageParam structure",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([threadId])",
            "@@index([threadId, createdAt(sort: Desc)])"
          ],
          "looseRefs": [
            "sendingUserId"
          ],
          "relationsOut": [
            {
              "field": "thread",
              "target": "AIThread",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "threadId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIThread",
              "targetDomain": "ai"
            },
            {
              "field": "ratings",
              "target": "AIFeedback",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIFeedback",
              "targetDomain": "ai"
            }
          ],
          "relationsIn": [
            {
              "model": "AIFeedback",
              "field": "message",
              "fk": true,
              "list": false,
              "sourceKey": "ai/AIFeedback",
              "sourceDomain": "ai"
            },
            {
              "model": "AIThread",
              "field": "messages",
              "fk": false,
              "list": true,
              "sourceKey": "ai/AIThread",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 12,
            "reads": 7,
            "writes": 5,
            "ops": {
              "create": 3,
              "upsert": 1,
              "deleteMany": 1,
              "findUnique": 2,
              "findMany": 4,
              "count": 1
            },
            "byArea": [
              {
                "area": "api/ai",
                "reads": 5,
                "writes": 5,
                "domain": "ai",
                "kind": "api-module"
              },
              {
                "area": "api/raw-asset-retrieval",
                "reads": 2,
                "writes": 0,
                "domain": "documents",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/ai/agents/lawrence/lawrence.ts",
                "line": 306,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/ai/agents/lawrence/lawrence.ts",
                "line": 322,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/ai/ai.service.ts",
                "line": 15,
                "op": "upsert"
              }
            ],
            "nested": 10,
            "nestedByArea": [
              {
                "area": "api/test-data",
                "n": 3
              },
              {
                "area": "api/messages",
                "n": 2
              },
              {
                "area": "api/_integrations",
                "n": 1
              },
              {
                "area": "api/ai",
                "n": 1
              },
              {
                "area": "api/cases",
                "n": 1
              },
              {
                "area": "api/instructions",
                "n": 1
              },
              {
                "area": "api/lawrence",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One turn in a Lawrence thread, which can be a lawyer's question, an assistant reply, a tool call, or a tool result. The whole prompt history for the next completion is rebuilt from these rows.",
          "keyFields": [
            {
              "name": "role",
              "meaning": "user, assistant, system or function. Free text, not an enum, and function rows are filtered out of the UI query."
            },
            {
              "name": "content",
              "meaning": "The text. Empty on an assistant row that is only a function call."
            },
            {
              "name": "openaiData",
              "meaning": "The raw ChatCompletionMessageParam shape, holding function_call arguments or the function name of a result."
            },
            {
              "name": "toolInvocations",
              "meaning": "The structured tool payload the UI renders as an interactive card, for example a form or letter suggestion."
            },
            {
              "name": "omitFromGenerationContext",
              "meaning": "Shown to the lawyer but excluded from the next prompt. Used for the greeting and for injected system notices."
            },
            {
              "name": "sendingUserId",
              "meaning": "Who sent it, when a human did. Null for assistant and function rows."
            }
          ],
          "references": [
            {
              "field": "threadId",
              "target": "ai",
              "meaning": "the thread this turn belongs to"
            },
            {
              "field": "sendingUserId",
              "target": "people",
              "meaning": "the User who typed it, if any"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "json-heavy"
          ]
        },
        {
          "key": "ai/AIFeedback",
          "name": "AIFeedback",
          "table": null,
          "datastore": "ai",
          "domain": "ai",
          "isView": false,
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 116,
          "idPrefix": "aifb_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rating",
              "type": "AIFeedbackRating",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "message",
              "type": "AIMessage",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "AIMessage",
              "onDelete": null
            },
            {
              "name": "messageId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "ratingUserId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([messageId, ratingUserId])"
          ],
          "looseRefs": [
            "ratingUserId"
          ],
          "relationsOut": [
            {
              "field": "message",
              "target": "AIMessage",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "messageId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIMessage",
              "targetDomain": "ai"
            }
          ],
          "relationsIn": [
            {
              "model": "AIMessage",
              "field": "ratings",
              "fk": false,
              "list": true,
              "sourceKey": "ai/AIMessage",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 2,
            "reads": 0,
            "writes": 2,
            "ops": {
              "deleteMany": 1,
              "upsert": 1
            },
            "byArea": [
              {
                "area": "api/ai",
                "reads": 0,
                "writes": 2,
                "domain": "ai",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/ai/procedures/adminClearThread.ts",
                "line": 14,
                "op": "deleteMany"
              },
              {
                "file": "packages/api/src/modules/ai/procedures/rateAssistantMessage.ts",
                "line": 23,
                "op": "upsert"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "A thumbs up or down a lawyer gave one assistant message. One rating per message per rater, enforced by a unique key.",
          "keyFields": [
            {
              "name": "rating",
              "meaning": "POSITIVE or NEGATIVE. Written by rateAssistantMessage and never read back by the platform."
            },
            {
              "name": "ratingUserId",
              "meaning": "Who rated it. Unique together with messageId, so re-rating upserts."
            }
          ],
          "references": [
            {
              "field": "messageId",
              "target": "ai",
              "meaning": "the assistant message being rated"
            },
            {
              "field": "ratingUserId",
              "target": "people",
              "meaning": "the User who rated it"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "write-only"
          ]
        },
        {
          "key": "ai/AIDocument",
          "name": "AIDocument",
          "table": null,
          "datastore": "ai",
          "domain": "ai",
          "isView": false,
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 16,
          "idPrefix": "aidoc_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sourceEntityType",
              "type": "AIDocumentSourceEntityType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sourceEntityId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "name",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "summary",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aiElements",
              "type": "AIDocumentElement",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AIDocumentElement",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([sourceEntityId])",
            "@@index([sourceEntityType, sourceEntityId])"
          ],
          "looseRefs": [
            "sourceEntityId"
          ],
          "relationsOut": [
            {
              "field": "aiElements",
              "target": "AIDocumentElement",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIDocumentElement",
              "targetDomain": "ai"
            }
          ],
          "relationsIn": [
            {
              "model": "AIDocumentElement",
              "field": "aiDocument",
              "fk": true,
              "list": false,
              "sourceKey": "ai/AIDocumentElement",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 4,
            "reads": 3,
            "writes": 1,
            "ops": {
              "findMany": 3,
              "create": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "admin",
                "reads": 1,
                "writes": 0,
                "domain": "plumbing",
                "kind": "app"
              },
              {
                "area": "api/test-data",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/test-data/testData.service.ts",
                "line": 161,
                "op": "create"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "The extracted, machine-readable version of one case file. Its only source entity type is CASE_FILE, so a row is a CaseFile that the old ingestion pipeline parsed.",
          "keyFields": [
            {
              "name": "sourceEntityType",
              "meaning": "CASE_FILE, the only value the enum has."
            },
            {
              "name": "sourceEntityId",
              "meaning": "The CaseFile id in the app database, joined by hand across the two databases."
            },
            {
              "name": "name",
              "meaning": "The document name captured at ingestion time."
            },
            {
              "name": "summary",
              "meaning": "A short summary of the file. Nothing in the monolith writes it; the briefing note context reads File.summary instead."
            }
          ],
          "references": [
            {
              "field": "sourceEntityId",
              "target": "documents",
              "meaning": "the CaseFile this was parsed from"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "cross-database-id",
            "v1-pipeline"
          ]
        },
        {
          "key": "ai/AIDocumentElement",
          "name": "AIDocumentElement",
          "table": null,
          "datastore": "ai",
          "domain": "ai",
          "isView": false,
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 38,
          "idPrefix": "aidocel_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 7,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "metadata",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aiEmbeddings",
              "type": "AIEmbedding",
              "list": true,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": "AIEmbedding",
              "onDelete": null
            },
            {
              "name": "aiDocument",
              "type": "AIDocument",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "AIDocument",
              "onDelete": null
            },
            {
              "name": "aiDocumentId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([aiDocumentId])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "aiEmbeddings",
              "target": "AIEmbedding",
              "list": true,
              "optional": false,
              "fk": false,
              "fkFields": [],
              "references": [],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIEmbedding",
              "targetDomain": "ai"
            },
            {
              "field": "aiDocument",
              "target": "AIDocument",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "aiDocumentId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIDocument",
              "targetDomain": "ai"
            }
          ],
          "relationsIn": [
            {
              "model": "AIDocument",
              "field": "aiElements",
              "fk": false,
              "list": true,
              "sourceKey": "ai/AIDocument",
              "sourceDomain": "ai"
            },
            {
              "model": "AIEmbedding",
              "field": "aiDocumentElement",
              "fk": true,
              "list": false,
              "sourceKey": "ai/AIEmbedding",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 5,
            "nestedByArea": [
              {
                "area": "api/cases",
                "n": 3
              },
              {
                "area": "admin",
                "n": 1
              },
              {
                "area": "api/test-data",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One chunk of a parsed case file, usually a page or a block, with whatever page and position metadata the parser produced.",
          "keyFields": [
            {
              "name": "content",
              "meaning": "The chunk text. getCaseFileContentForBriefingNote joins these in creation order and trims at 100k characters."
            },
            {
              "name": "metadata",
              "meaning": "Parser metadata such as page number, carried through to citations in the briefing note context."
            }
          ],
          "references": [
            {
              "field": "aiDocumentId",
              "target": "ai",
              "meaning": "the parsed document this chunk came from, optional"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "nested-only"
          ]
        },
        {
          "key": "ai/AIEmbedding",
          "name": "AIEmbedding",
          "table": null,
          "datastore": "ai",
          "domain": "ai",
          "isView": false,
          "file": "packages/db-ai/prisma/schema.prisma",
          "line": 54,
          "idPrefix": "aiemb_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "content",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "vector",
              "type": "Unsupported",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isSearchable",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aiDocumentElement",
              "type": "AIDocumentElement",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "AIDocumentElement",
              "onDelete": null
            },
            {
              "name": "aiDocumentElementId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId, isSearchable])",
            "@@index([aiDocumentElementId])"
          ],
          "looseRefs": [
            "caseId"
          ],
          "relationsOut": [
            {
              "field": "aiDocumentElement",
              "target": "AIDocumentElement",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "aiDocumentElementId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "ai/AIDocumentElement",
              "targetDomain": "ai"
            }
          ],
          "relationsIn": [
            {
              "model": "AIDocumentElement",
              "field": "aiEmbeddings",
              "fk": false,
              "list": true,
              "sourceKey": "ai/AIDocumentElement",
              "sourceDomain": "ai"
            }
          ],
          "crossDomainRelations": [],
          "usage": {
            "total": 1,
            "reads": 0,
            "writes": 1,
            "ops": {
              "updateMany": 1
            },
            "byArea": [
              {
                "area": "api/cases",
                "reads": 0,
                "writes": 1,
                "domain": "cases",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/cases/files/service/deleteFile.ts",
                "line": 18,
                "op": "updateMany"
              }
            ],
            "nested": 1,
            "nestedByArea": [
              {
                "area": "admin",
                "n": 1
              }
            ],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "legacy",
          "meaning": "A pgvector embedding of one document chunk, tagged with the case it belongs to so retrieval could filter by case. Retrieval moved to the search service and nothing queries the vectors any more.",
          "keyFields": [
            {
              "name": "vector",
              "meaning": "The pgvector column. Unsupported in Prisma, so it was only ever reachable by raw SQL, and no raw SQL query for it survives."
            },
            {
              "name": "caseId",
              "meaning": "The case whose files this chunk came from. Indexed with isSearchable for the retrieval filter that no longer runs."
            },
            {
              "name": "isSearchable",
              "meaning": "Set false when the file is deleted. deleteFile is the only writer of this table left."
            },
            {
              "name": "content",
              "meaning": "The chunk text the vector was computed from, duplicated from AIDocumentElement."
            }
          ],
          "references": [
            {
              "field": "aiDocumentElementId",
              "target": "ai",
              "meaning": "the chunk this embeds"
            },
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case used to scope retrieval, by id only"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "never-queried",
            "superseded-by-search-service"
          ]
        },
        {
          "key": "app/WorkflowRun",
          "name": "WorkflowRun",
          "table": null,
          "datastore": "app",
          "domain": "ai",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3284,
          "idPrefix": "wfr_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 10,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "workflowType",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "version",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "state",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "WorkflowStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "snoozedUntil",
              "type": "DateTime",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@unique([caseId, workflowType, version])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "workflowRuns",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "workflowRuns"
            }
          ],
          "usage": {
            "total": 22,
            "reads": 14,
            "writes": 8,
            "ops": {
              "findMany": 2,
              "findFirst": 8,
              "update": 7,
              "findUnique": 3,
              "create": 1,
              "findUniqueOrThrow": 1
            },
            "byArea": [
              {
                "area": "api/workflows-v2",
                "reads": 14,
                "writes": 8,
                "domain": "ai",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/workflows-v2/procedures/snoozeWorkflow.ts",
                "line": 39,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/workflows-v2/procedures/snoozeWorkflow.ts",
                "line": 76,
                "op": "update"
              },
              {
                "file": "packages/api/src/modules/workflows-v2/service.ts",
                "line": 49,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One attempt at running a named case workflow, holding its progress as JSON rather than rows. Unique on caseId, workflowType and version, so a restart cancels the old run and creates the next version.",
          "keyFields": [
            {
              "name": "workflowType",
              "meaning": "civil-litigation or case-nursery. A free string in the schema, validated against workflowRegistry in code."
            },
            {
              "name": "version",
              "meaning": "Incremented on restart. The active run is the highest version that is still RUNNING."
            },
            {
              "name": "state",
              "meaning": "completedSteps plus arbitrary per-step data. Restarting copies only the keys the caller names and records the reason."
            },
            {
              "name": "status",
              "meaning": "RUNNING until every step in the registry is done, then COMPLETED. CANCELLED on restart, FAILED unused."
            },
            {
              "name": "snoozedUntil",
              "meaning": "Hides the workflow's next action card until this time. Cleared whenever the run advances a step."
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case this workflow is running on"
            }
          ],
          "lifecycle": "RUNNING → COMPLETED / CANCELLED (FAILED never set)",
          "grouped": [],
          "flags": [
            "json-state-machine",
            "steps-hardcoded"
          ]
        },
        {
          "key": "app/InformationRequest",
          "name": "InformationRequest",
          "table": null,
          "datastore": "app",
          "domain": "ai",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3070,
          "idPrefix": "ir_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 6,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "case",
              "type": "Case",
              "list": false,
              "optional": false,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Case",
              "onDelete": null
            },
            {
              "name": "caseId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "sufficientInformation",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedQuestionnaire",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([caseId])",
            "@@index([createdAt])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "case",
              "target": "Case",
              "list": false,
              "optional": false,
              "fk": true,
              "fkFields": [
                "caseId"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Case",
              "targetDomain": "cases"
            }
          ],
          "relationsIn": [
            {
              "model": "Case",
              "field": "informationRequests",
              "fk": false,
              "list": true,
              "sourceKey": "app/Case",
              "sourceDomain": "cases"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "cases",
              "model": "Case",
              "field": "case"
            },
            {
              "dir": "in",
              "domain": "cases",
              "model": "Case",
              "field": "informationRequests"
            }
          ],
          "usage": {
            "total": 0,
            "reads": 0,
            "writes": 0,
            "ops": {},
            "byArea": [],
            "writeSites": [],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": true,
          "interpreted": true,
          "tier": "legacy",
          "meaning": "An AI judgement on whether a case has enough information yet, with a rewritten questionnaire to fill the gaps. Nothing reads or writes the table.",
          "keyFields": [
            {
              "name": "sufficientInformation",
              "meaning": "Whether the model thought the case had enough to work with."
            },
            {
              "name": "updatedQuestionnaire",
              "meaning": "The revised set of questions to put to the client."
            }
          ],
          "references": [
            {
              "field": "caseId",
              "target": "cases",
              "meaning": "the case that was assessed"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "dead-table"
          ]
        }
      ]
    },
    {
      "id": "plumbing",
      "order": 17,
      "groups": [],
      "name": "Plumbing: events and internal tooling",
      "tagline": "Two event systems, one Prisma client, and the Slack messages that fire on a sale",
      "whatItIs": "Plumbing is the wiring the other sixteen domains sit on, plus the three tables that describe the wiring rather than the business. v2 is one Next.js monolith over one database. packages/db/src/index.ts exports a single `prisma` client, cached on `global` outside production, and every module imports that same singleton, so there is no repository layer and no per-domain connection. Everything a client can do arrives as a tRPC call, and packages/api/src/trpc.ts defines the whole auth ladder in one file. publicProcedure only asserts that the Clerk middleware ran. protectedProcedure turns a Clerk session into the person, customer, solicitor and firm-employee context every handler destructures. customerProcedure demands the customer hat, solicitorProcedure and firmEmployeeProcedure take a permission list and reject roles that lack it, adminProcedure skips the user context entirely and requires the token to be issued by the separate admin Clerk issuer, and outlookProcedure verifies an Outlook add-in JWT and looks the firm employee up by email address. Under that sit the two ways work happens later: the in-process event router, and Inngest.",
      "howItConnects": "Two different things are called events here, and both leave a table behind. The first is the framework event router in packages/framework: each module declares a router of `e.event` and `e.transformedEvent` entries (caseEvents.ts, instructionEvents.ts, paymentEvents.ts, and so on), packages/api/src/events/router.ts merges twenty of them into one tree, and calling `events.case.opened.publish(input)` runs that event's effect, which is the actual Prisma write, then appends a row to Event keyed by the dot path. Seventy-eight files publish that way, so Event is the closest thing v2 has to an audit log of business writes. The second is Inngest, the real background queue. Event names follow {namespace}/{domain}/{entity}.{verbPastTense}, as in app/case/note.created, ai/case/summary.created, cqs/case-alert/alert.resolved and kyc/workflowRun.statusUpdated, declared as zod schemas with a literal `name` either in packages/event-schemas (the ones shared with the Python and v3 services) or in a module file, all handed to one Inngest client in integrations/inngest/client.ts and served from a single serve() call in apps/platform/src/app/api/inngest/route.ts. A third-party webhook becomes an internal event immediately: the Tally route does nothing but forward the body as webhooks/tally/submission.received and return 200, and the Onfido and Stripe routes verify the signature, find the row, then send. Of the three tables, Event is live and InngestEvent is a short-lived delivery trace that nothing reads. CelebratoryMessage belongs to neither system and is really a Money side project.",
      "lifecycle": null,
      "flows": [
        {
          "id": "request-to-events",
          "title": "A mutation and the two event systems",
          "mermaid": "flowchart TD\n  C[Client] --> P[tRPC procedure]\n  P --> A[auth middleware resolves the hat]\n  A --> H[handler]\n  H --> DB[(prisma singleton)]\n  H --> PUB[events.case.opened.publish]\n  PUB --> EFF[effect does the Prisma write]\n  EFF --> ROW[Event row, type aggregate]\n  H --> SND[inngest.send]\n  SND --> TRK[InngestEvent row, pending]\n  SND --> Q[Inngest]\n  Q --> FN[Inngest function]\n  TRK --> OK[batch flipped to success]",
          "caption": "publish is synchronous: the effect runs inline and the Event row is written after it. Nothing subscribes to it. Real deferred work goes to Inngest, and the middleware records the send on the way past."
        },
        {
          "id": "webhook-to-event",
          "title": "A webhook becoming an internal event",
          "mermaid": "flowchart LR\n  W[Provider webhook] --> R[pages/api/webhook/tally]\n  R --> S[inngest.send submission.received]\n  S --> M[eventTracking middleware]\n  M --> I[InngestEvent pending]\n  S --> Q[Inngest]\n  Q --> F[handleTallyWebhookReceived]\n  F --> D[domain work]\n  I --> CR[weekly cron deletes success rows]",
          "caption": "The route does no work of its own, which is what keeps the provider's retry window short. The webhooks/ namespace exists only for these hand-off events."
        }
      ],
      "notes": [
        {
          "kind": "legacy",
          "body": "EventType has two values and only one is used. No module anywhere calls e.ephemeral, so every Event row is written with type aggregate and the ephemeral branch of publisher.ts, the one that omits aggregateId and aggregateType, never runs."
        },
        {
          "kind": "status",
          "body": "The framework's subscriber half was never wired up. Event definitions accept a `subscribers` array and events/router.ts exports `eventHandler` from createEventHandler, but nothing in the repo passes subscribers and nothing calls eventHandler. Publishing runs the effect and writes the row, and that is all it does, so Event is an append-only log rather than a bus."
        },
        {
          "kind": "status",
          "body": "Event is written by 78 files and read by 3: case note history and note-comment counts pull rows by aggregateId, and the solicitor review widget looks for the first case.opened row to date the case. The other tens of thousands of rows are written and never queried by code."
        },
        {
          "kind": "status",
          "body": "InngestEvent is for tracing sends, not batching them. batchId is a UUID minted per inngest.send call because, as the middleware comment says, Inngest exposes no consistent per-event id. Rows go in as pending before the send and the whole batch is flipped to success once Inngest returns ids, so a pending row older than a few seconds is a send that failed. Nothing in the codebase reads the table; a Monday cron deletes success rows older than a week, which caps it to seven days of history."
        },
        {
          "kind": "duplication",
          "body": "Celebratory messages exist twice. packages/api/src/modules/payments/service/celebratoryMessages.ts is 1478 lines of hardcoded message functions keyed by tier, and the CelebratoryMessage table replaced it. That file is still imported, but only for its AchievementTier type."
        },
        {
          "kind": "misfiled",
          "body": "CelebratoryMessage lives entirely in api/modules/payments and its trigger is a paid instruction, so on ownership it is a Money model. It sits here because it is internal tooling rather than anything a client sees."
        },
        {
          "kind": "status",
          "body": "Event names are declared in three different places: packages/event-schemas/src/schemas.ts for anything crossing a service boundary, integrations/inngest/inngestSchemas.ts for the document and form-filling ones, and module files named either <module>.events.ts (lawrence, case-internal-reviews) or events.ts. A handful of names also break the namespace/domain/entity.verb shape, like app/score/lawyer and app/form_filling/form-filling-v2."
        }
      ],
      "datastores": [
        "app"
      ],
      "areas": [
        {
          "id": "api/inngest",
          "kind": "api-module",
          "label": "inngest",
          "path": "packages/api/src/modules/inngest",
          "files": 3,
          "prismaSites": 1,
          "procedures": {
            "queries": 0,
            "mutations": 1
          }
        },
        {
          "id": "api/_events",
          "kind": "api-core",
          "label": "api events",
          "path": "packages/api/src/events",
          "files": 3,
          "prismaSites": 2
        },
        {
          "id": "api/_integrations",
          "kind": "api-core",
          "label": "api integrations",
          "path": "packages/api/src/integrations",
          "files": 99,
          "prismaSites": 48
        },
        {
          "id": "api/_root",
          "kind": "api-core",
          "label": "api root",
          "path": "packages/api/src",
          "files": 24,
          "prismaSites": 1
        },
        {
          "id": "api/_types",
          "kind": "api-core",
          "label": "api types",
          "path": "packages/api/src/types",
          "files": 1,
          "prismaSites": 0
        },
        {
          "id": "api/_utils",
          "kind": "api-core",
          "label": "api utils",
          "path": "packages/api/src/utils",
          "files": 20,
          "prismaSites": 10
        },
        {
          "id": "pkg/event-schemas",
          "kind": "package",
          "label": "event-schemas",
          "path": "packages/event-schemas",
          "files": 9,
          "prismaSites": 0
        },
        {
          "id": "pkg/framework",
          "kind": "package",
          "label": "framework",
          "path": "packages/framework",
          "files": 8,
          "prismaSites": 0
        },
        {
          "id": "pkg/db",
          "kind": "package",
          "label": "db",
          "path": "packages/db",
          "files": 312,
          "prismaSites": 23
        },
        {
          "id": "pkg/shared",
          "kind": "package",
          "label": "shared",
          "path": "packages/shared",
          "files": 46,
          "prismaSites": 0
        },
        {
          "id": "pkg/ui",
          "kind": "package",
          "label": "ui",
          "path": "packages/ui",
          "files": 244,
          "prismaSites": 0
        },
        {
          "id": "pkg/e2e-tests",
          "kind": "package",
          "label": "e2e-tests",
          "path": "packages/e2e-tests",
          "files": 13,
          "prismaSites": 0
        },
        {
          "id": "ui/_app",
          "kind": "ui-other",
          "label": "platform app shell",
          "path": "apps/platform/src",
          "files": 320,
          "prismaSites": 2
        },
        {
          "id": "admin",
          "kind": "app",
          "label": "admin app",
          "path": "apps/admin",
          "files": 538,
          "prismaSites": 139
        },
        {
          "id": "tooling",
          "kind": "tooling",
          "label": "tooling",
          "path": "tooling",
          "files": 21,
          "prismaSites": 0
        },
        {
          "id": "infrastructure",
          "kind": "tooling",
          "label": "infrastructure",
          "path": "infrastructure",
          "files": 88,
          "prismaSites": 0
        },
        {
          "id": "other",
          "kind": "other",
          "label": "other",
          "path": "",
          "files": 83,
          "prismaSites": 0
        },
        {
          "id": "pkg/config",
          "kind": "package",
          "label": "config",
          "path": "packages/config",
          "files": 2,
          "prismaSites": 0
        }
      ],
      "events": {
        "publishes": [
          {
            "name": "app/case/empty-form-generation.completed",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/generateEmptyForm.ts",
            "line": 111,
            "live": "silent"
          },
          {
            "name": "app/case/form-filling.completed",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 310,
            "live": "silent"
          },
          {
            "name": "app/case/form-filling.requested",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 42,
            "live": "silent"
          },
          {
            "name": "app/case/mail.uploaded",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/addThereforeDocument.ts",
            "line": 167,
            "live": "silent"
          },
          {
            "name": "app/instructions/instruction.created",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
            "line": 363,
            "live": "silent"
          },
          {
            "name": "app/lawyer-tier-review/check-individual",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/lawyerTierReviewAlerts.ts",
            "line": 39,
            "live": "active"
          },
          {
            "name": "app/score/lawyer",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/scoreAllLawyers.ts",
            "line": 15,
            "live": "active"
          },
          {
            "name": "Imported Quote",
            "namespace": "Imported Quote",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/v1/cases/beginImport.ts",
            "line": 363,
            "live": "silent"
          },
          {
            "name": "kyc/workflowRun.statusUpdated",
            "namespace": "kyc",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/onfido/webhooks.ts",
            "line": 57,
            "live": "silent"
          },
          {
            "name": "webhooks/calendly/invitee.created",
            "namespace": "webhooks",
            "area": "ui/_app",
            "file": "apps/platform/src/pages/api/webhook/calendly.ts",
            "line": 13,
            "live": "silent"
          },
          {
            "name": "webhooks/tally/submission.received",
            "namespace": "webhooks",
            "area": "ui/_app",
            "file": "apps/platform/src/pages/api/webhook/tally.ts",
            "line": 10,
            "live": "silent"
          }
        ],
        "consumes": [
          {
            "name": "app/case/advice_note.called",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/adviceNote.ts",
            "line": 10,
            "live": "silent"
          },
          {
            "name": "app/case/advice_note.is_empty",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/adviceNote.ts",
            "line": 60,
            "live": "silent"
          },
          {
            "name": "app/case/bills/bill.paid",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/referralPaymentProcessor.ts",
            "line": 6,
            "live": "silent"
          },
          {
            "name": "app/case/briefing_note.called",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/briefingNote.ts",
            "line": 8,
            "live": "silent"
          },
          {
            "name": "app/case/dry-run/form-filling.requested",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 21,
            "live": "silent"
          },
          {
            "name": "app/case/empty-form-generation.completed",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/generateEmptyForm.ts",
            "line": 138,
            "live": "silent"
          },
          {
            "name": "app/case/empty-form-generation.requested",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/generateEmptyForm.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "app/case/form-filling.completed",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 362,
            "live": "silent"
          },
          {
            "name": "app/case/form-filling.requested",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/fillForm.ts",
            "line": 58,
            "live": "silent"
          },
          {
            "name": "app/case/therefore-document-add.requested",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/addThereforeDocument.ts",
            "line": 21,
            "live": "silent"
          },
          {
            "name": "app/form_filling/form-field-override-enrichment",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/formCompletion/v2Workflow.ts",
            "line": 119,
            "live": "silent"
          },
          {
            "name": "app/form_filling/form-filling-v2",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/formCompletion/v2Workflow.ts",
            "line": 23,
            "live": "silent"
          },
          {
            "name": "app/lawyer-tier-review/check-all",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/lawyerTierReviewAlerts.ts",
            "line": 12,
            "live": "silent"
          },
          {
            "name": "app/lawyer-tier-review/check-individual",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/lawyerTierReviewAlerts.ts",
            "line": 51,
            "live": "active"
          },
          {
            "name": "app/score/all-lawyers",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/scoreAllLawyers.ts",
            "line": 27,
            "live": "silent"
          },
          {
            "name": "app/score/lawyer",
            "namespace": "app",
            "area": "api/_integrations",
            "file": "packages/api/src/integrations/inngest/scoreLawyer.ts",
            "line": 20,
            "live": "active"
          }
        ],
        "owns": []
      },
      "enums": [
        {
          "name": "EventType",
          "file": "packages/db/prisma/schema.prisma",
          "line": 67,
          "doc": null,
          "values": [
            {
              "name": "ephemeral",
              "doc": null
            },
            {
              "name": "aggregate",
              "doc": null
            }
          ],
          "usedBy": [
            "Event"
          ],
          "datastore": "app",
          "shared": false
        },
        {
          "name": "InngestEventStatus",
          "file": "packages/db/prisma/schema.prisma",
          "line": 3326,
          "doc": null,
          "values": [
            {
              "name": "pending",
              "doc": null
            },
            {
              "name": "success",
              "doc": null
            }
          ],
          "usedBy": [
            "InngestEvent"
          ],
          "datastore": "app",
          "shared": false
        }
      ],
      "usage": {
        "reads": 7,
        "writes": 8
      },
      "models": [
        {
          "key": "app/Event",
          "name": "Event",
          "table": null,
          "datastore": "app",
          "domain": "plumbing",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 32,
          "idPrefix": "evt_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 9,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "timestamp",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "key",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "type",
              "type": "EventType",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "payload",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aggregateType",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "aggregateId",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([aggregateId])"
          ],
          "looseRefs": [
            "aggregateId"
          ],
          "relationsOut": [],
          "relationsIn": [],
          "crossDomainRelations": [],
          "usage": {
            "total": 5,
            "reads": 3,
            "writes": 2,
            "ops": {
              "create": 2,
              "findMany": 1,
              "count": 1,
              "findFirst": 1
            },
            "byArea": [
              {
                "area": "api/_events",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/cases",
                "reads": 2,
                "writes": 0,
                "domain": "cases",
                "kind": "api-module"
              },
              {
                "area": "api/solicitors",
                "reads": 1,
                "writes": 0,
                "domain": "people",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/events/publisher.ts",
                "line": 10,
                "op": "create"
              },
              {
                "file": "packages/api/src/events/publisher.ts",
                "line": 22,
                "op": "create"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 22,
            "typeMentionsByArea": [
              {
                "area": "api/_integrations",
                "n": 10
              },
              {
                "area": "admin",
                "n": 3
              },
              {
                "area": "api/workflows-v2",
                "n": 3
              },
              {
                "area": "pkg/framework",
                "n": 3
              },
              {
                "area": "api/messages",
                "n": 2
              },
              {
                "area": "ui/document-editor",
                "n": 1
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "core",
          "meaning": "One business write that went through the framework event router: what happened, to which row, and the payload it happened with. The log is append-only and no code reacts to a row appearing.",
          "keyFields": [
            {
              "name": "key",
              "meaning": "the router's dot path, like case.opened or case.notes.created. Not an Inngest name."
            },
            {
              "name": "type",
              "meaning": "aggregate or ephemeral. Nothing publishes ephemeral, so every row is aggregate."
            },
            {
              "name": "aggregateType",
              "meaning": "the router segment above the verb, so \"case\" for case.opened. Free text, not a model name."
            },
            {
              "name": "aggregateId",
              "meaning": "id of the row the event is about, whatever table it is in. Indexed, and the only column readers filter on."
            },
            {
              "name": "payload",
              "meaning": "the transformed input as JSON. Readers safeParse it with the same zod schema the publisher used."
            },
            {
              "name": "timestamp",
              "meaning": "set by publisher.ts when the row is written, and what the history readers order by"
            }
          ],
          "references": [],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "append-only",
            "polymorphic-id",
            "no-subscribers"
          ]
        },
        {
          "key": "app/InngestEvent",
          "name": "InngestEvent",
          "table": null,
          "datastore": "app",
          "domain": "plumbing",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 3308,
          "idPrefix": "innev_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 8,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "status",
              "type": "InngestEventStatus",
              "list": false,
              "optional": false,
              "kind": "enum",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "batchId",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "inngestEventName",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "inngestEventData",
              "type": "Json",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "rawInngestEventPayload",
              "type": "Json",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([batchId])",
            "@@index([createdAt, status])"
          ],
          "looseRefs": [
            "batchId"
          ],
          "relationsOut": [],
          "relationsIn": [],
          "crossDomainRelations": [],
          "usage": {
            "total": 3,
            "reads": 0,
            "writes": 3,
            "ops": {
              "createMany": 1,
              "updateMany": 1,
              "deleteMany": 1
            },
            "byArea": [
              {
                "area": "api/_integrations",
                "reads": 0,
                "writes": 2,
                "domain": "plumbing",
                "kind": "api-core"
              },
              {
                "area": "api/inngest",
                "reads": 0,
                "writes": 1,
                "domain": "plumbing",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/integrations/inngest/middleware/eventTracking.ts",
                "line": 19,
                "op": "createMany"
              },
              {
                "file": "packages/api/src/integrations/inngest/middleware/eventTracking.ts",
                "line": 33,
                "op": "updateMany"
              },
              {
                "file": "packages/api/src/modules/inngest/event-storage/cleanup.cron.ts",
                "line": 17,
                "op": "deleteMany"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 0,
            "typeMentionsByArea": []
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One payload handed to Inngest, recorded by the eventTracking middleware so a failed send can be found and replayed. It says the event was sent, not that any function ran.",
          "keyFields": [
            {
              "name": "batchId",
              "meaning": "one UUID per inngest.send call, shared by every payload in it. Tracing stops at the batch."
            },
            {
              "name": "status",
              "meaning": "pending on insert, then success for the whole batch once Inngest returns ids. A stale pending row is a failed send."
            },
            {
              "name": "inngestEventName",
              "meaning": "the name sent, like app/case/note.created"
            },
            {
              "name": "rawInngestEventPayload",
              "meaning": "the full payload object as Inngest received it, kept so the send can be inspected or replayed"
            }
          ],
          "references": [],
          "lifecycle": "pending → success → deleted by the weekly cron",
          "grouped": [],
          "flags": [
            "write-only",
            "pruned-weekly"
          ]
        },
        {
          "key": "app/CelebratoryMessage",
          "name": "CelebratoryMessage",
          "table": null,
          "datastore": "app",
          "domain": "plumbing",
          "isView": false,
          "file": "packages/db/prisma/schema.prisma",
          "line": 48,
          "idPrefix": "cmsg_",
          "idPrefixShared": [],
          "doc": null,
          "fieldCount": 11,
          "fields": [
            {
              "name": "id",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": true,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "tier",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "header",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Can contain {{slackUserId}} and {{formattedAmount}} placeholders",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "body",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Can contain {{slackUserId}} and {{formattedAmount}} placeholders",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "footer",
              "type": "String",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "Can contain {{slackUserId}} and {{formattedAmount}} placeholders",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "isActive",
              "type": "Boolean",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "weight",
              "type": "Int",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "For random selection weighting",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdBy",
              "type": "Admin",
              "list": false,
              "optional": true,
              "kind": "relation",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": true,
              "relationTarget": "Admin",
              "onDelete": null
            },
            {
              "name": "createdById",
              "type": "String",
              "list": false,
              "optional": true,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": null,
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "createdAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            },
            {
              "name": "updatedAt",
              "type": "DateTime",
              "list": false,
              "optional": false,
              "kind": "scalar",
              "isId": false,
              "isUnique": false,
              "doc": "@zod.custom.omit([input])",
              "fk": false,
              "relationTarget": null,
              "onDelete": null
            }
          ],
          "blockAttributes": [
            "@@index([tier, isActive])"
          ],
          "looseRefs": [],
          "relationsOut": [
            {
              "field": "createdBy",
              "target": "Admin",
              "list": false,
              "optional": true,
              "fk": true,
              "fkFields": [
                "createdById"
              ],
              "references": [
                "id"
              ],
              "relationName": null,
              "onDelete": null,
              "targetKey": "app/Admin",
              "targetDomain": "people"
            }
          ],
          "relationsIn": [
            {
              "model": "Admin",
              "field": "celebratoryMessages",
              "fk": false,
              "list": true,
              "sourceKey": "app/Admin",
              "sourceDomain": "people"
            }
          ],
          "crossDomainRelations": [
            {
              "dir": "out",
              "domain": "people",
              "model": "Admin",
              "field": "createdBy"
            },
            {
              "dir": "in",
              "domain": "people",
              "model": "Admin",
              "field": "celebratoryMessages"
            }
          ],
          "usage": {
            "total": 7,
            "reads": 4,
            "writes": 3,
            "ops": {
              "create": 1,
              "findUnique": 2,
              "delete": 1,
              "findMany": 2,
              "update": 1
            },
            "byArea": [
              {
                "area": "api/payments",
                "reads": 4,
                "writes": 3,
                "domain": "money",
                "kind": "api-module"
              }
            ],
            "writeSites": [
              {
                "file": "packages/api/src/modules/payments/celebratoryMessages/procedures/createCelebratoryMessage.handler.ts",
                "line": 9,
                "op": "create"
              },
              {
                "file": "packages/api/src/modules/payments/celebratoryMessages/procedures/deleteCelebratoryMessage.handler.ts",
                "line": 23,
                "op": "delete"
              },
              {
                "file": "packages/api/src/modules/payments/celebratoryMessages/procedures/updateCelebratoryMessage.handler.ts",
                "line": 25,
                "op": "update"
              }
            ],
            "nested": 0,
            "nestedByArea": [],
            "typeMentions": 5,
            "typeMentionsByArea": [
              {
                "area": "api/payments",
                "n": 3
              },
              {
                "area": "admin",
                "n": 2
              }
            ]
          },
          "unreferenced": false,
          "interpreted": true,
          "tier": "supporting",
          "meaning": "One Slack celebration an admin wrote, filed under an amount tier. When a sale lands, one row is drawn at random from its tier and rendered into the Slack post.",
          "keyFields": [
            {
              "name": "tier",
              "meaning": "1 to 10, chosen from the payment amount: tier 1 up to £499, tier 10 from £10,000"
            },
            {
              "name": "body",
              "meaning": "Handlebars template. {{slackUserId}} and {{formattedAmount}} are filled in at send time."
            },
            {
              "name": "weight",
              "meaning": "how many copies of the row go into the draw, so weight 3 is three times as likely as weight 1"
            },
            {
              "name": "isActive",
              "meaning": "off switch. If a tier has no active rows the sender falls back to one hardcoded message."
            }
          ],
          "references": [
            {
              "field": "createdById",
              "target": "people",
              "meaning": "the admin who wrote it, from the admin app's celebratory-messages page"
            }
          ],
          "lifecycle": null,
          "grouped": [],
          "flags": [
            "admin-authored",
            "handlebars-template"
          ]
        }
      ]
    }
  ]
}