---
id: TST-ACC-PRD-030
title: Catalogue API lifecycle
kind: api-lifecycle
product_area: accounting
module: products
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
repository: services-accounting
files:
  - modules/products/tests/e2e/products.e2e.spec.js
implements:
  - ATS-ACC-PRD-001-02
  - ATS-ACC-PRD-002-01
  - ATS-ACC-PRD-002-03
  - ATS-ACC-PRD-002-05
  - ATS-ACC-PRD-003-01
  - ATS-ACC-PRD-004-01
  - ATS-ACC-PRD-004-03
  - ATS-ACC-PRD-004-04
  - ATS-ACC-PRD-005-02
  - ATS-ACC-PRD-005-04
  - ATS-ACC-PRD-006-01
  - ATS-ACC-PRD-006-08
  - ATS-ACC-PRD-008-01
  - ATS-ACC-PRD-008-07
  - ATS-ACC-PRD-008-09
  - ATS-ACC-PRD-011-01
  - ATS-ACC-PRD-011-04
  - FAS-ACC-PRD-02-05
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
estimation_note: Planning estimate; no runtime measurement is claimed.
isolation: 'Suite-named local workspaces, isolated fixture records and explicit cleanup or rollback.'
evidence:
  - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
assertion_bindings:
  - scenario: ATS-ACC-PRD-001-02
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers the three Accounting types
        first, in display order, with their labels and legacy types
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers the domains’ types after
        them, each with its owning service and extension table, the Events ones inactive
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-002-01
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 naming id for an id
        that is not a configuration id
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-002-03
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to the same id under
        another type: a product id is unique across every type
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-002-05
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#creates a Donation Product with no
        prices and the variable pricing model
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-003-01
    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'
  - scenario: ATS-ACC-PRD-004-01
    assertions:
      - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 409 to a stale version'
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-004-03
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a body whose id is
        not the path’s: an id never changes
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 409 to a change of
        business unit
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-004-04
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 409 to replacing a retired
        product
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-005-02
    assertions:
      - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 409 to retiring it again'
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-005-04
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to a lifecycle request
        without the version read
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-006-01
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 409 to deleting a product
        a bundle includes
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-006-08
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 409 to deleting a business
        unit that still has products
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-008-01
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to prices on a
        Donation Product
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-008-07
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to overlapping price
        periods, leaving the prices as they were
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-008-09
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#replaces the prices as a whole,
        with their effective periods
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-011-01
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 to bundled products on
        a Legacy Product
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
  - scenario: ATS-ACC-PRD-011-04
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products.e2e.spec.js#answers 400 when a part would
        include the bundle that includes it
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
coverage_note: Scenario references name existing assertion evidence; broader unexecuted variants remain findings.
---

# Catalogue API lifecycle

## Verification Boundary

Requests pass through the local enforcing Accounting dispatcher, request mapping and persistence to PostgreSQL. This is local API evidence rather than a deployed network run.

## What This Suite Proves

The enforcing API creates, reads, filters, replaces, retires, restores and deletes products with validated grids and bundle dependencies.

## What It Does Not Prove

Local execution does not prove deployed infrastructure, downstream purchase behavior, real domain extension completion or atomic remote-template recovery.

## Real Dependencies and Test Doubles

The composed handler, permission evaluation and Accounting database are real. Local signing keys and Platform workspace registration stand in for external infrastructure.

## Must Not Be Doubled

Do not double PostgreSQL, row-level security, transaction boundaries, constraints or the persistence implementation when claiming these local guarantees.
