---
id: TST-PFM-QRY-223
title: Platform custom tables
kind: api-lifecycle
product_area: platform
module: queries
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  rhythm-v2-docs: 99376625d3e7ac26936413cfc31a88fba6562464
repository: services-platform
files:
  - modules/queries/tests/e2e/custom-tables.e2e.spec.js
implements:
  - ATS-PFM-QRY-005-01
  - ATS-PFM-QRY-005-02
  - ATS-PFM-QRY-005-03
  - ATS-PFM-QRY-005-04
  - ATS-PFM-QRY-005-05
  - ATS-PFM-QRY-005-06
  - ATS-PFM-QRY-005-07
  - ATS-PFM-QRY-005-09
  - ATS-PFM-QRY-005-10
  - ATS-PFM-QRY-005-12
  - ATS-PFM-QRY-005-13
  - ATS-PFM-QRY-005-14
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: 'The suite’s database fixtures, controlled execution contexts and file-owned external dependency seams.'
evidence:
  - 'services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js'
assertion_bindings:
  - scenario: ATS-PFM-QRY-005-01
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a tenant’s own console
        user every one of them, for not being staff
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a staff caller who holds
        no custom query table key every one of them, for the key
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#admits a staff caller who holds
        only the read key to the reads, and refuses them the writes
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#is refused to a caller who may
        author but not publish, the two being separate keys
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-02
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a second definition
        under the same id, an id being permanent and never reused
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses an id that is not a
        definition id as 400, before anything is written
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-03
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#says what the statement reads
        and the permission a caller would need for it
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#proposes a field for every
        output column but the tenant, each with a key, a label and a data type
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#answers a statement the rules
        refuse as 200 and its problems, an analysis being data and not an error
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-04
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a draft that declares
        parameters as 400, a definition taking only the platform's own placeholders
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses {{min_members}} in the
        statement as an unknown placeholder
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-05
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a preview of any other
        tenant, a customer’s rows needing a staff access grant there is no way to hold
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#answers 503 on analyze, naming
        the setting an operator must put in place
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#still answers the reads, which
        need no tenant at all (the known positive)
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-06
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses the publish as 409
        rather than breaking the query quietly
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#names the change that breaks it,
        by the field key a client would have written
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#publishes once every affected
        query is acknowledged, saying that the change was breaking
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-07
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#lists the definition as a
        dataset of its own, authorized by the dataset the statement reads
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#is not listed to the tenant no
        assignment names, and is not found there
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-09
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#clears the pin at the version
        the caller read, which puts the scope back on the published version
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a pin naming a version
        that was never published, as 400
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a pin written over a
        version of the assignment somebody else has moved on from, as 409
    scope: contributing assertions; the scenario combines multiple files
    provenance: test
  - scenario: ATS-PFM-QRY-005-10
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#deprecates it, which takes it
        out of every picker and leaves it answering
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#disables it, which refuses a run
        of it rather than answering nothing
      - 'services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#restores it to active again'
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-12
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#answers the history, newest
        first, naming the actor and what each step did
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#keeps no statement and no value
        of the data in the history, which is what it is allowed to carry
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-13
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#describes it as a one-to-many
        relationship of the dataset, which is what the Data tab offers
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#answers the joined page, one row
        of the dataset per row of the definition
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#is refused the join by the
        tenant no assignment names, the definition not being a dataset there
    scope: assertions cited by the scenario
    provenance: test
  - scenario: ATS-PFM-QRY-005-14
    source:
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a save at a version
        somebody else has moved on from as 409
      - >-
        services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses a replacement at a stale
        version as 409
    scope: assertions cited by the scenario
    provenance: test
fixture_seams:
  - 'services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js:93'
  - 'services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js:66'
---

# Platform custom tables

## Verification Boundary

The file dispatches requests through the real route table and signed execution contexts against its local fixtures.

## What This Suite Proves

Its assertions check custom tables. The assertion bindings identify the corresponding acceptance examples and retain their original test-title citations.

## What It Does Not Prove

Local execution does not establish deployed queue scheduling, every external provider response or a passing result at the pinned revision.

## Real Dependencies and Test Doubles

The integration fixture and any imported dependency seams define the environment. Database-oriented checks use PostgreSQL; file-owned transport, clock, provider or worker seams isolate the explicitly controlled boundary.

## Must Not Be Doubled

Keep the dispatcher, route requirements and the handler behavior named by the assertions real. Review any new substitutions before treating the same acceptance bindings as unchanged.
