---
id: ATS-PFM-QRY-005
scope: CAP-PFM-QRY-005
product_area: platform
module: queries
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  rhythm-v2-docs: 99376625d3e7ac26936413cfc31a88fba6562464
scenarios:
  - id: ATS-PFM-QRY-005-01
    title: Custom-table powers remain divided
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-01
    preconditions: 'Staff callers have separate read, author and publish grants, and a customer caller has console access.'
    steps: 'Exercise reading, drafting and publication with each caller.'
    expected: >-
      Only the appropriate powers succeed; customers cannot reach the staff routes and authors cannot publish
      alone.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: permission
  - id: ATS-PFM-QRY-005-02
    title: Definition identities cannot be reused
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-02
      - INV-DOM-PFM-QRY-001-07
    preconditions: A custom definition is already registered.
    steps: Create its identity again and try an invalid identity form.
    expected: Duplicate identity returns 409; invalid form returns 400 without a write.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: invariant
  - id: ATS-PFM-QRY-005-03
    title: Analysis returns structured problems
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-03
    preconditions: Valid and unsafe statements are available for drafts.
    steps: Analyze both statements.
    expected: >-
      The valid analysis supplies access and field information; unsafe analysis succeeds as a response
      containing problems.
    negative: false
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: validation
  - id: ATS-PFM-QRY-005-04
    title: Only supported placeholders enter drafts
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-04
    preconditions: A custom-table draft exists.
    steps: Save declared customer parameters and an unsupported placeholder.
    expected: Both saves are refused with 400.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: validation
  - id: ATS-PFM-QRY-005-05
    title: Validation configuration limits statement work
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-05
    preconditions: One environment has a validation workspace and another does not.
    steps: >-
      Preview another workspace and invoke analysis, draft validation, publication and preview without
      configuration.
    expected: >-
      The foreign preview is refused, missing configuration returns unavailable, and registry reads remain
      usable.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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)
      - TST-PFM-QRY-223
    provenance: test
    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
    category: failure
  - id: ATS-PFM-QRY-005-06
    title: Breaking publication requires acknowledgment
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-06
    preconditions: A saved question uses a column removed by the next custom-table draft.
    steps: 'Publish without acknowledgment, then acknowledge and retry.'
    expected: The first attempt reports dependencies with 409; the second records a breaking publication.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    source: >-
      services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js#refuses the publish as 409 rather
      than breaking the query quietly
    category: interaction
  - id: ATS-PFM-QRY-005-07
    title: Assignments limit dataset existence
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-07
      - INV-DOM-PFM-QRY-001-10
    preconditions: One published definition covers only a designated workspace.
    steps: List and describe it in covered and uncovered workspaces.
    expected: It is usable where assigned and missing elsewhere.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: boundary
  - id: ATS-PFM-QRY-005-08
    title: Statement permissions constrain readers
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-08
    preconditions: An assigned definition reads organizations and a reader lacks that grant.
    steps: Inspect its catalog entry and execute it.
    expected: It is unauthorized and execution returns 403 naming the missing permission.
    negative: true
    data_needs: Prepare isolated fixtures for the states described here.
    bound_to: []
    provenance: proposed
    source: 'services-platform:docs/queries/semantic-query-layer.md#14.2 What resolves a custom dataset'
    category: permission
  - id: ATS-PFM-QRY-005-09
    title: Pin validation and precedence
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-09
    preconditions: 'Published versions have platform-wide, customer and workspace assignments with overlapping pins.'
    steps: 'Exercise set and clear refusals, then resolve competing pins and an unpinned workspace assignment.'
    expected: >-
      Unpublished and stale changes are refused. The most specific covering pin wins; an unpinned assignment
      leaves a broader pin effective.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/assignment-visibility.spec.ts#prefers
        its own pin to its customer’s, and its customer’s to the platform-wide one
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/assignment-visibility.spec.ts#keeps
        its customer’s pin when its own assignment pins nothing
      - TST-PFM-QRY-223
      - TST-PFM-QRY-372
    provenance: test
    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
    category: transition
    binding_note: >-
      The cited suites contribute separate assertions. The complete combined example is not a single
      executable journey.
  - id: ATS-PFM-QRY-005-10
    title: Deprecation and disabling have distinct effects
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-10
    preconditions: An assigned definition is active.
    steps: 'Deprecate, disable and restore it while checking continued execution.'
    expected: >-
      Deprecation keeps execution available without picker presence; disabling refuses; restoration restores
      use.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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'
      - TST-PFM-QRY-223
    provenance: test
    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
    category: transition
  - id: ATS-PFM-QRY-005-11
    title: Fingerprint mismatch prevents execution
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-11
      - INV-DOM-PFM-QRY-001-09
    preconditions: Stored publication text no longer matches its publication fingerprint.
    steps: Run the assigned custom dataset.
    expected: An integrity refusal identifies the definition while hiding statement text and records the mismatch.
    negative: true
    data_needs: Prepare isolated fixtures for the states described here.
    bound_to: []
    provenance: proposed
    source: 'services-platform:docs/queries/semantic-query-layer.md#14.2 What resolves a custom dataset'
    category: invariant
  - id: ATS-PFM-QRY-005-12
    title: History explains actions without sensitive content
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-12
      - INV-DOM-PFM-QRY-001-11
    preconditions: A definition has undergone several lifecycle actions.
    steps: Read its history.
    expected: 'Entries identify actor and action newest first, without statement text or record values.'
    negative: false
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: invariant
  - id: ATS-PFM-QRY-005-13
    title: Reverse relationships follow assignment
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-13
    preconditions: A definition exposes an organization reference.
    steps: Describe and join it from Organizations in covered and uncovered workspaces.
    expected: The covered workspace gets the relationship and result; the uncovered one is refused.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: interaction
  - id: ATS-PFM-QRY-005-14
    title: Concurrent custom-table changes conflict
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-14
    preconditions: Another writer has advanced the definition or draft version.
    steps: Save the draft and presentation against their earlier versions.
    expected: Both stale writes return 409.
    negative: true
    data_needs: Use the existing binding’s controlled fixture data.
    bound_to:
      - >-
        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
      - TST-PFM-QRY-223
    provenance: test
    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
    category: concurrency
  - id: ATS-PFM-QRY-005-15
    title: Revalidation records meaningful health changes
    level: api
    proves:
      - BR-CAP-PFM-QRY-005-15
    preconditions: 'Published and pinned versions, including a definition that later loses a database grant.'
    steps: 'Run revalidation twice, remove and restore a required grant, then run with no validation workspace.'
    expected: >-
      All runnable versions are checked; history records failure and recovery without sensitive content,
      repeated unchanged checks add no entry, and absent configuration causes a clean skip.
    negative: true
    data_needs: Use the existing suite’s controlled fixtures.
    bound_to:
      - >-
        services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js#checks
        every published version and every version an assignment pins, each once
      - >-
        services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js#writes
        no row at all, because the day’s revalidated row is already there
      - >-
        services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js#never
        writes the statement or a column name into the history
      - >-
        services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js#records
        that it came back, so the history reads as the moments it broke and recovered
      - >-
        services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js#says
        it skipped, and checks nothing
      - TST-PFM-QRY-250
    provenance: test
    source: >-
      services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js#checks
      every published version and every version an assignment pins, each once
    category: transition
  - id: ATS-PFM-QRY-005-16
    title: Unsafe statement forms fail analysis
    level: unit
    proves:
      - BR-CAP-PFM-QRY-005-16
    preconditions: 'A permitted read statement and variants containing writes, locks, recursion or forbidden access.'
    steps: Analyze the positive case and each unsafe variant.
    expected: The permitted read passes; each unsafe variant returns a problem identifying the refusal.
    negative: true
    data_needs: Use the existing suite’s controlled fixtures.
    bound_to:
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#accepts
        a minimal one-relation SELECT, so the refusals below are not vacuous (the known positive)
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#refuses
        SELECT … INTO, naming the table it would write
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#refuses
        FOR UPDATE, naming the locking strength
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#refuses
        WITH RECURSIVE, which only an untagged field carries
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#refuses
        the platform schema, whatever the allowlist says
      - >-
        services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#refuses
        set_config, which would move the statement into another tenant
      - TST-PFM-QRY-371
    provenance: test
    source: >-
      services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts#accepts
      a minimal one-relation SELECT, so the refusals below are not vacuous (the known positive)
    category: validation
  - id: ATS-PFM-QRY-005-17
    title: A tailored dataset disappears from new choices before execution stops
    category: interaction
    level: api
    exercises:
      - CAP-PFM-QRY-001
      - CAP-PFM-QRY-005
    proves:
      - BR-CAP-PFM-QRY-001-02
      - BR-CAP-PFM-QRY-005-10
    preconditions: One assigned tailored dataset supplies a retained question.
    steps: 'Read its description, deprecate it, reopen the retained question, then disable it and run again.'
    expected: >-
      Deprecation removes the new choice while the retained question still resolves; disabling produces the
      explicit refusal.
    negative: true
    data_needs: >-
      Use an isolated workspace with the described source records, access grants and a surviving control
      workspace.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/queries/tests/e2e/datasets.e2e.spec.js#refuses a dataset the caller holds no
        query permission for as 403
      - 'services-platform:modules/queries/services/custom-tables/assignment-visibility.ts:visibleCustomTables'
  - id: ATS-PFM-QRY-005-18
    title: A breaking publication waits for retained questions
    category: interaction
    level: api
    exercises:
      - CAP-PFM-QRY-005
      - CAP-PFM-QRY-006
    proves:
      - BR-CAP-PFM-QRY-005-06
      - BR-CAP-PFM-QRY-006-10
    preconditions: A saved question selects a field from an assigned tailored dataset.
    steps: >-
      Publish a draft removing that field without acknowledgment, then acknowledge the named dependency and
      retry.
    expected: >-
      The first attempt identifies the saved question without publishing; the acknowledged attempt publishes
      the revised version.
    negative: false
    data_needs: >-
      Use an isolated workspace with the described source records, access grants and a surviving control
      workspace.
    bound_to: []
    provenance: proposed
    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/saved-queries.e2e.spec.js#refuses a body whose definition
        cannot be run as written as 400
