---
id: ATS-ACC-PRD-017
scope: CAP-ACC-PRD-017
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-017-01
    title: Missing-setup reads share product selection
    level: api
    proves:
      - BR-CAP-ACC-PRD-017-01
    preconditions: 'Two units have active, inactive and retired products with and without setups.'
    steps: 'List without status, with explicit statuses and with ordinary product filters.'
    expected: 'Only selected products without setups appear, defaulting to active.'
    negative: false
    data_needs: 'Two units have active, inactive and retired products with and without setups.'
    bound_to:
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
        active products with no setup, by name
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
        inactive ones when asked
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers each
        product as the products list does
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#lists
        a product whose setup was deleted
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#filters
        by status: retired, leaving out a retired product with a setup
      - TST-ACC-PRD-025
      - TST-ACC-PRD-037
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the active
      products with no setup, by name
    category: rule
    binding_scope:
      - suite: TST-ACC-PRD-025
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
            active products with no setup, by name
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
            inactive ones when asked
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers each
            product as the products list does
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
          active products with no setup, by name;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
          inactive ones when asked;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers each
          product as the products list does;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#lists
          a product whose setup was deleted;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#filters
          by status: retired, leaving out a retired product with a setup
      - suite: TST-ACC-PRD-037
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#lists
            a product whose setup was deleted
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#filters
            by status: retired, leaving out a retired product with a setup
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
          active products with no setup, by name;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers the
          inactive ones when asked;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#answers each
          product as the products list does;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#lists
          a product whose setup was deleted;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js#filters
          by status: retired, leaving out a retired product with a setup
  - id: ATS-ACC-PRD-017-02
    title: Bulk setup input is bounded
    level: unit
    proves:
      - BR-CAP-ACC-PRD-017-02
    preconditions: One hundred one product fixtures are available.
    steps: 'Submit absent, empty, one-hundred and one-hundred-one setup collections.'
    expected: Only valid nonempty collections within the maximum succeed.
    negative: true
    data_needs: One hundred one product fixtures are available.
    bound_to:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        101 setups before reading any product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#saves
        100 setups in one request
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses a body
        without setups 400
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses more than
        100 setups 400
      - TST-ACC-PRD-036
      - TST-ACC-PRD-025
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
      101 setups before reading any product
    category: boundary
    binding_scope:
      - suite: TST-ACC-PRD-036
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            101 setups before reading any product
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#saves
            100 setups in one request
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          101 setups before reading any product;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#saves
          100 setups in one request;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses a body
          without setups 400;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses more
          than 100 setups 400
      - suite: TST-ACC-PRD-025
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses a
            body without setups 400
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses more
            than 100 setups 400
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          101 setups before reading any product;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#saves
          100 setups in one request;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses a body
          without setups 400;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses more
          than 100 setups 400
  - id: ATS-ACC-PRD-017-03
    title: A later bulk failure undoes earlier writes
    level: unit
    proves:
      - BR-CAP-ACC-PRD-017-03
    preconditions: Some products have setups and others need creation.
    steps: 'Cause a later validation, stale-version, missing-version or lock refusal.'
    expected: The error identifies the failing entry and the entire request persists nothing.
    negative: true
    data_needs: Some products have setups and others need creation.
    bound_to:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        a rule of a later setup naming its position and product, the earlier create rolled back
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        a stale version 409 naming the product, the earlier replacement rolled back
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        a replacement without its version, naming the product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        a setup locked against updates 409, naming the product
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses another
        unit’s account in a later setup 400, naming it, and writes nothing
      - TST-ACC-PRD-036
      - TST-ACC-PRD-025
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
      a rule of a later setup naming its position and product, the earlier create rolled back
    category: failure
    binding_scope:
      - suite: TST-ACC-PRD-036
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            a rule of a later setup naming its position and product, the earlier create rolled back
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            a stale version 409 naming the product, the earlier replacement rolled back
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            a replacement without its version, naming the product
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            a setup locked against updates 409, naming the product
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a rule of a later setup naming its position and product, the earlier create rolled back;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a stale version 409 naming the product, the earlier replacement rolled back;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a replacement without its version, naming the product;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a setup locked against updates 409, naming the product;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses another
          unit’s account in a later setup 400, naming it, and writes nothing
      - suite: TST-ACC-PRD-025
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses
            another unit’s account in a later setup 400, naming it, and writes nothing
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a rule of a later setup naming its position and product, the earlier create rolled back;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a stale version 409 naming the product, the earlier replacement rolled back;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a replacement without its version, naming the product;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a setup locked against updates 409, naming the product;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses another
          unit’s account in a later setup 400, naming it, and writes nothing
  - id: ATS-ACC-PRD-017-04
    title: Bulk input rejects repeated or unavailable products
    level: api
    proves:
      - BR-CAP-ACC-PRD-017-04
    preconditions: Two workspaces provide product fixtures.
    steps: 'Repeat a product, use a missing identity and name another workspace’s product.'
    expected: Each request fails before setup writes survive.
    negative: true
    data_needs: Two workspaces provide product fixtures.
    bound_to:
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#refuses tenant B a bulk
        save naming tenant A’s product as unknown
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        a product named twice, naming both positions
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
        an unknown product 400, naming it, before writing any setup
      - >-
        services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses an
        unknown product 400, naming it
      - TST-ACC-PRD-028
      - TST-ACC-PRD-036
      - TST-ACC-PRD-025
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#refuses tenant B a bulk
      save naming tenant A’s product as unknown
    category: validation
    binding_scope:
      - suite: TST-ACC-PRD-028
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#refuses tenant B a
            bulk save naming tenant A’s product as unknown
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#refuses tenant B a bulk
          save naming tenant A’s product as unknown;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a product named twice, naming both positions;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          an unknown product 400, naming it, before writing any setup;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses an
          unknown product 400, naming it
      - suite: TST-ACC-PRD-036
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            a product named twice, naming both positions
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
            an unknown product 400, naming it, before writing any setup
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#refuses tenant B a bulk
          save naming tenant A’s product as unknown;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a product named twice, naming both positions;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          an unknown product 400, naming it, before writing any setup;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses an
          unknown product 400, naming it
      - suite: TST-ACC-PRD-025
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses an
            unknown product 400, naming it
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#refuses tenant B a bulk
          save naming tenant A’s product as unknown;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          a product named twice, naming both positions;
          services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
          an unknown product 400, naming it, before writing any setup;
          services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js#refuses an
          unknown product 400, naming it
  - id: ATS-ACC-PRD-017-05
    title: Bulk workflows require setup permissions
    level: api
    proves:
      - BR-CAP-ACC-PRD-017-06
    preconditions: 'Reader, product-only and accounting-only callers are available.'
    steps: Request missing-setup reads and bulk saves under each identity.
    expected: 'Readers can list, product-only callers cannot use either action and setup managers can save.'
    negative: true
    data_needs: 'Reader, product-only and accounting-only callers are available.'
    bound_to:
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused listing the
        products without an accounting setup
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused saving
        accounting setups in bulk
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#saves accounting setups
        in bulk
      - >-
        services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#lists the products
        without an accounting setup
      - TST-ACC-PRD-028
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused listing the
      products without an accounting setup
    category: permission
    binding_scope:
      - suite: TST-ACC-PRD-028
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused listing
            the products without an accounting setup
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused saving
            accounting setups in bulk
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#saves accounting
            setups in bulk
          - >-
            services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#lists the products
            without an accounting setup
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused listing the
          products without an accounting setup;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused saving
          accounting setups in bulk;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#saves accounting setups
          in bulk; services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#lists the
          products without an accounting setup
  - id: ATS-ACC-PRD-017-06
    title: Overlapping bulk saves use a common lock order
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-PRD-017-05
      - BR-CAP-ACC-PRD-017-03
    preconditions: Two clients read the same versions of two products with setups.
    steps: Submit concurrent replacements listing those products in opposite input orders.
    expected: >-
      The product locks serialize the requests; one complete group succeeds and stale competing versions
      refuse without a partial group.
    negative: true
    data_needs: Two clients read the same versions of two products with setups.
    bound_to: []
    provenance: proposed
    source: 'services-accounting:modules/products/services/persistence/products.ts:lockProductsInIdOrder'
    binding_scope: []
  - id: ATS-ACC-PRD-017-07
    title: One invalid allocation rolls back a complete setup group
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-PRD-017-03
      - BR-CAP-ACC-PRD-016-06
      - BR-CAP-ACC-PRD-015-08
    preconditions: Two products lack setups; the second proposed setup has fixed shares exceeding its base price.
    steps: >-
      Submit both setups, read both products and the missing-setup list, then correct the allocation and
      retry.
    expected: >-
      The failed group leaves both incomplete; the corrected group sets up both and removes them from
      missing-setup results.
    negative: true
    data_needs: Two products lack setups; the second proposed setup has fixed shares exceeding its base price.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
      a rule of a later setup naming its position and product, the earlier create rolled back;
      services-accounting:modules/products/services/rules/product-rules.ts:listPrice;
      services-accounting:modules/products/services/rules/product-rules.ts:revenueSplitsProblem;
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#leaves
      the previous setup and collections when a rule refuses the replacement
    exercises:
      - CAP-ACC-PRD-017
      - CAP-ACC-PRD-016
      - CAP-ACC-PRD-015
    binding_scope: []
