---
id: TST-ACC-PRD-029
title: Common-product and tax-default 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-shared-base.e2e.spec.js
implements:
  - ATS-ACC-PRD-002-04
  - ATS-ACC-PRD-002-12
  - ATS-ACC-PRD-007-02
  - ATS-ACC-PRD-018-01
  - ATS-ACC-PRD-018-02
  - ATS-ACC-PRD-018-03
  - ATS-ACC-PRD-018-04
  - ATS-ACC-PRD-018-05
  - ATS-ACC-PRD-018-07
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-shared-base.e2e.spec.js'
assertion_bindings:
  - scenario: ATS-ACC-PRD-002-04
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#refuses a type
        registered inactive (an Events type), 400 with its sentence
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-002-12
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#refuses a body that
        names custom fields, 400 naming the property
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-007-02
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#creates a membership
        package for a console caller, answering its type, the pricing model and no custom fields
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-018-01
    assertions:
      - >-
        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
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#sets a default for
        membership packages, after which a package without a setup class is taxed under it
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-018-02
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#refuses an unknown
        type and an unknown class, 400 with their sentences
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-018-03
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#replaces the default
        at the version read, lists it, and refuses a stale version 409
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-018-04
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#removes the default,
        200 then 404, after which a package without a setup class is taxed under none
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-018-05
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#refuses deleting a tax
        class only a default names, 409 with the sentence, and allows it once the default is gone
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
  - scenario: ATS-ACC-PRD-018-07
    assertions:
      - >-
        services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js#refuses a caller with
        product rights alone (tax configuration needs the tax-classes keys)
    provenance: test
    source: 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
coverage_note: Scenario references name existing assertion evidence; broader unexecuted variants remain findings.
---

# Common-product and tax-default 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 checks common domain kinds, derived pricing, custom-field refusal, tax precedence and default lifecycle permissions.

## 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.
