{
  "org": "TTRPGSolution",
  "generatedAt": "2026-08-16T04:42:21.903Z",
  "nodes": [
    {
      "ref": {
        "name": "tabletop-infra",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/tabletop-infra",
        "description": "Shared infra, CI/CD, observability, cross-cutting QA strategy"
      },
      "status": "in-progress",
      "current": {
        "languages": {
          "Shell": 57080,
          "TypeScript": 53590,
          "JavaScript": 9325,
          "Dockerfile": 3203
        },
        "packageDependencies": [
          "@eslint/js",
          "eslint",
          "prettier",
          "turbo",
          "typescript",
          "typescript-eslint",
          "vitest"
        ],
        "internalPackageDependencies": [],
        "ci": {
          "latestConclusion": "skipped",
          "latestWorkflowName": "e2e",
          "latestRunUrl": "https://github.com/TTRPGSolution/tabletop-infra/actions/runs/31876987643"
        },
        "lastCommitSha": "e728c8ed7096816f51de673fc2ee0e66f774e9ab",
        "lastCommitDate": "2026-08-15T21:22:21Z",
        "openPullRequests": 0,
        "dependencyCruiser": {
          "moduleCount": 38,
          "dependencyCount": 49,
          "violationCount": 0,
          "modules": [
            {
              "source": "packages/e2e/fixtures/stack.ts",
              "dependencies": [
                "@playwright/test"
              ]
            },
            {
              "source": "@playwright/test",
              "dependencies": []
            },
            {
              "source": "packages/e2e/playwright.config.ts",
              "dependencies": [
                "@playwright/test"
              ]
            },
            {
              "source": "packages/e2e/specs/harness-smoke.spec.ts",
              "dependencies": [
                "packages/e2e/fixtures/stack.ts"
              ]
            },
            {
              "source": "packages/schema-types/codegen.ts",
              "dependencies": []
            },
            {
              "source": "packages/schema-types/scripts/check-composition.ts",
              "dependencies": [
                "@apollo/composition",
                "fs/promises",
                "../../node_modules/graphql/index.js",
                "path",
                "url"
              ]
            },
            {
              "source": "@apollo/composition",
              "dependencies": []
            },
            {
              "source": "fs/promises",
              "dependencies": []
            },
            {
              "source": "../../node_modules/graphql/index.js",
              "dependencies": []
            },
            {
              "source": "path",
              "dependencies": []
            },
            {
              "source": "url",
              "dependencies": []
            },
            {
              "source": "packages/schema-types/scripts/contractBreakReport.ts",
              "dependencies": []
            },
            {
              "source": "packages/schema-types/scripts/update-contracts.ts",
              "dependencies": [
                "fs/promises",
                "../../node_modules/graphql/index.js",
                "url"
              ]
            },
            {
              "source": "packages/schema-types/test/check-composition.test.ts",
              "dependencies": [
                "packages/schema-types/scripts/check-composition.ts",
                "fs/promises",
                "../../node_modules/graphql/index.js",
                "url",
                "vitest"
              ]
            },
            {
              "source": "vitest",
              "dependencies": []
            },
            {
              "source": "packages/service-core/src/config.ts",
              "dependencies": [
                "zod"
              ]
            },
            {
              "source": "zod",
              "dependencies": []
            },
            {
              "source": "packages/service-core/src/health.ts",
              "dependencies": []
            },
            {
              "source": "packages/service-core/src/index.ts",
              "dependencies": [
                "packages/service-core/src/config.ts",
                "packages/service-core/src/health.ts",
                "packages/service-core/src/logging.ts",
                "packages/service-core/src/metrics.ts",
                "packages/service-core/src/tracing.ts"
              ]
            },
            {
              "source": "packages/service-core/src/logging.ts",
              "dependencies": [
                "async_hooks",
                "crypto",
                "pino"
              ]
            },
            {
              "source": "async_hooks",
              "dependencies": []
            },
            {
              "source": "crypto",
              "dependencies": []
            },
            {
              "source": "pino",
              "dependencies": []
            },
            {
              "source": "packages/service-core/src/metrics.ts",
              "dependencies": [
                "prom-client"
              ]
            },
            {
              "source": "prom-client",
              "dependencies": []
            },
            {
              "source": "packages/service-core/src/tracing.ts",
              "dependencies": [
                "packages/service-core/src/logging.ts",
                "@opentelemetry/api",
                "@opentelemetry/auto-instrumentations-node",
                "@opentelemetry/exporter-trace-otlp-http",
                "@opentelemetry/sdk-node"
              ]
            },
            {
              "source": "@opentelemetry/api",
              "dependencies": []
            },
            {
              "source": "@opentelemetry/auto-instrumentations-node",
              "dependencies": []
            },
            {
              "source": "@opentelemetry/exporter-trace-otlp-http",
              "dependencies": []
            },
            {
              "source": "@opentelemetry/sdk-node",
              "dependencies": []
            },
            {
              "source": "packages/service-core/test/config.test.ts",
              "dependencies": [
                "packages/service-core/src/config.ts",
                "vitest",
                "zod"
              ]
            },
            {
              "source": "packages/service-core/test/health.express.test.ts",
              "dependencies": [
                "packages/service-core/src/health.ts",
                "express",
                "supertest",
                "vitest"
              ]
            },
            {
              "source": "express",
              "dependencies": []
            },
            {
              "source": "supertest",
              "dependencies": []
            },
            {
              "source": "packages/service-core/test/health.test.ts",
              "dependencies": [
                "packages/service-core/src/health.ts",
                "fastify",
                "vitest"
              ]
            },
            {
              "source": "fastify",
              "dependencies": []
            },
            {
              "source": "packages/service-core/test/logging.test.ts",
              "dependencies": [
                "packages/service-core/src/logging.ts",
                "express",
                "supertest",
                "vitest"
              ]
            },
            {
              "source": "packages/service-core/test/metrics.express.test.ts",
              "dependencies": [
                "packages/service-core/src/metrics.ts",
                "express",
                "supertest",
                "vitest"
              ]
            }
          ]
        },
        "madge": {
          "moduleCount": 19,
          "circularPaths": []
        },
        "federation": {
          "ownedTypes": [
            "User",
            "Character",
            "Party",
            "Table",
            "Ruleset",
            "TableMembership",
            "Product"
          ],
          "extendedTypes": [],
          "schemaFiles": [
            "packages/schema-types/contracts/auth-service.graphql",
            "packages/schema-types/contracts/character-service.graphql",
            "packages/schema-types/contracts/example-service.graphql",
            "packages/schema-types/contracts/map-service.graphql",
            "packages/schema-types/contracts/ruleset-service.graphql",
            "packages/schema-types/contracts/table-service.graphql",
            "packages/schema-types/schema/ping.graphql",
            "packages/schema-types/test/fixtures/composition-breaking/catalog.graphql",
            "packages/schema-types/test/fixtures/composition-breaking/pricing.graphql",
            "packages/schema-types/test/fixtures/composition-compatible/catalog.graphql",
            "packages/schema-types/test/fixtures/composition-compatible/pricing.graphql"
          ]
        },
        "classDiagram": {
          "entries": [
            {
              "kind": "class",
              "name": "ConfigValidationError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ContractBreakReport",
              "properties": [
                "sourceSubgraph: string",
                "brokenDependency: string",
                "compositionErrors: string[]",
                "detectedAt: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "LoadConfigOptions",
              "properties": [
                "env: NodeJS.ProcessEnv",
                "schema: TSchema",
                "envKeys: Record<string, string>"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "DependencyCheck",
              "properties": [
                "name: string",
                "check: () => Promise<void>",
                "timeoutMs: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "DependencyReport",
              "properties": [
                "name: string",
                "status: DependencyStatus",
                "latencyMs: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ReadinessReport",
              "properties": [
                "status: ReadinessStatus",
                "dependencies: DependencyReport[]",
                "timestamp: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreateLoggerOptions",
              "properties": [
                "level: string",
                "serviceName: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TracingOptions",
              "properties": [
                "serviceName: string",
                "otelExporterUrl: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "Args",
              "properties": [
                "subgraph: string",
                "sdlFile: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "Args",
              "properties": [
                "subgraph: string",
                "sdlFile: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CorrelationStore",
              "properties": [
                "correlationId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "StackFixtures",
              "properties": [
                "stackReady: undefined"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            }
          ]
        },
        "graphqlSchema": {
          "types": [
            {
              "name": "User",
              "kind": "object",
              "fields": [
                "id: ID!",
                "email: String!",
                "status: UserStatus!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "status",
                  "refType": "UserStatus"
                }
              ]
            },
            {
              "name": "UserStatus",
              "kind": "enum",
              "fields": [
                "ACTIVE",
                "DISABLED"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "me: User"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "me",
                  "refType": "User"
                }
              ]
            },
            {
              "name": "Character",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "owner: User!",
                "party: Party!",
                "table: Table!",
                "isNpc: Boolean!",
                "stats: JSON!",
                "resources: [ResourcePool!]!",
                "createdAt: DateTime!",
                "updatedAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "owner",
                  "refType": "User"
                },
                {
                  "field": "party",
                  "refType": "Party"
                },
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "stats",
                  "refType": "JSON"
                },
                {
                  "field": "resources",
                  "refType": "ResourcePool"
                },
                {
                  "field": "createdAt",
                  "refType": "DateTime"
                },
                {
                  "field": "updatedAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "ResourcePool",
              "kind": "object",
              "fields": [
                "key: String!",
                "current: Int!",
                "max: Int!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "User",
              "kind": "object",
              "fields": [
                "id: ID!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Party",
              "kind": "object",
              "fields": [
                "id: ID!",
                "characters: [Character!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "characters: [Character!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "characters: [Character!]!",
                "character: Character"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                },
                {
                  "field": "character",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "CharacterInput",
              "kind": "input",
              "fields": [
                "name: String!",
                "partyId: ID!",
                "ownerId: ID!",
                "stats: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "CharacterStatsUpdateInput",
              "kind": "input",
              "fields": [
                "stats: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ResourceUpdateInput",
              "kind": "input",
              "fields": [
                "key: String!",
                "current: Int",
                "max: Int"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "FieldValidationError",
              "kind": "object",
              "fields": [
                "path: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ValidationFailure",
              "kind": "object",
              "fields": [
                "errors: [FieldValidationError!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "errors",
                  "refType": "FieldValidationError"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createCharacter: CharacterMutationResult!",
                "updateCharacterStats: CharacterMutationResult!",
                "updateCharacterDetails: CharacterMutationResult!",
                "setCharacterNpcFlag: Character!",
                "updateCharacterResource: CharacterMutationResult!",
                "deleteCharacter: Boolean!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createCharacter",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "updateCharacterStats",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "updateCharacterDetails",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "setCharacterNpcFlag",
                  "refType": "Character"
                },
                {
                  "field": "updateCharacterResource",
                  "refType": "CharacterMutationResult"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "characterChanged: Character!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characterChanged",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "ping: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "_mapServicePlaceholder: Boolean"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "RulesetOrigin",
              "kind": "enum",
              "fields": [
                "PRESET",
                "CUSTOM"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "RulesetStatus",
              "kind": "enum",
              "fields": [
                "ACTIVE",
                "ARCHIVED"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Ruleset",
              "kind": "object",
              "fields": [
                "id: ID!",
                "gameSystemName: String!",
                "statSchema: JSON!",
                "diceConventions: JSON!",
                "origin: RulesetOrigin!",
                "status: RulesetStatus!",
                "ownerId: ID",
                "clonedFromId: ID",
                "createdAt: DateTime!",
                "updatedAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "statSchema",
                  "refType": "JSON"
                },
                {
                  "field": "diceConventions",
                  "refType": "JSON"
                },
                {
                  "field": "origin",
                  "refType": "RulesetOrigin"
                },
                {
                  "field": "status",
                  "refType": "RulesetStatus"
                },
                {
                  "field": "createdAt",
                  "refType": "DateTime"
                },
                {
                  "field": "updatedAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "ValidationError",
              "kind": "object",
              "fields": [
                "field: String!",
                "path: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ValidationResult",
              "kind": "object",
              "fields": [
                "valid: Boolean!",
                "errors: [ValidationError!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "errors",
                  "refType": "ValidationError"
                }
              ]
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "ruleset: Ruleset"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "ruleset",
                  "refType": "Ruleset"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "availableRulesets: [Ruleset!]!",
                "ruleset: Ruleset",
                "myRulesets: [Ruleset!]!",
                "validateCharacterData: ValidationResult!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "availableRulesets",
                  "refType": "Ruleset"
                },
                {
                  "field": "ruleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "myRulesets",
                  "refType": "Ruleset"
                },
                {
                  "field": "validateCharacterData",
                  "refType": "ValidationResult"
                }
              ]
            },
            {
              "name": "CreateRulesetInput",
              "kind": "input",
              "fields": [
                "gameSystemName: String!",
                "statSchema: JSON!",
                "diceConventions: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "UpdateRulesetInput",
              "kind": "input",
              "fields": [
                "gameSystemName: String",
                "statSchema: JSON",
                "diceConventions: JSON"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createRuleset: Ruleset!",
                "updateRuleset: Ruleset!",
                "deleteRuleset: Ruleset!",
                "cloneRuleset: Ruleset!",
                "assignRulesetToTable: Table!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "updateRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "deleteRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "cloneRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "assignRulesetToTable",
                  "refType": "Table"
                }
              ]
            },
            {
              "name": "TableRole",
              "kind": "enum",
              "fields": [
                "DM",
                "CO_DM",
                "PLAYER",
                "SPECTATOR"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "creatorUserId: ID!",
                "viewerRole: TableRole",
                "members: [TableMembership!]!",
                "parties: [Party!]!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "viewerRole",
                  "refType": "TableRole"
                },
                {
                  "field": "members",
                  "refType": "TableMembership"
                },
                {
                  "field": "parties",
                  "refType": "Party"
                }
              ]
            },
            {
              "name": "TableMembership",
              "kind": "object",
              "fields": [
                "id: ID!",
                "table: Table!",
                "userId: ID!",
                "role: TableRole!",
                "isActive: Boolean!",
                "joinedAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "role",
                  "refType": "TableRole"
                }
              ]
            },
            {
              "name": "InviteCode",
              "kind": "object",
              "fields": [
                "code: String!",
                "tableId: ID!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Party",
              "kind": "object",
              "fields": [
                "id: ID!",
                "table: Table!",
                "name: String!",
                "members: [TableMembership!]!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "members",
                  "refType": "TableMembership"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "table: Table",
                "myTables: [Table!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "myTables",
                  "refType": "Table"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createTable: Table!",
                "generateInviteCode: InviteCode!",
                "regenerateInviteCode: InviteCode!",
                "joinTable: TableMembership!",
                "promoteMember: TableMembership!",
                "demoteMember: TableMembership!",
                "setSpectator: TableMembership!",
                "removeMember: Boolean!",
                "createParty: Party!",
                "updateParty: Party!",
                "deleteParty: Boolean!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createTable",
                  "refType": "Table"
                },
                {
                  "field": "generateInviteCode",
                  "refType": "InviteCode"
                },
                {
                  "field": "regenerateInviteCode",
                  "refType": "InviteCode"
                },
                {
                  "field": "joinTable",
                  "refType": "TableMembership"
                },
                {
                  "field": "promoteMember",
                  "refType": "TableMembership"
                },
                {
                  "field": "demoteMember",
                  "refType": "TableMembership"
                },
                {
                  "field": "setSpectator",
                  "refType": "TableMembership"
                },
                {
                  "field": "createParty",
                  "refType": "Party"
                },
                {
                  "field": "updateParty",
                  "refType": "Party"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "ping: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Product",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "product: Product"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "product",
                  "refType": "Product"
                }
              ]
            },
            {
              "name": "Product",
              "kind": "object",
              "fields": [
                "id: ID!",
                "price: Float!",
                "discountedPrice: Float!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "discount: Product"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "discount",
                  "refType": "Product"
                }
              ]
            },
            {
              "name": "Product",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "price: Float!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "product: Product"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "product",
                  "refType": "Product"
                }
              ]
            },
            {
              "name": "Product",
              "kind": "object",
              "fields": [
                "id: ID!",
                "price: Float!",
                "discountedPrice: Float!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "discount: Product"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "discount",
                  "refType": "Product"
                }
              ]
            }
          ]
        },
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/e2e-package-ci.yml",
              "name": "e2e package CI",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: ./.github/workflows/reusable-node-ci.yml",
                      "uses": "./.github/workflows/reusable-node-ci.yml",
                      "run": null
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/e2e.yml",
              "name": "e2e",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "e2e",
                  "name": "e2e",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "npm ci",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "npx playwright install --with-deps",
                      "uses": null,
                      "run": "npx playwright install --with-deps"
                    },
                    {
                      "label": "npm run test:e2e",
                      "uses": null,
                      "run": "npm run test:e2e"
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/example-service-ci.yml",
              "name": "example-service CI",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: ./.github/workflows/reusable-node-ci.yml",
                      "uses": "./.github/workflows/reusable-node-ci.yml",
                      "run": null
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/publish-service-core.yml",
              "name": "publish service-core",
              "triggers": [
                "push",
                "workflow_dispatch"
              ],
              "jobs": [
                {
                  "id": "publish",
                  "name": "publish",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install workspace dependencies",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Build service-core",
                      "uses": null,
                      "run": "npm run build --workspace packages/service-core"
                    },
                    {
                      "label": "Point the published package at compiled output",
                      "uses": null,
                      "run": "npm pkg set main=./dist/index.js types=./dist/index.d.ts"
                    },
                    {
                      "label": "Set the published version",
                      "uses": null,
                      "run": "npm pkg set version=0.1.0-ci.${{ github.run_number }}"
                    },
                    {
                      "label": "Publish",
                      "uses": null,
                      "run": "npm publish"
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/reusable-node-ci.yml",
              "name": "Reusable Node CI",
              "triggers": [
                "workflow_call"
              ],
              "jobs": [
                {
                  "id": "lint",
                  "name": "lint",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)",
                      "uses": null,
                      "run": "corepack enable"
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install dependencies",
                      "uses": null,
                      "run": "case \"${{ inputs.package-manager }}\" in\n  pnpm) corepack enable && pnpm install --frozen-lockfile ;;\n  yarn) corepack enable && yarn install --frozen-lockfile ;;\n  npm) npm ci ;;\nesac\n"
                    },
                    {
                      "label": "${{ inputs.package-manager }} run lint",
                      "uses": null,
                      "run": "${{ inputs.package-manager }} run lint"
                    }
                  ]
                },
                {
                  "id": "typecheck",
                  "name": "typecheck",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)",
                      "uses": null,
                      "run": "corepack enable"
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install dependencies",
                      "uses": null,
                      "run": "case \"${{ inputs.package-manager }}\" in\n  pnpm) corepack enable && pnpm install --frozen-lockfile ;;\n  yarn) corepack enable && yarn install --frozen-lockfile ;;\n  npm) npm ci ;;\nesac\n"
                    },
                    {
                      "label": "Run codegen if the calling repo defines it (schema-types drift must fail typecheck, not pass silently)",
                      "uses": null,
                      "run": "if node -e \"process.exit(require('./package.json').scripts?.codegen ? 0 : 1)\"; then\n  ${{ inputs.package-manager }} run codegen\nelse\n  echo \"No codegen script in package.json — skipping.\"\nfi\n"
                    },
                    {
                      "label": "${{ inputs.package-manager }} run typecheck",
                      "uses": null,
                      "run": "${{ inputs.package-manager }} run typecheck"
                    }
                  ]
                },
                {
                  "id": "test",
                  "name": "test",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)",
                      "uses": null,
                      "run": "corepack enable"
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install dependencies",
                      "uses": null,
                      "run": "case \"${{ inputs.package-manager }}\" in\n  pnpm) corepack enable && pnpm install --frozen-lockfile ;;\n  yarn) corepack enable && yarn install --frozen-lockfile ;;\n  npm) npm ci ;;\nesac\n"
                    },
                    {
                      "label": "Run unit tests with coverage",
                      "uses": null,
                      "run": "if ls vitest.config.* >/dev/null 2>&1; then\n  case \"${{ inputs.package-manager }}\" in\n    pnpm) pnpm run test -- --coverage --reporter=github-actions --exclude '**/test/support/**' --exclude '**/test/integration/**' --exclude '**/tests/support/**' --exclude '**/tests/integration/**' ;;\n    yarn) yarn test --coverage --reporter=github-actions --exclude '**/test/support/**' --exclude '**/test/integration/**' --exclude '**/tests/support/**' --exclude '**/tests/integration/**' ;;\n    npm) npm run test -- --coverage --reporter=github-actions --exclude '**/test/support/**' --exclude '**/test/integration/**' --exclude '**/tests/support/**' --exclude '**/tests/integration/**' ;;\n  esac\nelse\n  case \"${{ inputs.package-manager }}\" in\n    pnpm) pnpm run test ;;\n    yarn) yarn test ;;\n    npm) npm run test ;;\n  esac\nfi\n"
                    }
                  ]
                },
                {
                  "id": "integration",
                  "name": "integration",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)",
                      "uses": null,
                      "run": "corepack enable"
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install dependencies",
                      "uses": null,
                      "run": "case \"${{ inputs.package-manager }}\" in\n  pnpm) corepack enable && pnpm install --frozen-lockfile ;;\n  yarn) corepack enable && yarn install --frozen-lockfile ;;\n  npm) npm ci ;;\nesac\n"
                    },
                    {
                      "label": "Run integration suite if this repo has one (contracts/integration-test-contract.md)",
                      "uses": null,
                      "run": "targets=\"\"\nfor dir in test/support test/integration tests/support tests/integration; do\n  if [ -d \"$dir\" ]; then\n    targets=\"$targets $dir\"\n  fi\ndone\nif [ -z \"$targets\" ]; then\n  echo \"No test/support, test/integration, tests/support, or tests/integration directory — no service-owned database here (contracts/integration-test-contract.md exemption). Skipping.\"\n  exit 0\nfi\ncase \"${{ inputs.package-manager }}\" in\n  pnpm) pnpm run test -- $targets ;;\n  yarn) yarn test $targets ;;\n  npm) npm run test -- $targets ;;\nesac\n"
                    }
                  ]
                },
                {
                  "id": "build",
                  "name": "build",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)",
                      "uses": null,
                      "run": "corepack enable"
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install dependencies",
                      "uses": null,
                      "run": "case \"${{ inputs.package-manager }}\" in\n  pnpm) corepack enable && pnpm install --frozen-lockfile ;;\n  yarn) corepack enable && yarn install --frozen-lockfile ;;\n  npm) npm ci ;;\nesac\n"
                    },
                    {
                      "label": "${{ inputs.package-manager }} run build",
                      "uses": null,
                      "run": "${{ inputs.package-manager }} run build"
                    },
                    {
                      "label": "Build Docker image if a Dockerfile exists (proves FR-010 packageability every PR)",
                      "uses": null,
                      "run": "dockerfile=\"${{ inputs.working-directory }}/Dockerfile\"\ncontext=\"${{ inputs.docker-context }}\"\nif [ -z \"$context\" ]; then\n  context=\"${{ inputs.working-directory }}\"\nfi\nif [ -f \"$dockerfile\" ]; then\n  docker build --secret id=node_auth_token,env=NODE_AUTH_TOKEN -f \"$dockerfile\" -t \"${{ github.event.repository.name }}:pr-${{ github.event.pull_request.number }}\" \"$context\"\nelse\n  echo \"No Dockerfile at ${{ inputs.working-directory }} — skipping image build.\"\nfi\n"
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/schema-types-ci.yml",
              "name": "schema-types CI",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: ./.github/workflows/reusable-node-ci.yml",
                      "uses": "./.github/workflows/reusable-node-ci.yml",
                      "run": null
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": {
                "name": "Mutation",
                "kind": "OBJECT"
              },
              "subscriptionType": {
                "name": "Subscription",
                "kind": "OBJECT"
              },
              "types": [
                {
                  "kind": "OBJECT",
                  "name": "User",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "UserStatus",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "ACTIVE",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DISABLED",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "discount",
                      "description": null,
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "OBJECT",
                        "name": "Product",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "DateTime",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "JSON",
                  "description": "Arbitrary JSON value — used for the JSON-Schema `statSchema` document and for\nopaque character-data payloads passed to validateCharacterData.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Character",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "owner",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "User",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "party",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isNpc",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "stats",
                      "description": "Full stats payload, validated against the owning table's ruleset\nstatSchema on every write. Full-replace semantics on update.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "resources",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "ResourcePool",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updatedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ResourcePool",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "key",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "current",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "max",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Int",
                  "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Party",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMembership",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Table",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "creatorUserId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "viewerRole",
                      "description": "The requesting (authenticated) user's current role at this table, or null if they\nhave no active membership. Convenience field for clients; NOT the mechanism the\ngateway uses for per-field authorization (see contracts/role-resolution.yaml).",
                      "args": [],
                      "type": {
                        "kind": "ENUM",
                        "name": "TableRole",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMembership",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "parties",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Party",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "CharacterInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "name",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "partyId",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ownerId",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "stats",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "CharacterStatsUpdateInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "stats",
                      "description": "Full-replacement stats payload — not a partial merge.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "ResourceUpdateInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "key",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "current",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "Int",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "max",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "Int",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "FieldValidationError",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "path",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "message",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ValidationFailure",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "errors",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "FieldValidationError",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "UNION",
                  "name": "CharacterMutationResult",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": [
                    {
                      "kind": "OBJECT",
                      "name": "Character",
                      "ofType": null
                    },
                    {
                      "kind": "OBJECT",
                      "name": "ValidationFailure",
                      "ofType": null
                    }
                  ]
                },
                {
                  "kind": "OBJECT",
                  "name": "Mutation",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "createTable",
                      "description": "FR-001..FR-004: creator becomes DM of the new table.",
                      "args": [
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "generateInviteCode",
                      "description": "FR-005, FR-010: DM or co-DM only. Regenerating invalidates the previous code.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "InviteCode",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "regenerateInviteCode",
                      "description": null,
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "InviteCode",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "joinTable",
                      "description": "FR-006..FR-009: joins as PLAYER, or reports already-a-member; rejects invalid/superseded codes.",
                      "args": [
                        {
                          "name": "inviteCode",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "promoteMember",
                      "description": "FR-012, FR-017..FR-019: role-management actions, all scoped to a single tableMembership.",
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "demoteMember",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "setSpectator",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "removeMember",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createParty",
                      "description": "FR-020..FR-024: party CRUD, DM/co-DM only; memberIds must be active table members.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "memberIds",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": null,
                              "kind": "LIST",
                              "ofType": {
                                "name": null,
                                "kind": "NON_NULL",
                                "ofType": {
                                  "name": "ID",
                                  "kind": "SCALAR",
                                  "ofType": null
                                }
                              }
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateParty",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "String",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "memberIds",
                          "description": null,
                          "type": {
                            "kind": "LIST",
                            "name": null,
                            "ofType": {
                              "name": null,
                              "kind": "NON_NULL",
                              "ofType": {
                                "name": "ID",
                                "kind": "SCALAR",
                                "ofType": null
                              }
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deleteParty",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Subscription",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "characterChanged",
                      "description": null,
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Character",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "RulesetOrigin",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "PRESET",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "CUSTOM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "RulesetStatus",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "ACTIVE",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARCHIVED",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Ruleset",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "gameSystemName",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "statSchema",
                      "description": "JSON Schema (2020-12) document describing valid character stats/fields.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceConventions",
                      "description": "Structured, declarative dice-roll definitions (never executable code).",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "origin",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "RulesetOrigin",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "status",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "RulesetStatus",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ownerId",
                      "description": "Null for PRESET rulesets. Opaque platform user id for CUSTOM rulesets.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "ID",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "clonedFromId",
                      "description": "Set when this ruleset was created via cloneRuleset; null otherwise.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "ID",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updatedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ValidationError",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "field",
                      "description": "Best-effort human-readable field name.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "path",
                      "description": "Raw JSON Pointer to the offending location.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "message",
                      "description": "Human-readable reason the field failed validation.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ValidationResult",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "valid",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "errors",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "ValidationError",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "CreateRulesetInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "gameSystemName",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "statSchema",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceConventions",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "UpdateRulesetInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "gameSystemName",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "statSchema",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "JSON",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceConventions",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "JSON",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "TableRole",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "CO_DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "PLAYER",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SPECTATOR",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "TableMembership",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "userId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "role",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableRole",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isActive",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "joinedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "InviteCode",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "code",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "tableId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Product",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "price",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Float",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "discountedPrice",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Float",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Float",
                  "description": "The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-foundations-skeleton",
          "specs/002-observability-security-hardening",
          "specs/003-deployment-devops",
          "specs/004-qa-testing-strategy"
        ],
        "adrFiles": [
          "docs/adr/0001-monorepo-vs-polyrepo.md",
          "docs/adr/0002-publish-service-core-github-packages.md",
          "docs/adr/0004-testing-tool-choices.md"
        ],
        "specSummaries": [
          {
            "path": "specs/001-foundations-skeleton/spec.md",
            "title": "Feature Specification: Foundations and Repo/Infra Skeleton",
            "summary": "A new engineer joins the project, clones the repository, and needs to get a\nrunnable local environment (database, cache, event bus placeholder, and one\nrunning service) without hunting through chat history or asking a teammate\nto walk them through undocumented setup steps."
          },
          {
            "path": "specs/002-observability-security-hardening/spec.md",
            "title": "Feature Specification: Observability and Security Hardening",
            "summary": "An on-call engineer gets a report that something went wrong for a specific\nplayer action (e.g. a token move that didn't sync). They need to follow that\none request as it passed through the gateway and every service it touched,\nreading a single connected trail of log entries instead of grepping through\neach service's logs separately and guessing which entries belong together."
          },
          {
            "path": "specs/003-deployment-devops/spec.md",
            "title": "Feature Specification: Deployment and DevOps",
            "summary": "An engineer needs to run a service in a real (non-laptop) environment. The\nservice must start from a single, versioned deployment definition that\ndeclares how much CPU and memory it needs and is allowed to use — figures\nbased on what the service actually consumed under the realistic load test\nfrom the observability epic, not a guess."
          },
          {
            "path": "specs/004-qa-testing-strategy/spec.md",
            "title": "Feature Specification: QA and Testing Strategy",
            "summary": "An engineer finishing a story writes the unit tests for the logic they just\nadded or changed, as part of that same story — not as a follow-up ticket\nand not as someone else's job. Before anyone else looks at the change, the\nengineer already knows the new logic behaves as intended and that a\nregression in it will be caught automatically in the future."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": {
          "nodes": [
            {
              "id": "packages_e2e",
              "label": "packages/e2e",
              "kind": "folder",
              "detailHtml": "<h3>packages/e2e</h3><p>3 file(s)</p><ul><li><code>packages/e2e/fixtures/stack.ts</code></li><li><code>packages/e2e/playwright.config.ts</code></li><li><code>packages/e2e/specs/harness-smoke.spec.ts</code></li></ul>"
            },
            {
              "id": "_playwright_test",
              "label": "@playwright/test",
              "kind": "folder",
              "detailHtml": "<h3>@playwright/test</h3><p>1 file(s)</p><ul><li><code>@playwright/test</code></li></ul>"
            },
            {
              "id": "packages_schema-types",
              "label": "packages/schema-types",
              "kind": "folder",
              "detailHtml": "<h3>packages/schema-types</h3><p>5 file(s)</p><ul><li><code>packages/schema-types/codegen.ts</code></li><li><code>packages/schema-types/scripts/check-composition.ts</code></li><li><code>packages/schema-types/scripts/contractBreakReport.ts</code></li><li><code>packages/schema-types/scripts/update-contracts.ts</code></li><li><code>packages/schema-types/test/check-composition.test.ts</code></li></ul>"
            },
            {
              "id": "_apollo_composition",
              "label": "@apollo/composition",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/composition</h3><p>1 file(s)</p><ul><li><code>@apollo/composition</code></li></ul>"
            },
            {
              "id": "fs_promises",
              "label": "fs/promises",
              "kind": "folder",
              "detailHtml": "<h3>fs/promises</h3><p>1 file(s)</p><ul><li><code>fs/promises</code></li></ul>"
            },
            {
              "id": "_____",
              "label": "../..",
              "kind": "folder",
              "detailHtml": "<h3>../..</h3><p>1 file(s)</p><ul><li><code>../../node_modules/graphql/index.js</code></li></ul>"
            },
            {
              "id": "path",
              "label": "path",
              "kind": "folder",
              "detailHtml": "<h3>path</h3><p>1 file(s)</p><ul><li><code>path</code></li></ul>"
            },
            {
              "id": "url",
              "label": "url",
              "kind": "folder",
              "detailHtml": "<h3>url</h3><p>1 file(s)</p><ul><li><code>url</code></li></ul>"
            },
            {
              "id": "vitest",
              "label": "vitest",
              "kind": "folder",
              "detailHtml": "<h3>vitest</h3><p>1 file(s)</p><ul><li><code>vitest</code></li></ul>"
            },
            {
              "id": "packages_service-core",
              "label": "packages/service-core",
              "kind": "folder",
              "detailHtml": "<h3>packages/service-core</h3><p>11 file(s)</p><ul><li><code>packages/service-core/src/config.ts</code></li><li><code>packages/service-core/src/health.ts</code></li><li><code>packages/service-core/src/index.ts</code></li><li><code>packages/service-core/src/logging.ts</code></li><li><code>packages/service-core/src/metrics.ts</code></li><li><code>packages/service-core/src/tracing.ts</code></li><li><code>packages/service-core/test/config.test.ts</code></li><li><code>packages/service-core/test/health.express.test.ts</code></li><li><code>packages/service-core/test/health.test.ts</code></li><li><code>packages/service-core/test/logging.test.ts</code></li><li><code>packages/service-core/test/metrics.express.test.ts</code></li></ul>"
            },
            {
              "id": "zod",
              "label": "zod",
              "kind": "folder",
              "detailHtml": "<h3>zod</h3><p>1 file(s)</p><ul><li><code>zod</code></li></ul>"
            },
            {
              "id": "async_hooks",
              "label": "async_hooks",
              "kind": "folder",
              "detailHtml": "<h3>async_hooks</h3><p>1 file(s)</p><ul><li><code>async_hooks</code></li></ul>"
            },
            {
              "id": "crypto",
              "label": "crypto",
              "kind": "folder",
              "detailHtml": "<h3>crypto</h3><p>1 file(s)</p><ul><li><code>crypto</code></li></ul>"
            },
            {
              "id": "pino",
              "label": "pino",
              "kind": "folder",
              "detailHtml": "<h3>pino</h3><p>1 file(s)</p><ul><li><code>pino</code></li></ul>"
            },
            {
              "id": "prom-client",
              "label": "prom-client",
              "kind": "folder",
              "detailHtml": "<h3>prom-client</h3><p>1 file(s)</p><ul><li><code>prom-client</code></li></ul>"
            },
            {
              "id": "_opentelemetry_api",
              "label": "@opentelemetry/api",
              "kind": "folder",
              "detailHtml": "<h3>@opentelemetry/api</h3><p>1 file(s)</p><ul><li><code>@opentelemetry/api</code></li></ul>"
            },
            {
              "id": "_opentelemetry_auto-instrumentations-node",
              "label": "@opentelemetry/auto-instrumentations-node",
              "kind": "folder",
              "detailHtml": "<h3>@opentelemetry/auto-instrumentations-node</h3><p>1 file(s)</p><ul><li><code>@opentelemetry/auto-instrumentations-node</code></li></ul>"
            },
            {
              "id": "_opentelemetry_exporter-trace-otlp-http",
              "label": "@opentelemetry/exporter-trace-otlp-http",
              "kind": "folder",
              "detailHtml": "<h3>@opentelemetry/exporter-trace-otlp-http</h3><p>1 file(s)</p><ul><li><code>@opentelemetry/exporter-trace-otlp-http</code></li></ul>"
            },
            {
              "id": "_opentelemetry_sdk-node",
              "label": "@opentelemetry/sdk-node",
              "kind": "folder",
              "detailHtml": "<h3>@opentelemetry/sdk-node</h3><p>1 file(s)</p><ul><li><code>@opentelemetry/sdk-node</code></li></ul>"
            },
            {
              "id": "express",
              "label": "express",
              "kind": "folder",
              "detailHtml": "<h3>express</h3><p>1 file(s)</p><ul><li><code>express</code></li></ul>"
            },
            {
              "id": "supertest",
              "label": "supertest",
              "kind": "folder",
              "detailHtml": "<h3>supertest</h3><p>1 file(s)</p><ul><li><code>supertest</code></li></ul>"
            },
            {
              "id": "fastify",
              "label": "fastify",
              "kind": "folder",
              "detailHtml": "<h3>fastify</h3><p>1 file(s)</p><ul><li><code>fastify</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "packages_e2e___playwright_test",
              "source": "packages_e2e",
              "target": "_playwright_test",
              "label": "2"
            },
            {
              "id": "packages_schema-types___apollo_composition",
              "source": "packages_schema-types",
              "target": "_apollo_composition",
              "label": ""
            },
            {
              "id": "packages_schema-types__fs_promises",
              "source": "packages_schema-types",
              "target": "fs_promises",
              "label": "3"
            },
            {
              "id": "packages_schema-types_______",
              "source": "packages_schema-types",
              "target": "_____",
              "label": "3"
            },
            {
              "id": "packages_schema-types__path",
              "source": "packages_schema-types",
              "target": "path",
              "label": ""
            },
            {
              "id": "packages_schema-types__url",
              "source": "packages_schema-types",
              "target": "url",
              "label": "3"
            },
            {
              "id": "packages_schema-types__vitest",
              "source": "packages_schema-types",
              "target": "vitest",
              "label": ""
            },
            {
              "id": "packages_service-core__zod",
              "source": "packages_service-core",
              "target": "zod",
              "label": "2"
            },
            {
              "id": "packages_service-core__async_hooks",
              "source": "packages_service-core",
              "target": "async_hooks",
              "label": ""
            },
            {
              "id": "packages_service-core__crypto",
              "source": "packages_service-core",
              "target": "crypto",
              "label": ""
            },
            {
              "id": "packages_service-core__pino",
              "source": "packages_service-core",
              "target": "pino",
              "label": ""
            },
            {
              "id": "packages_service-core__prom-client",
              "source": "packages_service-core",
              "target": "prom-client",
              "label": ""
            },
            {
              "id": "packages_service-core___opentelemetry_api",
              "source": "packages_service-core",
              "target": "_opentelemetry_api",
              "label": ""
            },
            {
              "id": "packages_service-core___opentelemetry_auto-instrumentations-node",
              "source": "packages_service-core",
              "target": "_opentelemetry_auto-instrumentations-node",
              "label": ""
            },
            {
              "id": "packages_service-core___opentelemetry_exporter-trace-otlp-http",
              "source": "packages_service-core",
              "target": "_opentelemetry_exporter-trace-otlp-http",
              "label": ""
            },
            {
              "id": "packages_service-core___opentelemetry_sdk-node",
              "source": "packages_service-core",
              "target": "_opentelemetry_sdk-node",
              "label": ""
            },
            {
              "id": "packages_service-core__vitest",
              "source": "packages_service-core",
              "target": "vitest",
              "label": "5"
            },
            {
              "id": "packages_service-core__express",
              "source": "packages_service-core",
              "target": "express",
              "label": "3"
            },
            {
              "id": "packages_service-core__supertest",
              "source": "packages_service-core",
              "target": "supertest",
              "label": "3"
            },
            {
              "id": "packages_service-core__fastify",
              "source": "packages_service-core",
              "target": "fastify",
              "label": ""
            }
          ]
        },
        "classDiagram": {
          "nodes": [
            {
              "id": "ConfigValidationError",
              "label": "ConfigValidationError",
              "kind": "class",
              "detailHtml": "<h3>ConfigValidationError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "ContractBreakReport",
              "label": "ContractBreakReport",
              "kind": "interface",
              "detailHtml": "<h3>ContractBreakReport <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>sourceSubgraph: string</code></li><li><code>brokenDependency: string</code></li><li><code>compositionErrors: string[]</code></li><li><code>detectedAt: string</code></li></ul>"
            },
            {
              "id": "LoadConfigOptions",
              "label": "LoadConfigOptions",
              "kind": "interface",
              "detailHtml": "<h3>LoadConfigOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>env: NodeJS.ProcessEnv</code></li><li><code>schema: TSchema</code></li><li><code>envKeys: Record&lt;string, string&gt;</code></li></ul>"
            },
            {
              "id": "DependencyCheck",
              "label": "DependencyCheck",
              "kind": "interface",
              "detailHtml": "<h3>DependencyCheck <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>name: string</code></li><li><code>check: () =&gt; Promise&lt;void&gt;</code></li><li><code>timeoutMs: number</code></li></ul>"
            },
            {
              "id": "DependencyReport",
              "label": "DependencyReport",
              "kind": "interface",
              "detailHtml": "<h3>DependencyReport <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>name: string</code></li><li><code>status: DependencyStatus</code></li><li><code>latencyMs: number</code></li></ul>"
            },
            {
              "id": "ReadinessReport",
              "label": "ReadinessReport",
              "kind": "interface",
              "detailHtml": "<h3>ReadinessReport <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>status: ReadinessStatus</code></li><li><code>dependencies: DependencyReport[]</code></li><li><code>timestamp: string</code></li></ul>"
            },
            {
              "id": "CreateLoggerOptions",
              "label": "CreateLoggerOptions",
              "kind": "interface",
              "detailHtml": "<h3>CreateLoggerOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>level: string</code></li><li><code>serviceName: string</code></li></ul>"
            },
            {
              "id": "TracingOptions",
              "label": "TracingOptions",
              "kind": "interface",
              "detailHtml": "<h3>TracingOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>serviceName: string</code></li><li><code>otelExporterUrl: string</code></li></ul>"
            },
            {
              "id": "Args",
              "label": "Args",
              "kind": "interface",
              "detailHtml": "<h3>Args <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>subgraph: string</code></li><li><code>sdlFile: string</code></li></ul>"
            },
            {
              "id": "Args",
              "label": "Args",
              "kind": "interface",
              "detailHtml": "<h3>Args <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>subgraph: string</code></li><li><code>sdlFile: string</code></li></ul>"
            },
            {
              "id": "CorrelationStore",
              "label": "CorrelationStore",
              "kind": "interface",
              "detailHtml": "<h3>CorrelationStore <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>correlationId: string</code></li></ul>"
            },
            {
              "id": "StackFixtures",
              "label": "StackFixtures",
              "kind": "interface",
              "detailHtml": "<h3>StackFixtures <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>stackReady: undefined</code></li></ul>"
            }
          ],
          "edges": []
        },
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_e2e-package-ci_yml",
              "label": "e2e package CI",
              "kind": "workflow",
              "detailHtml": "<h3>e2e package CI</h3><p class=\"muted\"><code>.github/workflows/e2e-package-ci.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_e2e-package-ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_e2e-package-ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/e2e-package-ci.yml</code></p><ol><li>1. uses: ./.github/workflows/reusable-node-ci.yml<br/><code>uses: ./.github/workflows/reusable-node-ci.yml</code></li></ol>"
            },
            {
              "id": "_github_workflows_e2e_yml",
              "label": "e2e",
              "kind": "workflow",
              "detailHtml": "<h3>e2e</h3><p class=\"muted\"><code>.github/workflows/e2e.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_e2e_yml__e2e",
              "label": "e2e",
              "kind": "job",
              "parent": "_github_workflows_e2e_yml",
              "detailHtml": "<h3>e2e</h3><p class=\"muted\"><code>.github/workflows/e2e.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>3. npm ci<br/><code>run: npm ci</code></li><li>4. npx playwright install --with-deps<br/><code>run: npx playwright install --with-deps</code></li><li>5. npm run test:e2e<br/><code>run: npm run test:e2e</code></li></ol>"
            },
            {
              "id": "_github_workflows_example-service-ci_yml",
              "label": "example-service CI",
              "kind": "workflow",
              "detailHtml": "<h3>example-service CI</h3><p class=\"muted\"><code>.github/workflows/example-service-ci.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_example-service-ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_example-service-ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/example-service-ci.yml</code></p><ol><li>1. uses: ./.github/workflows/reusable-node-ci.yml<br/><code>uses: ./.github/workflows/reusable-node-ci.yml</code></li></ol>"
            },
            {
              "id": "_github_workflows_publish-service-core_yml",
              "label": "publish service-core",
              "kind": "workflow",
              "detailHtml": "<h3>publish service-core</h3><p class=\"muted\"><code>.github/workflows/publish-service-core.yml</code></p><p>Triggers: push, workflow_dispatch</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_publish-service-core_yml__publish",
              "label": "publish",
              "kind": "job",
              "parent": "_github_workflows_publish-service-core_yml",
              "detailHtml": "<h3>publish</h3><p class=\"muted\"><code>.github/workflows/publish-service-core.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>3. Install workspace dependencies<br/><code>run: npm ci</code></li><li>4. Build service-core<br/><code>run: npm run build --workspace packages/service-core</code></li><li>5. Point the published package at compiled output<br/><code>run: npm pkg set main=./dist/index.js types=./dist/index.d.ts</code></li><li>6. Set the published version<br/><code>run: npm pkg set version=0.1.0-ci.${{ github.run_number }}</code></li><li>7. Publish<br/><code>run: npm publish</code></li></ol>"
            },
            {
              "id": "_github_workflows_reusable-node-ci_yml",
              "label": "Reusable Node CI",
              "kind": "workflow",
              "detailHtml": "<h3>Reusable Node CI</h3><p class=\"muted\"><code>.github/workflows/reusable-node-ci.yml</code></p><p>Triggers: workflow_call</p><p>5 job(s)</p>"
            },
            {
              "id": "_github_workflows_reusable-node-ci_yml__lint",
              "label": "lint",
              "kind": "job",
              "parent": "_github_workflows_reusable-node-ci_yml",
              "detailHtml": "<h3>lint</h3><p class=\"muted\"><code>.github/workflows/reusable-node-ci.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)<br/><code>run: corepack enable</code></li><li>3. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>4. Install dependencies<br/><code>run: case &quot;${{ inputs.package-manager }}&quot; in\n  pnpm) corepack enable &amp;&amp; pnpm install </code></li><li>5. ${{ inputs.package-manager }} run lint<br/><code>run: ${{ inputs.package-manager }} run lint</code></li></ol>"
            },
            {
              "id": "_github_workflows_reusable-node-ci_yml__typecheck",
              "label": "typecheck",
              "kind": "job",
              "parent": "_github_workflows_reusable-node-ci_yml",
              "detailHtml": "<h3>typecheck</h3><p class=\"muted\"><code>.github/workflows/reusable-node-ci.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)<br/><code>run: corepack enable</code></li><li>3. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>4. Install dependencies<br/><code>run: case &quot;${{ inputs.package-manager }}&quot; in\n  pnpm) corepack enable &amp;&amp; pnpm install </code></li><li>5. Run codegen if the calling repo defines it (schema-types drift must fail typecheck, not pass silently)<br/><code>run: if node -e &quot;process.exit(require('./package.json').scripts?.codegen ? 0 : 1)&quot;; t</code></li><li>6. ${{ inputs.package-manager }} run typecheck<br/><code>run: ${{ inputs.package-manager }} run typecheck</code></li></ol>"
            },
            {
              "id": "_github_workflows_reusable-node-ci_yml__test",
              "label": "test",
              "kind": "job",
              "parent": "_github_workflows_reusable-node-ci_yml",
              "detailHtml": "<h3>test</h3><p class=\"muted\"><code>.github/workflows/reusable-node-ci.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)<br/><code>run: corepack enable</code></li><li>3. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>4. Install dependencies<br/><code>run: case &quot;${{ inputs.package-manager }}&quot; in\n  pnpm) corepack enable &amp;&amp; pnpm install </code></li><li>5. Run unit tests with coverage<br/><code>run: if ls vitest.config.* &gt;/dev/null 2&gt;&amp;1; then\n  case &quot;${{ inputs.package-manager }</code></li></ol>"
            },
            {
              "id": "_github_workflows_reusable-node-ci_yml__integration",
              "label": "integration",
              "kind": "job",
              "parent": "_github_workflows_reusable-node-ci_yml",
              "detailHtml": "<h3>integration</h3><p class=\"muted\"><code>.github/workflows/reusable-node-ci.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)<br/><code>run: corepack enable</code></li><li>3. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>4. Install dependencies<br/><code>run: case &quot;${{ inputs.package-manager }}&quot; in\n  pnpm) corepack enable &amp;&amp; pnpm install </code></li><li>5. Run integration suite if this repo has one (contracts/integration-test-contract.md)<br/><code>run: targets=&quot;&quot;\nfor dir in test/support test/integration tests/support tests/integrat</code></li></ol>"
            },
            {
              "id": "_github_workflows_reusable-node-ci_yml__build",
              "label": "build",
              "kind": "job",
              "parent": "_github_workflows_reusable-node-ci_yml",
              "detailHtml": "<h3>build</h3><p class=\"muted\"><code>.github/workflows/reusable-node-ci.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Enable corepack (setup-node's pnpm/yarn cache needs the binary on PATH already)<br/><code>run: corepack enable</code></li><li>3. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>4. Install dependencies<br/><code>run: case &quot;${{ inputs.package-manager }}&quot; in\n  pnpm) corepack enable &amp;&amp; pnpm install </code></li><li>5. ${{ inputs.package-manager }} run build<br/><code>run: ${{ inputs.package-manager }} run build</code></li><li>6. Build Docker image if a Dockerfile exists (proves FR-010 packageability every PR)<br/><code>run: dockerfile=&quot;${{ inputs.working-directory }}/Dockerfile&quot;\ncontext=&quot;${{ inputs.dock</code></li></ol>"
            },
            {
              "id": "_github_workflows_schema-types-ci_yml",
              "label": "schema-types CI",
              "kind": "workflow",
              "detailHtml": "<h3>schema-types CI</h3><p class=\"muted\"><code>.github/workflows/schema-types-ci.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_schema-types-ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_schema-types-ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/schema-types-ci.yml</code></p><ol><li>1. uses: ./.github/workflows/reusable-node-ci.yml<br/><code>uses: ./.github/workflows/reusable-node-ci.yml</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "auth-service",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/auth-service",
        "description": "Auth and identity service"
      },
      "status": "merged",
      "current": {
        "languages": {
          "TypeScript": 115955,
          "Shell": 57080,
          "JavaScript": 640
        },
        "packageDependencies": [
          "@fastify/cookie",
          "@fastify/rate-limit",
          "@mercuriusjs/federation",
          "@prisma/client",
          "@ttrpgsolution/service-core",
          "argon2",
          "fastify",
          "graphql",
          "jose",
          "mercurius",
          "pino",
          "zod",
          "@eslint/js",
          "@testcontainers/postgresql",
          "@types/js-yaml",
          "@types/node",
          "@vitest/coverage-v8",
          "ajv",
          "eslint",
          "globals",
          "js-yaml",
          "prettier",
          "prisma",
          "tsx",
          "typescript",
          "typescript-eslint",
          "vitest"
        ],
        "internalPackageDependencies": [
          "@ttrpgsolution/service-core"
        ],
        "ci": {
          "latestConclusion": "success",
          "latestWorkflowName": "CI",
          "latestRunUrl": "https://github.com/TTRPGSolution/auth-service/actions/runs/31877983316"
        },
        "lastCommitSha": "e36160421db923394da5cea57385c5599679c924",
        "lastCommitDate": "2026-08-11T13:16:05+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": {
          "moduleCount": 47,
          "dependencyCount": 90,
          "violationCount": 0,
          "modules": [
            {
              "source": "src/config/index.ts",
              "dependencies": [
                "@ttrpgsolution/service-core",
                "zod"
              ]
            },
            {
              "source": "@ttrpgsolution/service-core",
              "dependencies": []
            },
            {
              "source": "zod",
              "dependencies": []
            },
            {
              "source": "src/db/client.ts",
              "dependencies": [
                "@prisma/client"
              ]
            },
            {
              "source": "@prisma/client",
              "dependencies": []
            },
            {
              "source": "src/events/outbox.ts",
              "dependencies": []
            },
            {
              "source": "src/events/publisher.ts",
              "dependencies": []
            },
            {
              "source": "src/graphql/resolvers.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/lib/jwt.ts",
                "src/modules/users/user.repository.ts"
              ]
            },
            {
              "source": "src/lib/jwt.ts",
              "dependencies": [
                "crypto",
                "jose"
              ]
            },
            {
              "source": "crypto",
              "dependencies": []
            },
            {
              "source": "jose",
              "dependencies": []
            },
            {
              "source": "src/modules/users/user.repository.ts",
              "dependencies": []
            },
            {
              "source": "src/http/middleware/auth.ts",
              "dependencies": [
                "src/lib/jwt.ts",
                "src/http/middleware/error-handler.ts"
              ]
            },
            {
              "source": "src/http/middleware/error-handler.ts",
              "dependencies": []
            },
            {
              "source": "src/http/middleware/logging.ts",
              "dependencies": [
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/http/routes/jwks.ts",
              "dependencies": [
                "src/lib/jwt.ts"
              ]
            },
            {
              "source": "src/http/routes/login.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/modules/credentials/login.service.ts"
              ]
            },
            {
              "source": "src/modules/credentials/login.service.ts",
              "dependencies": [
                "src/http/middleware/error-handler.ts",
                "src/lib/hashing.ts",
                "src/lib/jwt.ts",
                "src/lib/opaque-token.ts",
                "src/modules/password-reset/reset-token.repository.ts",
                "src/modules/tokens/refresh-token.repository.ts",
                "src/modules/users/login-attempt.repository.ts",
                "src/modules/users/user.repository.ts",
                "src/modules/credentials/credential.repository.ts",
                "crypto"
              ]
            },
            {
              "source": "src/lib/hashing.ts",
              "dependencies": [
                "argon2"
              ]
            },
            {
              "source": "argon2",
              "dependencies": []
            },
            {
              "source": "src/lib/opaque-token.ts",
              "dependencies": [
                "crypto"
              ]
            },
            {
              "source": "src/modules/password-reset/reset-token.repository.ts",
              "dependencies": []
            },
            {
              "source": "src/modules/tokens/refresh-token.repository.ts",
              "dependencies": []
            },
            {
              "source": "src/modules/users/login-attempt.repository.ts",
              "dependencies": [
                "src/lib/rate-limiter.ts"
              ]
            },
            {
              "source": "src/lib/rate-limiter.ts",
              "dependencies": []
            },
            {
              "source": "src/modules/credentials/credential.repository.ts",
              "dependencies": []
            },
            {
              "source": "src/http/routes/password-reset.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/modules/password-reset/confirm.service.ts",
                "src/modules/password-reset/request.service.ts"
              ]
            },
            {
              "source": "src/modules/password-reset/confirm.service.ts",
              "dependencies": [
                "src/http/middleware/error-handler.ts",
                "src/lib/hashing.ts",
                "src/lib/opaque-token.ts",
                "src/modules/credentials/credential.repository.ts",
                "src/modules/tokens/refresh-token.repository.ts",
                "src/modules/users/register.service.ts",
                "src/modules/password-reset/reset-token.repository.ts"
              ]
            },
            {
              "source": "src/modules/users/register.service.ts",
              "dependencies": [
                "src/events/outbox.ts",
                "src/http/middleware/error-handler.ts",
                "src/lib/hashing.ts",
                "src/modules/credentials/credential.repository.ts",
                "src/modules/users/user.repository.ts"
              ]
            },
            {
              "source": "src/modules/password-reset/request.service.ts",
              "dependencies": [
                "src/lib/opaque-token.ts",
                "src/modules/users/user.repository.ts",
                "src/modules/password-reset/reset-request.repository.ts",
                "src/modules/password-reset/reset-token.repository.ts",
                "crypto"
              ]
            },
            {
              "source": "src/modules/password-reset/reset-request.repository.ts",
              "dependencies": [
                "src/lib/rate-limiter.ts"
              ]
            },
            {
              "source": "src/http/routes/refresh.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/modules/tokens/refresh.service.ts",
                "src/http/middleware/error-handler.ts"
              ]
            },
            {
              "source": "src/modules/tokens/refresh.service.ts",
              "dependencies": [
                "src/http/middleware/error-handler.ts",
                "src/lib/jwt.ts",
                "src/lib/opaque-token.ts",
                "src/modules/tokens/refresh-token.repository.ts",
                "crypto"
              ]
            },
            {
              "source": "src/http/routes/register.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/modules/users/register.schema.ts",
                "src/modules/users/register.service.ts"
              ]
            },
            {
              "source": "src/modules/users/register.schema.ts",
              "dependencies": []
            },
            {
              "source": "src/http/routes/revoke.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/modules/tokens/revoke.service.ts",
                "src/http/middleware/auth.ts",
                "src/http/middleware/error-handler.ts"
              ]
            },
            {
              "source": "src/modules/tokens/revoke.service.ts",
              "dependencies": [
                "src/http/middleware/error-handler.ts",
                "src/lib/opaque-token.ts",
                "src/modules/tokens/refresh-token.repository.ts"
              ]
            },
            {
              "source": "src/http/server.ts",
              "dependencies": [
                "src/graphql/resolvers.ts",
                "src/lib/email.ts",
                "src/http/middleware/error-handler.ts",
                "src/http/middleware/logging.ts",
                "src/http/routes/jwks.ts",
                "src/http/routes/login.ts",
                "src/http/routes/password-reset.ts",
                "src/http/routes/refresh.ts",
                "src/http/routes/register.ts",
                "src/http/routes/revoke.ts",
                "@fastify/cookie",
                "@mercuriusjs/federation",
                "@ttrpgsolution/service-core",
                "fastify",
                "fs",
                "path",
                "url"
              ]
            },
            {
              "source": "@fastify/cookie",
              "dependencies": []
            },
            {
              "source": "@mercuriusjs/federation",
              "dependencies": []
            },
            {
              "source": "fastify",
              "dependencies": []
            },
            {
              "source": "fs",
              "dependencies": []
            },
            {
              "source": "path",
              "dependencies": []
            },
            {
              "source": "url",
              "dependencies": []
            },
            {
              "source": "src/lib/email.ts",
              "dependencies": []
            },
            {
              "source": "src/index.ts",
              "dependencies": [
                "src/config/index.ts",
                "src/db/client.ts",
                "src/events/publisher.ts",
                "src/http/server.ts",
                "src/lib/jwt.ts",
                "src/lib/rate-limiter-cleanup.ts",
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/lib/rate-limiter-cleanup.ts",
              "dependencies": []
            }
          ]
        },
        "madge": {
          "moduleCount": 35,
          "circularPaths": []
        },
        "federation": {
          "ownedTypes": [
            "User"
          ],
          "extendedTypes": [],
          "schemaFiles": [
            "src/graphql/schema.graphql",
            "specs/001-auth-identity-service/contracts/identity.graphql"
          ]
        },
        "classDiagram": {
          "entries": [
            {
              "kind": "class",
              "name": "StubEmailSender",
              "properties": [
                "sent: PasswordResetEmail[]"
              ],
              "methods": [
                "sendPasswordReset(1): Promise<void>",
                "lastSentTo(1): PasswordResetEmail | undefined"
              ],
              "extends": [],
              "implements": [
                "EmailSender"
              ]
            },
            {
              "kind": "class",
              "name": "DomainError",
              "properties": [
                "statusCode: number",
                "code: string"
              ],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "ValidationError",
              "properties": [],
              "methods": [],
              "extends": [
                "DomainError"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "ConflictError",
              "properties": [],
              "methods": [],
              "extends": [
                "DomainError"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "AuthenticationError",
              "properties": [],
              "methods": [],
              "extends": [
                "DomainError"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "ForbiddenError",
              "properties": [],
              "methods": [],
              "extends": [
                "DomainError"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "TooManyRequestsError",
              "properties": [],
              "methods": [],
              "extends": [
                "DomainError"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "AccessTokenClaims",
              "properties": [
                "sub: string",
                "email: string",
                "jti: string"
              ],
              "methods": [],
              "extends": [
                "JWTPayload"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreateRefreshTokenInput",
              "properties": [
                "id: string",
                "userId: string",
                "familyId: string",
                "tokenHash: string",
                "expiresAt: Date",
                "deviceContext: string | null"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "EmailSender",
              "properties": [],
              "methods": [
                "sendPasswordReset(1): Promise<void>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "LoginServiceOptions",
              "properties": [
                "jwtKeys: JwtKeys",
                "accessTokenTtlMin: number",
                "refreshTokenTtlDays: number",
                "loginRateLimitMax: number",
                "loginRateLimitWindowMin: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "GraphqlUser",
              "properties": [
                "id: string",
                "email: string",
                "status: \"ACTIVE\" | \"DISABLED\"",
                "createdAt: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "HashParams",
              "properties": [
                "memoryCost: number",
                "timeCost: number",
                "parallelism: number",
                "version: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreateCredentialInput",
              "properties": [
                "userId: string",
                "passwordHash: string",
                "hashAlgo: string",
                "hashParams: Prisma.InputJsonValue"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "LoginResult",
              "properties": [
                "accessToken: string",
                "accessTokenExpiresAt: Date",
                "refreshToken: string",
                "refreshTokenExpiresAt: Date"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreatePasswordResetTokenInput",
              "properties": [
                "id: string",
                "userId: string",
                "tokenHash: string",
                "expiresAt: Date"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RefreshResult",
              "properties": [
                "accessToken: string",
                "accessTokenExpiresAt: Date",
                "refreshToken: string",
                "refreshTokenExpiresAt: Date"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "LoginThrottleParams",
              "properties": [
                "email: string",
                "ipAddress: string",
                "windowMinutes: number",
                "maxAttempts: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "PasswordResetEmail",
              "properties": [
                "to: string",
                "resetToken: string",
                "expiresAt: Date"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "HashedPassword",
              "properties": [
                "hash: string",
                "hashAlgo: \"argon2id\"",
                "hashParams: HashParams"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "JwtKeys",
              "properties": [
                "privateKey: CryptoKey",
                "publicKey: CryptoKey",
                "kid: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "SignedAccessToken",
              "properties": [
                "token: string",
                "jti: string",
                "expiresAt: Date"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "SlidingWindowResult",
              "properties": [
                "allowed: boolean",
                "count: number",
                "windowStart: Date"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "UpdateCredentialHashInput",
              "properties": [
                "passwordHash: string",
                "hashAlgo: string",
                "hashParams: Prisma.InputJsonValue"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "LoginInput",
              "properties": [
                "email: string",
                "password: string",
                "ipAddress: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            }
          ]
        },
        "graphqlSchema": {
          "types": [
            {
              "name": "User",
              "kind": "object",
              "fields": [
                "id: ID!",
                "email: String!",
                "status: UserStatus!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "status",
                  "refType": "UserStatus"
                }
              ]
            },
            {
              "name": "UserStatus",
              "kind": "enum",
              "fields": [
                "ACTIVE",
                "DISABLED"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "me: User"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "me",
                  "refType": "User"
                }
              ]
            },
            {
              "name": "User",
              "kind": "object",
              "fields": [
                "id: ID!",
                "email: String!",
                "status: UserStatus!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "status",
                  "refType": "UserStatus"
                }
              ]
            },
            {
              "name": "UserStatus",
              "kind": "enum",
              "fields": [
                "ACTIVE",
                "DISABLED"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "me: User"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "me",
                  "refType": "User"
                }
              ]
            }
          ]
        },
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/ci.yml",
              "name": "CI",
              "triggers": [
                "pull_request",
                "push"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "uses": "TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "run": null
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-check.yml",
              "name": "contract-check",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "contract-check",
                  "name": "contract-check",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a short-lived tabletop-infra installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "Fetch tabletop-infra's committed contract snapshots",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Run the composition check against this service's own SDL",
                      "uses": null,
                      "run": "npm run check-composition -- --subgraph auth-service --sdl-file ../../../src/graphql/schema.graphql"
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-snapshot-update.yml",
              "name": "contract-snapshot-update",
              "triggers": [
                "push"
              ],
              "jobs": [
                {
                  "id": "update-contract",
                  "name": "update-contract",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a short-lived tabletop-infra installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Regenerate this subgraph's snapshot from the merged SDL",
                      "uses": null,
                      "run": "npm run update-contracts -- --subgraph auth-service --sdl-file ../../../src/graphql/schema.graphql"
                    },
                    {
                      "label": "Commit and push the updated snapshot back to tabletop-infra",
                      "uses": null,
                      "run": "git config user.name \"tabletop-infra-sync[bot]\"\ngit config user.email \"tabletop-infra-sync[bot]@users.noreply.github.com\"\ngit add packages/schema-types/contracts/auth-service.graphql\ngit diff --cached --quiet || git commit -m \"contracts: update auth-service snapshot\"\ngit push\n"
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": null,
              "subscriptionType": null,
              "types": [
                {
                  "kind": "OBJECT",
                  "name": "User",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "email",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "status",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "UserStatus",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "UserStatus",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "ACTIVE",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DISABLED",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "me",
                      "description": "The identity of the currently authenticated caller, resolved from the\nbearer access token attached to the request by the gateway. Returns null\nif unauthenticated.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "User",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-auth-identity-service"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-auth-identity-service/spec.md",
            "title": "Feature Specification: Auth and Identity Service",
            "summary": "A new person visiting the platform creates an account using an email address and password so they can be recognized on future visits and participate in tables (games/sessions) elsewhere in the platform."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": {
          "nodes": [
            {
              "id": "src_config",
              "label": "src/config",
              "kind": "folder",
              "detailHtml": "<h3>src/config</h3><p>1 file(s)</p><ul><li><code>src/config/index.ts</code></li></ul>"
            },
            {
              "id": "_ttrpgsolution_service-core",
              "label": "@ttrpgsolution/service-core",
              "kind": "folder",
              "detailHtml": "<h3>@ttrpgsolution/service-core</h3><p>1 file(s)</p><ul><li><code>@ttrpgsolution/service-core</code></li></ul>"
            },
            {
              "id": "zod",
              "label": "zod",
              "kind": "folder",
              "detailHtml": "<h3>zod</h3><p>1 file(s)</p><ul><li><code>zod</code></li></ul>"
            },
            {
              "id": "src_db",
              "label": "src/db",
              "kind": "folder",
              "detailHtml": "<h3>src/db</h3><p>1 file(s)</p><ul><li><code>src/db/client.ts</code></li></ul>"
            },
            {
              "id": "_prisma_client",
              "label": "@prisma/client",
              "kind": "folder",
              "detailHtml": "<h3>@prisma/client</h3><p>1 file(s)</p><ul><li><code>@prisma/client</code></li></ul>"
            },
            {
              "id": "src_events",
              "label": "src/events",
              "kind": "folder",
              "detailHtml": "<h3>src/events</h3><p>2 file(s)</p><ul><li><code>src/events/outbox.ts</code></li><li><code>src/events/publisher.ts</code></li></ul>"
            },
            {
              "id": "src_graphql",
              "label": "src/graphql",
              "kind": "folder",
              "detailHtml": "<h3>src/graphql</h3><p>1 file(s)</p><ul><li><code>src/graphql/resolvers.ts</code></li></ul>"
            },
            {
              "id": "src_lib",
              "label": "src/lib",
              "kind": "folder",
              "detailHtml": "<h3>src/lib</h3><p>6 file(s)</p><ul><li><code>src/lib/email.ts</code></li><li><code>src/lib/hashing.ts</code></li><li><code>src/lib/jwt.ts</code></li><li><code>src/lib/opaque-token.ts</code></li><li><code>src/lib/rate-limiter-cleanup.ts</code></li><li><code>src/lib/rate-limiter.ts</code></li></ul>"
            },
            {
              "id": "src_modules",
              "label": "src/modules",
              "kind": "folder",
              "detailHtml": "<h3>src/modules</h3><p>13 file(s)</p><ul><li><code>src/modules/credentials/credential.repository.ts</code></li><li><code>src/modules/credentials/login.service.ts</code></li><li><code>src/modules/password-reset/confirm.service.ts</code></li><li><code>src/modules/password-reset/request.service.ts</code></li><li><code>src/modules/password-reset/reset-request.repository.ts</code></li><li><code>src/modules/password-reset/reset-token.repository.ts</code></li><li><code>src/modules/tokens/refresh-token.repository.ts</code></li><li><code>src/modules/tokens/refresh.service.ts</code></li><li><code>src/modules/tokens/revoke.service.ts</code></li><li><code>src/modules/users/login-attempt.repository.ts</code></li><li><code>src/modules/users/register.schema.ts</code></li><li><code>src/modules/users/register.service.ts</code></li><li><code>src/modules/users/user.repository.ts</code></li></ul>"
            },
            {
              "id": "crypto",
              "label": "crypto",
              "kind": "folder",
              "detailHtml": "<h3>crypto</h3><p>1 file(s)</p><ul><li><code>crypto</code></li></ul>"
            },
            {
              "id": "jose",
              "label": "jose",
              "kind": "folder",
              "detailHtml": "<h3>jose</h3><p>1 file(s)</p><ul><li><code>jose</code></li></ul>"
            },
            {
              "id": "src_http",
              "label": "src/http",
              "kind": "folder",
              "detailHtml": "<h3>src/http</h3><p>10 file(s)</p><ul><li><code>src/http/middleware/auth.ts</code></li><li><code>src/http/middleware/error-handler.ts</code></li><li><code>src/http/middleware/logging.ts</code></li><li><code>src/http/routes/jwks.ts</code></li><li><code>src/http/routes/login.ts</code></li><li><code>src/http/routes/password-reset.ts</code></li><li><code>src/http/routes/refresh.ts</code></li><li><code>src/http/routes/register.ts</code></li><li><code>src/http/routes/revoke.ts</code></li><li><code>src/http/server.ts</code></li></ul>"
            },
            {
              "id": "argon2",
              "label": "argon2",
              "kind": "folder",
              "detailHtml": "<h3>argon2</h3><p>1 file(s)</p><ul><li><code>argon2</code></li></ul>"
            },
            {
              "id": "_fastify_cookie",
              "label": "@fastify/cookie",
              "kind": "folder",
              "detailHtml": "<h3>@fastify/cookie</h3><p>1 file(s)</p><ul><li><code>@fastify/cookie</code></li></ul>"
            },
            {
              "id": "_mercuriusjs_federation",
              "label": "@mercuriusjs/federation",
              "kind": "folder",
              "detailHtml": "<h3>@mercuriusjs/federation</h3><p>1 file(s)</p><ul><li><code>@mercuriusjs/federation</code></li></ul>"
            },
            {
              "id": "fastify",
              "label": "fastify",
              "kind": "folder",
              "detailHtml": "<h3>fastify</h3><p>1 file(s)</p><ul><li><code>fastify</code></li></ul>"
            },
            {
              "id": "fs",
              "label": "fs",
              "kind": "folder",
              "detailHtml": "<h3>fs</h3><p>1 file(s)</p><ul><li><code>fs</code></li></ul>"
            },
            {
              "id": "path",
              "label": "path",
              "kind": "folder",
              "detailHtml": "<h3>path</h3><p>1 file(s)</p><ul><li><code>path</code></li></ul>"
            },
            {
              "id": "url",
              "label": "url",
              "kind": "folder",
              "detailHtml": "<h3>url</h3><p>1 file(s)</p><ul><li><code>url</code></li></ul>"
            },
            {
              "id": "src_index_ts",
              "label": "src/index.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/index.ts</h3><p>1 file(s)</p><ul><li><code>src/index.ts</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "src_config___ttrpgsolution_service-core",
              "source": "src_config",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_config__zod",
              "source": "src_config",
              "target": "zod",
              "label": ""
            },
            {
              "id": "src_db___prisma_client",
              "source": "src_db",
              "target": "_prisma_client",
              "label": ""
            },
            {
              "id": "src_graphql__src_db",
              "source": "src_graphql",
              "target": "src_db",
              "label": ""
            },
            {
              "id": "src_graphql__src_lib",
              "source": "src_graphql",
              "target": "src_lib",
              "label": ""
            },
            {
              "id": "src_graphql__src_modules",
              "source": "src_graphql",
              "target": "src_modules",
              "label": ""
            },
            {
              "id": "src_lib__crypto",
              "source": "src_lib",
              "target": "crypto",
              "label": "2"
            },
            {
              "id": "src_lib__jose",
              "source": "src_lib",
              "target": "jose",
              "label": ""
            },
            {
              "id": "src_http__src_lib",
              "source": "src_http",
              "target": "src_lib",
              "label": "3"
            },
            {
              "id": "src_http___ttrpgsolution_service-core",
              "source": "src_http",
              "target": "_ttrpgsolution_service-core",
              "label": "2"
            },
            {
              "id": "src_http__src_db",
              "source": "src_http",
              "target": "src_db",
              "label": "5"
            },
            {
              "id": "src_http__src_modules",
              "source": "src_http",
              "target": "src_modules",
              "label": "7"
            },
            {
              "id": "src_modules__src_http",
              "source": "src_modules",
              "target": "src_http",
              "label": "5"
            },
            {
              "id": "src_modules__src_lib",
              "source": "src_modules",
              "target": "src_lib",
              "label": "12"
            },
            {
              "id": "src_modules__crypto",
              "source": "src_modules",
              "target": "crypto",
              "label": "3"
            },
            {
              "id": "src_lib__argon2",
              "source": "src_lib",
              "target": "argon2",
              "label": ""
            },
            {
              "id": "src_modules__src_events",
              "source": "src_modules",
              "target": "src_events",
              "label": ""
            },
            {
              "id": "src_http__src_graphql",
              "source": "src_http",
              "target": "src_graphql",
              "label": ""
            },
            {
              "id": "src_http___fastify_cookie",
              "source": "src_http",
              "target": "_fastify_cookie",
              "label": ""
            },
            {
              "id": "src_http___mercuriusjs_federation",
              "source": "src_http",
              "target": "_mercuriusjs_federation",
              "label": ""
            },
            {
              "id": "src_http__fastify",
              "source": "src_http",
              "target": "fastify",
              "label": ""
            },
            {
              "id": "src_http__fs",
              "source": "src_http",
              "target": "fs",
              "label": ""
            },
            {
              "id": "src_http__path",
              "source": "src_http",
              "target": "path",
              "label": ""
            },
            {
              "id": "src_http__url",
              "source": "src_http",
              "target": "url",
              "label": ""
            },
            {
              "id": "src_index_ts__src_config",
              "source": "src_index_ts",
              "target": "src_config",
              "label": ""
            },
            {
              "id": "src_index_ts__src_db",
              "source": "src_index_ts",
              "target": "src_db",
              "label": ""
            },
            {
              "id": "src_index_ts__src_events",
              "source": "src_index_ts",
              "target": "src_events",
              "label": ""
            },
            {
              "id": "src_index_ts__src_http",
              "source": "src_index_ts",
              "target": "src_http",
              "label": ""
            },
            {
              "id": "src_index_ts__src_lib",
              "source": "src_index_ts",
              "target": "src_lib",
              "label": "2"
            },
            {
              "id": "src_index_ts___ttrpgsolution_service-core",
              "source": "src_index_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            }
          ]
        },
        "classDiagram": {
          "nodes": [
            {
              "id": "StubEmailSender",
              "label": "StubEmailSender",
              "kind": "class",
              "detailHtml": "<h3>StubEmailSender <span class=\"tag\">class</span></h3><h4>Properties</h4><ul><li><code>sent: PasswordResetEmail[]</code></li></ul><h4>Methods</h4><ul><li><code>sendPasswordReset(1): Promise&lt;void&gt;</code></li><li><code>lastSentTo(1): PasswordResetEmail | undefined</code></li></ul><h4>Implements</h4><ul><li><code>EmailSender</code></li></ul>"
            },
            {
              "id": "DomainError",
              "label": "DomainError",
              "kind": "class",
              "detailHtml": "<h3>DomainError <span class=\"tag\">class</span></h3><h4>Properties</h4><ul><li><code>statusCode: number</code></li><li><code>code: string</code></li></ul><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "ValidationError",
              "label": "ValidationError",
              "kind": "class",
              "detailHtml": "<h3>ValidationError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>DomainError</code></li></ul>"
            },
            {
              "id": "ConflictError",
              "label": "ConflictError",
              "kind": "class",
              "detailHtml": "<h3>ConflictError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>DomainError</code></li></ul>"
            },
            {
              "id": "AuthenticationError",
              "label": "AuthenticationError",
              "kind": "class",
              "detailHtml": "<h3>AuthenticationError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>DomainError</code></li></ul>"
            },
            {
              "id": "ForbiddenError",
              "label": "ForbiddenError",
              "kind": "class",
              "detailHtml": "<h3>ForbiddenError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>DomainError</code></li></ul>"
            },
            {
              "id": "TooManyRequestsError",
              "label": "TooManyRequestsError",
              "kind": "class",
              "detailHtml": "<h3>TooManyRequestsError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>DomainError</code></li></ul>"
            },
            {
              "id": "AccessTokenClaims",
              "label": "AccessTokenClaims",
              "kind": "interface",
              "detailHtml": "<h3>AccessTokenClaims <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>sub: string</code></li><li><code>email: string</code></li><li><code>jti: string</code></li></ul><h4>Extends</h4><ul><li><code>JWTPayload</code></li></ul>"
            },
            {
              "id": "CreateRefreshTokenInput",
              "label": "CreateRefreshTokenInput",
              "kind": "interface",
              "detailHtml": "<h3>CreateRefreshTokenInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>userId: string</code></li><li><code>familyId: string</code></li><li><code>tokenHash: string</code></li><li><code>expiresAt: Date</code></li><li><code>deviceContext: string | null</code></li></ul>"
            },
            {
              "id": "EmailSender",
              "label": "EmailSender",
              "kind": "interface",
              "detailHtml": "<h3>EmailSender <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>sendPasswordReset(1): Promise&lt;void&gt;</code></li></ul>"
            },
            {
              "id": "LoginServiceOptions",
              "label": "LoginServiceOptions",
              "kind": "interface",
              "detailHtml": "<h3>LoginServiceOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>jwtKeys: JwtKeys</code></li><li><code>accessTokenTtlMin: number</code></li><li><code>refreshTokenTtlDays: number</code></li><li><code>loginRateLimitMax: number</code></li><li><code>loginRateLimitWindowMin: number</code></li></ul>"
            },
            {
              "id": "GraphqlUser",
              "label": "GraphqlUser",
              "kind": "interface",
              "detailHtml": "<h3>GraphqlUser <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>email: string</code></li><li><code>status: &quot;ACTIVE&quot; | &quot;DISABLED&quot;</code></li><li><code>createdAt: string</code></li></ul>"
            },
            {
              "id": "HashParams",
              "label": "HashParams",
              "kind": "interface",
              "detailHtml": "<h3>HashParams <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>memoryCost: number</code></li><li><code>timeCost: number</code></li><li><code>parallelism: number</code></li><li><code>version: number</code></li></ul>"
            },
            {
              "id": "CreateCredentialInput",
              "label": "CreateCredentialInput",
              "kind": "interface",
              "detailHtml": "<h3>CreateCredentialInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string</code></li><li><code>passwordHash: string</code></li><li><code>hashAlgo: string</code></li><li><code>hashParams: Prisma.InputJsonValue</code></li></ul>"
            },
            {
              "id": "LoginResult",
              "label": "LoginResult",
              "kind": "interface",
              "detailHtml": "<h3>LoginResult <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>accessToken: string</code></li><li><code>accessTokenExpiresAt: Date</code></li><li><code>refreshToken: string</code></li><li><code>refreshTokenExpiresAt: Date</code></li></ul>"
            },
            {
              "id": "CreatePasswordResetTokenInput",
              "label": "CreatePasswordResetTokenInput",
              "kind": "interface",
              "detailHtml": "<h3>CreatePasswordResetTokenInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>userId: string</code></li><li><code>tokenHash: string</code></li><li><code>expiresAt: Date</code></li></ul>"
            },
            {
              "id": "RefreshResult",
              "label": "RefreshResult",
              "kind": "interface",
              "detailHtml": "<h3>RefreshResult <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>accessToken: string</code></li><li><code>accessTokenExpiresAt: Date</code></li><li><code>refreshToken: string</code></li><li><code>refreshTokenExpiresAt: Date</code></li></ul>"
            },
            {
              "id": "LoginThrottleParams",
              "label": "LoginThrottleParams",
              "kind": "interface",
              "detailHtml": "<h3>LoginThrottleParams <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>email: string</code></li><li><code>ipAddress: string</code></li><li><code>windowMinutes: number</code></li><li><code>maxAttempts: number</code></li></ul>"
            },
            {
              "id": "PasswordResetEmail",
              "label": "PasswordResetEmail",
              "kind": "interface",
              "detailHtml": "<h3>PasswordResetEmail <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>to: string</code></li><li><code>resetToken: string</code></li><li><code>expiresAt: Date</code></li></ul>"
            },
            {
              "id": "HashedPassword",
              "label": "HashedPassword",
              "kind": "interface",
              "detailHtml": "<h3>HashedPassword <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>hash: string</code></li><li><code>hashAlgo: &quot;argon2id&quot;</code></li><li><code>hashParams: HashParams</code></li></ul>"
            },
            {
              "id": "JwtKeys",
              "label": "JwtKeys",
              "kind": "interface",
              "detailHtml": "<h3>JwtKeys <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>privateKey: CryptoKey</code></li><li><code>publicKey: CryptoKey</code></li><li><code>kid: string</code></li></ul>"
            },
            {
              "id": "SignedAccessToken",
              "label": "SignedAccessToken",
              "kind": "interface",
              "detailHtml": "<h3>SignedAccessToken <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>token: string</code></li><li><code>jti: string</code></li><li><code>expiresAt: Date</code></li></ul>"
            },
            {
              "id": "SlidingWindowResult",
              "label": "SlidingWindowResult",
              "kind": "interface",
              "detailHtml": "<h3>SlidingWindowResult <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>allowed: boolean</code></li><li><code>count: number</code></li><li><code>windowStart: Date</code></li></ul>"
            },
            {
              "id": "UpdateCredentialHashInput",
              "label": "UpdateCredentialHashInput",
              "kind": "interface",
              "detailHtml": "<h3>UpdateCredentialHashInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>passwordHash: string</code></li><li><code>hashAlgo: string</code></li><li><code>hashParams: Prisma.InputJsonValue</code></li></ul>"
            },
            {
              "id": "LoginInput",
              "label": "LoginInput",
              "kind": "interface",
              "detailHtml": "<h3>LoginInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>email: string</code></li><li><code>password: string</code></li><li><code>ipAddress: string</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "EmailSender_impl_StubEmailSender",
              "source": "StubEmailSender",
              "target": "EmailSender",
              "label": "implements"
            },
            {
              "id": "DomainError_ext_ValidationError",
              "source": "ValidationError",
              "target": "DomainError",
              "label": "extends"
            },
            {
              "id": "DomainError_ext_ConflictError",
              "source": "ConflictError",
              "target": "DomainError",
              "label": "extends"
            },
            {
              "id": "DomainError_ext_AuthenticationError",
              "source": "AuthenticationError",
              "target": "DomainError",
              "label": "extends"
            },
            {
              "id": "DomainError_ext_ForbiddenError",
              "source": "ForbiddenError",
              "target": "DomainError",
              "label": "extends"
            },
            {
              "id": "DomainError_ext_TooManyRequestsError",
              "source": "TooManyRequestsError",
              "target": "DomainError",
              "label": "extends"
            }
          ]
        },
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_ci_yml",
              "label": "CI",
              "kind": "workflow",
              "detailHtml": "<h3>CI</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><p>Triggers: pull_request, push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><ol><li>1. uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main<br/><code>uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-check_yml",
              "label": "contract-check",
              "kind": "workflow",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-check_yml__contract-check",
              "label": "contract-check",
              "kind": "job",
              "parent": "_github_workflows_contract-check_yml",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a short-lived tabletop-infra installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. Fetch tabletop-infra's committed contract snapshots<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Run the composition check against this service's own SDL<br/><code>run: npm run check-composition -- --subgraph auth-service --sdl-file ../../../src/gra</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-snapshot-update_yml",
              "label": "contract-snapshot-update",
              "kind": "workflow",
              "detailHtml": "<h3>contract-snapshot-update</h3><p class=\"muted\"><code>.github/workflows/contract-snapshot-update.yml</code></p><p>Triggers: push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-snapshot-update_yml__update-contract",
              "label": "update-contract",
              "kind": "job",
              "parent": "_github_workflows_contract-snapshot-update_yml",
              "detailHtml": "<h3>update-contract</h3><p class=\"muted\"><code>.github/workflows/contract-snapshot-update.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a short-lived tabletop-infra installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Regenerate this subgraph's snapshot from the merged SDL<br/><code>run: npm run update-contracts -- --subgraph auth-service --sdl-file ../../../src/grap</code></li><li>7. Commit and push the updated snapshot back to tabletop-infra<br/><code>run: git config user.name &quot;tabletop-infra-sync[bot]&quot;\ngit config user.email &quot;tabletop-</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "gateway",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/gateway",
        "description": "GraphQL federation gateway"
      },
      "status": "merged",
      "current": {
        "languages": {
          "TypeScript": 105732,
          "Shell": 57080,
          "JavaScript": 1779,
          "Dockerfile": 524
        },
        "packageDependencies": [
          "@apollo/gateway",
          "@apollo/server",
          "@apollo/subgraph",
          "@as-integrations/fastify",
          "@graphql-inspector/core",
          "@graphql-tools/mock",
          "@ttrpgsolution/service-core",
          "fastify",
          "graphql",
          "graphql-ws",
          "ioredis",
          "jose",
          "prom-client",
          "rate-limiter-flexible",
          "ws",
          "zod",
          "@eslint/js",
          "@types/node",
          "@types/supertest",
          "@types/ws",
          "@vitest/coverage-v8",
          "ajv",
          "eslint",
          "prettier",
          "supertest",
          "tsx",
          "typescript",
          "typescript-eslint",
          "vitest"
        ],
        "internalPackageDependencies": [
          "@ttrpgsolution/service-core"
        ],
        "ci": {
          "latestConclusion": "success",
          "latestWorkflowName": "CI",
          "latestRunUrl": "https://github.com/TTRPGSolution/gateway/actions/runs/31877998773"
        },
        "lastCommitSha": "4cca68f27a9615a33882f85ff3a4517fcc8ab0d8",
        "lastCommitDate": "2026-08-11T10:08:26+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": {
          "moduleCount": 31,
          "dependencyCount": 52,
          "violationCount": 0,
          "modules": [
            {
              "source": "src/auth/publicOperations.ts",
              "dependencies": []
            },
            {
              "source": "src/auth/verifyToken.ts",
              "dependencies": [
                "jose"
              ]
            },
            {
              "source": "jose",
              "dependencies": []
            },
            {
              "source": "src/config/env.ts",
              "dependencies": [
                "@ttrpgsolution/service-core",
                "zod"
              ]
            },
            {
              "source": "@ttrpgsolution/service-core",
              "dependencies": []
            },
            {
              "source": "zod",
              "dependencies": []
            },
            {
              "source": "src/config/subgraphs.ts",
              "dependencies": [
                "zod"
              ]
            },
            {
              "source": "src/errors/errorCodes.ts",
              "dependencies": []
            },
            {
              "source": "src/errors/formatError.ts",
              "dependencies": [
                "src/errors/errorCodes.ts",
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/gateway/context.ts",
              "dependencies": [
                "src/auth/publicOperations.ts",
                "src/auth/verifyToken.ts",
                "src/errors/errorCodes.ts",
                "@ttrpgsolution/service-core",
                "../../node_modules/graphql/index.js"
              ]
            },
            {
              "source": "../../node_modules/graphql/index.js",
              "dependencies": []
            },
            {
              "source": "src/gateway/supergraph.ts",
              "dependencies": [
                "src/errors/errorCodes.ts",
                "@apollo/gateway",
                "module"
              ]
            },
            {
              "source": "@apollo/gateway",
              "dependencies": []
            },
            {
              "source": "module",
              "dependencies": []
            },
            {
              "source": "src/index.ts",
              "dependencies": [
                "src/config/env.ts",
                "src/config/subgraphs.ts",
                "src/errors/formatError.ts",
                "src/gateway/context.ts",
                "src/gateway/supergraph.ts",
                "src/logging/logger.ts",
                "src/rateLimit/middleware.ts",
                "src/rateLimit/rateLimiter.ts",
                "src/rateLimit/redisClient.ts",
                "src/subscriptions/wsServer.ts",
                "@apollo/server",
                "@as-integrations/fastify",
                "@ttrpgsolution/service-core",
                "fastify",
                "ws"
              ]
            },
            {
              "source": "@apollo/server",
              "dependencies": []
            },
            {
              "source": "@as-integrations/fastify",
              "dependencies": []
            },
            {
              "source": "fastify",
              "dependencies": []
            },
            {
              "source": "ws",
              "dependencies": []
            },
            {
              "source": "src/logging/logger.ts",
              "dependencies": [
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/rateLimit/middleware.ts",
              "dependencies": [
                "src/auth/verifyToken.ts",
                "src/errors/errorCodes.ts",
                "src/rateLimit/metrics.ts",
                "src/rateLimit/rateLimiter.ts",
                "@ttrpgsolution/service-core",
                "rate-limiter-flexible"
              ]
            },
            {
              "source": "rate-limiter-flexible",
              "dependencies": []
            },
            {
              "source": "src/rateLimit/metrics.ts",
              "dependencies": [
                "prom-client"
              ]
            },
            {
              "source": "prom-client",
              "dependencies": []
            },
            {
              "source": "src/rateLimit/rateLimiter.ts",
              "dependencies": [
                "rate-limiter-flexible"
              ]
            },
            {
              "source": "src/rateLimit/redisClient.ts",
              "dependencies": [
                "ioredis"
              ]
            },
            {
              "source": "ioredis",
              "dependencies": []
            },
            {
              "source": "src/subscriptions/wsServer.ts",
              "dependencies": [
                "src/auth/verifyToken.ts",
                "src/errors/errorCodes.ts",
                "src/errors/formatError.ts",
                "src/rateLimit/metrics.ts",
                "src/subscriptions/subscriptionProxy.ts",
                "@ttrpgsolution/service-core",
                "../../node_modules/graphql/index.js",
                "graphql-ws/use/ws",
                "rate-limiter-flexible"
              ]
            },
            {
              "source": "graphql-ws/use/ws",
              "dependencies": []
            },
            {
              "source": "src/subscriptions/subscriptionProxy.ts",
              "dependencies": [
                "src/errors/errorCodes.ts",
                "src/errors/formatError.ts",
                "graphql-ws",
                "ws"
              ]
            },
            {
              "source": "graphql-ws",
              "dependencies": []
            }
          ]
        },
        "madge": {
          "moduleCount": 16,
          "circularPaths": []
        },
        "federation": {
          "ownedTypes": [
            "Table",
            "TableMembership",
            "Party"
          ],
          "extendedTypes": [],
          "schemaFiles": [
            "mocks/table-subgraph/schema.graphql"
          ]
        },
        "classDiagram": {
          "entries": [
            {
              "kind": "class",
              "name": "SubgraphDataSource",
              "properties": [],
              "methods": [
                "process(1): Promise<GatewayGraphQLResponse>"
              ],
              "extends": [
                "RemoteGraphQLDataSource"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "TokenVerificationError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "SubgraphConfigError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "MutableExtra",
              "properties": [
                "userId: string | null",
                "requestId: string"
              ],
              "methods": [],
              "extends": [
                "Record"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "WsServerDeps",
              "properties": [
                "schema: GraphQLSchema",
                "config: GatewayConfig",
                "rateLimiter: RateLimiterAbstract",
                "subgraphs: readonly SubgraphConfig[]",
                "subscriptionFieldOwners: ReadonlyMap<string, string>"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "SubgraphConfig",
              "properties": [
                "name: string",
                "url: string",
                "wsUrl: string | null",
                "isMock: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "GatewayContext",
              "properties": [
                "requestId: string | undefined",
                "userId: string | null",
                "tokenClaims: Record<string, unknown> | null",
                "isPublic: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RelayOperation",
              "properties": [
                "query: string",
                "variables: Record<string, unknown> | null",
                "operationName: string | null"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "VerifiedToken",
              "properties": [
                "userId: string",
                "tokenClaims: Record<string, unknown>"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "GraphQLRequestBody",
              "properties": [
                "query: string",
                "operationName: string | null"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RelayIdentity",
              "properties": [
                "userId: string | null",
                "requestId: string | undefined"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ConnectionState",
              "properties": [
                "userId: string | null",
                "requestId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ConnectionParams",
              "properties": [
                "authToken: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            }
          ]
        },
        "graphqlSchema": {
          "types": [
            {
              "name": "TableRole",
              "kind": "enum",
              "fields": [
                "DM",
                "CO_DM",
                "PLAYER",
                "SPECTATOR"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "creatorUserId: ID!",
                "viewerRole: TableRole",
                "members: [TableMembership!]!",
                "parties: [Party!]!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "viewerRole",
                  "refType": "TableRole"
                },
                {
                  "field": "members",
                  "refType": "TableMembership"
                },
                {
                  "field": "parties",
                  "refType": "Party"
                }
              ]
            },
            {
              "name": "TableMembership",
              "kind": "object",
              "fields": [
                "id: ID!",
                "table: Table!",
                "userId: ID!",
                "role: TableRole!",
                "isActive: Boolean!",
                "joinedAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "role",
                  "refType": "TableRole"
                }
              ]
            },
            {
              "name": "Party",
              "kind": "object",
              "fields": [
                "id: ID!",
                "table: Table!",
                "name: String!",
                "members: [TableMembership!]!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "members",
                  "refType": "TableMembership"
                }
              ]
            },
            {
              "name": "InviteCode",
              "kind": "object",
              "fields": [
                "code: String!",
                "tableId: ID!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "table: Table",
                "myTables: [Table!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "myTables",
                  "refType": "Table"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createTable: Table!",
                "generateInviteCode: InviteCode!",
                "regenerateInviteCode: InviteCode!",
                "joinTable: TableMembership!",
                "promoteMember: TableMembership!",
                "demoteMember: TableMembership!",
                "setSpectator: TableMembership!",
                "removeMember: Boolean!",
                "createParty: Party!",
                "updateParty: Party!",
                "deleteParty: Boolean!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createTable",
                  "refType": "Table"
                },
                {
                  "field": "generateInviteCode",
                  "refType": "InviteCode"
                },
                {
                  "field": "regenerateInviteCode",
                  "refType": "InviteCode"
                },
                {
                  "field": "joinTable",
                  "refType": "TableMembership"
                },
                {
                  "field": "promoteMember",
                  "refType": "TableMembership"
                },
                {
                  "field": "demoteMember",
                  "refType": "TableMembership"
                },
                {
                  "field": "setSpectator",
                  "refType": "TableMembership"
                },
                {
                  "field": "createParty",
                  "refType": "Party"
                },
                {
                  "field": "updateParty",
                  "refType": "Party"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "tableUpdated: Table!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "tableUpdated",
                  "refType": "Table"
                }
              ]
            }
          ]
        },
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/ci.yml",
              "name": "CI",
              "triggers": [
                "pull_request",
                "push"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "uses": "TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "run": null
                    }
                  ]
                },
                {
                  "id": "schema-diff",
                  "name": "schema-diff",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "npm ci",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Compose subgraph schemas and check for breaking changes (@graphql-inspector/core)",
                      "uses": null,
                      "run": "npx vitest run tests/contract/supergraph-composition.test.ts"
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": {
                "name": "Mutation",
                "kind": "OBJECT"
              },
              "subscriptionType": {
                "name": "Subscription",
                "kind": "OBJECT"
              },
              "types": [
                {
                  "kind": "ENUM",
                  "name": "TableRole",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "CO_DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "PLAYER",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SPECTATOR",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Table",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "creatorUserId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "viewerRole",
                      "description": "The requesting (authenticated) user's current role at this table, or null if they\nhave no active membership. Convenience field for clients; NOT the mechanism the\ngateway uses for per-field authorization (see contracts/role-resolution.yaml).",
                      "args": [],
                      "type": {
                        "kind": "ENUM",
                        "name": "TableRole",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMembership",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "parties",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Party",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "TableMembership",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "userId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "role",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableRole",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isActive",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "joinedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Party",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMembership",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "InviteCode",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "code",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "tableId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "table",
                      "description": "Table by id, visible only to active members (FR-023 read scope applies to parties/members).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "OBJECT",
                        "name": "Table",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "myTables",
                      "description": "Tables the authenticated caller is an active member of.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Table",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Mutation",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "createTable",
                      "description": "FR-001..FR-004: creator becomes DM of the new table.",
                      "args": [
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "generateInviteCode",
                      "description": "FR-005, FR-010: DM or co-DM only. Regenerating invalidates the previous code.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "InviteCode",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "regenerateInviteCode",
                      "description": null,
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "InviteCode",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "joinTable",
                      "description": "FR-006..FR-009: joins as PLAYER, or reports already-a-member; rejects invalid/superseded codes.",
                      "args": [
                        {
                          "name": "inviteCode",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "promoteMember",
                      "description": "FR-012, FR-017..FR-019: role-management actions, all scoped to a single tableMembership.",
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "demoteMember",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "setSpectator",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "removeMember",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createParty",
                      "description": "FR-020..FR-024: party CRUD, DM/co-DM only; memberIds must be active table members.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "memberIds",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": null,
                              "kind": "LIST",
                              "ofType": {
                                "name": null,
                                "kind": "NON_NULL",
                                "ofType": {
                                  "name": "ID",
                                  "kind": "SCALAR",
                                  "ofType": null
                                }
                              }
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateParty",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "String",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "memberIds",
                          "description": null,
                          "type": {
                            "kind": "LIST",
                            "name": null,
                            "ofType": {
                              "name": null,
                              "kind": "NON_NULL",
                              "ofType": {
                                "name": "ID",
                                "kind": "SCALAR",
                                "ofType": null
                              }
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deleteParty",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Subscription",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "tableUpdated",
                      "description": null,
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-graphql-gateway"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-graphql-gateway/spec.md",
            "title": "Feature Specification: GraphQL Gateway",
            "summary": "As a client application, I want to send a single GraphQL request to one gateway endpoint and receive data composed from whichever backend services own it (starting with the auth service), so that I don't need to know or care how the platform's services are split up."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": {
          "nodes": [
            {
              "id": "src_auth",
              "label": "src/auth",
              "kind": "folder",
              "detailHtml": "<h3>src/auth</h3><p>2 file(s)</p><ul><li><code>src/auth/publicOperations.ts</code></li><li><code>src/auth/verifyToken.ts</code></li></ul>"
            },
            {
              "id": "jose",
              "label": "jose",
              "kind": "folder",
              "detailHtml": "<h3>jose</h3><p>1 file(s)</p><ul><li><code>jose</code></li></ul>"
            },
            {
              "id": "src_config",
              "label": "src/config",
              "kind": "folder",
              "detailHtml": "<h3>src/config</h3><p>2 file(s)</p><ul><li><code>src/config/env.ts</code></li><li><code>src/config/subgraphs.ts</code></li></ul>"
            },
            {
              "id": "_ttrpgsolution_service-core",
              "label": "@ttrpgsolution/service-core",
              "kind": "folder",
              "detailHtml": "<h3>@ttrpgsolution/service-core</h3><p>1 file(s)</p><ul><li><code>@ttrpgsolution/service-core</code></li></ul>"
            },
            {
              "id": "zod",
              "label": "zod",
              "kind": "folder",
              "detailHtml": "<h3>zod</h3><p>1 file(s)</p><ul><li><code>zod</code></li></ul>"
            },
            {
              "id": "src_errors",
              "label": "src/errors",
              "kind": "folder",
              "detailHtml": "<h3>src/errors</h3><p>2 file(s)</p><ul><li><code>src/errors/errorCodes.ts</code></li><li><code>src/errors/formatError.ts</code></li></ul>"
            },
            {
              "id": "src_gateway",
              "label": "src/gateway",
              "kind": "folder",
              "detailHtml": "<h3>src/gateway</h3><p>2 file(s)</p><ul><li><code>src/gateway/context.ts</code></li><li><code>src/gateway/supergraph.ts</code></li></ul>"
            },
            {
              "id": "_____",
              "label": "../..",
              "kind": "folder",
              "detailHtml": "<h3>../..</h3><p>1 file(s)</p><ul><li><code>../../node_modules/graphql/index.js</code></li></ul>"
            },
            {
              "id": "_apollo_gateway",
              "label": "@apollo/gateway",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/gateway</h3><p>1 file(s)</p><ul><li><code>@apollo/gateway</code></li></ul>"
            },
            {
              "id": "module",
              "label": "module",
              "kind": "folder",
              "detailHtml": "<h3>module</h3><p>1 file(s)</p><ul><li><code>module</code></li></ul>"
            },
            {
              "id": "src_index_ts",
              "label": "src/index.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/index.ts</h3><p>1 file(s)</p><ul><li><code>src/index.ts</code></li></ul>"
            },
            {
              "id": "src_logging",
              "label": "src/logging",
              "kind": "folder",
              "detailHtml": "<h3>src/logging</h3><p>1 file(s)</p><ul><li><code>src/logging/logger.ts</code></li></ul>"
            },
            {
              "id": "src_rateLimit",
              "label": "src/rateLimit",
              "kind": "folder",
              "detailHtml": "<h3>src/rateLimit</h3><p>4 file(s)</p><ul><li><code>src/rateLimit/metrics.ts</code></li><li><code>src/rateLimit/middleware.ts</code></li><li><code>src/rateLimit/rateLimiter.ts</code></li><li><code>src/rateLimit/redisClient.ts</code></li></ul>"
            },
            {
              "id": "src_subscriptions",
              "label": "src/subscriptions",
              "kind": "folder",
              "detailHtml": "<h3>src/subscriptions</h3><p>2 file(s)</p><ul><li><code>src/subscriptions/subscriptionProxy.ts</code></li><li><code>src/subscriptions/wsServer.ts</code></li></ul>"
            },
            {
              "id": "_apollo_server",
              "label": "@apollo/server",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/server</h3><p>1 file(s)</p><ul><li><code>@apollo/server</code></li></ul>"
            },
            {
              "id": "_as-integrations_fastify",
              "label": "@as-integrations/fastify",
              "kind": "folder",
              "detailHtml": "<h3>@as-integrations/fastify</h3><p>1 file(s)</p><ul><li><code>@as-integrations/fastify</code></li></ul>"
            },
            {
              "id": "fastify",
              "label": "fastify",
              "kind": "folder",
              "detailHtml": "<h3>fastify</h3><p>1 file(s)</p><ul><li><code>fastify</code></li></ul>"
            },
            {
              "id": "ws",
              "label": "ws",
              "kind": "folder",
              "detailHtml": "<h3>ws</h3><p>1 file(s)</p><ul><li><code>ws</code></li></ul>"
            },
            {
              "id": "rate-limiter-flexible",
              "label": "rate-limiter-flexible",
              "kind": "folder",
              "detailHtml": "<h3>rate-limiter-flexible</h3><p>1 file(s)</p><ul><li><code>rate-limiter-flexible</code></li></ul>"
            },
            {
              "id": "prom-client",
              "label": "prom-client",
              "kind": "folder",
              "detailHtml": "<h3>prom-client</h3><p>1 file(s)</p><ul><li><code>prom-client</code></li></ul>"
            },
            {
              "id": "ioredis",
              "label": "ioredis",
              "kind": "folder",
              "detailHtml": "<h3>ioredis</h3><p>1 file(s)</p><ul><li><code>ioredis</code></li></ul>"
            },
            {
              "id": "graphql-ws_use",
              "label": "graphql-ws/use",
              "kind": "folder",
              "detailHtml": "<h3>graphql-ws/use</h3><p>1 file(s)</p><ul><li><code>graphql-ws/use/ws</code></li></ul>"
            },
            {
              "id": "graphql-ws",
              "label": "graphql-ws",
              "kind": "folder",
              "detailHtml": "<h3>graphql-ws</h3><p>1 file(s)</p><ul><li><code>graphql-ws</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "src_auth__jose",
              "source": "src_auth",
              "target": "jose",
              "label": ""
            },
            {
              "id": "src_config___ttrpgsolution_service-core",
              "source": "src_config",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_config__zod",
              "source": "src_config",
              "target": "zod",
              "label": "2"
            },
            {
              "id": "src_errors___ttrpgsolution_service-core",
              "source": "src_errors",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_gateway__src_auth",
              "source": "src_gateway",
              "target": "src_auth",
              "label": "2"
            },
            {
              "id": "src_gateway__src_errors",
              "source": "src_gateway",
              "target": "src_errors",
              "label": "2"
            },
            {
              "id": "src_gateway___ttrpgsolution_service-core",
              "source": "src_gateway",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_gateway_______",
              "source": "src_gateway",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_gateway___apollo_gateway",
              "source": "src_gateway",
              "target": "_apollo_gateway",
              "label": ""
            },
            {
              "id": "src_gateway__module",
              "source": "src_gateway",
              "target": "module",
              "label": ""
            },
            {
              "id": "src_index_ts__src_config",
              "source": "src_index_ts",
              "target": "src_config",
              "label": "2"
            },
            {
              "id": "src_index_ts__src_errors",
              "source": "src_index_ts",
              "target": "src_errors",
              "label": ""
            },
            {
              "id": "src_index_ts__src_gateway",
              "source": "src_index_ts",
              "target": "src_gateway",
              "label": "2"
            },
            {
              "id": "src_index_ts__src_logging",
              "source": "src_index_ts",
              "target": "src_logging",
              "label": ""
            },
            {
              "id": "src_index_ts__src_rateLimit",
              "source": "src_index_ts",
              "target": "src_rateLimit",
              "label": "3"
            },
            {
              "id": "src_index_ts__src_subscriptions",
              "source": "src_index_ts",
              "target": "src_subscriptions",
              "label": ""
            },
            {
              "id": "src_index_ts___apollo_server",
              "source": "src_index_ts",
              "target": "_apollo_server",
              "label": ""
            },
            {
              "id": "src_index_ts___as-integrations_fastify",
              "source": "src_index_ts",
              "target": "_as-integrations_fastify",
              "label": ""
            },
            {
              "id": "src_index_ts___ttrpgsolution_service-core",
              "source": "src_index_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_index_ts__fastify",
              "source": "src_index_ts",
              "target": "fastify",
              "label": ""
            },
            {
              "id": "src_index_ts__ws",
              "source": "src_index_ts",
              "target": "ws",
              "label": ""
            },
            {
              "id": "src_logging___ttrpgsolution_service-core",
              "source": "src_logging",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_rateLimit__src_auth",
              "source": "src_rateLimit",
              "target": "src_auth",
              "label": ""
            },
            {
              "id": "src_rateLimit__src_errors",
              "source": "src_rateLimit",
              "target": "src_errors",
              "label": ""
            },
            {
              "id": "src_rateLimit___ttrpgsolution_service-core",
              "source": "src_rateLimit",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_rateLimit__rate-limiter-flexible",
              "source": "src_rateLimit",
              "target": "rate-limiter-flexible",
              "label": "2"
            },
            {
              "id": "src_rateLimit__prom-client",
              "source": "src_rateLimit",
              "target": "prom-client",
              "label": ""
            },
            {
              "id": "src_rateLimit__ioredis",
              "source": "src_rateLimit",
              "target": "ioredis",
              "label": ""
            },
            {
              "id": "src_subscriptions__src_auth",
              "source": "src_subscriptions",
              "target": "src_auth",
              "label": ""
            },
            {
              "id": "src_subscriptions__src_errors",
              "source": "src_subscriptions",
              "target": "src_errors",
              "label": "4"
            },
            {
              "id": "src_subscriptions__src_rateLimit",
              "source": "src_subscriptions",
              "target": "src_rateLimit",
              "label": ""
            },
            {
              "id": "src_subscriptions___ttrpgsolution_service-core",
              "source": "src_subscriptions",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_subscriptions_______",
              "source": "src_subscriptions",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_subscriptions__graphql-ws_use",
              "source": "src_subscriptions",
              "target": "graphql-ws_use",
              "label": ""
            },
            {
              "id": "src_subscriptions__rate-limiter-flexible",
              "source": "src_subscriptions",
              "target": "rate-limiter-flexible",
              "label": ""
            },
            {
              "id": "src_subscriptions__graphql-ws",
              "source": "src_subscriptions",
              "target": "graphql-ws",
              "label": ""
            },
            {
              "id": "src_subscriptions__ws",
              "source": "src_subscriptions",
              "target": "ws",
              "label": ""
            }
          ]
        },
        "classDiagram": {
          "nodes": [
            {
              "id": "SubgraphDataSource",
              "label": "SubgraphDataSource",
              "kind": "class",
              "detailHtml": "<h3>SubgraphDataSource <span class=\"tag\">class</span></h3><h4>Methods</h4><ul><li><code>process(1): Promise&lt;GatewayGraphQLResponse&gt;</code></li></ul><h4>Extends</h4><ul><li><code>RemoteGraphQLDataSource</code></li></ul>"
            },
            {
              "id": "TokenVerificationError",
              "label": "TokenVerificationError",
              "kind": "class",
              "detailHtml": "<h3>TokenVerificationError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "SubgraphConfigError",
              "label": "SubgraphConfigError",
              "kind": "class",
              "detailHtml": "<h3>SubgraphConfigError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "MutableExtra",
              "label": "MutableExtra",
              "kind": "interface",
              "detailHtml": "<h3>MutableExtra <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string | null</code></li><li><code>requestId: string</code></li></ul><h4>Extends</h4><ul><li><code>Record</code></li></ul>"
            },
            {
              "id": "WsServerDeps",
              "label": "WsServerDeps",
              "kind": "interface",
              "detailHtml": "<h3>WsServerDeps <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>schema: GraphQLSchema</code></li><li><code>config: GatewayConfig</code></li><li><code>rateLimiter: RateLimiterAbstract</code></li><li><code>subgraphs: readonly SubgraphConfig[]</code></li><li><code>subscriptionFieldOwners: ReadonlyMap&lt;string, string&gt;</code></li></ul>"
            },
            {
              "id": "SubgraphConfig",
              "label": "SubgraphConfig",
              "kind": "interface",
              "detailHtml": "<h3>SubgraphConfig <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>name: string</code></li><li><code>url: string</code></li><li><code>wsUrl: string | null</code></li><li><code>isMock: boolean</code></li></ul>"
            },
            {
              "id": "GatewayContext",
              "label": "GatewayContext",
              "kind": "interface",
              "detailHtml": "<h3>GatewayContext <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>requestId: string | undefined</code></li><li><code>userId: string | null</code></li><li><code>tokenClaims: Record&lt;string, unknown&gt; | null</code></li><li><code>isPublic: boolean</code></li></ul>"
            },
            {
              "id": "RelayOperation",
              "label": "RelayOperation",
              "kind": "interface",
              "detailHtml": "<h3>RelayOperation <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>query: string</code></li><li><code>variables: Record&lt;string, unknown&gt; | null</code></li><li><code>operationName: string | null</code></li></ul>"
            },
            {
              "id": "VerifiedToken",
              "label": "VerifiedToken",
              "kind": "interface",
              "detailHtml": "<h3>VerifiedToken <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string</code></li><li><code>tokenClaims: Record&lt;string, unknown&gt;</code></li></ul>"
            },
            {
              "id": "GraphQLRequestBody",
              "label": "GraphQLRequestBody",
              "kind": "interface",
              "detailHtml": "<h3>GraphQLRequestBody <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>query: string</code></li><li><code>operationName: string | null</code></li></ul>"
            },
            {
              "id": "RelayIdentity",
              "label": "RelayIdentity",
              "kind": "interface",
              "detailHtml": "<h3>RelayIdentity <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string | null</code></li><li><code>requestId: string | undefined</code></li></ul>"
            },
            {
              "id": "ConnectionState",
              "label": "ConnectionState",
              "kind": "interface",
              "detailHtml": "<h3>ConnectionState <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string | null</code></li><li><code>requestId: string</code></li></ul>"
            },
            {
              "id": "ConnectionParams",
              "label": "ConnectionParams",
              "kind": "interface",
              "detailHtml": "<h3>ConnectionParams <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>authToken: string</code></li></ul>"
            }
          ],
          "edges": []
        },
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_ci_yml",
              "label": "CI",
              "kind": "workflow",
              "detailHtml": "<h3>CI</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><p>Triggers: pull_request, push</p><p>2 job(s)</p>"
            },
            {
              "id": "_github_workflows_ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><ol><li>1. uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main<br/><code>uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main</code></li></ol>"
            },
            {
              "id": "_github_workflows_ci_yml__schema-diff",
              "label": "schema-diff",
              "kind": "job",
              "parent": "_github_workflows_ci_yml",
              "detailHtml": "<h3>schema-diff</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>3. npm ci<br/><code>run: npm ci</code></li><li>4. Compose subgraph schemas and check for breaking changes (@graphql-inspector/core)<br/><code>run: npx vitest run tests/contract/supergraph-composition.test.ts</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "table-service",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/table-service",
        "description": "Tables, memberships, roles, parties"
      },
      "status": "merged",
      "current": {
        "languages": {
          "TypeScript": 171127,
          "Shell": 57080,
          "JavaScript": 640
        },
        "packageDependencies": [
          "@apollo/server",
          "@apollo/subgraph",
          "@as-integrations/fastify",
          "@prisma/client",
          "@ttrpgsolution/service-core",
          "fastify",
          "graphql",
          "ioredis",
          "nanoid",
          "pino",
          "zod",
          "@eslint/js",
          "@testcontainers/postgresql",
          "@testcontainers/redis",
          "@types/node",
          "@types/supertest",
          "@vitest/coverage-v8",
          "eslint",
          "globals",
          "prettier",
          "prisma",
          "supertest",
          "tsx",
          "typescript",
          "typescript-eslint",
          "vitest"
        ],
        "internalPackageDependencies": [
          "@ttrpgsolution/service-core"
        ],
        "ci": {
          "latestConclusion": "success",
          "latestWorkflowName": "CI",
          "latestRunUrl": "https://github.com/TTRPGSolution/table-service/actions/runs/31879869975"
        },
        "lastCommitSha": "7fd4ec9530f54351d8bc439fac19291a09438778",
        "lastCommitDate": "2026-08-15T13:34:51+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": {
          "moduleCount": 38,
          "dependencyCount": 60,
          "violationCount": 0,
          "modules": [
            {
              "source": "src/context.ts",
              "dependencies": [
                "src/db/client.ts",
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "@ttrpgsolution/service-core",
              "dependencies": []
            },
            {
              "source": "src/db/client.ts",
              "dependencies": [
                "@prisma/client"
              ]
            },
            {
              "source": "@prisma/client",
              "dependencies": []
            },
            {
              "source": "src/domain/errors.ts",
              "dependencies": []
            },
            {
              "source": "src/domain/invite-codes.ts",
              "dependencies": [
                "../../node_modules/nanoid/index.cjs"
              ]
            },
            {
              "source": "../../node_modules/nanoid/index.cjs",
              "dependencies": []
            },
            {
              "source": "src/domain/role-hierarchy.ts",
              "dependencies": [
                "src/domain/errors.ts"
              ]
            },
            {
              "source": "src/events/event-types.ts",
              "dependencies": []
            },
            {
              "source": "src/events/publisher.ts",
              "dependencies": [
                "src/events/event-types.ts",
                "@ttrpgsolution/service-core",
                "crypto"
              ]
            },
            {
              "source": "crypto",
              "dependencies": []
            },
            {
              "source": "src/graphql/resolvers/membership.resolvers.ts",
              "dependencies": [
                "src/domain/errors.ts",
                "src/services/membership.service.ts",
                "zod"
              ]
            },
            {
              "source": "zod",
              "dependencies": []
            },
            {
              "source": "src/services/membership.service.ts",
              "dependencies": [
                "src/domain/errors.ts",
                "src/domain/invite-codes.ts",
                "src/domain/role-hierarchy.ts",
                "src/events/event-types.ts"
              ]
            },
            {
              "source": "src/graphql/resolvers/mergeResolvers.ts",
              "dependencies": []
            },
            {
              "source": "src/graphql/resolvers/party.resolvers.ts",
              "dependencies": [
                "src/domain/errors.ts",
                "src/services/party.service.ts",
                "zod"
              ]
            },
            {
              "source": "src/services/party.service.ts",
              "dependencies": [
                "src/domain/errors.ts",
                "src/events/event-types.ts"
              ]
            },
            {
              "source": "src/graphql/resolvers/table.resolvers.ts",
              "dependencies": [
                "src/domain/errors.ts",
                "src/services/table.service.ts",
                "zod"
              ]
            },
            {
              "source": "src/services/table.service.ts",
              "dependencies": [
                "src/domain/errors.ts",
                "src/domain/invite-codes.ts",
                "src/events/event-types.ts"
              ]
            },
            {
              "source": "src/index.ts",
              "dependencies": [
                "src/context.ts",
                "src/db/client.ts",
                "src/events/publisher.ts",
                "src/graphql/resolvers/membership.resolvers.ts",
                "src/graphql/resolvers/mergeResolvers.ts",
                "src/graphql/resolvers/party.resolvers.ts",
                "src/graphql/resolvers/table.resolvers.ts",
                "src/lib/config.ts",
                "src/lib/errorFormatting.ts",
                "src/lib/logger.ts",
                "src/middleware/auth-context.ts",
                "src/middleware/correlation-id.ts",
                "src/rest/party-resolution.route.ts",
                "src/rest/role-resolution.route.ts",
                "src/services/role-resolution.service.ts",
                "@apollo/server",
                "@apollo/subgraph",
                "@as-integrations/fastify",
                "@ttrpgsolution/service-core",
                "fastify",
                "fs",
                "../../node_modules/graphql/index.js",
                "ioredis",
                "path",
                "url"
              ]
            },
            {
              "source": "@apollo/server",
              "dependencies": []
            },
            {
              "source": "@apollo/subgraph",
              "dependencies": []
            },
            {
              "source": "@as-integrations/fastify",
              "dependencies": []
            },
            {
              "source": "fastify",
              "dependencies": []
            },
            {
              "source": "fs",
              "dependencies": []
            },
            {
              "source": "../../node_modules/graphql/index.js",
              "dependencies": []
            },
            {
              "source": "ioredis",
              "dependencies": []
            },
            {
              "source": "path",
              "dependencies": []
            },
            {
              "source": "url",
              "dependencies": []
            },
            {
              "source": "src/lib/config.ts",
              "dependencies": [
                "@ttrpgsolution/service-core",
                "zod"
              ]
            },
            {
              "source": "src/lib/errorFormatting.ts",
              "dependencies": [
                "src/domain/errors.ts"
              ]
            },
            {
              "source": "src/lib/logger.ts",
              "dependencies": [
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/middleware/auth-context.ts",
              "dependencies": []
            },
            {
              "source": "src/middleware/correlation-id.ts",
              "dependencies": [
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/rest/party-resolution.route.ts",
              "dependencies": [
                "src/middleware/service-auth.ts",
                "zod"
              ]
            },
            {
              "source": "src/middleware/service-auth.ts",
              "dependencies": []
            },
            {
              "source": "src/rest/role-resolution.route.ts",
              "dependencies": [
                "src/middleware/service-auth.ts",
                "zod"
              ]
            },
            {
              "source": "src/services/role-resolution.service.ts",
              "dependencies": []
            }
          ]
        },
        "madge": {
          "moduleCount": 24,
          "circularPaths": []
        },
        "federation": {
          "ownedTypes": [
            "Table",
            "TableMembership",
            "Party"
          ],
          "extendedTypes": [],
          "schemaFiles": [
            "src/graphql/schema.graphql"
          ]
        },
        "classDiagram": {
          "entries": [
            {
              "kind": "class",
              "name": "ValidationError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "UnauthorizedError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "NotFoundError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "ConflictError",
              "properties": [],
              "methods": [],
              "extends": [
                "Error"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "MembershipService",
              "properties": [],
              "methods": [
                "getInviteCode(2): Promise<{ code: string; tableId: string }>",
                "regenerateInviteCode(2): Promise<{ code: string; tableId: string }>",
                "joinTable(2): Promise<JoinTableResult>",
                "promoteMember(2): Promise<TableMembership>",
                "demoteMember(2): Promise<TableMembership>",
                "setSpectator(2): Promise<TableMembership>",
                "removeMember(2): Promise<void>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "PartyService",
              "properties": [],
              "methods": [
                "createParty(4): Promise<Party>",
                "updateParty(4): Promise<Party>",
                "deleteParty(2): Promise<void>",
                "listPartiesForTable(1): Promise<Party[]>",
                "listMemberIdsForParty(1): Promise<string[]>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableService",
              "properties": [],
              "methods": [
                "createTable(2): Promise<Table>",
                "getTableById(1): Promise<Table | null>",
                "listMyTables(1): Promise<Table[]>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RoleResolutionService",
              "properties": [],
              "methods": [
                "resolveRole(2): Promise<RoleResolution>",
                "resolveRolesBatch(1): Promise<(RoleResolution & { userId: string; tableId: string })[]>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "MembershipRoleChangedPayload",
              "properties": [
                "tableId: string",
                "membershipId: string",
                "userId: string",
                "previousRole: TableRole",
                "newRole: TableRole",
                "actorUserId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableEventEnvelope",
              "properties": [
                "eventId: string",
                "eventType: string",
                "tableId: string",
                "occurredAt: string",
                "correlationId: string",
                "payload: T"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableServiceContext",
              "properties": [
                "actorUserId: string | null",
                "correlationId: string | undefined",
                "prisma: typeof prisma",
                "eventPublisher: EventPublisher",
                "roleResolutionService: RoleResolutionService"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RoleActionInput",
              "properties": [
                "actorRole: TableRole",
                "actorUserId: string",
                "targetRole: TableRole",
                "targetUserId: string",
                "targetIsLastActiveDm: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "EventPublisher",
              "properties": [],
              "methods": [
                "publish(3): Promise<void>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "MembershipJoinedPayload",
              "properties": [
                "tableId: string",
                "membershipId: string",
                "userId: string",
                "role: \"PLAYER\""
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "MembershipRemovedPayload",
              "properties": [
                "tableId: string",
                "membershipId: string",
                "userId: string",
                "actorUserId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "PartyCreatedPayload",
              "properties": [
                "tableId: string",
                "partyId: string",
                "name: string",
                "memberIds: string[]"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "PartyUpdatedPayload",
              "properties": [
                "tableId: string",
                "partyId: string",
                "name: string",
                "memberIds: string[]"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "BuildServerOptions",
              "properties": [
                "config: TableServiceConfig",
                "events: EventPublisher",
                "redis: Redis"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableCreatedPayload",
              "properties": [
                "tableId: string",
                "name: string",
                "creatorUserId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ContextBuilderDependencies",
              "properties": [
                "eventPublisher: EventPublisher",
                "roleResolutionService: RoleResolutionService"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "PartyDeletedPayload",
              "properties": [
                "tableId: string",
                "partyId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "PartyResolutionRouteOptions",
              "properties": [
                "prisma: PrismaClient",
                "serviceAuthSecret: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RoleResolutionRouteOptions",
              "properties": [
                "roleResolutionService: RoleResolutionService",
                "serviceAuthSecret: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "JoinTableResult",
              "properties": [
                "membership: TableMembership",
                "wasNewJoin: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "InviteCodeRegeneratedPayload",
              "properties": [
                "tableId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            }
          ]
        },
        "graphqlSchema": {
          "types": [
            {
              "name": "TableRole",
              "kind": "enum",
              "fields": [
                "DM",
                "CO_DM",
                "PLAYER",
                "SPECTATOR"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "creatorUserId: ID!",
                "viewerRole: TableRole",
                "members: [TableMembership!]!",
                "parties: [Party!]!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "viewerRole",
                  "refType": "TableRole"
                },
                {
                  "field": "members",
                  "refType": "TableMembership"
                },
                {
                  "field": "parties",
                  "refType": "Party"
                }
              ]
            },
            {
              "name": "TableMembership",
              "kind": "object",
              "fields": [
                "id: ID!",
                "table: Table!",
                "userId: ID!",
                "role: TableRole!",
                "isActive: Boolean!",
                "joinedAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "role",
                  "refType": "TableRole"
                }
              ]
            },
            {
              "name": "InviteCode",
              "kind": "object",
              "fields": [
                "code: String!",
                "tableId: ID!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Party",
              "kind": "object",
              "fields": [
                "id: ID!",
                "table: Table!",
                "name: String!",
                "members: [TableMembership!]!",
                "createdAt: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "members",
                  "refType": "TableMembership"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "table: Table",
                "myTables: [Table!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "myTables",
                  "refType": "Table"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createTable: Table!",
                "generateInviteCode: InviteCode!",
                "regenerateInviteCode: InviteCode!",
                "joinTable: TableMembership!",
                "promoteMember: TableMembership!",
                "demoteMember: TableMembership!",
                "setSpectator: TableMembership!",
                "removeMember: Boolean!",
                "createParty: Party!",
                "updateParty: Party!",
                "deleteParty: Boolean!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createTable",
                  "refType": "Table"
                },
                {
                  "field": "generateInviteCode",
                  "refType": "InviteCode"
                },
                {
                  "field": "regenerateInviteCode",
                  "refType": "InviteCode"
                },
                {
                  "field": "joinTable",
                  "refType": "TableMembership"
                },
                {
                  "field": "promoteMember",
                  "refType": "TableMembership"
                },
                {
                  "field": "demoteMember",
                  "refType": "TableMembership"
                },
                {
                  "field": "setSpectator",
                  "refType": "TableMembership"
                },
                {
                  "field": "createParty",
                  "refType": "Party"
                },
                {
                  "field": "updateParty",
                  "refType": "Party"
                }
              ]
            }
          ]
        },
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/ci.yml",
              "name": "CI",
              "triggers": [
                "pull_request",
                "push"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "uses": "TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "run": null
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-check.yml",
              "name": "contract-check",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "contract-check",
                  "name": "contract-check",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a short-lived tabletop-infra installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "Fetch tabletop-infra's committed contract snapshots",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Run the composition check against this service's own SDL",
                      "uses": null,
                      "run": "npm run check-composition -- --subgraph table-service --sdl-file ../../../src/graphql/schema.graphql"
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-snapshot-update.yml",
              "name": "contract-snapshot-update",
              "triggers": [
                "push"
              ],
              "jobs": [
                {
                  "id": "update-contract",
                  "name": "update-contract",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a short-lived tabletop-infra installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Regenerate this subgraph's snapshot from the merged SDL",
                      "uses": null,
                      "run": "npm run update-contracts -- --subgraph table-service --sdl-file ../../../src/graphql/schema.graphql"
                    },
                    {
                      "label": "Commit and push the updated snapshot back to tabletop-infra",
                      "uses": null,
                      "run": "git config user.name \"tabletop-infra-sync[bot]\"\ngit config user.email \"tabletop-infra-sync[bot]@users.noreply.github.com\"\ngit add packages/schema-types/contracts/table-service.graphql\ngit diff --cached --quiet || git commit -m \"contracts: update table-service snapshot\"\ngit push\n"
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": {
                "name": "Mutation",
                "kind": "OBJECT"
              },
              "subscriptionType": null,
              "types": [
                {
                  "kind": "ENUM",
                  "name": "TableRole",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "CO_DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "PLAYER",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SPECTATOR",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Table",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "creatorUserId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "viewerRole",
                      "description": "The requesting (authenticated) user's current role at this table, or null if they\nhave no active membership. Convenience field for clients; NOT the mechanism the\ngateway uses for per-field authorization (see contracts/role-resolution.yaml).",
                      "args": [],
                      "type": {
                        "kind": "ENUM",
                        "name": "TableRole",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMembership",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "parties",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Party",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "TableMembership",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "userId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "role",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableRole",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isActive",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "joinedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "InviteCode",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "code",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "tableId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Party",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMembership",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "table",
                      "description": "Table by id, visible only to active members (FR-023 read scope applies to parties/members).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "OBJECT",
                        "name": "Table",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "myTables",
                      "description": "Tables the authenticated caller is an active member of.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Table",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Mutation",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "createTable",
                      "description": "FR-001..FR-004: creator becomes DM of the new table.",
                      "args": [
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "generateInviteCode",
                      "description": "FR-005, FR-010: DM or co-DM only. Regenerating invalidates the previous code.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "InviteCode",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "regenerateInviteCode",
                      "description": null,
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "InviteCode",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "joinTable",
                      "description": "FR-006..FR-009: joins as PLAYER, or reports already-a-member; rejects invalid/superseded codes.",
                      "args": [
                        {
                          "name": "inviteCode",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "promoteMember",
                      "description": "FR-012, FR-017..FR-019: role-management actions, all scoped to a single tableMembership.",
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "demoteMember",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "setSpectator",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableMembership",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "removeMember",
                      "description": null,
                      "args": [
                        {
                          "name": "membershipId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createParty",
                      "description": "FR-020..FR-024: party CRUD, DM/co-DM only; memberIds must be active table members.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "memberIds",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": null,
                              "kind": "LIST",
                              "ofType": {
                                "name": null,
                                "kind": "NON_NULL",
                                "ofType": {
                                  "name": "ID",
                                  "kind": "SCALAR",
                                  "ofType": null
                                }
                              }
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateParty",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "String",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "memberIds",
                          "description": null,
                          "type": {
                            "kind": "LIST",
                            "name": null,
                            "ofType": {
                              "name": null,
                              "kind": "NON_NULL",
                              "ofType": {
                                "name": "ID",
                                "kind": "SCALAR",
                                "ofType": null
                              }
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deleteParty",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-table-membership-roles"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-table-membership-roles/spec.md",
            "title": "Feature Specification: Table Service — Tables, Memberships & Roles",
            "summary": "A game master wants to start a new game. They create a table, giving it a name, and are automatically established as the Dungeon Master (DM) of that table with full control over its membership and organization."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": {
          "nodes": [
            {
              "id": "src_context_ts",
              "label": "src/context.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/context.ts</h3><p>1 file(s)</p><ul><li><code>src/context.ts</code></li></ul>"
            },
            {
              "id": "src_db",
              "label": "src/db",
              "kind": "folder",
              "detailHtml": "<h3>src/db</h3><p>1 file(s)</p><ul><li><code>src/db/client.ts</code></li></ul>"
            },
            {
              "id": "_ttrpgsolution_service-core",
              "label": "@ttrpgsolution/service-core",
              "kind": "folder",
              "detailHtml": "<h3>@ttrpgsolution/service-core</h3><p>1 file(s)</p><ul><li><code>@ttrpgsolution/service-core</code></li></ul>"
            },
            {
              "id": "_prisma_client",
              "label": "@prisma/client",
              "kind": "folder",
              "detailHtml": "<h3>@prisma/client</h3><p>1 file(s)</p><ul><li><code>@prisma/client</code></li></ul>"
            },
            {
              "id": "src_domain",
              "label": "src/domain",
              "kind": "folder",
              "detailHtml": "<h3>src/domain</h3><p>3 file(s)</p><ul><li><code>src/domain/errors.ts</code></li><li><code>src/domain/invite-codes.ts</code></li><li><code>src/domain/role-hierarchy.ts</code></li></ul>"
            },
            {
              "id": "_____",
              "label": "../..",
              "kind": "folder",
              "detailHtml": "<h3>../..</h3><p>2 file(s)</p><ul><li><code>../../node_modules/graphql/index.js</code></li><li><code>../../node_modules/nanoid/index.cjs</code></li></ul>"
            },
            {
              "id": "src_events",
              "label": "src/events",
              "kind": "folder",
              "detailHtml": "<h3>src/events</h3><p>2 file(s)</p><ul><li><code>src/events/event-types.ts</code></li><li><code>src/events/publisher.ts</code></li></ul>"
            },
            {
              "id": "crypto",
              "label": "crypto",
              "kind": "folder",
              "detailHtml": "<h3>crypto</h3><p>1 file(s)</p><ul><li><code>crypto</code></li></ul>"
            },
            {
              "id": "src_graphql",
              "label": "src/graphql",
              "kind": "folder",
              "detailHtml": "<h3>src/graphql</h3><p>4 file(s)</p><ul><li><code>src/graphql/resolvers/membership.resolvers.ts</code></li><li><code>src/graphql/resolvers/mergeResolvers.ts</code></li><li><code>src/graphql/resolvers/party.resolvers.ts</code></li><li><code>src/graphql/resolvers/table.resolvers.ts</code></li></ul>"
            },
            {
              "id": "src_services",
              "label": "src/services",
              "kind": "folder",
              "detailHtml": "<h3>src/services</h3><p>4 file(s)</p><ul><li><code>src/services/membership.service.ts</code></li><li><code>src/services/party.service.ts</code></li><li><code>src/services/role-resolution.service.ts</code></li><li><code>src/services/table.service.ts</code></li></ul>"
            },
            {
              "id": "zod",
              "label": "zod",
              "kind": "folder",
              "detailHtml": "<h3>zod</h3><p>1 file(s)</p><ul><li><code>zod</code></li></ul>"
            },
            {
              "id": "src_index_ts",
              "label": "src/index.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/index.ts</h3><p>1 file(s)</p><ul><li><code>src/index.ts</code></li></ul>"
            },
            {
              "id": "src_lib",
              "label": "src/lib",
              "kind": "folder",
              "detailHtml": "<h3>src/lib</h3><p>3 file(s)</p><ul><li><code>src/lib/config.ts</code></li><li><code>src/lib/errorFormatting.ts</code></li><li><code>src/lib/logger.ts</code></li></ul>"
            },
            {
              "id": "src_middleware",
              "label": "src/middleware",
              "kind": "folder",
              "detailHtml": "<h3>src/middleware</h3><p>3 file(s)</p><ul><li><code>src/middleware/auth-context.ts</code></li><li><code>src/middleware/correlation-id.ts</code></li><li><code>src/middleware/service-auth.ts</code></li></ul>"
            },
            {
              "id": "src_rest",
              "label": "src/rest",
              "kind": "folder",
              "detailHtml": "<h3>src/rest</h3><p>2 file(s)</p><ul><li><code>src/rest/party-resolution.route.ts</code></li><li><code>src/rest/role-resolution.route.ts</code></li></ul>"
            },
            {
              "id": "_apollo_server",
              "label": "@apollo/server",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/server</h3><p>1 file(s)</p><ul><li><code>@apollo/server</code></li></ul>"
            },
            {
              "id": "_apollo_subgraph",
              "label": "@apollo/subgraph",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/subgraph</h3><p>1 file(s)</p><ul><li><code>@apollo/subgraph</code></li></ul>"
            },
            {
              "id": "_as-integrations_fastify",
              "label": "@as-integrations/fastify",
              "kind": "folder",
              "detailHtml": "<h3>@as-integrations/fastify</h3><p>1 file(s)</p><ul><li><code>@as-integrations/fastify</code></li></ul>"
            },
            {
              "id": "fastify",
              "label": "fastify",
              "kind": "folder",
              "detailHtml": "<h3>fastify</h3><p>1 file(s)</p><ul><li><code>fastify</code></li></ul>"
            },
            {
              "id": "fs",
              "label": "fs",
              "kind": "folder",
              "detailHtml": "<h3>fs</h3><p>1 file(s)</p><ul><li><code>fs</code></li></ul>"
            },
            {
              "id": "ioredis",
              "label": "ioredis",
              "kind": "folder",
              "detailHtml": "<h3>ioredis</h3><p>1 file(s)</p><ul><li><code>ioredis</code></li></ul>"
            },
            {
              "id": "path",
              "label": "path",
              "kind": "folder",
              "detailHtml": "<h3>path</h3><p>1 file(s)</p><ul><li><code>path</code></li></ul>"
            },
            {
              "id": "url",
              "label": "url",
              "kind": "folder",
              "detailHtml": "<h3>url</h3><p>1 file(s)</p><ul><li><code>url</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "src_context_ts__src_db",
              "source": "src_context_ts",
              "target": "src_db",
              "label": ""
            },
            {
              "id": "src_context_ts___ttrpgsolution_service-core",
              "source": "src_context_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_db___prisma_client",
              "source": "src_db",
              "target": "_prisma_client",
              "label": ""
            },
            {
              "id": "src_domain_______",
              "source": "src_domain",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_events___ttrpgsolution_service-core",
              "source": "src_events",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_events__crypto",
              "source": "src_events",
              "target": "crypto",
              "label": ""
            },
            {
              "id": "src_graphql__src_domain",
              "source": "src_graphql",
              "target": "src_domain",
              "label": "3"
            },
            {
              "id": "src_graphql__src_services",
              "source": "src_graphql",
              "target": "src_services",
              "label": "3"
            },
            {
              "id": "src_graphql__zod",
              "source": "src_graphql",
              "target": "zod",
              "label": "3"
            },
            {
              "id": "src_services__src_domain",
              "source": "src_services",
              "target": "src_domain",
              "label": "6"
            },
            {
              "id": "src_services__src_events",
              "source": "src_services",
              "target": "src_events",
              "label": "3"
            },
            {
              "id": "src_index_ts__src_context_ts",
              "source": "src_index_ts",
              "target": "src_context_ts",
              "label": ""
            },
            {
              "id": "src_index_ts__src_db",
              "source": "src_index_ts",
              "target": "src_db",
              "label": ""
            },
            {
              "id": "src_index_ts__src_events",
              "source": "src_index_ts",
              "target": "src_events",
              "label": ""
            },
            {
              "id": "src_index_ts__src_graphql",
              "source": "src_index_ts",
              "target": "src_graphql",
              "label": "4"
            },
            {
              "id": "src_index_ts__src_lib",
              "source": "src_index_ts",
              "target": "src_lib",
              "label": "3"
            },
            {
              "id": "src_index_ts__src_middleware",
              "source": "src_index_ts",
              "target": "src_middleware",
              "label": "2"
            },
            {
              "id": "src_index_ts__src_rest",
              "source": "src_index_ts",
              "target": "src_rest",
              "label": "2"
            },
            {
              "id": "src_index_ts__src_services",
              "source": "src_index_ts",
              "target": "src_services",
              "label": ""
            },
            {
              "id": "src_index_ts___apollo_server",
              "source": "src_index_ts",
              "target": "_apollo_server",
              "label": ""
            },
            {
              "id": "src_index_ts___apollo_subgraph",
              "source": "src_index_ts",
              "target": "_apollo_subgraph",
              "label": ""
            },
            {
              "id": "src_index_ts___as-integrations_fastify",
              "source": "src_index_ts",
              "target": "_as-integrations_fastify",
              "label": ""
            },
            {
              "id": "src_index_ts___ttrpgsolution_service-core",
              "source": "src_index_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_index_ts__fastify",
              "source": "src_index_ts",
              "target": "fastify",
              "label": ""
            },
            {
              "id": "src_index_ts__fs",
              "source": "src_index_ts",
              "target": "fs",
              "label": ""
            },
            {
              "id": "src_index_ts_______",
              "source": "src_index_ts",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_index_ts__ioredis",
              "source": "src_index_ts",
              "target": "ioredis",
              "label": ""
            },
            {
              "id": "src_index_ts__path",
              "source": "src_index_ts",
              "target": "path",
              "label": ""
            },
            {
              "id": "src_index_ts__url",
              "source": "src_index_ts",
              "target": "url",
              "label": ""
            },
            {
              "id": "src_lib___ttrpgsolution_service-core",
              "source": "src_lib",
              "target": "_ttrpgsolution_service-core",
              "label": "2"
            },
            {
              "id": "src_lib__zod",
              "source": "src_lib",
              "target": "zod",
              "label": ""
            },
            {
              "id": "src_lib__src_domain",
              "source": "src_lib",
              "target": "src_domain",
              "label": ""
            },
            {
              "id": "src_middleware___ttrpgsolution_service-core",
              "source": "src_middleware",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_rest__src_middleware",
              "source": "src_rest",
              "target": "src_middleware",
              "label": "2"
            },
            {
              "id": "src_rest__zod",
              "source": "src_rest",
              "target": "zod",
              "label": "2"
            }
          ]
        },
        "classDiagram": {
          "nodes": [
            {
              "id": "ValidationError",
              "label": "ValidationError",
              "kind": "class",
              "detailHtml": "<h3>ValidationError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "UnauthorizedError",
              "label": "UnauthorizedError",
              "kind": "class",
              "detailHtml": "<h3>UnauthorizedError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "NotFoundError",
              "label": "NotFoundError",
              "kind": "class",
              "detailHtml": "<h3>NotFoundError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "ConflictError",
              "label": "ConflictError",
              "kind": "class",
              "detailHtml": "<h3>ConflictError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>Error</code></li></ul>"
            },
            {
              "id": "MembershipService",
              "label": "MembershipService",
              "kind": "interface",
              "detailHtml": "<h3>MembershipService <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>getInviteCode(2): Promise&lt;{ code: string; tableId: string }&gt;</code></li><li><code>regenerateInviteCode(2): Promise&lt;{ code: string; tableId: string }&gt;</code></li><li><code>joinTable(2): Promise&lt;JoinTableResult&gt;</code></li><li><code>promoteMember(2): Promise&lt;TableMembership&gt;</code></li><li><code>demoteMember(2): Promise&lt;TableMembership&gt;</code></li><li><code>setSpectator(2): Promise&lt;TableMembership&gt;</code></li><li><code>removeMember(2): Promise&lt;void&gt;</code></li></ul>"
            },
            {
              "id": "PartyService",
              "label": "PartyService",
              "kind": "interface",
              "detailHtml": "<h3>PartyService <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>createParty(4): Promise&lt;Party&gt;</code></li><li><code>updateParty(4): Promise&lt;Party&gt;</code></li><li><code>deleteParty(2): Promise&lt;void&gt;</code></li><li><code>listPartiesForTable(1): Promise&lt;Party[]&gt;</code></li><li><code>listMemberIdsForParty(1): Promise&lt;string[]&gt;</code></li></ul>"
            },
            {
              "id": "TableService",
              "label": "TableService",
              "kind": "interface",
              "detailHtml": "<h3>TableService <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>createTable(2): Promise&lt;Table&gt;</code></li><li><code>getTableById(1): Promise&lt;Table | null&gt;</code></li><li><code>listMyTables(1): Promise&lt;Table[]&gt;</code></li></ul>"
            },
            {
              "id": "RoleResolutionService",
              "label": "RoleResolutionService",
              "kind": "interface",
              "detailHtml": "<h3>RoleResolutionService <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>resolveRole(2): Promise&lt;RoleResolution&gt;</code></li><li><code>resolveRolesBatch(1): Promise&lt;(RoleResolution &amp; { userId: string; tableId: string })[]&gt;</code></li></ul>"
            },
            {
              "id": "MembershipRoleChangedPayload",
              "label": "MembershipRoleChangedPayload",
              "kind": "interface",
              "detailHtml": "<h3>MembershipRoleChangedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>membershipId: string</code></li><li><code>userId: string</code></li><li><code>previousRole: TableRole</code></li><li><code>newRole: TableRole</code></li><li><code>actorUserId: string</code></li></ul>"
            },
            {
              "id": "TableEventEnvelope",
              "label": "TableEventEnvelope",
              "kind": "interface",
              "detailHtml": "<h3>TableEventEnvelope <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventId: string</code></li><li><code>eventType: string</code></li><li><code>tableId: string</code></li><li><code>occurredAt: string</code></li><li><code>correlationId: string</code></li><li><code>payload: T</code></li></ul>"
            },
            {
              "id": "TableServiceContext",
              "label": "TableServiceContext",
              "kind": "interface",
              "detailHtml": "<h3>TableServiceContext <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>actorUserId: string | null</code></li><li><code>correlationId: string | undefined</code></li><li><code>prisma: typeof prisma</code></li><li><code>eventPublisher: EventPublisher</code></li><li><code>roleResolutionService: RoleResolutionService</code></li></ul>"
            },
            {
              "id": "RoleActionInput",
              "label": "RoleActionInput",
              "kind": "interface",
              "detailHtml": "<h3>RoleActionInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>actorRole: TableRole</code></li><li><code>actorUserId: string</code></li><li><code>targetRole: TableRole</code></li><li><code>targetUserId: string</code></li><li><code>targetIsLastActiveDm: boolean</code></li></ul>"
            },
            {
              "id": "EventPublisher",
              "label": "EventPublisher",
              "kind": "interface",
              "detailHtml": "<h3>EventPublisher <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>publish(3): Promise&lt;void&gt;</code></li></ul>"
            },
            {
              "id": "MembershipJoinedPayload",
              "label": "MembershipJoinedPayload",
              "kind": "interface",
              "detailHtml": "<h3>MembershipJoinedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>membershipId: string</code></li><li><code>userId: string</code></li><li><code>role: &quot;PLAYER&quot;</code></li></ul>"
            },
            {
              "id": "MembershipRemovedPayload",
              "label": "MembershipRemovedPayload",
              "kind": "interface",
              "detailHtml": "<h3>MembershipRemovedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>membershipId: string</code></li><li><code>userId: string</code></li><li><code>actorUserId: string</code></li></ul>"
            },
            {
              "id": "PartyCreatedPayload",
              "label": "PartyCreatedPayload",
              "kind": "interface",
              "detailHtml": "<h3>PartyCreatedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>partyId: string</code></li><li><code>name: string</code></li><li><code>memberIds: string[]</code></li></ul>"
            },
            {
              "id": "PartyUpdatedPayload",
              "label": "PartyUpdatedPayload",
              "kind": "interface",
              "detailHtml": "<h3>PartyUpdatedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>partyId: string</code></li><li><code>name: string</code></li><li><code>memberIds: string[]</code></li></ul>"
            },
            {
              "id": "BuildServerOptions",
              "label": "BuildServerOptions",
              "kind": "interface",
              "detailHtml": "<h3>BuildServerOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>config: TableServiceConfig</code></li><li><code>events: EventPublisher</code></li><li><code>redis: Redis</code></li></ul>"
            },
            {
              "id": "TableCreatedPayload",
              "label": "TableCreatedPayload",
              "kind": "interface",
              "detailHtml": "<h3>TableCreatedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>name: string</code></li><li><code>creatorUserId: string</code></li></ul>"
            },
            {
              "id": "ContextBuilderDependencies",
              "label": "ContextBuilderDependencies",
              "kind": "interface",
              "detailHtml": "<h3>ContextBuilderDependencies <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventPublisher: EventPublisher</code></li><li><code>roleResolutionService: RoleResolutionService</code></li></ul>"
            },
            {
              "id": "PartyDeletedPayload",
              "label": "PartyDeletedPayload",
              "kind": "interface",
              "detailHtml": "<h3>PartyDeletedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>partyId: string</code></li></ul>"
            },
            {
              "id": "PartyResolutionRouteOptions",
              "label": "PartyResolutionRouteOptions",
              "kind": "interface",
              "detailHtml": "<h3>PartyResolutionRouteOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>prisma: PrismaClient</code></li><li><code>serviceAuthSecret: string</code></li></ul>"
            },
            {
              "id": "RoleResolutionRouteOptions",
              "label": "RoleResolutionRouteOptions",
              "kind": "interface",
              "detailHtml": "<h3>RoleResolutionRouteOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>roleResolutionService: RoleResolutionService</code></li><li><code>serviceAuthSecret: string</code></li></ul>"
            },
            {
              "id": "JoinTableResult",
              "label": "JoinTableResult",
              "kind": "interface",
              "detailHtml": "<h3>JoinTableResult <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>membership: TableMembership</code></li><li><code>wasNewJoin: boolean</code></li></ul>"
            },
            {
              "id": "InviteCodeRegeneratedPayload",
              "label": "InviteCodeRegeneratedPayload",
              "kind": "interface",
              "detailHtml": "<h3>InviteCodeRegeneratedPayload <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li></ul>"
            }
          ],
          "edges": []
        },
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_ci_yml",
              "label": "CI",
              "kind": "workflow",
              "detailHtml": "<h3>CI</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><p>Triggers: pull_request, push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><ol><li>1. uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main<br/><code>uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-check_yml",
              "label": "contract-check",
              "kind": "workflow",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-check_yml__contract-check",
              "label": "contract-check",
              "kind": "job",
              "parent": "_github_workflows_contract-check_yml",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a short-lived tabletop-infra installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. Fetch tabletop-infra's committed contract snapshots<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Run the composition check against this service's own SDL<br/><code>run: npm run check-composition -- --subgraph table-service --sdl-file ../../../src/gr</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-snapshot-update_yml",
              "label": "contract-snapshot-update",
              "kind": "workflow",
              "detailHtml": "<h3>contract-snapshot-update</h3><p class=\"muted\"><code>.github/workflows/contract-snapshot-update.yml</code></p><p>Triggers: push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-snapshot-update_yml__update-contract",
              "label": "update-contract",
              "kind": "job",
              "parent": "_github_workflows_contract-snapshot-update_yml",
              "detailHtml": "<h3>update-contract</h3><p class=\"muted\"><code>.github/workflows/contract-snapshot-update.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a short-lived tabletop-infra installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Regenerate this subgraph's snapshot from the merged SDL<br/><code>run: npm run update-contracts -- --subgraph table-service --sdl-file ../../../src/gra</code></li><li>7. Commit and push the updated snapshot back to tabletop-infra<br/><code>run: git config user.name &quot;tabletop-infra-sync[bot]&quot;\ngit config user.email &quot;tabletop-</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "ruleset-service",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/ruleset-service",
        "description": "Game system rulesets and stat schemas"
      },
      "status": "merged",
      "current": {
        "languages": {
          "TypeScript": 89058,
          "Shell": 57080,
          "JavaScript": 1014
        },
        "packageDependencies": [
          "@apollo/server",
          "@apollo/subgraph",
          "@as-integrations/fastify",
          "@prisma/client",
          "@ttrpgsolution/service-core",
          "ajv",
          "ajv-errors",
          "ajv-formats",
          "fastify",
          "graphql",
          "graphql-tag",
          "pino",
          "pino-loki",
          "@eslint/js",
          "@testcontainers/postgresql",
          "@types/node",
          "@typescript-eslint/eslint-plugin",
          "@typescript-eslint/parser",
          "@vitest/coverage-v8",
          "eslint",
          "eslint-config-prettier",
          "prettier",
          "prisma",
          "tsx",
          "typescript",
          "vitest"
        ],
        "internalPackageDependencies": [
          "@ttrpgsolution/service-core"
        ],
        "ci": {
          "latestConclusion": "success",
          "latestWorkflowName": "CI",
          "latestRunUrl": "https://github.com/TTRPGSolution/ruleset-service/actions/runs/31909147528"
        },
        "lastCommitSha": "109f19480e723ea11b1527ba9aa932288a82f6c7",
        "lastCommitDate": "2026-08-16T00:20:08+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": {
          "moduleCount": 36,
          "dependencyCount": 58,
          "violationCount": 0,
          "modules": [
            {
              "source": "src/context/auth.ts",
              "dependencies": [
                "src/lib/errors.ts"
              ]
            },
            {
              "source": "src/lib/errors.ts",
              "dependencies": [
                "../../node_modules/graphql/index.js"
              ]
            },
            {
              "source": "../../node_modules/graphql/index.js",
              "dependencies": []
            },
            {
              "source": "src/db/client.ts",
              "dependencies": [
                "@prisma/client"
              ]
            },
            {
              "source": "@prisma/client",
              "dependencies": []
            },
            {
              "source": "src/db/ruleset.repository.ts",
              "dependencies": [
                "src/db/client.ts"
              ]
            },
            {
              "source": "src/db/table-assignment.repository.ts",
              "dependencies": [
                "src/db/client.ts"
              ]
            },
            {
              "source": "src/events/event-publisher.ts",
              "dependencies": []
            },
            {
              "source": "src/events/local-event-publisher.ts",
              "dependencies": [
                "src/lib/logger.ts"
              ]
            },
            {
              "source": "src/lib/logger.ts",
              "dependencies": [
                "@ttrpgsolution/service-core",
                "pino"
              ]
            },
            {
              "source": "@ttrpgsolution/service-core",
              "dependencies": []
            },
            {
              "source": "pino",
              "dependencies": []
            },
            {
              "source": "src/index.ts",
              "dependencies": [
                "src/context/auth.ts",
                "src/db/client.ts",
                "src/lib/logger.ts",
                "src/schema/index.ts",
                "@apollo/server",
                "@as-integrations/fastify",
                "@ttrpgsolution/service-core",
                "fastify"
              ]
            },
            {
              "source": "@apollo/server",
              "dependencies": []
            },
            {
              "source": "@as-integrations/fastify",
              "dependencies": []
            },
            {
              "source": "fastify",
              "dependencies": []
            },
            {
              "source": "src/schema/index.ts",
              "dependencies": [
                "src/resolvers/mutation.resolvers.ts",
                "src/resolvers/query.resolvers.ts",
                "src/resolvers/table.resolvers.ts",
                "@apollo/subgraph",
                "fs",
                "../../node_modules/graphql/index.js",
                "path",
                "url"
              ]
            },
            {
              "source": "@apollo/subgraph",
              "dependencies": []
            },
            {
              "source": "fs",
              "dependencies": []
            },
            {
              "source": "path",
              "dependencies": []
            },
            {
              "source": "url",
              "dependencies": []
            },
            {
              "source": "src/resolvers/mutation.resolvers.ts",
              "dependencies": [
                "src/context/auth.ts",
                "src/services/clone.service.ts",
                "src/services/ruleset.service.ts",
                "src/services/table-assignment.service.ts"
              ]
            },
            {
              "source": "src/services/clone.service.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/db/ruleset.repository.ts",
                "src/lib/errors.ts",
                "src/services/ruleset.service.ts"
              ]
            },
            {
              "source": "src/services/ruleset.service.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/db/ruleset.repository.ts",
                "src/db/table-assignment.repository.ts",
                "src/events/local-event-publisher.ts",
                "src/lib/errors.ts",
                "src/validation/character-data.validator.ts",
                "src/validation/dice-conventions.validator.ts",
                "src/validation/stat-schema.validator.ts"
              ]
            },
            {
              "source": "src/validation/character-data.validator.ts",
              "dependencies": [
                "src/validation/size-depth-guard.ts",
                "src/validation/validator-cache.ts"
              ]
            },
            {
              "source": "src/validation/size-depth-guard.ts",
              "dependencies": []
            },
            {
              "source": "src/validation/validator-cache.ts",
              "dependencies": [
                "src/validation/ajv-instance.ts"
              ]
            },
            {
              "source": "src/validation/ajv-instance.ts",
              "dependencies": [
                "ajv-errors",
                "ajv-formats"
              ]
            },
            {
              "source": "ajv-errors",
              "dependencies": []
            },
            {
              "source": "ajv-formats",
              "dependencies": []
            },
            {
              "source": "src/validation/dice-conventions.validator.ts",
              "dependencies": [
                "src/validation/ajv-instance.ts",
                "src/validation/dice-conventions.schema.ts"
              ]
            },
            {
              "source": "src/validation/dice-conventions.schema.ts",
              "dependencies": []
            },
            {
              "source": "src/validation/stat-schema.validator.ts",
              "dependencies": [
                "src/validation/ajv-instance.ts",
                "src/validation/size-depth-guard.ts"
              ]
            },
            {
              "source": "src/services/table-assignment.service.ts",
              "dependencies": [
                "src/db/client.ts",
                "src/db/table-assignment.repository.ts",
                "src/events/local-event-publisher.ts",
                "src/lib/errors.ts",
                "src/services/ruleset.service.ts"
              ]
            },
            {
              "source": "src/resolvers/query.resolvers.ts",
              "dependencies": [
                "src/context/auth.ts",
                "src/services/ruleset.service.ts"
              ]
            },
            {
              "source": "src/resolvers/table.resolvers.ts",
              "dependencies": [
                "src/db/ruleset.repository.ts",
                "src/db/table-assignment.repository.ts"
              ]
            }
          ]
        },
        "madge": {
          "moduleCount": 23,
          "circularPaths": []
        },
        "federation": {
          "ownedTypes": [
            "Ruleset",
            "Table"
          ],
          "extendedTypes": [],
          "schemaFiles": [
            "contracts/schema.graphql",
            "specs/001-ruleset-content-service/contracts/schema.graphql"
          ]
        },
        "classDiagram": {
          "entries": [
            {
              "kind": "class",
              "name": "LocalEventPublisher",
              "properties": [
                "published: { topic: string; payload: Record<string, unknown> }[]"
              ],
              "methods": [
                "publish(2): Promise<void>"
              ],
              "extends": [],
              "implements": [
                "EventPublisher"
              ]
            },
            {
              "kind": "class",
              "name": "NotFoundError",
              "properties": [],
              "methods": [],
              "extends": [
                "GraphQLError"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "ForbiddenError",
              "properties": [],
              "methods": [],
              "extends": [
                "GraphQLError"
              ],
              "implements": []
            },
            {
              "kind": "class",
              "name": "ValidationFailedError",
              "properties": [],
              "methods": [],
              "extends": [
                "GraphQLError"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "DeleteRulesetDeps",
              "properties": [
                "eventPublisher: EventPublisher"
              ],
              "methods": [],
              "extends": [
                "RulesetServiceDeps"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "EventPublisher",
              "properties": [],
              "methods": [
                "publish(2): Promise<void>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreateRulesetInput",
              "properties": [
                "gameSystemName: string",
                "statSchema: unknown",
                "diceConventions: unknown"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "UpdateRulesetInput",
              "properties": [
                "gameSystemName: string",
                "statSchema: unknown",
                "diceConventions: unknown"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "AssignRulesetToTableInput",
              "properties": [
                "tableId: string",
                "rulesetId: string",
                "userId: string | null"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RulesetLike",
              "properties": [
                "id: string",
                "updatedAt: Date | string",
                "statSchema: object"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ValidationErrorDetail",
              "properties": [
                "field: string",
                "path: string",
                "message: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableAssignmentServiceDeps",
              "properties": [
                "prisma: PrismaClient",
                "eventPublisher: EventPublisher"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "SizeDepthViolation",
              "properties": [
                "reason: \"too_large\" | \"too_deep\"",
                "message: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ValidationOutcome",
              "properties": [
                "valid: boolean",
                "errors: ValidationErrorDetail[]"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "GraphQLContext",
              "properties": [
                "userId: string | null"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RequestLike",
              "properties": [
                "headers: Record<string, string | string[] | undefined>"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableReference",
              "properties": [
                "id: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CloneServiceDeps",
              "properties": [
                "prisma: PrismaClient"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RulesetServiceDeps",
              "properties": [
                "prisma: PrismaClient"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            }
          ]
        },
        "graphqlSchema": {
          "types": [
            {
              "name": "RulesetOrigin",
              "kind": "enum",
              "fields": [
                "PRESET",
                "CUSTOM"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "RulesetStatus",
              "kind": "enum",
              "fields": [
                "ACTIVE",
                "ARCHIVED"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Ruleset",
              "kind": "object",
              "fields": [
                "id: ID!",
                "gameSystemName: String!",
                "statSchema: JSON!",
                "diceConventions: JSON!",
                "origin: RulesetOrigin!",
                "status: RulesetStatus!",
                "ownerId: ID",
                "clonedFromId: ID",
                "createdAt: DateTime!",
                "updatedAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "statSchema",
                  "refType": "JSON"
                },
                {
                  "field": "diceConventions",
                  "refType": "JSON"
                },
                {
                  "field": "origin",
                  "refType": "RulesetOrigin"
                },
                {
                  "field": "status",
                  "refType": "RulesetStatus"
                },
                {
                  "field": "createdAt",
                  "refType": "DateTime"
                },
                {
                  "field": "updatedAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "ValidationError",
              "kind": "object",
              "fields": [
                "field: String!",
                "path: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ValidationResult",
              "kind": "object",
              "fields": [
                "valid: Boolean!",
                "errors: [ValidationError!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "errors",
                  "refType": "ValidationError"
                }
              ]
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "ruleset: Ruleset"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "ruleset",
                  "refType": "Ruleset"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "availableRulesets: [Ruleset!]!",
                "ruleset: Ruleset",
                "myRulesets: [Ruleset!]!",
                "validateCharacterData: ValidationResult!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "availableRulesets",
                  "refType": "Ruleset"
                },
                {
                  "field": "ruleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "myRulesets",
                  "refType": "Ruleset"
                },
                {
                  "field": "validateCharacterData",
                  "refType": "ValidationResult"
                }
              ]
            },
            {
              "name": "CreateRulesetInput",
              "kind": "input",
              "fields": [
                "gameSystemName: String!",
                "statSchema: JSON!",
                "diceConventions: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "UpdateRulesetInput",
              "kind": "input",
              "fields": [
                "gameSystemName: String",
                "statSchema: JSON",
                "diceConventions: JSON"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createRuleset: Ruleset!",
                "updateRuleset: Ruleset!",
                "deleteRuleset: Ruleset!",
                "cloneRuleset: Ruleset!",
                "assignRulesetToTable: Table!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "updateRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "deleteRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "cloneRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "assignRulesetToTable",
                  "refType": "Table"
                }
              ]
            },
            {
              "name": "RulesetOrigin",
              "kind": "enum",
              "fields": [
                "PRESET",
                "CUSTOM"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "RulesetStatus",
              "kind": "enum",
              "fields": [
                "ACTIVE",
                "ARCHIVED"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Ruleset",
              "kind": "object",
              "fields": [
                "id: ID!",
                "gameSystemName: String!",
                "statSchema: JSON!",
                "diceConventions: JSON!",
                "origin: RulesetOrigin!",
                "status: RulesetStatus!",
                "ownerId: ID",
                "clonedFromId: ID",
                "createdAt: DateTime!",
                "updatedAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "statSchema",
                  "refType": "JSON"
                },
                {
                  "field": "diceConventions",
                  "refType": "JSON"
                },
                {
                  "field": "origin",
                  "refType": "RulesetOrigin"
                },
                {
                  "field": "status",
                  "refType": "RulesetStatus"
                },
                {
                  "field": "createdAt",
                  "refType": "DateTime"
                },
                {
                  "field": "updatedAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "ValidationError",
              "kind": "object",
              "fields": [
                "field: String!",
                "path: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ValidationResult",
              "kind": "object",
              "fields": [
                "valid: Boolean!",
                "errors: [ValidationError!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "errors",
                  "refType": "ValidationError"
                }
              ]
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "ruleset: Ruleset"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "ruleset",
                  "refType": "Ruleset"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "availableRulesets: [Ruleset!]!",
                "ruleset: Ruleset",
                "myRulesets: [Ruleset!]!",
                "validateCharacterData: ValidationResult!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "availableRulesets",
                  "refType": "Ruleset"
                },
                {
                  "field": "ruleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "myRulesets",
                  "refType": "Ruleset"
                },
                {
                  "field": "validateCharacterData",
                  "refType": "ValidationResult"
                }
              ]
            },
            {
              "name": "CreateRulesetInput",
              "kind": "input",
              "fields": [
                "gameSystemName: String!",
                "statSchema: JSON!",
                "diceConventions: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "UpdateRulesetInput",
              "kind": "input",
              "fields": [
                "gameSystemName: String",
                "statSchema: JSON",
                "diceConventions: JSON"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createRuleset: Ruleset!",
                "updateRuleset: Ruleset!",
                "deleteRuleset: Ruleset!",
                "cloneRuleset: Ruleset!",
                "assignRulesetToTable: Table!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "updateRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "deleteRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "cloneRuleset",
                  "refType": "Ruleset"
                },
                {
                  "field": "assignRulesetToTable",
                  "refType": "Table"
                }
              ]
            }
          ]
        },
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/ci.yml",
              "name": "CI",
              "triggers": [
                "pull_request",
                "push"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "uses": "TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "run": null
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-check.yml",
              "name": "contract-check",
              "triggers": [
                "pull_request",
                "push"
              ],
              "jobs": [
                {
                  "id": "contract-check",
                  "name": "contract-check",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a tabletop-infra-contract-sync installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "Fetch tabletop-infra's committed contract snapshots",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Run the composition check against this service's own SDL",
                      "uses": null,
                      "run": "npm run check-composition -- --subgraph ruleset-service --sdl-file ../../../contracts/schema.graphql"
                    }
                  ]
                },
                {
                  "id": "update-contract",
                  "name": "update-contract",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a tabletop-infra-contract-sync installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Regenerate this subgraph's snapshot from the merged SDL",
                      "uses": null,
                      "run": "npm run update-contracts -- --subgraph ruleset-service --sdl-file ../../../contracts/schema.graphql"
                    },
                    {
                      "label": "Commit and push the updated snapshot back to tabletop-infra",
                      "uses": null,
                      "run": "git config user.name \"tabletop-infra-contract-sync[bot]\"\ngit config user.email \"tabletop-infra-contract-sync[bot]@users.noreply.github.com\"\ngit add packages/schema-types/contracts/ruleset-service.graphql\ngit diff --cached --quiet || git commit -m \"contracts: update ruleset-service snapshot\"\ngit push\n"
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": {
                "name": "Mutation",
                "kind": "OBJECT"
              },
              "subscriptionType": null,
              "types": [
                {
                  "kind": "SCALAR",
                  "name": "DateTime",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "JSON",
                  "description": "Arbitrary JSON value — used for the JSON-Schema `statSchema` document and for\nopaque character-data payloads passed to validateCharacterData.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "RulesetOrigin",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "PRESET",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "CUSTOM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "RulesetStatus",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "ACTIVE",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARCHIVED",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Ruleset",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "gameSystemName",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "statSchema",
                      "description": "JSON Schema (2020-12) document describing valid character stats/fields.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceConventions",
                      "description": "Structured, declarative dice-roll definitions (never executable code).",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "origin",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "RulesetOrigin",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "status",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "RulesetStatus",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ownerId",
                      "description": "Null for PRESET rulesets. Opaque platform user id for CUSTOM rulesets.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "ID",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "clonedFromId",
                      "description": "Set when this ruleset was created via cloneRuleset; null otherwise.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "ID",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updatedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ValidationError",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "field",
                      "description": "Best-effort human-readable field name.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "path",
                      "description": "Raw JSON Pointer to the offending location.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "message",
                      "description": "Human-readable reason the field failed validation.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ValidationResult",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "valid",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "errors",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "ValidationError",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Table",
                  "description": "Entity extension: this subgraph contributes the `ruleset` field to the `Table`\nentity owned by table-service, per FR-015. table-service's subgraph declares\n`type Table @key(fields: \"id\") { id: ID! }`; this subgraph extends it.\n\nDeliberately no `@external` on `id` here: that's the Federation v1 stub\nconvention (every re-declared field on an extended entity marked external).\nUnder Federation v2, `@external` is reserved for fields read solely to\nsatisfy a `@requires`/`@provides` elsewhere — this subgraph has neither, and\nmarking the key field external anyway breaks composition against the real\nsupergraph (confirmed via tabletop-infra's check-composition tooling, T065).",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ruleset",
                      "description": "The ruleset permanently associated with this table at creation time.\nNull only if queried before assignRulesetToTable has been called, which the\ntable-creation flow is not expected to allow (FR-014).",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "Ruleset",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "availableRulesets",
                      "description": "All rulesets available to the caller: every seeded preset plus the\ncaller's own active custom rulesets. Powers the table-creation picker\n(FR-013) and the general ruleset list (FR-006).",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Ruleset",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ruleset",
                      "description": "A single ruleset by id, visible only if it's a preset or owned by the\ncaller (FR-012). Returns null if not found or not visible to the caller.",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "OBJECT",
                        "name": "Ruleset",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "myRulesets",
                      "description": "Every custom ruleset owned by the caller, active and archived (US3).",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Ruleset",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "validateCharacterData",
                      "description": "Authoritative, deterministic character-data validation against a\nruleset's statSchema (FR-016-018). The single source of truth other\nservices (e.g. character-service) call instead of re-implementing\nvalidation.",
                      "args": [
                        {
                          "name": "rulesetId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "data",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "JSON",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ValidationResult",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "CreateRulesetInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "gameSystemName",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "statSchema",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceConventions",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "UpdateRulesetInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "gameSystemName",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "statSchema",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "JSON",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceConventions",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "JSON",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Mutation",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "createRuleset",
                      "description": "Creates a new CUSTOM ruleset owned by the caller (FR-003). Rejects with a\nfield-level error if statSchema or diceConventions fails validation\n(FR-004, FR-005).",
                      "args": [
                        {
                          "name": "input",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "CreateRulesetInput",
                              "kind": "INPUT_OBJECT",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Ruleset",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateRuleset",
                      "description": "Updates a CUSTOM ruleset owned by the caller (FR-007). Rejects if the\ncaller is not the owner (FR-012) or the target is a PRESET (FR-010).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "input",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "UpdateRulesetInput",
                              "kind": "INPUT_OBJECT",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Ruleset",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deleteRuleset",
                      "description": "Deletes a CUSTOM ruleset owned by the caller if unreferenced by any\ntable (FR-008), or archives it instead if it is referenced (FR-009).\nRejects if the caller is not the owner (FR-012) or the target is a PRESET\n(FR-010). Publishes a `ruleset.archived` event when the archive branch is\ntaken.",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Ruleset",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "cloneRuleset",
                      "description": "Creates a new CUSTOM ruleset owned by the caller, seeded from any\nruleset visible to them — preset or their own custom (FR-011). The source\nruleset is never modified.",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Ruleset",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "assignRulesetToTable",
                      "description": "Called by table-service's table-creation flow once a ruleset has been\nchosen. Permanent — there is no reassignment mutation (FR-015). Rejects if\nrulesetId is not ACTIVE and visible to the caller, or if tableId already\nhas an assignment. Publishes a `table.ruleset_assigned` event.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "rulesetId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-ruleset-content-service"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-ruleset-content-service/spec.md",
            "title": "Feature Specification: Ruleset and Content Service",
            "summary": "A DM creating a new table wants to pick a ready-made game system rather than build one from scratch, so they can start playing right away."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": {
          "nodes": [
            {
              "id": "src_context",
              "label": "src/context",
              "kind": "folder",
              "detailHtml": "<h3>src/context</h3><p>1 file(s)</p><ul><li><code>src/context/auth.ts</code></li></ul>"
            },
            {
              "id": "src_lib",
              "label": "src/lib",
              "kind": "folder",
              "detailHtml": "<h3>src/lib</h3><p>2 file(s)</p><ul><li><code>src/lib/errors.ts</code></li><li><code>src/lib/logger.ts</code></li></ul>"
            },
            {
              "id": "_____",
              "label": "../..",
              "kind": "folder",
              "detailHtml": "<h3>../..</h3><p>1 file(s)</p><ul><li><code>../../node_modules/graphql/index.js</code></li></ul>"
            },
            {
              "id": "src_db",
              "label": "src/db",
              "kind": "folder",
              "detailHtml": "<h3>src/db</h3><p>3 file(s)</p><ul><li><code>src/db/client.ts</code></li><li><code>src/db/ruleset.repository.ts</code></li><li><code>src/db/table-assignment.repository.ts</code></li></ul>"
            },
            {
              "id": "_prisma_client",
              "label": "@prisma/client",
              "kind": "folder",
              "detailHtml": "<h3>@prisma/client</h3><p>1 file(s)</p><ul><li><code>@prisma/client</code></li></ul>"
            },
            {
              "id": "src_events",
              "label": "src/events",
              "kind": "folder",
              "detailHtml": "<h3>src/events</h3><p>2 file(s)</p><ul><li><code>src/events/event-publisher.ts</code></li><li><code>src/events/local-event-publisher.ts</code></li></ul>"
            },
            {
              "id": "_ttrpgsolution_service-core",
              "label": "@ttrpgsolution/service-core",
              "kind": "folder",
              "detailHtml": "<h3>@ttrpgsolution/service-core</h3><p>1 file(s)</p><ul><li><code>@ttrpgsolution/service-core</code></li></ul>"
            },
            {
              "id": "pino",
              "label": "pino",
              "kind": "folder",
              "detailHtml": "<h3>pino</h3><p>1 file(s)</p><ul><li><code>pino</code></li></ul>"
            },
            {
              "id": "src_index_ts",
              "label": "src/index.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/index.ts</h3><p>1 file(s)</p><ul><li><code>src/index.ts</code></li></ul>"
            },
            {
              "id": "src_schema",
              "label": "src/schema",
              "kind": "folder",
              "detailHtml": "<h3>src/schema</h3><p>1 file(s)</p><ul><li><code>src/schema/index.ts</code></li></ul>"
            },
            {
              "id": "_apollo_server",
              "label": "@apollo/server",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/server</h3><p>1 file(s)</p><ul><li><code>@apollo/server</code></li></ul>"
            },
            {
              "id": "_as-integrations_fastify",
              "label": "@as-integrations/fastify",
              "kind": "folder",
              "detailHtml": "<h3>@as-integrations/fastify</h3><p>1 file(s)</p><ul><li><code>@as-integrations/fastify</code></li></ul>"
            },
            {
              "id": "fastify",
              "label": "fastify",
              "kind": "folder",
              "detailHtml": "<h3>fastify</h3><p>1 file(s)</p><ul><li><code>fastify</code></li></ul>"
            },
            {
              "id": "src_resolvers",
              "label": "src/resolvers",
              "kind": "folder",
              "detailHtml": "<h3>src/resolvers</h3><p>3 file(s)</p><ul><li><code>src/resolvers/mutation.resolvers.ts</code></li><li><code>src/resolvers/query.resolvers.ts</code></li><li><code>src/resolvers/table.resolvers.ts</code></li></ul>"
            },
            {
              "id": "_apollo_subgraph",
              "label": "@apollo/subgraph",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/subgraph</h3><p>1 file(s)</p><ul><li><code>@apollo/subgraph</code></li></ul>"
            },
            {
              "id": "fs",
              "label": "fs",
              "kind": "folder",
              "detailHtml": "<h3>fs</h3><p>1 file(s)</p><ul><li><code>fs</code></li></ul>"
            },
            {
              "id": "path",
              "label": "path",
              "kind": "folder",
              "detailHtml": "<h3>path</h3><p>1 file(s)</p><ul><li><code>path</code></li></ul>"
            },
            {
              "id": "url",
              "label": "url",
              "kind": "folder",
              "detailHtml": "<h3>url</h3><p>1 file(s)</p><ul><li><code>url</code></li></ul>"
            },
            {
              "id": "src_services",
              "label": "src/services",
              "kind": "folder",
              "detailHtml": "<h3>src/services</h3><p>3 file(s)</p><ul><li><code>src/services/clone.service.ts</code></li><li><code>src/services/ruleset.service.ts</code></li><li><code>src/services/table-assignment.service.ts</code></li></ul>"
            },
            {
              "id": "src_validation",
              "label": "src/validation",
              "kind": "folder",
              "detailHtml": "<h3>src/validation</h3><p>7 file(s)</p><ul><li><code>src/validation/ajv-instance.ts</code></li><li><code>src/validation/character-data.validator.ts</code></li><li><code>src/validation/dice-conventions.schema.ts</code></li><li><code>src/validation/dice-conventions.validator.ts</code></li><li><code>src/validation/size-depth-guard.ts</code></li><li><code>src/validation/stat-schema.validator.ts</code></li><li><code>src/validation/validator-cache.ts</code></li></ul>"
            },
            {
              "id": "ajv-errors",
              "label": "ajv-errors",
              "kind": "folder",
              "detailHtml": "<h3>ajv-errors</h3><p>1 file(s)</p><ul><li><code>ajv-errors</code></li></ul>"
            },
            {
              "id": "ajv-formats",
              "label": "ajv-formats",
              "kind": "folder",
              "detailHtml": "<h3>ajv-formats</h3><p>1 file(s)</p><ul><li><code>ajv-formats</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "src_context__src_lib",
              "source": "src_context",
              "target": "src_lib",
              "label": ""
            },
            {
              "id": "src_lib_______",
              "source": "src_lib",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_db___prisma_client",
              "source": "src_db",
              "target": "_prisma_client",
              "label": ""
            },
            {
              "id": "src_events__src_lib",
              "source": "src_events",
              "target": "src_lib",
              "label": ""
            },
            {
              "id": "src_lib___ttrpgsolution_service-core",
              "source": "src_lib",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_lib__pino",
              "source": "src_lib",
              "target": "pino",
              "label": ""
            },
            {
              "id": "src_index_ts__src_context",
              "source": "src_index_ts",
              "target": "src_context",
              "label": ""
            },
            {
              "id": "src_index_ts__src_db",
              "source": "src_index_ts",
              "target": "src_db",
              "label": ""
            },
            {
              "id": "src_index_ts__src_lib",
              "source": "src_index_ts",
              "target": "src_lib",
              "label": ""
            },
            {
              "id": "src_index_ts__src_schema",
              "source": "src_index_ts",
              "target": "src_schema",
              "label": ""
            },
            {
              "id": "src_index_ts___apollo_server",
              "source": "src_index_ts",
              "target": "_apollo_server",
              "label": ""
            },
            {
              "id": "src_index_ts___as-integrations_fastify",
              "source": "src_index_ts",
              "target": "_as-integrations_fastify",
              "label": ""
            },
            {
              "id": "src_index_ts___ttrpgsolution_service-core",
              "source": "src_index_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_index_ts__fastify",
              "source": "src_index_ts",
              "target": "fastify",
              "label": ""
            },
            {
              "id": "src_schema__src_resolvers",
              "source": "src_schema",
              "target": "src_resolvers",
              "label": "3"
            },
            {
              "id": "src_schema___apollo_subgraph",
              "source": "src_schema",
              "target": "_apollo_subgraph",
              "label": ""
            },
            {
              "id": "src_schema__fs",
              "source": "src_schema",
              "target": "fs",
              "label": ""
            },
            {
              "id": "src_schema_______",
              "source": "src_schema",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_schema__path",
              "source": "src_schema",
              "target": "path",
              "label": ""
            },
            {
              "id": "src_schema__url",
              "source": "src_schema",
              "target": "url",
              "label": ""
            },
            {
              "id": "src_resolvers__src_context",
              "source": "src_resolvers",
              "target": "src_context",
              "label": "2"
            },
            {
              "id": "src_resolvers__src_services",
              "source": "src_resolvers",
              "target": "src_services",
              "label": "4"
            },
            {
              "id": "src_services__src_db",
              "source": "src_services",
              "target": "src_db",
              "label": "7"
            },
            {
              "id": "src_services__src_lib",
              "source": "src_services",
              "target": "src_lib",
              "label": "3"
            },
            {
              "id": "src_services__src_events",
              "source": "src_services",
              "target": "src_events",
              "label": "2"
            },
            {
              "id": "src_services__src_validation",
              "source": "src_services",
              "target": "src_validation",
              "label": "3"
            },
            {
              "id": "src_validation__ajv-errors",
              "source": "src_validation",
              "target": "ajv-errors",
              "label": ""
            },
            {
              "id": "src_validation__ajv-formats",
              "source": "src_validation",
              "target": "ajv-formats",
              "label": ""
            },
            {
              "id": "src_resolvers__src_db",
              "source": "src_resolvers",
              "target": "src_db",
              "label": "2"
            }
          ]
        },
        "classDiagram": {
          "nodes": [
            {
              "id": "LocalEventPublisher",
              "label": "LocalEventPublisher",
              "kind": "class",
              "detailHtml": "<h3>LocalEventPublisher <span class=\"tag\">class</span></h3><h4>Properties</h4><ul><li><code>published: { topic: string; payload: Record&lt;string, unknown&gt; }[]</code></li></ul><h4>Methods</h4><ul><li><code>publish(2): Promise&lt;void&gt;</code></li></ul><h4>Implements</h4><ul><li><code>EventPublisher</code></li></ul>"
            },
            {
              "id": "NotFoundError",
              "label": "NotFoundError",
              "kind": "class",
              "detailHtml": "<h3>NotFoundError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>GraphQLError</code></li></ul>"
            },
            {
              "id": "ForbiddenError",
              "label": "ForbiddenError",
              "kind": "class",
              "detailHtml": "<h3>ForbiddenError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>GraphQLError</code></li></ul>"
            },
            {
              "id": "ValidationFailedError",
              "label": "ValidationFailedError",
              "kind": "class",
              "detailHtml": "<h3>ValidationFailedError <span class=\"tag\">class</span></h3><h4>Extends</h4><ul><li><code>GraphQLError</code></li></ul>"
            },
            {
              "id": "DeleteRulesetDeps",
              "label": "DeleteRulesetDeps",
              "kind": "interface",
              "detailHtml": "<h3>DeleteRulesetDeps <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventPublisher: EventPublisher</code></li></ul><h4>Extends</h4><ul><li><code>RulesetServiceDeps</code></li></ul>"
            },
            {
              "id": "EventPublisher",
              "label": "EventPublisher",
              "kind": "interface",
              "detailHtml": "<h3>EventPublisher <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>publish(2): Promise&lt;void&gt;</code></li></ul>"
            },
            {
              "id": "CreateRulesetInput",
              "label": "CreateRulesetInput",
              "kind": "interface",
              "detailHtml": "<h3>CreateRulesetInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>gameSystemName: string</code></li><li><code>statSchema: unknown</code></li><li><code>diceConventions: unknown</code></li></ul>"
            },
            {
              "id": "UpdateRulesetInput",
              "label": "UpdateRulesetInput",
              "kind": "interface",
              "detailHtml": "<h3>UpdateRulesetInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>gameSystemName: string</code></li><li><code>statSchema: unknown</code></li><li><code>diceConventions: unknown</code></li></ul>"
            },
            {
              "id": "AssignRulesetToTableInput",
              "label": "AssignRulesetToTableInput",
              "kind": "interface",
              "detailHtml": "<h3>AssignRulesetToTableInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>rulesetId: string</code></li><li><code>userId: string | null</code></li></ul>"
            },
            {
              "id": "RulesetLike",
              "label": "RulesetLike",
              "kind": "interface",
              "detailHtml": "<h3>RulesetLike <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>updatedAt: Date | string</code></li><li><code>statSchema: object</code></li></ul>"
            },
            {
              "id": "ValidationErrorDetail",
              "label": "ValidationErrorDetail",
              "kind": "interface",
              "detailHtml": "<h3>ValidationErrorDetail <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>field: string</code></li><li><code>path: string</code></li><li><code>message: string</code></li></ul>"
            },
            {
              "id": "TableAssignmentServiceDeps",
              "label": "TableAssignmentServiceDeps",
              "kind": "interface",
              "detailHtml": "<h3>TableAssignmentServiceDeps <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>prisma: PrismaClient</code></li><li><code>eventPublisher: EventPublisher</code></li></ul>"
            },
            {
              "id": "SizeDepthViolation",
              "label": "SizeDepthViolation",
              "kind": "interface",
              "detailHtml": "<h3>SizeDepthViolation <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>reason: &quot;too_large&quot; | &quot;too_deep&quot;</code></li><li><code>message: string</code></li></ul>"
            },
            {
              "id": "ValidationOutcome",
              "label": "ValidationOutcome",
              "kind": "interface",
              "detailHtml": "<h3>ValidationOutcome <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>valid: boolean</code></li><li><code>errors: ValidationErrorDetail[]</code></li></ul>"
            },
            {
              "id": "GraphQLContext",
              "label": "GraphQLContext",
              "kind": "interface",
              "detailHtml": "<h3>GraphQLContext <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string | null</code></li></ul>"
            },
            {
              "id": "RequestLike",
              "label": "RequestLike",
              "kind": "interface",
              "detailHtml": "<h3>RequestLike <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>headers: Record&lt;string, string | string[] | undefined&gt;</code></li></ul>"
            },
            {
              "id": "TableReference",
              "label": "TableReference",
              "kind": "interface",
              "detailHtml": "<h3>TableReference <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li></ul>"
            },
            {
              "id": "CloneServiceDeps",
              "label": "CloneServiceDeps",
              "kind": "interface",
              "detailHtml": "<h3>CloneServiceDeps <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>prisma: PrismaClient</code></li></ul>"
            },
            {
              "id": "RulesetServiceDeps",
              "label": "RulesetServiceDeps",
              "kind": "interface",
              "detailHtml": "<h3>RulesetServiceDeps <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>prisma: PrismaClient</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "EventPublisher_impl_LocalEventPublisher",
              "source": "LocalEventPublisher",
              "target": "EventPublisher",
              "label": "implements"
            },
            {
              "id": "RulesetServiceDeps_ext_DeleteRulesetDeps",
              "source": "DeleteRulesetDeps",
              "target": "RulesetServiceDeps",
              "label": "extends"
            }
          ]
        },
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_ci_yml",
              "label": "CI",
              "kind": "workflow",
              "detailHtml": "<h3>CI</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><p>Triggers: pull_request, push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><ol><li>1. uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main<br/><code>uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-check_yml",
              "label": "contract-check",
              "kind": "workflow",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><p>Triggers: pull_request, push</p><p>2 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-check_yml__contract-check",
              "label": "contract-check",
              "kind": "job",
              "parent": "_github_workflows_contract-check_yml",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a tabletop-infra-contract-sync installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. Fetch tabletop-infra's committed contract snapshots<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Run the composition check against this service's own SDL<br/><code>run: npm run check-composition -- --subgraph ruleset-service --sdl-file ../../../cont</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-check_yml__update-contract",
              "label": "update-contract",
              "kind": "job",
              "parent": "_github_workflows_contract-check_yml",
              "detailHtml": "<h3>update-contract</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a tabletop-infra-contract-sync installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Regenerate this subgraph's snapshot from the merged SDL<br/><code>run: npm run update-contracts -- --subgraph ruleset-service --sdl-file ../../../contr</code></li><li>7. Commit and push the updated snapshot back to tabletop-infra<br/><code>run: git config user.name &quot;tabletop-infra-contract-sync[bot]&quot;\ngit config user.email &quot;</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "character-service",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/character-service",
        "description": "Characters and NPCs"
      },
      "status": "merged",
      "current": {
        "languages": {
          "TypeScript": 121683,
          "Shell": 57080,
          "JavaScript": 1470
        },
        "packageDependencies": [
          "@apollo/server",
          "@apollo/subgraph",
          "@as-integrations/fastify",
          "@prisma/client",
          "@ttrpgsolution/service-core",
          "ajv",
          "ajv-formats",
          "dataloader",
          "dotenv",
          "fastify",
          "graphql",
          "graphql-subscriptions",
          "graphql-ws",
          "nats",
          "pino",
          "ws",
          "zod",
          "@eslint/js",
          "@testcontainers/postgresql",
          "@types/node",
          "@types/ws",
          "@typescript-eslint/eslint-plugin",
          "@typescript-eslint/parser",
          "eslint",
          "globals",
          "msw",
          "prettier",
          "prisma",
          "tsx",
          "typescript",
          "vitest"
        ],
        "internalPackageDependencies": [
          "@ttrpgsolution/service-core"
        ],
        "ci": {
          "latestConclusion": "success",
          "latestWorkflowName": "CI",
          "latestRunUrl": "https://github.com/TTRPGSolution/character-service/actions/runs/31880297146"
        },
        "lastCommitSha": "3e37e3984930ade9b328a3e6b71aef683dfe5a70",
        "lastCommitDate": "2026-08-15T13:44:56+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": {
          "moduleCount": 45,
          "dependencyCount": 83,
          "violationCount": 0,
          "modules": [
            {
              "source": "src/context.ts",
              "dependencies": [
                "src/infra/db/loaders.ts",
                "src/infra/db/prismaClient.ts",
                "src/infra/table-client/tableClient.ts",
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "@ttrpgsolution/service-core",
              "dependencies": []
            },
            {
              "source": "src/infra/db/loaders.ts",
              "dependencies": [
                "dataloader"
              ]
            },
            {
              "source": "dataloader",
              "dependencies": []
            },
            {
              "source": "src/infra/db/prismaClient.ts",
              "dependencies": [
                "@prisma/client"
              ]
            },
            {
              "source": "@prisma/client",
              "dependencies": []
            },
            {
              "source": "src/infra/table-client/tableClient.ts",
              "dependencies": [
                "@ttrpgsolution/service-core",
                "dataloader"
              ]
            },
            {
              "source": "src/domain/character/authorize.ts",
              "dependencies": []
            },
            {
              "source": "src/domain/character/createCharacter.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/schema/character/mutationResult.ts",
                "src/domain/errors.ts",
                "src/domain/character/authorize.ts",
                "src/domain/character/statsValidation.ts",
                "crypto"
              ]
            },
            {
              "source": "crypto",
              "dependencies": []
            },
            {
              "source": "src/infra/db/characterRepository.ts",
              "dependencies": []
            },
            {
              "source": "src/schema/character/mutationResult.ts",
              "dependencies": []
            },
            {
              "source": "src/domain/errors.ts",
              "dependencies": [
                "../../node_modules/graphql/index.js"
              ]
            },
            {
              "source": "../../node_modules/graphql/index.js",
              "dependencies": []
            },
            {
              "source": "src/domain/character/statsValidation.ts",
              "dependencies": []
            },
            {
              "source": "src/domain/character/deleteCharacter.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/domain/errors.ts",
                "src/domain/character/authorize.ts",
                "crypto"
              ]
            },
            {
              "source": "src/domain/character/listCharacters.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts"
              ]
            },
            {
              "source": "src/domain/character/setNpcFlag.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/domain/errors.ts",
                "src/domain/character/authorize.ts",
                "crypto"
              ]
            },
            {
              "source": "src/domain/character/updateCharacterDetails.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/domain/errors.ts",
                "src/domain/character/authorize.ts",
                "crypto"
              ]
            },
            {
              "source": "src/domain/character/updateCharacterResource.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/schema/character/mutationResult.ts",
                "src/domain/errors.ts",
                "src/domain/resources/bounds.ts",
                "src/domain/character/authorize.ts",
                "crypto"
              ]
            },
            {
              "source": "src/domain/resources/bounds.ts",
              "dependencies": []
            },
            {
              "source": "src/domain/character/updateCharacterStats.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/schema/character/mutationResult.ts",
                "src/domain/errors.ts",
                "src/domain/character/authorize.ts",
                "src/domain/character/statsValidation.ts",
                "crypto"
              ]
            },
            {
              "source": "src/infra/config/env.ts",
              "dependencies": [
                "@ttrpgsolution/service-core",
                "zod"
              ]
            },
            {
              "source": "zod",
              "dependencies": []
            },
            {
              "source": "src/infra/events/characterChangeBus.ts",
              "dependencies": [
                "graphql-subscriptions",
                "nats"
              ]
            },
            {
              "source": "graphql-subscriptions",
              "dependencies": []
            },
            {
              "source": "nats",
              "dependencies": []
            },
            {
              "source": "src/infra/events/eventPublisher.ts",
              "dependencies": []
            },
            {
              "source": "src/infra/events/natsEventPublisher.ts",
              "dependencies": [
                "nats"
              ]
            },
            {
              "source": "src/infra/logging/logger.ts",
              "dependencies": [
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/infra/ruleset-client/rulesetClient.ts",
              "dependencies": [
                "@ttrpgsolution/service-core"
              ]
            },
            {
              "source": "src/schema/character/resolvers.ts",
              "dependencies": [
                "src/domain/character/createCharacter.ts",
                "src/domain/character/deleteCharacter.ts",
                "src/domain/character/listCharacters.ts",
                "src/domain/character/setNpcFlag.ts",
                "src/domain/character/updateCharacterDetails.ts",
                "src/domain/character/updateCharacterResource.ts",
                "src/domain/character/updateCharacterStats.ts",
                "src/infra/db/characterRepository.ts",
                "src/schema/character/mutationResult.ts"
              ]
            },
            {
              "source": "src/schema/character/subscriptions.ts",
              "dependencies": [
                "src/infra/db/characterRepository.ts",
                "src/infra/events/characterChangeBus.ts",
                "graphql-subscriptions"
              ]
            },
            {
              "source": "src/schema/party/resolvers.ts",
              "dependencies": []
            },
            {
              "source": "src/schema/typeDefs.ts",
              "dependencies": [
                "fs",
                "../../node_modules/graphql/index.js",
                "path",
                "url"
              ]
            },
            {
              "source": "fs",
              "dependencies": []
            },
            {
              "source": "path",
              "dependencies": []
            },
            {
              "source": "url",
              "dependencies": []
            },
            {
              "source": "src/server.ts",
              "dependencies": [
                "src/context.ts",
                "src/infra/config/env.ts",
                "src/infra/db/prismaClient.ts",
                "src/infra/events/characterChangeBus.ts",
                "src/infra/events/natsEventPublisher.ts",
                "src/infra/logging/logger.ts",
                "src/infra/ruleset-client/rulesetClient.ts",
                "src/schema/character/resolvers.ts",
                "src/schema/character/subscriptions.ts",
                "src/schema/party/resolvers.ts",
                "src/schema/typeDefs.ts",
                "@apollo/server",
                "@apollo/subgraph",
                "@as-integrations/fastify",
                "@ttrpgsolution/service-core",
                "fastify",
                "graphql-ws/use/ws",
                "nats",
                "url",
                "ws"
              ]
            },
            {
              "source": "@apollo/server",
              "dependencies": []
            },
            {
              "source": "@apollo/subgraph",
              "dependencies": []
            },
            {
              "source": "@as-integrations/fastify",
              "dependencies": []
            },
            {
              "source": "fastify",
              "dependencies": []
            },
            {
              "source": "graphql-ws/use/ws",
              "dependencies": []
            },
            {
              "source": "ws",
              "dependencies": []
            }
          ]
        },
        "madge": {
          "moduleCount": 28,
          "circularPaths": []
        },
        "federation": {
          "ownedTypes": [
            "Character",
            "User",
            "Party",
            "Table"
          ],
          "extendedTypes": [],
          "schemaFiles": [
            "src/schema/character-service.graphql",
            "specs/001-character-party-service/contracts/character-service.graphql"
          ]
        },
        "classDiagram": {
          "entries": [
            {
              "kind": "interface",
              "name": "GraphqlResourcePool",
              "properties": [
                "key: string"
              ],
              "methods": [],
              "extends": [
                "ResourcePool"
              ],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "EventPublisher",
              "properties": [],
              "methods": [
                "publishCharacterCreated(1): Promise<void>",
                "publishCharacterUpdated(1): Promise<void>",
                "publishCharacterResourceChanged(1): Promise<void>",
                "publishCharacterDeleted(1): Promise<void>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RulesetClient",
              "properties": [],
              "methods": [
                "getTableRulesetId(1): Promise<string | null>",
                "validateCharacterData(2): Promise<StatsValidationResult>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableClient",
              "properties": [],
              "methods": [
                "resolveRole(1): Promise<TableRole | null>",
                "resolveParty(1): Promise<PartyResolution[\"tableId\"]>"
              ],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CharacterResourceChangedEvent",
              "properties": [
                "eventId: string",
                "occurredAt: string",
                "correlationId: string",
                "tableId: string",
                "characterId: string",
                "resourceKey: string",
                "current: number",
                "max: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CharacterServiceContext",
              "properties": [
                "actorUserId: string | null",
                "correlationId: string | undefined",
                "prisma: typeof prisma",
                "tableClient: TableClient",
                "rulesetClient: RulesetClient",
                "eventPublisher: EventPublisher",
                "loaders: CharacterLoaders"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreateCharacterInput",
              "properties": [
                "name: string",
                "ownerId: string",
                "partyId: string",
                "tableId: string",
                "stats: Prisma.InputJsonValue",
                "resources: Prisma.InputJsonValue",
                "isNpc: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CharacterCreatedEvent",
              "properties": [
                "eventId: string",
                "occurredAt: string",
                "correlationId: string",
                "tableId: string",
                "partyId: string",
                "characterId: string",
                "ownerId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "UpdateCharacterInput",
              "properties": [
                "name: string",
                "partyId: string",
                "tableId: string",
                "isNpc: boolean",
                "stats: Prisma.InputJsonValue",
                "resources: Prisma.InputJsonValue"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CharacterUpdatedEvent",
              "properties": [
                "eventId: string",
                "occurredAt: string",
                "correlationId: string",
                "tableId: string",
                "characterId: string",
                "changedFields: string[]"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CharacterDeletedEvent",
              "properties": [
                "eventId: string",
                "occurredAt: string",
                "correlationId: string",
                "tableId: string",
                "characterId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CreateCharacterInput",
              "properties": [
                "name: string",
                "partyId: string",
                "ownerId: string",
                "stats: unknown"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "UpdateCharacterResourceInput",
              "properties": [
                "id: string",
                "key: string",
                "current: number",
                "max: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RoleResolution",
              "properties": [
                "userId: string",
                "tableId: string",
                "role: TableRole | null",
                "active: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ContextBuilderDependencies",
              "properties": [
                "config: CharacterServiceConfig",
                "eventPublisher: EventPublisher",
                "rulesetClient: RulesetClient"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "BuildServerOptions",
              "properties": [
                "config: CharacterServiceConfig",
                "eventPublisher: EventPublisher",
                "characterChangePubsub: PubSub"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "UpdateCharacterDetailsInput",
              "properties": [
                "id: string",
                "name: string",
                "partyId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "BoundsCheckResult",
              "properties": [
                "valid: boolean",
                "min: number",
                "max: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "FieldValidationError",
              "properties": [
                "field: string",
                "path: string",
                "message: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "RulesetClientOptions",
              "properties": [
                "baseUrl: string",
                "fetchImpl: typeof fetch",
                "tableRulesetCacheTtlMs: number"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "TableClientOptions",
              "properties": [
                "baseUrl: string",
                "authToken: string",
                "fetchImpl: typeof fetch"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "CharacterEditSubject",
              "properties": [
                "ownerId: string",
                "isNpc: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "ListCharactersInput",
              "properties": [
                "tableId: string",
                "partyId: string"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "SetNpcFlagInput",
              "properties": [
                "id: string",
                "isNpc: boolean"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            },
            {
              "kind": "interface",
              "name": "UpdateCharacterStatsInput",
              "properties": [
                "id: string",
                "stats: unknown"
              ],
              "methods": [],
              "extends": [],
              "implements": []
            }
          ]
        },
        "graphqlSchema": {
          "types": [
            {
              "name": "Character",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "owner: User!",
                "party: Party!",
                "table: Table!",
                "isNpc: Boolean!",
                "stats: JSON!",
                "resources: [ResourcePool!]!",
                "createdAt: DateTime!",
                "updatedAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "owner",
                  "refType": "User"
                },
                {
                  "field": "party",
                  "refType": "Party"
                },
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "stats",
                  "refType": "JSON"
                },
                {
                  "field": "resources",
                  "refType": "ResourcePool"
                },
                {
                  "field": "createdAt",
                  "refType": "DateTime"
                },
                {
                  "field": "updatedAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "ResourcePool",
              "kind": "object",
              "fields": [
                "key: String!",
                "current: Int!",
                "max: Int!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "User",
              "kind": "object",
              "fields": [
                "id: ID!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Party",
              "kind": "object",
              "fields": [
                "id: ID!",
                "characters: [Character!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "characters: [Character!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "characters: [Character!]!",
                "character: Character"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                },
                {
                  "field": "character",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "CharacterInput",
              "kind": "input",
              "fields": [
                "name: String!",
                "partyId: ID!",
                "ownerId: ID!",
                "stats: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "CharacterStatsUpdateInput",
              "kind": "input",
              "fields": [
                "stats: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ResourceUpdateInput",
              "kind": "input",
              "fields": [
                "key: String!",
                "current: Int",
                "max: Int"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "FieldValidationError",
              "kind": "object",
              "fields": [
                "path: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ValidationFailure",
              "kind": "object",
              "fields": [
                "errors: [FieldValidationError!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "errors",
                  "refType": "FieldValidationError"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createCharacter: CharacterMutationResult!",
                "updateCharacterStats: CharacterMutationResult!",
                "updateCharacterDetails: CharacterMutationResult!",
                "setCharacterNpcFlag: Character!",
                "updateCharacterResource: CharacterMutationResult!",
                "deleteCharacter: Boolean!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createCharacter",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "updateCharacterStats",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "updateCharacterDetails",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "setCharacterNpcFlag",
                  "refType": "Character"
                },
                {
                  "field": "updateCharacterResource",
                  "refType": "CharacterMutationResult"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "characterChanged: Character!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characterChanged",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Character",
              "kind": "object",
              "fields": [
                "id: ID!",
                "name: String!",
                "owner: User!",
                "party: Party!",
                "table: Table!",
                "isNpc: Boolean!",
                "stats: JSON!",
                "resources: [ResourcePool!]!",
                "createdAt: DateTime!",
                "updatedAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "owner",
                  "refType": "User"
                },
                {
                  "field": "party",
                  "refType": "Party"
                },
                {
                  "field": "table",
                  "refType": "Table"
                },
                {
                  "field": "stats",
                  "refType": "JSON"
                },
                {
                  "field": "resources",
                  "refType": "ResourcePool"
                },
                {
                  "field": "createdAt",
                  "refType": "DateTime"
                },
                {
                  "field": "updatedAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "ResourcePool",
              "kind": "object",
              "fields": [
                "key: String!",
                "current: Int!",
                "max: Int!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "User",
              "kind": "object",
              "fields": [
                "id: ID!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Party",
              "kind": "object",
              "fields": [
                "id: ID!",
                "characters: [Character!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Table",
              "kind": "object",
              "fields": [
                "id: ID!",
                "characters: [Character!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "characters: [Character!]!",
                "character: Character"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characters",
                  "refType": "Character"
                },
                {
                  "field": "character",
                  "refType": "Character"
                }
              ]
            },
            {
              "name": "CharacterInput",
              "kind": "input",
              "fields": [
                "name: String!",
                "partyId: ID!",
                "ownerId: ID!",
                "stats: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "CharacterStatsUpdateInput",
              "kind": "input",
              "fields": [
                "stats: JSON!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ResourceUpdateInput",
              "kind": "input",
              "fields": [
                "key: String!",
                "current: Int",
                "max: Int"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "FieldValidationError",
              "kind": "object",
              "fields": [
                "path: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ValidationFailure",
              "kind": "object",
              "fields": [
                "errors: [FieldValidationError!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "errors",
                  "refType": "FieldValidationError"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "createCharacter: CharacterMutationResult!",
                "updateCharacterStats: CharacterMutationResult!",
                "updateCharacterDetails: CharacterMutationResult!",
                "setCharacterNpcFlag: Character!",
                "updateCharacterResource: CharacterMutationResult!",
                "deleteCharacter: Boolean!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "createCharacter",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "updateCharacterStats",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "updateCharacterDetails",
                  "refType": "CharacterMutationResult"
                },
                {
                  "field": "setCharacterNpcFlag",
                  "refType": "Character"
                },
                {
                  "field": "updateCharacterResource",
                  "refType": "CharacterMutationResult"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "characterChanged: Character!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characterChanged",
                  "refType": "Character"
                }
              ]
            }
          ]
        },
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/ci.yml",
              "name": "CI",
              "triggers": [
                "pull_request",
                "push"
              ],
              "jobs": [
                {
                  "id": "ci",
                  "name": "ci",
                  "needs": [],
                  "steps": [
                    {
                      "label": "uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "uses": "TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main",
                      "run": null
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-check.yml",
              "name": "contract-check",
              "triggers": [
                "pull_request"
              ],
              "jobs": [
                {
                  "id": "contract-check",
                  "name": "contract-check",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a short-lived tabletop-infra installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "Fetch tabletop-infra's committed contract snapshots",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Run the composition check against this service's own SDL",
                      "uses": null,
                      "run": "npm run check-composition -- --subgraph character-service --sdl-file ../../../src/schema/character-service.graphql"
                    }
                  ]
                }
              ]
            },
            {
              "file": ".github/workflows/contract-snapshot-update.yml",
              "name": "contract-snapshot-update",
              "triggers": [
                "push"
              ],
              "jobs": [
                {
                  "id": "update-contract",
                  "name": "update-contract",
                  "needs": [],
                  "steps": [
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "Mint a short-lived tabletop-infra installation token",
                      "uses": "actions/create-github-app-token@v1",
                      "run": null
                    },
                    {
                      "label": "actions/checkout@v4",
                      "uses": "actions/checkout@v4",
                      "run": null
                    },
                    {
                      "label": "actions/setup-node@v4",
                      "uses": "actions/setup-node@v4",
                      "run": null
                    },
                    {
                      "label": "Install tabletop-infra's schema-types deps",
                      "uses": null,
                      "run": "npm ci"
                    },
                    {
                      "label": "Regenerate this subgraph's snapshot from the merged SDL",
                      "uses": null,
                      "run": "npm run update-contracts -- --subgraph character-service --sdl-file ../../../src/schema/character-service.graphql"
                    },
                    {
                      "label": "Commit and push the updated snapshot back to tabletop-infra",
                      "uses": null,
                      "run": "git config user.name \"tabletop-infra-sync[bot]\"\ngit config user.email \"tabletop-infra-sync[bot]@users.noreply.github.com\"\ngit add packages/schema-types/contracts/character-service.graphql\ngit diff --cached --quiet || git commit -m \"contracts: update character-service snapshot\"\ngit push\n"
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": {
                "name": "Mutation",
                "kind": "OBJECT"
              },
              "subscriptionType": {
                "name": "Subscription",
                "kind": "OBJECT"
              },
              "types": [
                {
                  "kind": "SCALAR",
                  "name": "DateTime",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "JSON",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Character",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "owner",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "User",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "party",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Party",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "table",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Table",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isNpc",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "stats",
                      "description": "Full stats payload, validated against the owning table's ruleset\nstatSchema on every write. Full-replace semantics on update.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "resources",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "ResourcePool",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "createdAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updatedAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ResourcePool",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "key",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "current",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "max",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Int",
                  "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "User",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Party",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "characters",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Character",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Table",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "id",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "characters",
                      "description": null,
                      "args": [
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "ID",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Character",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "characters",
                      "description": "All characters belonging to a table, optionally narrowed to one party.\nRequires the caller to be a member of the table (FR-014).",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "ID",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Character",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "character",
                      "description": "Full detail for a single character. Requires the caller to be a member\nof the character's table (FR-014).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "OBJECT",
                        "name": "Character",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "CharacterInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "name",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "partyId",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ownerId",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "stats",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "CharacterStatsUpdateInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "stats",
                      "description": "Full-replacement stats payload — not a partial merge.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "INPUT_OBJECT",
                  "name": "ResourceUpdateInput",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": false,
                  "fields": null,
                  "inputFields": [
                    {
                      "name": "key",
                      "description": null,
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "current",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "Int",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "max",
                      "description": null,
                      "type": {
                        "kind": "SCALAR",
                        "name": "Int",
                        "ofType": null
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "FieldValidationError",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "path",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "message",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ValidationFailure",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "errors",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "FieldValidationError",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "UNION",
                  "name": "CharacterMutationResult",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": [
                    {
                      "kind": "OBJECT",
                      "name": "Character",
                      "ofType": null
                    },
                    {
                      "kind": "OBJECT",
                      "name": "ValidationFailure",
                      "ofType": null
                    }
                  ]
                },
                {
                  "kind": "OBJECT",
                  "name": "Mutation",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "createCharacter",
                      "description": "Player-owned or DM create. Rejects on ruleset schema violation (FR-002/FR-003).",
                      "args": [
                        {
                          "name": "input",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "CharacterInput",
                              "kind": "INPUT_OBJECT",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "CharacterMutationResult",
                          "kind": "UNION",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateCharacterStats",
                      "description": "Full-replace stats update. Owner (non-NPC) or DM only (FR-004..FR-006, FR-008).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "input",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "CharacterStatsUpdateInput",
                              "kind": "INPUT_OBJECT",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "CharacterMutationResult",
                          "kind": "UNION",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateCharacterDetails",
                      "description": "Rename / reassign party. Owner (non-NPC) or DM only.",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "name",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "String",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "partyId",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "ID",
                            "ofType": null
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "CharacterMutationResult",
                          "kind": "UNION",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "setCharacterNpcFlag",
                      "description": "DM-only. Toggles NPC flag (FR-007).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "isNpc",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Character",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "updateCharacterResource",
                      "description": "Adjust a resource pool's current and/or max value. Rejects if the\nresulting current would fall outside [0, max] (FR-010/FR-011).",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "input",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ResourceUpdateInput",
                              "kind": "INPUT_OBJECT",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "CharacterMutationResult",
                          "kind": "UNION",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deleteCharacter",
                      "description": "DM-only.",
                      "args": [
                        {
                          "name": "id",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Subscription",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "characterChanged",
                      "description": null,
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Character",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-character-party-service"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-character-party-service/spec.md",
            "title": "Feature Specification: Character and Party Service",
            "summary": "A player at a table creates a new character for their party by entering the character's stats according to the game system (ruleset) in use, and can later update those stats (e.g., leveling up, changing equipment) as play progresses."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": {
          "nodes": [
            {
              "id": "src_context_ts",
              "label": "src/context.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/context.ts</h3><p>1 file(s)</p><ul><li><code>src/context.ts</code></li></ul>"
            },
            {
              "id": "src_infra",
              "label": "src/infra",
              "kind": "folder",
              "detailHtml": "<h3>src/infra</h3><p>10 file(s)</p><ul><li><code>src/infra/config/env.ts</code></li><li><code>src/infra/db/characterRepository.ts</code></li><li><code>src/infra/db/loaders.ts</code></li><li><code>src/infra/db/prismaClient.ts</code></li><li><code>src/infra/events/characterChangeBus.ts</code></li><li><code>src/infra/events/eventPublisher.ts</code></li><li><code>src/infra/events/natsEventPublisher.ts</code></li><li><code>src/infra/logging/logger.ts</code></li><li><code>src/infra/ruleset-client/rulesetClient.ts</code></li><li><code>src/infra/table-client/tableClient.ts</code></li></ul>"
            },
            {
              "id": "_ttrpgsolution_service-core",
              "label": "@ttrpgsolution/service-core",
              "kind": "folder",
              "detailHtml": "<h3>@ttrpgsolution/service-core</h3><p>1 file(s)</p><ul><li><code>@ttrpgsolution/service-core</code></li></ul>"
            },
            {
              "id": "dataloader",
              "label": "dataloader",
              "kind": "folder",
              "detailHtml": "<h3>dataloader</h3><p>1 file(s)</p><ul><li><code>dataloader</code></li></ul>"
            },
            {
              "id": "_prisma_client",
              "label": "@prisma/client",
              "kind": "folder",
              "detailHtml": "<h3>@prisma/client</h3><p>1 file(s)</p><ul><li><code>@prisma/client</code></li></ul>"
            },
            {
              "id": "src_domain",
              "label": "src/domain",
              "kind": "folder",
              "detailHtml": "<h3>src/domain</h3><p>11 file(s)</p><ul><li><code>src/domain/character/authorize.ts</code></li><li><code>src/domain/character/createCharacter.ts</code></li><li><code>src/domain/character/deleteCharacter.ts</code></li><li><code>src/domain/character/listCharacters.ts</code></li><li><code>src/domain/character/setNpcFlag.ts</code></li><li><code>src/domain/character/statsValidation.ts</code></li><li><code>src/domain/character/updateCharacterDetails.ts</code></li><li><code>src/domain/character/updateCharacterResource.ts</code></li><li><code>src/domain/character/updateCharacterStats.ts</code></li><li><code>src/domain/errors.ts</code></li><li><code>src/domain/resources/bounds.ts</code></li></ul>"
            },
            {
              "id": "src_schema",
              "label": "src/schema",
              "kind": "folder",
              "detailHtml": "<h3>src/schema</h3><p>5 file(s)</p><ul><li><code>src/schema/character/mutationResult.ts</code></li><li><code>src/schema/character/resolvers.ts</code></li><li><code>src/schema/character/subscriptions.ts</code></li><li><code>src/schema/party/resolvers.ts</code></li><li><code>src/schema/typeDefs.ts</code></li></ul>"
            },
            {
              "id": "crypto",
              "label": "crypto",
              "kind": "folder",
              "detailHtml": "<h3>crypto</h3><p>1 file(s)</p><ul><li><code>crypto</code></li></ul>"
            },
            {
              "id": "_____",
              "label": "../..",
              "kind": "folder",
              "detailHtml": "<h3>../..</h3><p>1 file(s)</p><ul><li><code>../../node_modules/graphql/index.js</code></li></ul>"
            },
            {
              "id": "zod",
              "label": "zod",
              "kind": "folder",
              "detailHtml": "<h3>zod</h3><p>1 file(s)</p><ul><li><code>zod</code></li></ul>"
            },
            {
              "id": "graphql-subscriptions",
              "label": "graphql-subscriptions",
              "kind": "folder",
              "detailHtml": "<h3>graphql-subscriptions</h3><p>1 file(s)</p><ul><li><code>graphql-subscriptions</code></li></ul>"
            },
            {
              "id": "nats",
              "label": "nats",
              "kind": "folder",
              "detailHtml": "<h3>nats</h3><p>1 file(s)</p><ul><li><code>nats</code></li></ul>"
            },
            {
              "id": "fs",
              "label": "fs",
              "kind": "folder",
              "detailHtml": "<h3>fs</h3><p>1 file(s)</p><ul><li><code>fs</code></li></ul>"
            },
            {
              "id": "path",
              "label": "path",
              "kind": "folder",
              "detailHtml": "<h3>path</h3><p>1 file(s)</p><ul><li><code>path</code></li></ul>"
            },
            {
              "id": "url",
              "label": "url",
              "kind": "folder",
              "detailHtml": "<h3>url</h3><p>1 file(s)</p><ul><li><code>url</code></li></ul>"
            },
            {
              "id": "src_server_ts",
              "label": "src/server.ts",
              "kind": "folder",
              "detailHtml": "<h3>src/server.ts</h3><p>1 file(s)</p><ul><li><code>src/server.ts</code></li></ul>"
            },
            {
              "id": "_apollo_server",
              "label": "@apollo/server",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/server</h3><p>1 file(s)</p><ul><li><code>@apollo/server</code></li></ul>"
            },
            {
              "id": "_apollo_subgraph",
              "label": "@apollo/subgraph",
              "kind": "folder",
              "detailHtml": "<h3>@apollo/subgraph</h3><p>1 file(s)</p><ul><li><code>@apollo/subgraph</code></li></ul>"
            },
            {
              "id": "_as-integrations_fastify",
              "label": "@as-integrations/fastify",
              "kind": "folder",
              "detailHtml": "<h3>@as-integrations/fastify</h3><p>1 file(s)</p><ul><li><code>@as-integrations/fastify</code></li></ul>"
            },
            {
              "id": "fastify",
              "label": "fastify",
              "kind": "folder",
              "detailHtml": "<h3>fastify</h3><p>1 file(s)</p><ul><li><code>fastify</code></li></ul>"
            },
            {
              "id": "graphql-ws_use",
              "label": "graphql-ws/use",
              "kind": "folder",
              "detailHtml": "<h3>graphql-ws/use</h3><p>1 file(s)</p><ul><li><code>graphql-ws/use/ws</code></li></ul>"
            },
            {
              "id": "ws",
              "label": "ws",
              "kind": "folder",
              "detailHtml": "<h3>ws</h3><p>1 file(s)</p><ul><li><code>ws</code></li></ul>"
            }
          ],
          "edges": [
            {
              "id": "src_context_ts__src_infra",
              "source": "src_context_ts",
              "target": "src_infra",
              "label": "3"
            },
            {
              "id": "src_context_ts___ttrpgsolution_service-core",
              "source": "src_context_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_infra__dataloader",
              "source": "src_infra",
              "target": "dataloader",
              "label": "2"
            },
            {
              "id": "src_infra___prisma_client",
              "source": "src_infra",
              "target": "_prisma_client",
              "label": ""
            },
            {
              "id": "src_infra___ttrpgsolution_service-core",
              "source": "src_infra",
              "target": "_ttrpgsolution_service-core",
              "label": "4"
            },
            {
              "id": "src_domain__src_infra",
              "source": "src_domain",
              "target": "src_infra",
              "label": "7"
            },
            {
              "id": "src_domain__src_schema",
              "source": "src_domain",
              "target": "src_schema",
              "label": "3"
            },
            {
              "id": "src_domain__crypto",
              "source": "src_domain",
              "target": "crypto",
              "label": "6"
            },
            {
              "id": "src_domain_______",
              "source": "src_domain",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_infra__zod",
              "source": "src_infra",
              "target": "zod",
              "label": ""
            },
            {
              "id": "src_infra__graphql-subscriptions",
              "source": "src_infra",
              "target": "graphql-subscriptions",
              "label": ""
            },
            {
              "id": "src_infra__nats",
              "source": "src_infra",
              "target": "nats",
              "label": "2"
            },
            {
              "id": "src_schema__src_domain",
              "source": "src_schema",
              "target": "src_domain",
              "label": "7"
            },
            {
              "id": "src_schema__src_infra",
              "source": "src_schema",
              "target": "src_infra",
              "label": "3"
            },
            {
              "id": "src_schema__graphql-subscriptions",
              "source": "src_schema",
              "target": "graphql-subscriptions",
              "label": ""
            },
            {
              "id": "src_schema__fs",
              "source": "src_schema",
              "target": "fs",
              "label": ""
            },
            {
              "id": "src_schema_______",
              "source": "src_schema",
              "target": "_____",
              "label": ""
            },
            {
              "id": "src_schema__path",
              "source": "src_schema",
              "target": "path",
              "label": ""
            },
            {
              "id": "src_schema__url",
              "source": "src_schema",
              "target": "url",
              "label": ""
            },
            {
              "id": "src_server_ts__src_context_ts",
              "source": "src_server_ts",
              "target": "src_context_ts",
              "label": ""
            },
            {
              "id": "src_server_ts__src_infra",
              "source": "src_server_ts",
              "target": "src_infra",
              "label": "6"
            },
            {
              "id": "src_server_ts__src_schema",
              "source": "src_server_ts",
              "target": "src_schema",
              "label": "4"
            },
            {
              "id": "src_server_ts___apollo_server",
              "source": "src_server_ts",
              "target": "_apollo_server",
              "label": ""
            },
            {
              "id": "src_server_ts___apollo_subgraph",
              "source": "src_server_ts",
              "target": "_apollo_subgraph",
              "label": ""
            },
            {
              "id": "src_server_ts___as-integrations_fastify",
              "source": "src_server_ts",
              "target": "_as-integrations_fastify",
              "label": ""
            },
            {
              "id": "src_server_ts___ttrpgsolution_service-core",
              "source": "src_server_ts",
              "target": "_ttrpgsolution_service-core",
              "label": ""
            },
            {
              "id": "src_server_ts__fastify",
              "source": "src_server_ts",
              "target": "fastify",
              "label": ""
            },
            {
              "id": "src_server_ts__graphql-ws_use",
              "source": "src_server_ts",
              "target": "graphql-ws_use",
              "label": ""
            },
            {
              "id": "src_server_ts__nats",
              "source": "src_server_ts",
              "target": "nats",
              "label": ""
            },
            {
              "id": "src_server_ts__url",
              "source": "src_server_ts",
              "target": "url",
              "label": ""
            },
            {
              "id": "src_server_ts__ws",
              "source": "src_server_ts",
              "target": "ws",
              "label": ""
            }
          ]
        },
        "classDiagram": {
          "nodes": [
            {
              "id": "GraphqlResourcePool",
              "label": "GraphqlResourcePool",
              "kind": "interface",
              "detailHtml": "<h3>GraphqlResourcePool <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>key: string</code></li></ul><h4>Extends</h4><ul><li><code>ResourcePool</code></li></ul>"
            },
            {
              "id": "EventPublisher",
              "label": "EventPublisher",
              "kind": "interface",
              "detailHtml": "<h3>EventPublisher <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>publishCharacterCreated(1): Promise&lt;void&gt;</code></li><li><code>publishCharacterUpdated(1): Promise&lt;void&gt;</code></li><li><code>publishCharacterResourceChanged(1): Promise&lt;void&gt;</code></li><li><code>publishCharacterDeleted(1): Promise&lt;void&gt;</code></li></ul>"
            },
            {
              "id": "RulesetClient",
              "label": "RulesetClient",
              "kind": "interface",
              "detailHtml": "<h3>RulesetClient <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>getTableRulesetId(1): Promise&lt;string | null&gt;</code></li><li><code>validateCharacterData(2): Promise&lt;StatsValidationResult&gt;</code></li></ul>"
            },
            {
              "id": "TableClient",
              "label": "TableClient",
              "kind": "interface",
              "detailHtml": "<h3>TableClient <span class=\"tag\">interface</span></h3><h4>Methods</h4><ul><li><code>resolveRole(1): Promise&lt;TableRole | null&gt;</code></li><li><code>resolveParty(1): Promise&lt;PartyResolution[&quot;tableId&quot;]&gt;</code></li></ul>"
            },
            {
              "id": "CharacterResourceChangedEvent",
              "label": "CharacterResourceChangedEvent",
              "kind": "interface",
              "detailHtml": "<h3>CharacterResourceChangedEvent <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventId: string</code></li><li><code>occurredAt: string</code></li><li><code>correlationId: string</code></li><li><code>tableId: string</code></li><li><code>characterId: string</code></li><li><code>resourceKey: string</code></li><li><code>current: number</code></li><li><code>max: number</code></li></ul>"
            },
            {
              "id": "CharacterServiceContext",
              "label": "CharacterServiceContext",
              "kind": "interface",
              "detailHtml": "<h3>CharacterServiceContext <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>actorUserId: string | null</code></li><li><code>correlationId: string | undefined</code></li><li><code>prisma: typeof prisma</code></li><li><code>tableClient: TableClient</code></li><li><code>rulesetClient: RulesetClient</code></li><li><code>eventPublisher: EventPublisher</code></li><li><code>loaders: CharacterLoaders</code></li></ul>"
            },
            {
              "id": "CreateCharacterInput",
              "label": "CreateCharacterInput",
              "kind": "interface",
              "detailHtml": "<h3>CreateCharacterInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>name: string</code></li><li><code>ownerId: string</code></li><li><code>partyId: string</code></li><li><code>tableId: string</code></li><li><code>stats: Prisma.InputJsonValue</code></li><li><code>resources: Prisma.InputJsonValue</code></li><li><code>isNpc: boolean</code></li></ul>"
            },
            {
              "id": "CharacterCreatedEvent",
              "label": "CharacterCreatedEvent",
              "kind": "interface",
              "detailHtml": "<h3>CharacterCreatedEvent <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventId: string</code></li><li><code>occurredAt: string</code></li><li><code>correlationId: string</code></li><li><code>tableId: string</code></li><li><code>partyId: string</code></li><li><code>characterId: string</code></li><li><code>ownerId: string</code></li></ul>"
            },
            {
              "id": "UpdateCharacterInput",
              "label": "UpdateCharacterInput",
              "kind": "interface",
              "detailHtml": "<h3>UpdateCharacterInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>name: string</code></li><li><code>partyId: string</code></li><li><code>tableId: string</code></li><li><code>isNpc: boolean</code></li><li><code>stats: Prisma.InputJsonValue</code></li><li><code>resources: Prisma.InputJsonValue</code></li></ul>"
            },
            {
              "id": "CharacterUpdatedEvent",
              "label": "CharacterUpdatedEvent",
              "kind": "interface",
              "detailHtml": "<h3>CharacterUpdatedEvent <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventId: string</code></li><li><code>occurredAt: string</code></li><li><code>correlationId: string</code></li><li><code>tableId: string</code></li><li><code>characterId: string</code></li><li><code>changedFields: string[]</code></li></ul>"
            },
            {
              "id": "CharacterDeletedEvent",
              "label": "CharacterDeletedEvent",
              "kind": "interface",
              "detailHtml": "<h3>CharacterDeletedEvent <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>eventId: string</code></li><li><code>occurredAt: string</code></li><li><code>correlationId: string</code></li><li><code>tableId: string</code></li><li><code>characterId: string</code></li></ul>"
            },
            {
              "id": "CreateCharacterInput",
              "label": "CreateCharacterInput",
              "kind": "interface",
              "detailHtml": "<h3>CreateCharacterInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>name: string</code></li><li><code>partyId: string</code></li><li><code>ownerId: string</code></li><li><code>stats: unknown</code></li></ul>"
            },
            {
              "id": "UpdateCharacterResourceInput",
              "label": "UpdateCharacterResourceInput",
              "kind": "interface",
              "detailHtml": "<h3>UpdateCharacterResourceInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>key: string</code></li><li><code>current: number</code></li><li><code>max: number</code></li></ul>"
            },
            {
              "id": "RoleResolution",
              "label": "RoleResolution",
              "kind": "interface",
              "detailHtml": "<h3>RoleResolution <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>userId: string</code></li><li><code>tableId: string</code></li><li><code>role: TableRole | null</code></li><li><code>active: boolean</code></li></ul>"
            },
            {
              "id": "ContextBuilderDependencies",
              "label": "ContextBuilderDependencies",
              "kind": "interface",
              "detailHtml": "<h3>ContextBuilderDependencies <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>config: CharacterServiceConfig</code></li><li><code>eventPublisher: EventPublisher</code></li><li><code>rulesetClient: RulesetClient</code></li></ul>"
            },
            {
              "id": "BuildServerOptions",
              "label": "BuildServerOptions",
              "kind": "interface",
              "detailHtml": "<h3>BuildServerOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>config: CharacterServiceConfig</code></li><li><code>eventPublisher: EventPublisher</code></li><li><code>characterChangePubsub: PubSub</code></li></ul>"
            },
            {
              "id": "UpdateCharacterDetailsInput",
              "label": "UpdateCharacterDetailsInput",
              "kind": "interface",
              "detailHtml": "<h3>UpdateCharacterDetailsInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>name: string</code></li><li><code>partyId: string</code></li></ul>"
            },
            {
              "id": "BoundsCheckResult",
              "label": "BoundsCheckResult",
              "kind": "interface",
              "detailHtml": "<h3>BoundsCheckResult <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>valid: boolean</code></li><li><code>min: number</code></li><li><code>max: number</code></li></ul>"
            },
            {
              "id": "FieldValidationError",
              "label": "FieldValidationError",
              "kind": "interface",
              "detailHtml": "<h3>FieldValidationError <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>field: string</code></li><li><code>path: string</code></li><li><code>message: string</code></li></ul>"
            },
            {
              "id": "RulesetClientOptions",
              "label": "RulesetClientOptions",
              "kind": "interface",
              "detailHtml": "<h3>RulesetClientOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>baseUrl: string</code></li><li><code>fetchImpl: typeof fetch</code></li><li><code>tableRulesetCacheTtlMs: number</code></li></ul>"
            },
            {
              "id": "TableClientOptions",
              "label": "TableClientOptions",
              "kind": "interface",
              "detailHtml": "<h3>TableClientOptions <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>baseUrl: string</code></li><li><code>authToken: string</code></li><li><code>fetchImpl: typeof fetch</code></li></ul>"
            },
            {
              "id": "CharacterEditSubject",
              "label": "CharacterEditSubject",
              "kind": "interface",
              "detailHtml": "<h3>CharacterEditSubject <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>ownerId: string</code></li><li><code>isNpc: boolean</code></li></ul>"
            },
            {
              "id": "ListCharactersInput",
              "label": "ListCharactersInput",
              "kind": "interface",
              "detailHtml": "<h3>ListCharactersInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>tableId: string</code></li><li><code>partyId: string</code></li></ul>"
            },
            {
              "id": "SetNpcFlagInput",
              "label": "SetNpcFlagInput",
              "kind": "interface",
              "detailHtml": "<h3>SetNpcFlagInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>isNpc: boolean</code></li></ul>"
            },
            {
              "id": "UpdateCharacterStatsInput",
              "label": "UpdateCharacterStatsInput",
              "kind": "interface",
              "detailHtml": "<h3>UpdateCharacterStatsInput <span class=\"tag\">interface</span></h3><h4>Properties</h4><ul><li><code>id: string</code></li><li><code>stats: unknown</code></li></ul>"
            }
          ],
          "edges": []
        },
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_ci_yml",
              "label": "CI",
              "kind": "workflow",
              "detailHtml": "<h3>CI</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><p>Triggers: pull_request, push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_ci_yml__ci",
              "label": "ci",
              "kind": "job",
              "parent": "_github_workflows_ci_yml",
              "detailHtml": "<h3>ci</h3><p class=\"muted\"><code>.github/workflows/ci.yml</code></p><ol><li>1. uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main<br/><code>uses: TTRPGSolution/tabletop-infra/.github/workflows/reusable-node-ci.yml@main</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-check_yml",
              "label": "contract-check",
              "kind": "workflow",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><p>Triggers: pull_request</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-check_yml__contract-check",
              "label": "contract-check",
              "kind": "job",
              "parent": "_github_workflows_contract-check_yml",
              "detailHtml": "<h3>contract-check</h3><p class=\"muted\"><code>.github/workflows/contract-check.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a short-lived tabletop-infra installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. Fetch tabletop-infra's committed contract snapshots<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Run the composition check against this service's own SDL<br/><code>run: npm run check-composition -- --subgraph character-service --sdl-file ../../../sr</code></li></ol>"
            },
            {
              "id": "_github_workflows_contract-snapshot-update_yml",
              "label": "contract-snapshot-update",
              "kind": "workflow",
              "detailHtml": "<h3>contract-snapshot-update</h3><p class=\"muted\"><code>.github/workflows/contract-snapshot-update.yml</code></p><p>Triggers: push</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_contract-snapshot-update_yml__update-contract",
              "label": "update-contract",
              "kind": "job",
              "parent": "_github_workflows_contract-snapshot-update_yml",
              "detailHtml": "<h3>update-contract</h3><p class=\"muted\"><code>.github/workflows/contract-snapshot-update.yml</code></p><ol><li>1. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>2. Mint a short-lived tabletop-infra installation token<br/><code>uses: actions/create-github-app-token@v1</code></li><li>3. actions/checkout@v4<br/><code>uses: actions/checkout@v4</code></li><li>4. actions/setup-node@v4<br/><code>uses: actions/setup-node@v4</code></li><li>5. Install tabletop-infra's schema-types deps<br/><code>run: npm ci</code></li><li>6. Regenerate this subgraph's snapshot from the merged SDL<br/><code>run: npm run update-contracts -- --subgraph character-service --sdl-file ../../../src</code></li><li>7. Commit and push the updated snapshot back to tabletop-infra<br/><code>run: git config user.name &quot;tabletop-infra-sync[bot]&quot;\ngit config user.email &quot;tabletop-</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "map-service",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/map-service",
        "description": "Map state, tokens, realtime sync"
      },
      "status": "spec-only",
      "current": {
        "languages": {
          "Shell": 57080
        },
        "packageDependencies": [],
        "internalPackageDependencies": [],
        "ci": null,
        "lastCommitSha": "c79c59e0ff4b348999727b5de03d9e89610f7656",
        "lastCommitDate": "2026-08-11T00:00:31+03:00",
        "openPullRequests": 1,
        "dependencyCruiser": null,
        "madge": null,
        "federation": null,
        "classDiagram": null,
        "graphqlSchema": null,
        "cicdPipeline": null,
        "graphqlIntrospection": null
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-map-state",
          "specs/002-event-bus-subscriptions"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-map-state/spec.md",
            "title": "Feature Specification: Map State",
            "summary": "A DM opens a table's map and uploads an image to use as the shared battle map background, so every participant sees the same scene."
          },
          {
            "path": "specs/002-event-bus-subscriptions/spec.md",
            "title": "Feature Specification: Event Bus and Subscriptions",
            "summary": "While a session is running, a player moves their token, updates their character sheet, or a new member joins the table — and every other connected participant at that table sees the change appear immediately, without refreshing or re-querying."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": null,
        "classDiagram": null,
        "cicdPipeline": null,
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "bff",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/bff",
        "description": "Backend-for-frontend layer: one aggregation service per microfrontend experience"
      },
      "status": "spec-only",
      "current": {
        "languages": {
          "Shell": 57080
        },
        "packageDependencies": [],
        "internalPackageDependencies": [],
        "ci": null,
        "lastCommitSha": "8593bb808819d485c9b4c9dea38ed2bdc83cd4f5",
        "lastCommitDate": "2026-08-11T00:00:56+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": null,
        "madge": null,
        "federation": null,
        "classDiagram": null,
        "graphqlSchema": {
          "types": [
            {
              "name": "SchemaError",
              "kind": "object",
              "fields": [
                "code: String!",
                "message: String!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "CharacterSheetView",
              "kind": "object",
              "fields": [
                "characterId: ID!",
                "rulesetId: ID!",
                "characterData: JSON",
                "schema: JSON",
                "schemaError: SchemaError"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characterData",
                  "refType": "JSON"
                },
                {
                  "field": "schema",
                  "refType": "JSON"
                },
                {
                  "field": "schemaError",
                  "refType": "SchemaError"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "characterSheetView: CharacterSheetView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characterSheetView",
                  "refType": "CharacterSheetView"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "characterSheetUpdated: CharacterSheetView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "characterSheetUpdated",
                  "refType": "CharacterSheetView"
                }
              ]
            },
            {
              "name": "DiceRoll",
              "kind": "object",
              "fields": [
                "expression: String!",
                "result: Int!",
                "breakdown: [Int!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "ChatMessage",
              "kind": "object",
              "fields": [
                "messageId: ID!",
                "tableId: ID!",
                "authorId: ID!",
                "body: String",
                "diceRoll: DiceRoll",
                "sentAt: DateTime!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "diceRoll",
                  "refType": "DiceRoll"
                },
                {
                  "field": "sentAt",
                  "refType": "DateTime"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "recentMessages: [ChatMessage!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "recentMessages",
                  "refType": "ChatMessage"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "sendChatMessage: ChatMessage!",
                "rollDice: ChatMessage!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "sendChatMessage",
                  "refType": "ChatMessage"
                },
                {
                  "field": "rollDice",
                  "refType": "ChatMessage"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "messageReceived: ChatMessage!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "messageReceived",
                  "refType": "ChatMessage"
                }
              ]
            },
            {
              "name": "Role",
              "kind": "enum",
              "fields": [
                "DM",
                "CO_DM",
                "PLAYER",
                "SPECTATOR"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Position",
              "kind": "object",
              "fields": [
                "x: Float!",
                "y: Float!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Dimensions",
              "kind": "object",
              "fields": [
                "width: Int!",
                "height: Int!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "HP",
              "kind": "object",
              "fields": [
                "current: Int!",
                "max: Int!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "Token",
              "kind": "object",
              "fields": [
                "tokenId: ID!",
                "characterId: ID",
                "position: Position!",
                "hp: HP"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "position",
                  "refType": "Position"
                },
                {
                  "field": "hp",
                  "refType": "HP"
                }
              ]
            },
            {
              "name": "MapView",
              "kind": "object",
              "fields": [
                "mapId: ID!",
                "tableId: ID!",
                "backgroundImageUrl: String!",
                "dimensions: Dimensions!",
                "tokens: [Token!]!",
                "degradedFields: [String!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "dimensions",
                  "refType": "Dimensions"
                },
                {
                  "field": "tokens",
                  "refType": "Token"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "mapView: MapView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "mapView",
                  "refType": "MapView"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "mapViewUpdated: MapView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "mapViewUpdated",
                  "refType": "MapView"
                }
              ]
            },
            {
              "name": "Role",
              "kind": "enum",
              "fields": [
                "DM",
                "CO_DM",
                "PLAYER",
                "SPECTATOR"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": []
            },
            {
              "name": "TableMember",
              "kind": "object",
              "fields": [
                "userId: ID!",
                "displayName: String!",
                "role: Role!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "role",
                  "refType": "Role"
                }
              ]
            },
            {
              "name": "TableAdminView",
              "kind": "object",
              "fields": [
                "tableId: ID!",
                "name: String!",
                "settings: JSON!",
                "members: [TableMember!]!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "settings",
                  "refType": "JSON"
                },
                {
                  "field": "members",
                  "refType": "TableMember"
                }
              ]
            },
            {
              "name": "Query",
              "kind": "object",
              "fields": [
                "tableAdminView: TableAdminView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "tableAdminView",
                  "refType": "TableAdminView"
                }
              ]
            },
            {
              "name": "Mutation",
              "kind": "object",
              "fields": [
                "updateMemberRole: TableAdminView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "updateMemberRole",
                  "refType": "TableAdminView"
                }
              ]
            },
            {
              "name": "Subscription",
              "kind": "object",
              "fields": [
                "tableAdminViewUpdated: TableAdminView!"
              ],
              "implementsInterfaces": [],
              "fieldTypeRefs": [
                {
                  "field": "tableAdminViewUpdated",
                  "refType": "TableAdminView"
                }
              ]
            }
          ]
        },
        "cicdPipeline": null,
        "graphqlIntrospection": {
          "data": {
            "__schema": {
              "description": null,
              "queryType": {
                "name": "Query",
                "kind": "OBJECT"
              },
              "mutationType": {
                "name": "Mutation",
                "kind": "OBJECT"
              },
              "subscriptionType": {
                "name": "Subscription",
                "kind": "OBJECT"
              },
              "types": [
                {
                  "kind": "SCALAR",
                  "name": "JSON",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "SchemaError",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "code",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "message",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "String",
                  "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "CharacterSheetView",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "characterId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "rulesetId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "characterData",
                      "description": "Null when schemaError is set — never a guessed/blank sheet (constitution principle 2, FR-003).",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "JSON",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "schema",
                      "description": "The ruleset's statSchema, used by the frontend to render fields generically.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "JSON",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "schemaError",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "SchemaError",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "ID",
                  "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Query",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "tableAdminView",
                      "description": "Denies with FORBIDDEN unless the caller's role for tableId is DM or CO_DM (FR-006, US4.3).",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableAdminView",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Subscription",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "tableAdminViewUpdated",
                      "description": "Scoped by tableId per constitution principle 4. Pushes on any membership/role change.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableAdminView",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "DateTime",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "DiceRoll",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "expression",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "result",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "breakdown",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Int",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Int",
                  "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "ChatMessage",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "messageId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "tableId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "authorId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "body",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "diceRoll",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "DiceRoll",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "sentAt",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "DateTime",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Mutation",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "updateMemberRole",
                      "description": "Denies with FORBIDDEN unless the caller's role for tableId is DM or CO_DM.",
                      "args": [
                        {
                          "name": "tableId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "userId",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "ID",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        },
                        {
                          "name": "role",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Role",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          },
                          "defaultValue": null,
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "TableAdminView",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "Role",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "CO_DM",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "PLAYER",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SPECTATOR",
                      "description": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Position",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "x",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Float",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "y",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Float",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Float",
                  "description": "The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Dimensions",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "width",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "height",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "HP",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "current",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "max",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Int",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "Token",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "tokenId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "characterId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "ID",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "position",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Position",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "hp",
                      "description": "Null when HP is unavailable — check MapView.degradedFields for \"hp\" to distinguish from a token with no linked character",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "HP",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "MapView",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "mapId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "tableId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "backgroundImageUrl",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "dimensions",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Dimensions",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "tokens",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "Token",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "degradedFields",
                      "description": "Fields that could not be resolved this request due to an upstream outage (FR-011). Empty when healthy.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "String",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "TableMember",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "userId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "displayName",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "role",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Role",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "TableAdminView",
                  "description": null,
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "tableId",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "ID",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "settings",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "JSON",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "members",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "TableMember",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "SCALAR",
                  "name": "Boolean",
                  "description": "The `Boolean` scalar type represents `true` or `false`.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Schema",
                  "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "types",
                      "description": "A list of all types supported by this server.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Type",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "queryType",
                      "description": "The type that query operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "mutationType",
                      "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "subscriptionType",
                      "description": "If this server support subscription, the type that subscription operations will be rooted at.",
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "directives",
                      "description": "A list of all directives supported by this server.",
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "NON_NULL",
                            "name": null,
                            "ofType": {
                              "name": "Boolean",
                              "kind": "SCALAR",
                              "ofType": null
                            }
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__Directive",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Type",
                  "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "kind",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__TypeKind",
                          "kind": "ENUM",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "specifiedByURL",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "fields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Field",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "interfaces",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "possibleTypes",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__Type",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "enumValues",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__EnumValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "inputFields",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "LIST",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "NON_NULL",
                          "ofType": {
                            "name": "__InputValue",
                            "kind": "OBJECT",
                            "ofType": null
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ofType",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "OBJECT",
                        "name": "__Type",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isOneOf",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "Boolean",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__TypeKind",
                  "description": "An enum describing what kind of type a given `__Type` is.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "SCALAR",
                      "description": "Indicates this type is a scalar.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Indicates this type is an enum. `enumValues` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Indicates this type is an input object. `inputFields` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "LIST",
                      "description": "Indicates this type is a list. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "NON_NULL",
                      "description": "Indicates this type is a non-null. `ofType` is a valid field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Field",
                  "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__InputValue",
                  "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "type",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "__Type",
                          "kind": "OBJECT",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "defaultValue",
                      "description": "A GraphQL-formatted string representing the default value for this input value.",
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__EnumValue",
                  "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "OBJECT",
                  "name": "__Directive",
                  "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": [
                    {
                      "name": "name",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "description",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isRepeatable",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "locations",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__DirectiveLocation",
                              "kind": "ENUM",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "args",
                      "description": null,
                      "args": [
                        {
                          "name": "includeDeprecated",
                          "description": null,
                          "type": {
                            "kind": "SCALAR",
                            "name": "Boolean",
                            "ofType": null
                          },
                          "defaultValue": "false",
                          "isDeprecated": false,
                          "deprecationReason": null
                        }
                      ],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": null,
                          "kind": "LIST",
                          "ofType": {
                            "name": null,
                            "kind": "NON_NULL",
                            "ofType": {
                              "name": "__InputValue",
                              "kind": "OBJECT",
                              "ofType": null
                            }
                          }
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "isDeprecated",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "deprecationReason",
                      "description": null,
                      "args": [],
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "inputFields": null,
                  "interfaces": [],
                  "enumValues": null,
                  "possibleTypes": null
                },
                {
                  "kind": "ENUM",
                  "name": "__DirectiveLocation",
                  "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
                  "specifiedByURL": null,
                  "isOneOf": null,
                  "fields": null,
                  "inputFields": null,
                  "interfaces": null,
                  "enumValues": [
                    {
                      "name": "QUERY",
                      "description": "Location adjacent to a query operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "MUTATION",
                      "description": "Location adjacent to a mutation operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SUBSCRIPTION",
                      "description": "Location adjacent to a subscription operation.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD",
                      "description": "Location adjacent to a field.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_DEFINITION",
                      "description": "Location adjacent to a fragment definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FRAGMENT_SPREAD",
                      "description": "Location adjacent to a fragment spread.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INLINE_FRAGMENT",
                      "description": "Location adjacent to an inline fragment.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "VARIABLE_DEFINITION",
                      "description": "Location adjacent to a variable definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCHEMA",
                      "description": "Location adjacent to a schema definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "SCALAR",
                      "description": "Location adjacent to a scalar definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "OBJECT",
                      "description": "Location adjacent to an object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "FIELD_DEFINITION",
                      "description": "Location adjacent to a field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ARGUMENT_DEFINITION",
                      "description": "Location adjacent to an argument definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INTERFACE",
                      "description": "Location adjacent to an interface definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "UNION",
                      "description": "Location adjacent to a union definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM",
                      "description": "Location adjacent to an enum definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "ENUM_VALUE",
                      "description": "Location adjacent to an enum value definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_OBJECT",
                      "description": "Location adjacent to an input object type definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "INPUT_FIELD_DEFINITION",
                      "description": "Location adjacent to an input object field definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    },
                    {
                      "name": "DIRECTIVE_DEFINITION",
                      "description": "Location adjacent to a directive definition.",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ],
                  "possibleTypes": null
                }
              ],
              "directives": [
                {
                  "name": "include",
                  "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Included when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "skip",
                  "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD",
                    "FRAGMENT_SPREAD",
                    "INLINE_FRAGMENT"
                  ],
                  "args": [
                    {
                      "name": "if",
                      "description": "Skipped when true.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "Boolean",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "deprecated",
                  "description": "Marks an element of a GraphQL schema as no longer supported.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "FIELD_DEFINITION",
                    "ARGUMENT_DEFINITION",
                    "INPUT_FIELD_DEFINITION",
                    "ENUM_VALUE",
                    "DIRECTIVE_DEFINITION"
                  ],
                  "args": [
                    {
                      "name": "reason",
                      "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
                      "type": {
                        "kind": "SCALAR",
                        "name": "String",
                        "ofType": null
                      },
                      "defaultValue": "\"No longer supported\"",
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "specifiedBy",
                  "description": "Exposes a URL that specifies the behavior of this scalar.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "SCALAR"
                  ],
                  "args": [
                    {
                      "name": "url",
                      "description": "The URL that specifies the behavior of this scalar.",
                      "type": {
                        "kind": "NON_NULL",
                        "name": null,
                        "ofType": {
                          "name": "String",
                          "kind": "SCALAR",
                          "ofType": null
                        }
                      },
                      "defaultValue": null,
                      "isDeprecated": false,
                      "deprecationReason": null
                    }
                  ]
                },
                {
                  "name": "oneOf",
                  "description": "Indicates exactly one field must be supplied and this field must not be `null`.",
                  "isRepeatable": false,
                  "isDeprecated": false,
                  "deprecationReason": null,
                  "locations": [
                    "INPUT_OBJECT"
                  ],
                  "args": []
                }
              ]
            }
          }
        }
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/001-bff-layer"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/001-bff-layer/spec.md",
            "title": "Feature Specification: BFF Layer (Backend-for-Frontend)",
            "summary": "A player or DM opens the map for their table during a live session and sees the map, every token's position, and each token's current/max HP all appear together, without the screen populating piecemeal or flickering as separate pieces of data arrive."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": null,
        "classDiagram": null,
        "cicdPipeline": null,
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "tabletop-frontend",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/tabletop-frontend",
        "description": "Microfrontend monorepo: shell, map-ui, character-sheet, table-admin, chat-dice"
      },
      "status": "spec-only",
      "current": {
        "languages": {
          "Shell": 57080
        },
        "packageDependencies": [],
        "internalPackageDependencies": [],
        "ci": null,
        "lastCommitSha": "b385f884bf4457ceb24c533fdf99f36d68e3cf65",
        "lastCommitDate": "2026-08-10T15:39:29+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": null,
        "madge": null,
        "federation": null,
        "classDiagram": null,
        "graphqlSchema": null,
        "cicdPipeline": null,
        "graphqlIntrospection": null
      },
      "target": {
        "hasSpecs": true,
        "specDirs": [
          "specs/002-map-microfrontend",
          "specs/001-microfrontend-shell",
          "specs/003-character-sheet-microfrontend",
          "specs/004-table-admin-microfrontend",
          "specs/005-chat-dice-microfrontend"
        ],
        "adrFiles": [],
        "specSummaries": [
          {
            "path": "specs/002-map-microfrontend/spec.md",
            "title": "Feature Specification: Map Microfrontend",
            "summary": "A player or DM opens a table's map and sees the same grid-aligned battlefield — the background scene image with a grid overlay — as everyone else at the table, giving the group a shared visual reference for the encounter."
          },
          {
            "path": "specs/001-microfrontend-shell/spec.md",
            "title": "Feature Specification: Microfrontend Shell",
            "summary": "A player or DM using the platform moves between different feature areas of the app (e.g., from their dashboard into a table, from a table into a character sheet) without noticing that these areas are actually built and deployed by different teams. They stay logged in, the navigation and header stay consistent, and pages load without a jarring full-page reload."
          },
          {
            "path": "specs/003-character-sheet-microfrontend/spec.md",
            "title": "Feature Specification: Character Sheet Microfrontend",
            "summary": "A player creates a new character at a table by filling out a form whose fields are generated from that table's active ruleset (its `statSchema`) rather than a fixed, game-specific layout, so the same sheet-building experience works no matter which game system the table is running."
          },
          {
            "path": "specs/004-table-admin-microfrontend/spec.md",
            "title": "Feature Specification: Table Admin Microfrontend",
            "summary": "A user creates a new table by walking through a short wizard: naming the table, selecting the ruleset (game system) it will run, and receiving a shareable invite link to bring other players in. Completing the wizard establishes the user as the table's DM."
          },
          {
            "path": "specs/005-chat-dice-microfrontend/spec.md",
            "title": "Feature Specification: Chat and Dice Microfrontend",
            "summary": "A player or DM opens a table's chat and sees the messages previously sent at that table, in chronological order, so they can catch up on what's been said."
          }
        ]
      },
      "graphs": {
        "dependencyGraph": null,
        "classDiagram": null,
        "cicdPipeline": null,
        "graphqlSchema": null
      }
    },
    {
      "ref": {
        "name": "project-automation",
        "owner": "TTRPGSolution",
        "defaultBranch": "main",
        "archived": false,
        "htmlUrl": "https://github.com/TTRPGSolution/project-automation",
        "description": null
      },
      "status": "unknown",
      "current": {
        "languages": {},
        "packageDependencies": [],
        "internalPackageDependencies": [],
        "ci": {
          "latestConclusion": "success",
          "latestWorkflowName": "TTRPGSolution Project Sync",
          "latestRunUrl": "https://github.com/TTRPGSolution/project-automation/actions/runs/31885416858"
        },
        "lastCommitSha": "72487d41e42d50af551f8ce400bc5dd0ed155143",
        "lastCommitDate": "2026-08-15T15:45:20+03:00",
        "openPullRequests": 0,
        "dependencyCruiser": null,
        "madge": null,
        "federation": null,
        "classDiagram": null,
        "graphqlSchema": null,
        "cicdPipeline": {
          "workflows": [
            {
              "file": ".github/workflows/sync-project.yml",
              "name": "TTRPGSolution Project Sync",
              "triggers": [
                "workflow_dispatch"
              ],
              "jobs": [
                {
                  "id": "sync",
                  "name": "Synchronize Project",
                  "needs": [],
                  "steps": [
                    {
                      "label": "Create GitHub App token",
                      "uses": "actions/create-github-app-token@v3",
                      "run": null
                    },
                    {
                      "label": "Synchronize Project",
                      "uses": "actions/github-script@v8",
                      "run": null
                    }
                  ]
                }
              ]
            }
          ]
        },
        "graphqlIntrospection": null
      },
      "target": {
        "hasSpecs": false,
        "specDirs": [],
        "adrFiles": [],
        "specSummaries": []
      },
      "graphs": {
        "dependencyGraph": null,
        "classDiagram": null,
        "cicdPipeline": {
          "nodes": [
            {
              "id": "_github_workflows_sync-project_yml",
              "label": "TTRPGSolution Project Sync",
              "kind": "workflow",
              "detailHtml": "<h3>TTRPGSolution Project Sync</h3><p class=\"muted\"><code>.github/workflows/sync-project.yml</code></p><p>Triggers: workflow_dispatch</p><p>1 job(s)</p>"
            },
            {
              "id": "_github_workflows_sync-project_yml__sync",
              "label": "Synchronize Project",
              "kind": "job",
              "parent": "_github_workflows_sync-project_yml",
              "detailHtml": "<h3>Synchronize Project</h3><p class=\"muted\"><code>.github/workflows/sync-project.yml</code></p><ol><li>1. Create GitHub App token<br/><code>uses: actions/create-github-app-token@v3</code></li><li>2. Synchronize Project<br/><code>uses: actions/github-script@v8</code></li></ol>"
            }
          ],
          "edges": []
        },
        "graphqlSchema": null
      }
    }
  ],
  "edges": [],
  "gaps": [
    {
      "repo": "map-service",
      "description": "Spec-kit specs exist but no implementation code was found yet.",
      "severity": "low"
    },
    {
      "repo": "bff",
      "description": "Spec-kit specs exist but no implementation code was found yet.",
      "severity": "low"
    },
    {
      "repo": "tabletop-frontend",
      "description": "Spec-kit specs exist but no implementation code was found yet.",
      "severity": "low"
    }
  ]
}