---
id: ATS-ACC-PRD-003
scope: CAP-ACC-PRD-003
product_area: accounting
module: products
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-PRD-003-01
    title: Paging honors limits and continuation
    level: api
    proves:
      - BR-CAP-ACC-PRD-003-01
    preconditions: The catalogue contains more than one page.
    steps: 'Request a small page, follow its cursor and request 201 entries.'
    expected: Pages retain ordering without repeated products and the excessive limit fails.
    negative: true
    data_needs: The catalogue contains more than one page.
    bound_to:
      - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a limit above 200'
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers a page and the next by its
        cursor
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js#answers
        an exactly full last page without more
      - TST-ACC-PRD-030
      - TST-ACC-PRD-041
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a limit above 200'
    category: boundary
    binding_scope:
      - suite: TST-ACC-PRD-030
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a limit above
            200
          - >-
            services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers a page and the next by
            its cursor
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a limit above
          200; services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers a page and the next
          by its cursor;
          services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js#answers
          an exactly full last page without more
      - suite: TST-ACC-PRD-041
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js#answers
            an exactly full last page without more
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a limit above
          200; services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers a page and the next
          by its cursor;
          services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js#answers
          an exactly full last page without more
  - id: ATS-ACC-PRD-003-02
    title: Workspace boundaries hide other products
    level: api
    proves:
      - BR-CAP-ACC-PRD-003-04
    preconditions: Workspace A owns a product and B owns none.
    steps: 'From B, list products, retrieve A’s product and attempt to bundle it.'
    expected: 'B sees no product, retrieval returns not found and the component request fails without changing A.'
    negative: true
    data_needs: Workspace A owns a product and B owns none.
    bound_to:
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404 for
        tenant A’s product
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B an empty
        list of products
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#leaves tenant A’s product
        as it was
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0124.spec.ts#ACT-ACC-0124'
      - >-
        services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses a
        bundle of tenant B including a product only tenant A has
      - TST-ACC-PRD-028
      - TST-ACC-PRD-013
      - TST-ACC-PRD-031
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404 for
      tenant A’s product
    category: permission
    binding_scope:
      - suite: TST-ACC-PRD-028
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404
            for tenant A’s product
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B an
            empty list of products
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#leaves tenant A’s
            product as it was
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404
          for tenant A’s product;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B an
          empty list of products;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#leaves tenant A’s
          product as it was;
          react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0124.spec.ts#ACT-ACC-0124;
          services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses
          a bundle of tenant B including a product only tenant A has
      - suite: TST-ACC-PRD-013
        assertions:
          - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0124.spec.ts#ACT-ACC-0124'
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404
          for tenant A’s product;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B an
          empty list of products;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#leaves tenant A’s
          product as it was;
          react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0124.spec.ts#ACT-ACC-0124;
          services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses
          a bundle of tenant B including a product only tenant A has
      - suite: TST-ACC-PRD-031
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses
            a bundle of tenant B including a product only tenant A has
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404
          for tenant A’s product;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B an
          empty list of products;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#leaves tenant A’s
          product as it was;
          react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0124.spec.ts#ACT-ACC-0124;
          services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js#refuses
          a bundle of tenant B including a product only tenant A has
  - id: ATS-ACC-PRD-003-03
    title: Setup reading has separate authority
    level: api
    proves:
      - BR-CAP-ACC-PRD-003-05
    preconditions: A reader and a product-only manager are available.
    steps: Read the product and its full setup using each identity.
    expected: Product reads succeed but the manager cannot retrieve setup information.
    negative: true
    data_needs: A reader and a product-only manager are available.
    bound_to:
      - 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads the products'
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused reading a
        product’s accounting setup
      - TST-ACC-PRD-028
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads the products'
    category: permission
    binding_scope:
      - suite: TST-ACC-PRD-028
        assertions:
          - 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads the products'
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused reading a
            product’s accounting setup
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads the products;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused reading a
          product’s accounting setup
  - id: ATS-ACC-PRD-003-04
    title: Read-only editors permit inspection
    level: browser
    proves:
      - BR-CAP-ACC-PRD-003-06
    preconditions: A read-only persona can reach an existing product.
    steps: Open the editor and inspect its controls.
    expected: 'Fields are disabled, Save is unavailable and no mutation is sent.'
    negative: true
    data_needs: A read-only persona can reach an existing product.
    bound_to:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0122.spec.ts#ACT-ACC-0122'
      - TST-ACC-PRD-012
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0122.spec.ts#ACT-ACC-0122'
    category: permission
    binding_scope:
      - suite: TST-ACC-PRD-012
        assertions:
          - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0122.spec.ts#ACT-ACC-0122'
        provenance: test
        source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0122.spec.ts#ACT-ACC-0122'
  - id: ATS-ACC-PRD-003-05
    title: Product reads reflect setup and default changes
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-PRD-003-03
      - BR-CAP-ACC-PRD-015-10
      - BR-CAP-ACC-PRD-018-01
    preconditions: A product has its own setup class and its kind has a different default.
    steps: >-
      Read the product, remove its setup, remove the kind default, and repeat the product read after each
      action.
    expected: The resolved class and accounting summary track the remaining configuration in priority order.
    negative: true
    data_needs: A product has its own setup class and its kind has a different default.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js#maps
      a product whole: every column, its prices, its components and its accounting summary;
      services-accounting:modules/products/tests/e2e/product-accounting.e2e.spec.js#deletes it, leaving the
      product with accounting: null;
      services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#lets the product’s own
      accounting setup class win over the type default
    exercises:
      - CAP-ACC-PRD-003
      - CAP-ACC-PRD-015
      - CAP-ACC-PRD-018
    binding_scope: []