evidence:
  - 'services-accounting:modules/products/services/persistence/product-accounting-setups.ts'
  - 'services-accounting:modules/products/tests/e2e/product-accounting-setups.e2e.spec.js'
  - 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js'
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.queries.integration.spec.js
  - >-
    rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-005-save-many-accounting-setups-at-once.md
coverage:
  rule: covered
  transition: 'gap: FND-ACC-PRD-066'
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-PRD-066'
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: 'gap: FND-ACC-PRD-066'
  interaction: covered
coverage_notes:
  transition:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-066
  edge:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-066
  invariant:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-066
  remaining_obligations:
    reason: >-
      Oppositely ordered overlapping groups, complete allocation-failure interactions and missing-setup read
      races need execution; sequential rollback does not prove concurrent ordering. 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-066
  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-066
related_capabilities:
  - CAP-ACC-PRD-016
workflows:
  - WF-ACC-PRD-005
rule_coverage:
  - rule: BR-CAP-ACC-PRD-017-01
    scenarios:
      - ATS-ACC-PRD-017-01
  - rule: BR-CAP-ACC-PRD-017-02
    scenarios:
      - ATS-ACC-PRD-017-02
  - rule: BR-CAP-ACC-PRD-017-03
    scenarios:
      - ATS-ACC-PRD-017-03
      - ATS-ACC-PRD-017-06
      - ATS-ACC-PRD-017-07
  - rule: BR-CAP-ACC-PRD-017-04
    scenarios:
      - ATS-ACC-PRD-017-04
  - rule: BR-CAP-ACC-PRD-017-06
    scenarios:
      - ATS-ACC-PRD-017-05
