---
id: TST-ACC-PRD-042
title: Shared product ownership and kind tax defaults
kind: integration
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/integration/services/persistence/products.shared-base.integration.spec.js
implements:
  - ATS-ACC-PRD-002-12
  - ATS-ACC-PRD-007-01
  - 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-06
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 3
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/integration/services/persistence/products.shared-base.integration.spec.js
assertion_bindings:
  - scenario: ATS-ACC-PRD-002-12
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#answers
        no custom_fields property on a read
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#has
        no table of product custom field values
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-007-01
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        Commerce creating a membership package, naming the owner, the type and the caller
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        a service creating an Accounting-owned type
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#lets
        Commerce create merchandise, with the capabilities its seed row declares
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        another service replacing, retiring, reactivating or deleting the package, and lets its owner
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-007-02
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#lets
        Membership create a membership package, and a console caller too
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        a product of a type registered inactive (the Events types) for every caller
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-018-01
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#resolves
        each product’s class with its source, inside a transaction
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#sets
        a type’s default, answers it on every product of the type without a setup class, and keeps the setup’s
        class where there is one
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-018-02
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        an unknown type, an unknown class and an inactive class newly chosen, and keeps an inactive class once
        held
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#lists
        the tenant’s defaults and reads one
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-018-03
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#replaces
        a default at the version read, and refuses a stale one or one without its version
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-018-04
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#removes
        a default, after which its products fall back to none; a second delete is 404
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-018-05
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        deleting a tax class a default names, as one a setup names
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
  - scenario: ATS-ACC-PRD-018-06
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
        replacing or deleting a locked default
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
coverage_note: Scenario references name existing assertion evidence; broader unexecuted variants remain findings.
---

# Shared product ownership and kind tax defaults

## Verification Boundary

The suite exercises real PostgreSQL and Accounting persistence or database functions with isolated local workspace fixtures.

## What This Suite Proves

Persistence checks owner-limited service writes, common-product reads, default precedence, versions, protection and dependency guards.

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

PostgreSQL, transaction context, constraints, foreign keys and Accounting persistence are real. The test owns its workspace fixtures and clock.

## Must Not Be Doubled

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