---
id: FAS-PFM-QRY-03
feature: FEAT-PFM-QRY-03
product_area: platform
module: queries
revision: 1
status: proposed
product_intent: proposed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  rhythm-v2-docs: 99376625d3e7ac26936413cfc31a88fba6562464
capabilities:
  - CAP-PFM-QRY-009
  - CAP-PFM-QRY-010
scenarios:
  - id: FAS-PFM-QRY-03-01
    title: A retained view drives a bounded record review
    kind: behaviour
    exercises:
      - CAP-PFM-QRY-009
      - CAP-PFM-QRY-010
    relies_on:
      - ATS-PFM-QRY-009-03
      - ATS-PFM-QRY-010-03
      - ATS-PFM-QRY-010-09
    preconditions: A contact recipe supports a sorted view with three fixture records.
    steps: 'Save the view, open its middle record, inspect neighbours and select all matching records.'
    expected: >-
      Navigation and selection use the view’s ordered base records and return identities rather than copied
      values.
    negative: false
    data_needs: 'Use an isolated workspace, named fixture records and the caller grants described by the prerequisites.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-views-api.e2e.spec.js#refuses a definition
        naming a field the dataset has not got as 400
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-navigation-api.e2e.spec.js#answers the record’s
        position and the total, which is what "2 of 12" is drawn from
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-navigation-api.e2e.spec.js#answers every
        matching record id, in the query’s own order
  - id: FAS-PFM-QRY-03-02
    title: Changing a list preserves retained navigation context
    kind: interaction
    exercises:
      - CAP-PFM-QRY-009
      - CAP-PFM-QRY-010
    relies_on:
      - ATS-PFM-QRY-009-10
      - ATS-PFM-QRY-010-01
      - ATS-PFM-QRY-010-05
    preconditions: A view has a live navigation session over a retained identity window.
    steps: >-
      Change the view’s criteria in another tab, edit one retained record and navigate inside the earlier
      session.
    expected: >-
      The earlier session retains its stored window and return arrangement; a newly started session uses the
      revised view.
    negative: false
    data_needs: 'Use an isolated workspace, named fixture records and the caller grants described by the prerequisites.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-views-api.e2e.spec.js#refuses a stale version as
        409
      - >-
        services-platform:modules/explorer/services/navigation/navigation-sessions.ts:locateInNavigationSession
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-navigation-api.e2e.spec.js#answers no position
        for a record that is not in the frozen set, rather than refusing
  - id: FAS-PFM-QRY-03-03
    title: Expired navigation still returns to the list
    kind: lifecycle
    exercises:
      - CAP-PFM-QRY-009
      - CAP-PFM-QRY-010
    relies_on:
      - ATS-PFM-QRY-009-11
      - ATS-PFM-QRY-010-07
    preconditions: A pinned view is referenced by an expired session and its cleanup cutoff has not passed.
    steps: 'Read the expired session, return to the list, then start a new session after the cleanup cutoff.'
    expected: >-
      Return context remains available before cleanup; sufficiently old sessions are removed without rewriting
      personal view preferences.
    negative: false
    data_needs: 'Use an isolated workspace, named fixture records and the caller grants described by the prerequisites.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-preferences-api.e2e.spec.js#answers the whole
        default arrangement: whose it is, which Explorer, nothing pinned and version zero
      - >-
        services-platform:modules/explorer/tests/integration/services/persistence/explorer-navigation-sessions.integration.spec.js#expires
        twelve hours after the execution’s own clock, as ISO 8601 UTC
  - id: FAS-PFM-QRY-03-04
    title: Sharing a view preserves owner and dataset boundaries
    kind: permission
    exercises:
      - CAP-PFM-QRY-009
      - CAP-PFM-QRY-010
    relies_on:
      - ATS-PFM-QRY-009-05
      - ATS-PFM-QRY-009-06
      - ATS-PFM-QRY-010-04
      - ATS-PFM-QRY-010-10
    preconditions: Two colleagues can use a shared contact view but only one creates a session.
    steps: >-
      Read the view as the colleague, attempt an unauthorized change, read the other person’s session and
      remove dataset access before selection.
    expected: >-
      Shared discovery grants neither maintenance nor session ownership; selection fails after dataset access
      is withdrawn.
    negative: true
    data_needs: 'Use an isolated workspace, named fixture records and the caller grants described by the prerequisites.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-views-api.e2e.spec.js#answers 404, not 403, for
        another person’s private view
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-views-api.e2e.spec.js#refuses sharing a view
        without the share permission as 403
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-navigation-api.e2e.spec.js#answers 404, not 403,
        to a colleague of the same tenant
      - >-
        services-platform:modules/explorer/tests/e2e/explorer-navigation-api.e2e.spec.js#refuses to freeze one
        for a caller holding the surface key and not the dataset key, as 403
  - id: FAS-PFM-QRY-03-05
    title: Repeating joins cannot inflate a list population
    kind: regression
    exercises:
      - CAP-PFM-QRY-009
      - CAP-PFM-QRY-010
    relies_on:
      - ATS-PFM-QRY-009-02
      - ATS-PFM-QRY-010-08
    preconditions: A candidate recipe repeats base contacts through a collection join.
    steps: Try saving the recipe as a view and starting navigation or selection from that anchor.
    expected: >-
      The incompatible join is identified before duplicate base identities can become list positions or bulk
      work.
    negative: false
    data_needs: 'Use an isolated workspace, named fixture records and the caller grants described by the prerequisites.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/explorer/tests/integration/services/definitions/recipe-anchors.integration.spec.js#refuses
        a recipe whose joins answer a base record once per child
      - 'services-platform:docs/explorer.md#4. Navigating a result set'
evidence:
  - 'rhythm-v2-docs:specs/platform/queries/planning/features/FEAT-PFM-QRY-03-record-explorer.md'
  - >-
    rhythm-v2-docs:specs/platform/queries/planning/capabilities/CAP-PFM-QRY-009-keep-and-share-the-explorer-views-a-person-works-from.md
  - >-
    rhythm-v2-docs:specs/platform/queries/planning/capabilities/CAP-PFM-QRY-010-walk-a-list-record-by-record-and-act-on-every-record-it.md
---

# Working with record lists: Feature Acceptance Suite

## What the Feature Must Do as a Whole

People return to a useful list, move through its records and pass a bounded selection to another application. The examples connect retained arrangements with navigation context and current dataset access.

## Interactions Between Capabilities

Changing a list preserves retained navigation context. The combined example checks the dependent outcome after another capability changes its source or authority. The lifecycle and regression examples revisit retained state after a later change rather than repeating individual rule rows.

## Regression Record

| Revision | Change | Scenario | Why |
|---|---|---|---|
| 1 | initial | all | Establish the cumulative feature baseline from the pinned specification and executable assertions. |