interaction_coverage:
  - scenario: ATS-ACC-PRD-017-07
    exercises:
      - CAP-ACC-PRD-017
      - CAP-ACC-PRD-016
      - CAP-ACC-PRD-015
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#refuses
      a rule of a later setup naming its position and product, the earlier create rolled back;
      services-accounting:modules/products/services/rules/product-rules.ts:listPrice;
      services-accounting:modules/products/services/rules/product-rules.ts:revenueSplitsProblem;
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#leaves
      the previous setup and collections when a rule refuses the replacement
state_coverage:
  - model: STATE-ACC-PRD-003
    from: not set up
    to: set up
    scenarios: []
    finding: FND-ACC-PRD-066
    provenance: unknown
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#gives
      the product its accounting summary
  - model: STATE-ACC-PRD-003
    from: set up
    to: set up
    scenarios: []
    finding: FND-ACC-PRD-066
    provenance: unknown
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#answers
      the replaced setup at version 2, its cleared fields left out and every collection replaced
  - model: STATE-ACC-PRD-003
    from: set up
    to: not set up
    scenarios: []
    finding: FND-ACC-PRD-066
    provenance: unknown
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js#unlocks
      a setup locked against updates when the replacement states sys_locked null, then deletes it
permission_coverage:
  - key: accounting.product-accounting.read
    where_checked: api
    scope: tenant
    scenarios:
      - ATS-ACC-PRD-017-05
    finding: null
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused listing the
      products without an accounting setup
  - key: accounting.product-accounting.update
    where_checked: api
    scope: tenant
    scenarios:
      - ATS-ACC-PRD-017-05
    finding: null
    provenance: proposed
    source: >-
      services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused listing the
      products without an accounting setup
---

# Complete accounting setup for a group of products: 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. Oppositely ordered overlapping groups, complete allocation-failure interactions and missing-setup read races need execution; sequential rollback does not prove concurrent ordering. Workflow edges not named by a scenario remain in this finding rather than gaining a binding from shared workflow membership.

## Interactions With Related Capabilities

One invalid allocation rolls back a complete setup group. Two products lack setups; the second proposed setup has fixed shares exceeding its base price. Submit both setups, read both products and the missing-setup list, then correct the allocation and retry. The failed group leaves both incomplete; the corrected group sets up both and removes them from missing-setup results.