evidence:
  - 'Pinned reference: services-platform:docs/queries/semantic-query-layer.md'
  - 'Pinned reference: services-platform:modules/queries/tests/e2e/custom-tables.e2e.spec.js'
  - >-
    Pinned reference:
    services-platform:modules/queries/tests/integration/services/custom-tables/custom-table-revalidation.integration.spec.js
  - >-
    Pinned reference:
    services-platform:modules/queries/tests/unit/services/custom-tables/analyze-sql-refusals.spec.ts
  - >-
    Pinned reference:
    services-platform:modules/queries/tests/unit/services/custom-tables/assignment-visibility.spec.ts
coverage:
  rule: 'gap: FND-PFM-QRY-055'
  transition: 'gap: FND-PFM-QRY-055'
  validation: covered
  permission: covered
  edge: 'gap: FND-PFM-QRY-055'
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: 'gap: FND-PFM-QRY-055'
  interaction: covered
coverage_findings:
  - FND-PFM-QRY-055
transition_obligations:
  - state: STATE-PFM-QRY-001
    transition: 1
    from: active
    to: deprecated
    trigger: Staff deprecate the definition using its read version.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:deprecate'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 2
    from: active
    to: disabled
    trigger: Staff disable the definition.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:disable'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 3
    from: deprecated
    to: disabled
    trigger: Staff disable a deprecated definition.
    source: 'services-platform:modules/queries/services/persistence/custom-query-tables.ts:setCustomQueryTableStatus'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 4
    from: deprecated
    to: active
    trigger: Staff restore a deprecated definition.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:restore'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 5
    from: disabled
    to: active
    trigger: Staff restore a disabled definition.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:restore'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 6
    from: draft version
    to: published version
    trigger: Staff publish the analyzed draft.
    source: 'services-platform:modules/queries/services/persistence/custom-query-tables.ts:publishCustomTableDraft'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 7
    from: published version
    to: superseded version
    trigger: Another draft is published.
    source: 'services-platform:db/migrations/0065_custom_query_tables.sql:custom_query_table_versions_immutable'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 8
    from: active
    to: active
    trigger: Staff set the requested definition availability.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:restore'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 9
    from: deprecated
    to: deprecated
    trigger: Staff set the requested definition availability.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:deprecate'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 10
    from: disabled
    to: deprecated
    trigger: Staff set the requested definition availability.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:deprecate'
    gap: FND-PFM-QRY-055
  - state: STATE-PFM-QRY-001
    transition: 11
    from: disabled
    to: disabled
    trigger: Staff set the requested definition availability.
    source: 'services-platform:modules/queries/services/custom-tables/custom-table-library.ts:disable'
    gap: FND-PFM-QRY-055
