{
  "access": {
    "game": {
      "owner": "owner_id",
      "scope": "private"
    }
  },
  "app": "battlechess",
  "auth": {
    "providers": [
      "google"
    ],
    "required": false,
    "service": "/auth",
    "promote": true,
    "mode": "passkey"
  },
  "floors": {
    "touch": 24
  },
  "hostDom": {
    "battle": {
      "src": "shell/hatches/battle/battle.js",
      "note": "WebGL rendering, WebAssembly physics and engine, workers and Web Audio are beyond the terminal's markup; the hatch writes Game rows only by submitting the play screen's forms"
    }
  },
  "server": true,
  "routes": [
    {
      "access": "private",
      "hatches": [
        "battle"
      ],
      "path": "/",
      "screen": "play",
      "nav": {
        "label": "Bonk Chess"
      },
      "files": {
        "html": "shell/screens/play.html",
        "css": "shell/screens/play.css",
        "handlers": [],
        "adapters": [],
        "shared": []
      },
      "ssr": "spa",
      "states": [
        "loading",
        "empty",
        "populated"
      ]
    }
  ],
  "tables": [
    "game"
  ],
  "schema": {
    "game": {
      "durability": "offline",
      "fields": [
        {
          "name": "id",
          "pk": true,
          "type": "uuid",
          "required": true
        },
        {
          "enum": [
            "peasant",
            "squire",
            "page",
            "knight",
            "captain",
            "lord",
            "champion",
            "grandmaster",
            "human"
          ],
          "name": "opponent",
          "type": "string",
          "required": true
        },
        {
          "bounds": {
            "sizeMin": 1,
            "sizeMax": 60
          },
          "name": "opponent_label",
          "type": "string",
          "required": true
        },
        {
          "bounds": {
            "sizeMin": 1,
            "sizeMax": 100
          },
          "name": "start_fen",
          "type": "string",
          "required": true
        },
        {
          "bounds": {
            "sizeMin": 1,
            "sizeMax": 100
          },
          "name": "fen",
          "type": "string",
          "required": true
        },
        {
          "bounds": {
            "sizeMax": 3600,
            "regex": "^([a-h][1-8][a-h][1-8][qrbn]?( |$))*$"
          },
          "name": "moves",
          "type": "string",
          "required": true
        },
        {
          "bounds": {
            "intMin": 0,
            "intMax": 600
          },
          "name": "fights",
          "type": "int32",
          "required": true
        },
        {
          "bounds": {
            "sizeMax": 120
          },
          "name": "summary",
          "type": "string",
          "required": true
        },
        {
          "enum": [
            "active",
            "finished"
          ],
          "name": "status",
          "type": "string",
          "required": true
        },
        {
          "enum": [
            "",
            "white",
            "black",
            "draw"
          ],
          "name": "result",
          "type": "string",
          "required": true
        },
        {
          "enum": [
            "",
            "checkmate",
            "stalemate",
            "fifty-move rule"
          ],
          "name": "reason",
          "type": "string",
          "required": true
        },
        {
          "name": "created",
          "type": "timestamp",
          "required": true
        },
        {
          "name": "updated",
          "type": "timestamp",
          "required": true
        },
        {
          "defaulted": true,
          "name": "owner_id",
          "type": "uuid",
          "required": true
        }
      ]
    }
  },
  "types": {
    "types": {
      "string": {
        "pg": "text",
        "column": "plain",
        "subset": true,
        "base": [
          "text",
          "varchar",
          "bpchar",
          "tsvector"
        ],
        "json": "string",
        "refuse": "\\x00",
        "order": "text",
        "beyond": [
          "scalar-values"
        ]
      },
      "bool": {
        "pg": "boolean",
        "column": "plain",
        "subset": true,
        "base": [
          "bool",
          "boolean"
        ],
        "json": "boolean",
        "order": "boolean",
        "beyond": []
      },
      "int32": {
        "pg": "integer",
        "column": "plain",
        "subset": true,
        "base": [
          "int2",
          "int4",
          "integer",
          "smallint"
        ],
        "json": "number",
        "min": -2147483648,
        "max": 2147483647,
        "order": "number",
        "beyond": []
      },
      "int64": {
        "pg": "bigint",
        "column": "domain",
        "subset": false,
        "sql": "portable_int64",
        "base": [
          "int8",
          "bigint"
        ],
        "json": "string",
        "pattern": "^(0|-?[1-9][0-9]*)$",
        "order": "integer",
        "beyond": [
          "int64-range"
        ]
      },
      "double": {
        "pg": "double precision",
        "column": "checked",
        "subset": true,
        "base": [
          "float4",
          "float8",
          "double precision",
          "real"
        ],
        "json": "number",
        "order": "number",
        "beyond": []
      },
      "bytes": {
        "pg": "bytea",
        "column": "domain",
        "subset": false,
        "sql": "portable_bytes",
        "base": [
          "bytea"
        ],
        "json": "string",
        "pattern": "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
        "order": "none",
        "beyond": []
      },
      "uuid": {
        "pg": "uuid",
        "column": "plain",
        "subset": true,
        "base": [
          "uuid"
        ],
        "json": "string",
        "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
        "order": "text",
        "beyond": []
      },
      "timestamp": {
        "pg": "timestamptz",
        "column": "domain",
        "subset": false,
        "sql": "portable_timestamp",
        "base": [
          "timestamptz",
          "timestamp with time zone"
        ],
        "json": "string",
        "pattern": "^(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{6}Z$",
        "order": "text",
        "beyond": [
          "calendar"
        ]
      },
      "duration": {
        "pg": "interval",
        "column": "domain",
        "subset": false,
        "sql": "portable_duration",
        "base": [
          "interval"
        ],
        "json": "string",
        "pattern": "^PT(0|[1-9][0-9]*)(\\.[0-9]{0,5}[1-9])?S$",
        "order": "duration",
        "beyond": [
          "duration-range"
        ]
      },
      "decimal": {
        "pg": "numeric",
        "column": "domain",
        "subset": false,
        "base": [
          "numeric",
          "decimal"
        ],
        "json": "string",
        "pattern": "^(0|-?[1-9][0-9]*|-?(0|[1-9][0-9]*)\\.[0-9]*[1-9])$",
        "order": "decimal",
        "beyond": [
          "decimal-profile"
        ]
      },
      "date": {
        "pg": "date",
        "column": "checked",
        "subset": true,
        "base": [
          "date"
        ],
        "json": "string",
        "pattern": "^(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",
        "order": "text",
        "beyond": [
          "calendar"
        ]
      },
      "time": {
        "pg": "time(6)",
        "column": "domain",
        "subset": false,
        "sql": "portable_time",
        "base": [
          "time",
          "time without time zone"
        ],
        "json": "string",
        "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{6}$",
        "order": "text",
        "beyond": []
      },
      "timezone": {
        "pg": "text",
        "column": "checked",
        "subset": true,
        "base": [
          "text"
        ],
        "json": "string",
        "pattern": "^[A-Za-z0-9+_/-]+$",
        "order": "none",
        "beyond": [
          "tzdb"
        ]
      },
      "json": {
        "pg": "json",
        "column": "checked",
        "subset": false,
        "base": [
          "json",
          "jsonb"
        ],
        "json": "value",
        "order": "none",
        "beyond": [
          "scalar-values",
          "finite-numbers"
        ]
      },
      "geojson": {
        "pg": "json",
        "column": "checked",
        "subset": false,
        "base": [
          "json",
          "jsonb",
          "geometry",
          "geography"
        ],
        "json": "value",
        "order": "none",
        "beyond": [
          "scalar-values",
          "finite-numbers",
          "ring-closure"
        ]
      }
    },
    "aliases": {
      "text": "string",
      "int": "int32",
      "bigint": "int64",
      "timestamptz": "timestamp",
      "tsvector": "string"
    }
  },
  "carriers": {
    "types": {
      "string": {
        "pg": "text",
        "column": "plain",
        "subset": true,
        "base": [
          "text",
          "varchar",
          "bpchar",
          "tsvector"
        ],
        "json": "string",
        "refuse": "\\x00",
        "order": "text",
        "beyond": [
          "scalar-values"
        ]
      },
      "bool": {
        "pg": "boolean",
        "column": "plain",
        "subset": true,
        "base": [
          "bool",
          "boolean"
        ],
        "json": "boolean",
        "order": "boolean",
        "beyond": []
      },
      "int32": {
        "pg": "integer",
        "column": "plain",
        "subset": true,
        "base": [
          "int2",
          "int4",
          "integer",
          "smallint"
        ],
        "json": "number",
        "min": -2147483648,
        "max": 2147483647,
        "order": "number",
        "beyond": []
      },
      "int64": {
        "pg": "bigint",
        "column": "domain",
        "subset": false,
        "sql": "portable_int64",
        "base": [
          "int8",
          "bigint"
        ],
        "json": "string",
        "pattern": "^(0|-?[1-9][0-9]*)$",
        "order": "integer",
        "beyond": [
          "int64-range"
        ]
      },
      "double": {
        "pg": "double precision",
        "column": "checked",
        "subset": true,
        "base": [
          "float4",
          "float8",
          "double precision",
          "real"
        ],
        "json": "number",
        "order": "number",
        "beyond": []
      },
      "bytes": {
        "pg": "bytea",
        "column": "domain",
        "subset": false,
        "sql": "portable_bytes",
        "base": [
          "bytea"
        ],
        "json": "string",
        "pattern": "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
        "order": "none",
        "beyond": []
      },
      "uuid": {
        "pg": "uuid",
        "column": "plain",
        "subset": true,
        "base": [
          "uuid"
        ],
        "json": "string",
        "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
        "order": "text",
        "beyond": []
      },
      "timestamp": {
        "pg": "timestamptz",
        "column": "domain",
        "subset": false,
        "sql": "portable_timestamp",
        "base": [
          "timestamptz",
          "timestamp with time zone"
        ],
        "json": "string",
        "pattern": "^(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{6}Z$",
        "order": "text",
        "beyond": [
          "calendar"
        ]
      },
      "duration": {
        "pg": "interval",
        "column": "domain",
        "subset": false,
        "sql": "portable_duration",
        "base": [
          "interval"
        ],
        "json": "string",
        "pattern": "^PT(0|[1-9][0-9]*)(\\.[0-9]{0,5}[1-9])?S$",
        "order": "duration",
        "beyond": [
          "duration-range"
        ]
      },
      "decimal": {
        "pg": "numeric",
        "column": "domain",
        "subset": false,
        "base": [
          "numeric",
          "decimal"
        ],
        "json": "string",
        "pattern": "^(0|-?[1-9][0-9]*|-?(0|[1-9][0-9]*)\\.[0-9]*[1-9])$",
        "order": "decimal",
        "beyond": [
          "decimal-profile"
        ]
      },
      "date": {
        "pg": "date",
        "column": "checked",
        "subset": true,
        "base": [
          "date"
        ],
        "json": "string",
        "pattern": "^(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",
        "order": "text",
        "beyond": [
          "calendar"
        ]
      },
      "time": {
        "pg": "time(6)",
        "column": "domain",
        "subset": false,
        "sql": "portable_time",
        "base": [
          "time",
          "time without time zone"
        ],
        "json": "string",
        "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{6}$",
        "order": "text",
        "beyond": []
      },
      "timezone": {
        "pg": "text",
        "column": "checked",
        "subset": true,
        "base": [
          "text"
        ],
        "json": "string",
        "pattern": "^[A-Za-z0-9+_/-]+$",
        "order": "none",
        "beyond": [
          "tzdb"
        ]
      },
      "json": {
        "pg": "json",
        "column": "checked",
        "subset": false,
        "base": [
          "json",
          "jsonb"
        ],
        "json": "value",
        "order": "none",
        "beyond": [
          "scalar-values",
          "finite-numbers"
        ]
      },
      "geojson": {
        "pg": "json",
        "column": "checked",
        "subset": false,
        "base": [
          "json",
          "jsonb",
          "geometry",
          "geography"
        ],
        "json": "value",
        "order": "none",
        "beyond": [
          "scalar-values",
          "finite-numbers",
          "ring-closure"
        ]
      }
    },
    "aliases": {
      "text": "string",
      "int": "int32",
      "bigint": "int64",
      "timestamptz": "timestamp",
      "tsvector": "string"
    }
  },
  "migrations": [
    "services/database/migrations/000_extensions.sql",
    "services/database/migrations/001_roles.sql",
    "services/database/migrations/002_grants.sql",
    "services/database/migrations/004_types.sql",
    "services/database/migrations/005_create_tables.sql",
    "services/database/migrations/006_policies.sql",
    "services/database/migrations/007_txid.sql",
    "services/database/migrations/008_publication.sql"
  ],
  "pipelines": []
}