evidence:
  - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0122.spec.ts'
  - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0124.spec.ts'
  - 'react-console:components/accounting-config/products/product-editor-page.tsx'
  - 'services-accounting:modules/products/aws/api/products.routes.ts'
  - 'services-accounting:modules/products/services/persistence/products.ts'
  - 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js'
  - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - 'services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js'
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js
coverage:
  rule: 'gap: FND-ACC-PRD-052'
  transition: not-applicable
  validation: 'gap: FND-ACC-PRD-052'
  permission: covered
  edge: 'gap: FND-ACC-PRD-052'
  failure: 'gap: FND-ACC-PRD-052'
  boundary: covered
  concurrency: 'gap: FND-ACC-PRD-052'
  invariant: 'gap: FND-ACC-PRD-052'
  interaction: covered
coverage_notes:
  rule:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-052
  transition:
    reason: Catalogue inspection changes no record state.
    provenance: documented
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a limit above 200'
  validation:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-052
  edge:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-052
  failure:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-052
  concurrency:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-052
  invariant:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-052
  remaining_obligations:
    reason: >-
      Reads during setup or default mutations, complete filter combinations, cursor boundaries and permission
      combinations need fuller scenario coverage. Workflow edges not named by a scenario remain in this
      finding rather than gaining a binding from shared workflow membership.
    provenance: unknown
    source: FND-ACC-PRD-052
  meaning:
    reason: >-
      Covered means a specification scenario exists in this category. Executable coverage and run results
      remain independent.
    provenance: documented
    source: 'rhythm-v2-docs:specs/CONVENTIONS.md#9.10 Capability Test Specification (`ATS`, under `design/tests/`)'
coverage_findings:
  - FND-ACC-PRD-052
related_capabilities:
  - CAP-ACC-PRD-015
  - CAP-ACC-PRD-018
workflows: []
rule_coverage:
  - rule: BR-CAP-ACC-PRD-003-01
    scenarios:
      - ATS-ACC-PRD-003-01
  - rule: BR-CAP-ACC-PRD-003-04
    scenarios:
      - ATS-ACC-PRD-003-02
  - rule: BR-CAP-ACC-PRD-003-05
    scenarios:
      - ATS-ACC-PRD-003-03
  - rule: BR-CAP-ACC-PRD-003-06
    scenarios:
      - ATS-ACC-PRD-003-04
interaction_coverage:
  - scenario: ATS-ACC-PRD-003-05
    exercises:
      - CAP-ACC-PRD-003
      - CAP-ACC-PRD-015
      - CAP-ACC-PRD-018
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.queries.integration.spec.js#maps
      a product whole: every column, its prices, its components and its accounting summary;
      services-accounting:modules/products/tests/e2e/product-accounting.e2e.spec.js#deletes it, leaving the
      product with accounting: null;
      services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#lets the product’s own
      accounting setup class win over the type default
permission_coverage:
  - key: accounting.products.read
    where_checked: api
    scope: tenant
    scenarios:
      - ATS-ACC-PRD-003-02
      - ATS-ACC-PRD-003-03
      - ATS-ACC-PRD-003-04
    finding: null
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#answers tenant B 404 for
      tenant A’s product; services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads
      the products;
      react-console:components/accounting-config/products/product-editor-page.tsx:ProductEditorPage
invariant_coverage:
  - invariant: INV-DOM-ACC-PRD-001-16
    scenarios:
      - ATS-ACC-PRD-003-02
    finding: FND-ACC-PRD-052
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#answers
      another tenant’s product as absent and leaves it
    note: >-
      The mapped scenario exercises the related behavior; the complete invariant statement still needs
      dedicated proof.
---

# Locate products and inspect their configuration: Capability Test Specification

## Coverage

The frontmatter lists a proof scenario or finding for every required rule and records each applicable category. Scenario coverage describes what to check; bindings identify the assertions that already exist, and execution results remain unverified. Reads during setup or default mutations, complete filter combinations, cursor boundaries and permission combinations need fuller scenario coverage. Workflow edges not named by a scenario remain in this finding rather than gaining a binding from shared workflow membership.

## Interactions With Related Capabilities

Product reads reflect setup and default changes. A product has its own setup class and its kind has a different default. Read the product, remove its setup, remove the kind default, and repeat the product read after each action. The resolved class and accounting summary track the remaining configuration in priority order.
