prorm
    • prorm documentation
    • Known test gaps
    • Architecture
    • Core concepts
    • Database types & coverage
    • Getting started
    • Going further
    • compliance
      • Compliance
      • The security toolkit: `prorm audit`
      • Checklists by regulation
      • Declaring personal data
      • Evidence bundles
      • Evidence
      • Frameworks: `@Security`
      • Jurisdictions
      • Platform policies
      • Protecting data
      • The regulation dataset
      • Residency and cross-border transfers
      • Retention & integrity
      • Status
      • Subject rights
    • decorators
      • prorm with decorators
      • Models with decorators
      • Querying a decorated model
      • Relations with decorators
    • diagrams
      • Diagram generators
      • Chen diagram
      • Class diagram
      • Dependency diagram
      • ER diagram
      • Flow diagram
      • From your models to a diagram
      • Gantt diagram
      • Index diagram
      • Migration diagram
      • Model diagram
      • Package diagram
      • Crow’s-foot diagram
      • Schema documentation
      • Sequence diagram
      • State diagram
      • Tree diagram
    • dialects
      • SQL dialects
      • AlloyDB Dialect
      • AlloyDB Omni Dialect
      • Amazon Athena Dialect
      • Aurora DSQL Dialect
      • Amazon Aurora MySQL Dialect
      • Amazon Aurora PostgreSQL Dialect
      • Azure Database for MySQL Dialect
      • Azure Database for PostgreSQL Dialect
      • Azure SQL Database Dialect
      • Azure SQL Managed Instance Dialect
      • Google BigQuery Dialect
      • Citus Dialect
      • ClickHouse dialect
      • Cloud Authentication (`cloud-auth`)
      • Cloud SQL for SQL Server Dialect
      • Cloud SQL for MySQL Dialect
      • Cloud SQL for PostgreSQL Dialect
      • CockroachDB Dialect
      • Azure Cosmos DB for PostgreSQL Dialect
      • CrateDB Dialect
      • Cloudflare D1 Dialect
      • Databricks dialect
      • IBM Db2 Dialect
      • Dolt Dialect
      • Apache Doris Dialect
      • Druid Dialect
      • DuckDB Dialect
      • Exasol dialect
      • Microsoft Fabric Data Warehouse Dialect
      • Firebird Dialect
      • Greenplum Dialect
      • SAP HANA Dialect
      • MySQL HeatWave Dialect
      • Azure Data Explorer (Kusto) Dialect — T-SQL
      • MariaDB Dialect
      • Materialize Dialect
      • MonetDB Dialect
      • MotherDuck Dialect
      • Microsoft SQL Server Dialect
      • MySQL Dialect
      • Neon Dialect
      • OceanBase Dialect
      • openGauss Dialect
      • Oracle Dialect
      • Oracle Autonomous Database Dialect
      • ParadeDB Dialect
      • PolarDB Dialect
      • PostgreSQL Dialect
      • Presto Dialect
      • QuestDB Dialect
      • Aurora RDS Data API Dialect (`rdsdata`)
      • Amazon RDS for Db2 Dialect
      • Amazon RDS for MariaDB Dialect
      • Amazon RDS for SQL Server Dialect
      • Amazon RDS for MySQL Dialect
      • Amazon RDS for Oracle Dialect
      • Amazon RDS for PostgreSQL Dialect
      • Amazon Redshift
      • Amazon Redshift Data API Dialect
      • RisingWave Dialect
      • rqlite Dialect
      • SingleStore Dialect
      • Snowflake Dialect
      • Google Cloud Spanner Dialect
      • Spanner (PostgreSQL interface) Dialect
      • SQLite Dialect
      • StarRocks Dialect
      • Supabase Dialect
      • Azure Synapse Analytics (dedicated SQL pool)
      • Teradata Dialect
      • TiDB Dialect
      • TimescaleDB Dialect
      • Trino Dialect
      • Turso / libSQL Dialect
      • Vertica dialect
      • Vitess Dialect
      • Yellowbrick Dialect
      • YugabyteDB Dialect
    • guides
      • Access rules and behaviour profiles
      • ArangoDB (AQL)
      • Associations
      • Audit levels and escalation
      • Audit logging
      • In the browser
      • Bulk operations
      • Caching
      • Capabilities, tiers and team roles
      • CLI
      • Cloudflare
      • Compliance & data protection
      • Connection Pooling & Performance
      • Security in the console
      • Couchbase: structured N1QL queries
      • Data types
      • Decorators
      • Eager loading
      • Enums and constants
      • Error handling & error types
      • Extensions
      • External fields
      • Foreign data wrappers
      • Graph databases
      • Hooks & lifecycle events
      • Indexes & constraints
      • InfluxDB: structured Flux pipelines
      • klock-errors
      • klock — the `.klock` file
      • Local databases (`prorm db up`)
      • Structured log search — Splunk, Graylog, Papertrail, Sumo Logic
      • Logging
      • Grafana Loki: structured LogQL queries
      • MCP server
      • Migrate — the data transfer subsystem
      • Migrations & Schema Sync
      • Models from an existing database
      • Defining models
      • Multiple databases
      • OrientDB, Neptune and TigerGraph
      • Passwords
      • Importing a Prisma schema
      • Structured PromQL and MetricsQL
      • Query firewall
      • QueryInterface
      • Query operators reference
      • Query optimization
      • Composing find options with `pipe()` and `Q`
      • Query safety: the fail-closed WHERE guard
      • Querying
      • Raw Queries & Query Building
      • Read replicas
      • Schema diffing & migration generation
      • Views, triggers & other schema objects
      • Scopes & default scopes
      • Seeders
      • SPARQL / RDF triplestores
      • SQL constants
      • SQL features
      • SQL function builders
      • SQLite advanced features
      • StoreKey — a prod-orm database as the storage
      • Streaming results
      • Terraform
      • Transactions & Isolation Levels
      • Type mapping: legacy and modern
      • TypeScript types
      • Database users, roles & privileges
      • Validation & constraints
      • Virtual & Computed Fields
      • Writing docs
    • javascript
      • prorm in JavaScript
      • Models in JavaScript
      • Querying in JavaScript
      • Relations in JavaScript
    • runbooks
      • Operational runbooks
      • Connection failures
      • Credential rotation
      • Failover
      • Incident checklist
      • Deploying klock v2
      • Migration rollback
    • running-databases
      • Running databases in Docker
      • Running prorm under Bun in Docker
      • Running Cassandra in Docker with prorm
      • Running ClickHouse in Docker with prorm
      • Running CockroachDB in Docker with prorm
      • Running prorm under Deno in Docker
      • Running Elasticsearch in Docker with prorm
      • Running MariaDB in Docker with prorm
      • Running MongoDB in Docker with prorm
    • prorm control plane
      • Introduction
      • Authentication
      • Errors
      • Getting started
        • Service
          • Is it up
          • This description
      • Account
        • Sign-up and verification
          • Create an account
          • Exchange credentials for a token
          • Verify with the emailed code
          • Verify by clicking the emailed link
          • Name the parent or guardian
          • What a consent link is about
          • Give consent for a child's account
          • Ask the parent or guardian again
          • Send a new code and link
        • Family
          • Everyone this account is responsible for
          • One child, in detail
          • Turn a limit on or off
        • Profile
          • Who am I
          • Change the account
          • Every address on the account
          • Add an address
          • Confirm an address with the code mailed to it
          • Mail a fresh code to an unconfirmed address
          • Make an address primary
          • Remove an address
          • What this caller may do
      • Security
        • Sessions
          • Everywhere this account is signed in
          • Sign out everywhere else
          • Sign one out
          • A token for the CLI on a named machine
          • A token for the customer console, from the staff one
          • Park a sign-in for the CLI to collect
          • The CLI collecting its sign-in
          • The team's members' live sessions
          • Sign a member's session out
          • Sign an account out everywhere
          • Everywhere the account is signed in
          • Sign an account's session out
        • Single sign-on
          • Begin a single sign-on
          • The provider's return
          • Link the signed-in account to a team's provider
          • Which team an address signs in to
          • The team's single sign-on, as a member sees it
          • Set the team's OpenID Connect provider up, or change it
          • Remove the provider
          • The team's domain claims and the DNS record each needs
          • Prove a claimed domain
        • MFA and passwords
          • Start enrolling a second factor
          • Prove the app has it
          • Remove the second factor
          • Ask for a reset link
          • Set a new password with the emailed token
        • Klock
          • Open a device-bound klock session
          • Check in, for the next grant
          • Step up the session asking
          • Rotate the device key
          • Freeze a session
          • Unfreeze a session
          • A guest grant
          • The revocation feed
          • The published keyset
          • What this control plane supports
        • Devices
          • Your devices, or a team's
          • Approve a new device's pairing code
          • One device
          • Rename a device
          • Revoke a device
          • Suspend a device
          • Reinstate a suspended device
          • Wipe a device
          • Ask a device to rotate its key
          • The team's members' devices
          • Revoke a member's device
          • An account's devices
          • Revoke an account's device
          • Wipe an account's device
          • The device fleet
        • Access rules and behaviour
          • The access rules that bear on you
          • Add an access rule
          • This request, as the rules see it
          • One access rule
          • Remove an access rule
          • The behaviour profiles that bear on you
          • Add or change a behaviour profile
          • The profile presets
          • Your behaviour findings
          • Acknowledge a finding
          • One behaviour profile
          • Remove a behaviour profile
          • The team's access rules
          • Add a team access rule
          • Remove a team access rule
          • The team's behaviour profiles
          • Add or change a team behaviour profile
          • Remove a team behaviour profile
          • What the team's profiles caught
          • Acknowledge a team finding
        • Recovery and lockdown
          • Ask for a recovery link
          • Recover access with the emailed code
          • Is the account locked down
          • Lock the account down
          • Release a lockdown
          • Lock a member down
          • Release a member's lockdown
        • MCP tokens
          • Make a delegated token for one MCP client
          • The account's delegated tokens
          • Revoke a delegated token
          • What a delegated token may do now
          • Run one MCP tool with a delegated token
          • Run a device-signed MCP tool call relayed by the MCP Worker
        • Kerberos
          • Give the team its own Kerberos realm
          • The team's realm
          • Remove the team's realm
      • Logging and monitoring
        • Audit log
          • What has been done to the account
          • What has happened to this account
          • The account's audit trail
        • Operations
          • Everything that has been asked of this database
          • One, with its steps
          • Stop it
          • Put a failed one back in the queue
          • Every operation, across all accounts
        • Metrics and events
          • Every measurement, for a graph
          • Who did what to it
      • Billing
        • Plans and pricing
          • What the plans allow
          • The rate card
          • What one database would cost
          • What this account is paying for, itemised
        • Subscriptions and invoices
          • What this month's invoice will say
          • What this account is on
          • What it has been charged
          • Start a Stripe Checkout session
          • Open the customer portal
          • Stripe's events
          • Buy more connection pools
        • Team billing
          • The team's billing account
          • What the team has been charged
          • What this month's invoice will say
          • The team's cards
          • Add a card, through a Stripe-hosted setup session
          • Make a card the team's default
          • Remove a card
          • Start the team paying
          • Open the Stripe portal on the team's customer
          • Change the team's plan
          • Who receives the team's bills
          • How the team pays for transfers
      • Support
        • Support chat
          • My conversations
          • Start a conversation
          • Every support conversation, open first
          • A ticket for the socket
          • One conversation, with who is in it and who is connected
          • Rename a group; open or close a support conversation
          • The lines, oldest first
          • Say something
          • Add somebody
          • Mark read
      • Administration
        • Users
          • Every account
          • One account, with everything hanging off it
          • Grant or revoke admin
          • Verify an account by hand
          • Lock or unlock sign-in
          • Allow or hold provisioning
          • Send the verification mail again
          • Set the plan by hand
        • Platform
          • Every database and store, across all accounts
          • The counts worth putting on a dashboard
        • Staff and permissions
          • What kind of admin the caller is, and which scopes they hold
          • The admin presets
          • Every admin, and the scopes each resolves to
          • Make an account an admin of a kind
          • Change an admin's kind, or a custom admin's scopes
          • Revoke admin
        • Team administration
          • Every team, with its owner and size
          • One team in full — members with their accounts, and projects
          • Hand the team to another member
          • Put an account in the team, active at once
          • Change a member's role
          • Remove a member
        • Assumed identities
          • Assume an identity — act as a customer account
          • The identities the caller holds open
          • End an assumed identity
        • Support inbox
          • The platform's addresses
          • Add a platform address
          • One address, with its counts
          • Change an address's label, routing, or whether it accepts mail
          • Remove an address that holds no mail
          • Make, adopt or repair the address's routing rule
          • Every admin's personal address, made where missing
          • File a raw message, as if it had arrived
          • The inbox
          • One message, whole
          • Mark a message
          • Hand a message to an admin, or take it back
          • Leave an internal note
          • Reply, from the address the message came to
          • What is waiting
      • Databases
        • Databases
          • Data stores
            • Every data store on the account
            • Provision a data store
            • Change a data store that is already running
            • One data store
            • Deprovision it
            • Report what it is using
            • How to reach a data store
          • Connections and credentials
            • The api keys on a database
            • Issue a key
            • Revoke a key
            • The engine users we created
            • Create a user inside the database
            • Give a user a new password
            • Drop a user
            • How the database is reached
            • Set how it is reached
            • Revoke every api key on it
            • How to connect to it
            • The ssh keys that open its bastion
            • Add a key, or have one made
            • The private half of a generated key, once
            • Revoke an ssh key
          • Schema and objects
            • The SQL objects we put in it
            • Create one, and apply it
            • What is in the database, as the engine reports it
            • One table
            • What it would run, without running it
            • Redefine an object in place
            • Drop it
            • The extensions installed in it
          • Migrations
            • A plan compiled to statements, recording nothing
            • The migrations recorded for it
            • Record one
            • Apply everything recorded and not yet run
            • Apply everything pending, oldest version first
          • Lifecycle
            • Grow or shrink it
            • Stop it accepting connections
            • Start it again
            • Move it to another region
          • Backups and replicas
            • Take a backup
            • The backups it has
            • Restore one into it
            • What has been restored into it, and from where
            • Its read copies
            • Add one
          • Policies
            • The catalog
            • One policy
            • What this database is held to
            • Switch a policy on, or change its knobs
            • Switch it off
            • Mark the policies reviewed
            • Evaluate the periodic policies now
            • Who is behind a credential
          • Passwordless
            • The database's passwordless sessions
            • Issue a passwordless session (v1)
            • Revoke a passwordless session
            • Bind a session to a device key
            • Issue a v2 session for a host to bind
            • Redeem an enrolment ticket on the host
            • Check a passwordless credential
            • Run one described query under a passwordless credential
          • Database roles
            • The database's roles
            • Define a role
            • One role
            • Change what a role permits
            • Delete a role, and revoke every key granted it
            • Grant a role, which mints a key
            • Who holds a role
            • The api keys bound to a role
          • Pools
            • A database's connection pools, and how busy each is
            • Open another pool
            • Rename a pool or change its size
            • Close a pool
          • Data plane
            • Run a query against a database
            • Several statements, in order, over one connection
            • Is this database answering
            • What the proxy itself is holding
          • Transfers
            • The strategies this account's tier may use
            • Price a transfer without creating it
            • The account's transfer jobs, newest first
            • Create a transfer job
            • One job, and whether its certificate holds
            • Cancel an unfinished job
            • Start a created job, confirming its price
            • Report a job's status (the runner, or the owner's side of a local run)
          • Every database on the account
          • Provision a database
          • Change a database that is already running
          • One database
          • Deprovision it
          • Read or write it
          • Report what it is using
          • The engines this API will provision
          • Where a managed database can be put
      • Teams
        • Teams
          • Members
            • Who is on it
            • Invite somebody
            • Accept an invitation
            • Change somebody's role
            • Remove somebody
          • Projects
            • The projects a team runs
            • Start one
            • Rename a project, or move its environment
            • Delete a project
            • One project, and what is in it
            • Put a database or store in it
            • What is in a project
            • Take one out
          • The teams this account is on
          • Start one
          • The twelve roles, and what each may do
          • Rename a team
          • Close a team
          • One team
          • Hand the team to somebody else
          • Leave a team
      • Schemas
        • Error
        • ValidationErrors
        • Token
        • PolicyCategory
        • PolicySeverity
        • PolicyAction
        • PolicyTrigger
        • PolicyParam
        • Policy
        • PolicyCatalog
        • PolicyAssignment
        • PolicyOutcome
        • PolicyFiring
        • CredentialTrace
        • Relation
        • Restrictions
        • ChildSummary
        • SignupRequest
        • SigninRequest
        • UpdateMeRequest
        • User
        • Address
        • GeoPoint
        • D1Region
        • Usage
        • UsageReport
        • Resource
        • Database
        • DataStore
        • NewDatabase
        • NewDataStore
        • QueryRequest
        • DatabasePrivilege
        • ApiKey
        • DbUser
        • Access
        • AccessRequest
        • DatabaseObject
        • NewDatabaseObject
        • NewMigration
        • SchemaOperation
        • Migration
        • Operation
        • Session
        • AdminPowers
        • Admin
        • AuditEntry
        • TeamRole
        • Conversation
        • ChatMessage
        • TeamSso
        • Team
        • TeamMember
        • SshKey
        • ConnectionInfo
        • InboxAddress
        • InboxMailbox
        • InboxMessageSummary
        • InboxMessage
        • InboxNote
        • Page
        • Quote
        • Plan
        • ApiError
        • CapabilityRefusal
        • KlockErrorCode
        • PageWindow
        • SessionView
        • KlockStepUpRequest
        • KlockOpenRequest
        • KlockOpenedSession
        • UpdateMeResult
        • CapabilitiesView
        • SessionLimits
        • Device
        • DeviceListed
        • DeviceTeamRef
        • DeviceCommand
        • DeviceAuditLine
        • DeviceActionRequest
        • StaffActionRequest
        • ManagedSession
        • SessionRevoked
        • AccessRule
        • AccessRuleRequest
        • BehaviourProfile
        • BehaviourProfileRequest
        • BehaviourProfileSaved
        • BehaviourFinding
        • BehaviourFindingAck
        • StepUpProof
        • Removed
        • MemberLockdownRequest
        • McpClient
        • McpDelegatedView
        • McpToolCall
        • McpForwardRequest
        • PasswordlessScope
        • RoleScope
        • PasswordlessSession
        • PasswordlessTlsMaterial
        • PasswordlessKerberosMaterial
        • ServiceDeviceKeys
        • ServiceSession
        • DatabaseRole
        • TransferEndpoint
        • TransferJobRequest
        • TransferQuote
        • TransferStrategy
        • TransferJob
        • TransferJobAccess
        • Pool
        • PoolAllowance
        • BillingSubscription
        • Invoice
        • BillingContact
        • PaymentMethod
        • UpcomingCharges
        • TeamBilling
        • TeamKerberosRealm
        • TeamSsoDomain
        • TeamSsoResponse
        • StoreConnection
        • BatchFailure
        • ProxyStatus

    Known test gaps

    Tests that exist but are skipped, and why. Each is skipped rather than
    asserted-to-pass so it cannot mask a real defect.

    Unfinished agent-written tests (2026-09-06)#

    Eleven tests were written during a coverage push whose authoring agents were cut
    off mid-file by a rate limit. Their expectations were never reconciled against
    actual behaviour, so it is unknown whether each failure is a wrong expectation or
    a real bug. They are marked it.skip with an UNFINISHED: comment at the call
    site.
    FileSkippedWhat to check
    tests/dialects/duckdb-builders.test.ts3[model, field] order pairs; dropPartition() child-table + metadata cleanup; whether RLS/security policies throw
    tests/dialects/postgres-sql-builders.test.ts1createSequence schema-qualification and option ordering
    tests/cli-io-prompt-keychain.test.ts7keychain backend selection (security vs secret-tool) — likely environment-dependent spawnSync stubbing rather than a product bug
    To resolve one: run it, decide whether the expectation or the code is wrong,
    then either fix the expectation or file the bug and keep it skipped with a
    // BUG: note. Do not simply rewrite the assertion to match current output —
    that is how a silent defect gets frozen in.
    One test from the same batch was resolved: trino-builders.test.ts expected
    CREATE TABLE … "day" DATE from a column declared { type: 'DATEONLY' }. The
    product is correct — a raw string type is passed through verbatim by design,
    and DATEONLY is a DataTypes key, not a SQL type. The test now uses
    DataTypes.DATEONLY() and asserts DATE, which is what actually exercises the
    type mapper.

    Integration suites (pre-existing)#

    13 suites / 510 tests are gated on INTEGRATION=1 and need live services
    (PostgreSQL, MySQL, MariaDB, SQL Server, CockroachDB, ClickHouse, Oracle,
    Elasticsearch, Qdrant, etcd, InfluxDB, Neo4j, Weaviate, ArangoDB). Start them
    with npm run test:db:up, then npm run test:integration. They skip by design
    when docker is not running.

    Where the tests are#

    Counted with ls tests/*.test.ts | wc -l for the root and
    find tests/<dir> -name '*.test.ts' | wc -l for each directory; 648 test files
    in total (find tests -name '*.test.ts' | wc -l). "other" is compliance (2),
    associations, cloudflare, core and extensions (1 each).
    The chart shows that the root directory (cross-cutting suites: models,
    transactions, type mapping, CLI, …) and the per-dialect suites hold most of
    the files; a dialect or store without a file under tests/dialects or
    tests/nosql is one to check before relying on it.

    What changed since 4.8.2#

    The three commits that make up the next release (git log --oneline a3ce5fba..477f13fb: type mapping and the transaction contract, 42 new
    dialects, prorm models pull), grouped by top-level src/ directory with
    git diff --numstat a3ce5fba..477f13fb summed per directory. A chart would be
    dominated by the dialect row, so this is a table.
    AreaFilesLines addedLines removed
    src/dialects9064,1788,793
    src/codegen (new)206,4720
    src/query-builders185,9822,045
    src/*.ts (root modules: prorm.ts, transaction-support.ts, query-pipe.ts, …)225,4191,480
    src/models71,406559
    src/decorators141,025240
    src/compliance5995153
    src/cli10860104
    src/nosql370910
    src/query-optimizers553698
    src/types141092
    src/migrations311416
    everything else under src/1214691
    tests/23959,2131,641
    docs/497,58716

    Related reading#

    Going further — the rest of the reference material
    Architecture — where each area sits
    Modified at 2026-10-04 00:40:16
    Previous
    prorm documentation
    Next
    Architecture
    Built with