unproved_rules: []
---

# Provide a customer with a tailored dataset: Capability Test Specification

## Coverage

| Rule | Scenario or Finding |
|---|---|
| `BR-CAP-PFM-QRY-005-01` | `ATS-PFM-QRY-005-01` |
| `BR-CAP-PFM-QRY-005-02` | `ATS-PFM-QRY-005-02` |
| `BR-CAP-PFM-QRY-005-03` | `ATS-PFM-QRY-005-03` |
| `BR-CAP-PFM-QRY-005-04` | `ATS-PFM-QRY-005-04` |
| `BR-CAP-PFM-QRY-005-05` | `ATS-PFM-QRY-005-05` |
| `BR-CAP-PFM-QRY-005-06` | `ATS-PFM-QRY-005-06`, `ATS-PFM-QRY-005-18` |
| `BR-CAP-PFM-QRY-005-07` | `ATS-PFM-QRY-005-07`, `ATS-PFM-QRY-005-17` |
| `BR-CAP-PFM-QRY-005-08` | `ATS-PFM-QRY-005-08` |
| `BR-CAP-PFM-QRY-005-09` | `ATS-PFM-QRY-005-09` |
| `BR-CAP-PFM-QRY-005-10` | `ATS-PFM-QRY-005-10` |
| `BR-CAP-PFM-QRY-005-11` | `ATS-PFM-QRY-005-11` |
| `BR-CAP-PFM-QRY-005-12` | `ATS-PFM-QRY-005-12` |
| `BR-CAP-PFM-QRY-005-13` | `ATS-PFM-QRY-005-13` |
| `BR-CAP-PFM-QRY-005-14` | `ATS-PFM-QRY-005-14` |
| `BR-CAP-PFM-QRY-005-15` | `ATS-PFM-QRY-005-15` |
| `BR-CAP-PFM-QRY-005-16` | `ATS-PFM-QRY-005-16` |

## Interactions With Related Capabilities

The combined examples change a source, its audience or its retained state before checking the dependent outcome. Unbound examples remain proposed, and the coverage finding retains design obligations that these examples do not establish.

| Related Capability | Scenario |
|---|---|
| Journey dependency | `ATS-PFM-QRY-005-06` |
| Journey dependency | `ATS-PFM-QRY-005-13` |
| `CAP-PFM-QRY-001` | `ATS-PFM-QRY-005-17` |
| `CAP-PFM-QRY-006` | `ATS-PFM-QRY-005-18` |

## Evidence and Binding Limits

The source revisions pin the inspected assertions. A test binding identifies written assertions, and does not establish a successful run or approval of the expected behavior.
