---
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
finding_evidence:
  - finding: FND-ACC-PRD-001
    source: >-
      specs/PRODUCT-AREAS.md (MOD-ACC-PRD row as registered); react-console tree at baf6dae3: no products page
      under app/(console)/console/[tenantId]/accounting/; components/configuration/area-route.tsx (area
      "products"); lib/configuration/areas.ts; services-accounting:docs/accounting/products.md (cited by every
      products source file)
  - finding: FND-ACC-PRD-002
    source: >-
      services-accounting:docs/milestones/plans/ACCT-realignment-2026-10-22.md#D-T2;
      docs/architecture/realignment-2026-10-22/inventory.md rows 8, 9, 27, 32;
      modules/products/aws/api/products.routes.ts (four product_type_tax_classes routes);
      modules/products/db/product-type-tax-classes.table.ts; db/product-accounting-setups.table.ts
      (tax_class_id)
  - finding: FND-ACC-PRD-003
    source: >-
      services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md (Status row: Changes Requested;
      Product Accepted row: 2026-10-20 18:32 ET); docs/milestones/README.md (index row: Changes Requested;
      full-plan row: Product Accepted)
  - finding: FND-ACC-PRD-004
    source: >-
      services-accounting:docs/accounting/products.md#Accounting Products (status paragraph: "Backend only: no
      Console screen exists"), #Lifecycle (ADR §6) ("today: no bundle includes it");
      react-console:components/accounting-config/products/products-page.tsx;
      modules/transactions/db/invoice-lines.table.ts; modules/billing/db/installment-schedule-lines.table.ts
  - finding: FND-ACC-PRD-005
    source: >-
      services-accounting:modules/products/services/persistence/pricing-audiences.ts:readAdmittedAudiences;
      modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js#answers
      the built-ins and the tenant’s active audiences among the ids asked: not an inactive one, not another
      tenant’s, not the ids held;
      docs/migrations/accounting-modernization/products-a12-a13/README.md#Assumptions to validate
  - finding: FND-ACC-PRD-006
    source: >-
      services-accounting:modules/products/services/persistence/product-refusals.ts:STILL_REFERENCED (maps
      only invoice_lines_product_fk);
      modules/transactions/db/invoice-lines.table.ts:invoice_lines_discount_product_fk;
      modules/billing/db/installment-schedule-lines.table.ts:installment_schedule_lines_product_fk
  - finding: FND-ACC-PRD-007
    source: >-
      react-console:components/accounting-config/products/product-editor.tsx:useProductEditorState (three
      stages, each kept when a later one fails); acceptance/accounting/journeys/products/ACT-ACC-0139.json,
      ACT-ACC-0151.json
  - finding: FND-ACC-PRD-008
    source: >-
      react-console:lib/accounting-config/product-accounting-rules.ts:accountingForSave (splits sent without
      id); services-accounting:modules/products/services/rules/product-rules.ts:withRevenueSplitIds;
      react-console:acceptance/accounting/journeys/products/ACT-ACC-0141.json
  - finding: FND-ACC-PRD-009
    source: >-
      services-accounting:docs/accounting/products.md#The domain write path;
      modules/products/tests/integration/db/save-product-function.integration.spec.js#replaces the row and
      every collection as a whole, keeping an omitted property and clearing a null one;
      modules/products/aws/api/products-api-mapper.ts (an omitted property cleared by the replacement)
  - finding: FND-ACC-PRD-010
    source: >-
      services-accounting:aws/accounting.service.ts (ProductsPermissions, ProductAccountingPermissions:
      CONFIGURATION_ADMINISTRATION); modules/products/aws/api/products.routes.ts (no route requires .bulk or
      product-accounting.create)
  - finding: FND-ACC-PRD-011
    source: >-
      services-accounting:modules/products/services/confirmation-emails/confirmation-email-templates.ts
      (header, Order; clearConfirmationTemplateOfDeletedProduct)
  - finding: FND-ACC-PRD-012
    source: >-
      services-accounting:modules/products/db/products.table.ts (header: "the product owner, 2026-10-16");
      services/rules/product-rules.ts:ACCOUNTING_SLOT_ACCOUNT_TYPES; docs/accounting/products.md#Features
      (2026-10-16), #Ids (2026-10-16)
  - finding: FND-ACC-PRD-013
    source: >-
      react-console:acceptance/accounting/journeys/products/ACT-ACC-0110.json (step 3), ACT-ACC-0112.json,
      ACT-ACC-0125.json (step 6), ACT-ACC-0137.json, ACT-ACC-0138.json, ACT-ACC-0146.json;
      acceptance/accounting/inventory/business-rules.json (RUL-ACC-PRD-020, RUL-ACC-PRD-048);
      acceptance/accounting/inventory/capabilities.json (CAP-ACC-PRD-017);
      components/accounting-config/products/use-products.ts
  - finding: FND-ACC-PRD-014
    source: >-
      react-console:acceptance/accounting/inventory/capabilities.json (ids CAP-ACC-PRD-001 to 022); this
      module's ID_REGISTRY.md
  - finding: FND-ACC-PRD-015
    source: >-
      react-console:lib/accounting-config/product-accounting-rules.ts:relativeRuleProblems;
      acceptance/accounting/journeys/products/ACT-ACC-0117.json;
      services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D12
  - finding: FND-ACC-PRD-016
    source: >-
      services-accounting:modules/products/db/product-task-templates.table.ts (assignee: no foreign key);
      docs/accounting/products.md#Features (2026-10-16)
  - finding: FND-ACC-PRD-017
    source: >-
      services-accounting:modules/products/db/product-prices.table.ts (pricing_period_id: not validated);
      react-console:acceptance/accounting/journeys/products/ACT-ACC-0129.json
  - finding: FND-ACC-PRD-018
    source: >-
      services-accounting:modules/products/services/persistence/products.ts:lockProductForAccounting;
      services/persistence/product-accounting-setups.ts:replaceProductAccounting
  - finding: FND-ACC-PRD-019
    source: >-
      services-accounting:modules/products/services/persistence/product-refusals.ts
      (product_custom_field_values_product_fk);
      db/migrations/20261019224026_drop_product_custom_field_values.sql (named only);
      modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses an id that
      is not a UUID as a product the tenant does not have
  - finding: FND-ACC-PRD-020
    source: >-
      services-accounting:modules/products/aws/api/products.routes.ts (every route RouteAccess.Console);
      docs/accounting/products.md#Permissions ("no products route is served by a service function yet")
  - finding: FND-ACC-PRD-021
    source: >-
      services-accounting:modules/products/services/persistence/products.ts:ProductPrice (audience,
      deprecated); docs/migrations/accounting-modernization/products-a12-a13/README.md#Open items (1);
      react-console:lib/accounting-config/product-form.ts:formToWrite (rows carry audienceId)
  - finding: FND-ACC-PRD-022
    source: >-
      services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput;
      modules/products/tests/unit/api/products-api-mapper.spec.js (sys_locked cases only);
      react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0108.spec.ts#ACT-ACC-0108
  - finding: FND-ACC-PRD-023
    source: >-
      react-console:components/accounting-config/products/products-page.tsx (no list of products without a
      setup, no bulk save); lib/accounting/configuration/client.ts
  - finding: FND-ACC-PRD-024
    source: >-
      services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R10, #R22, #R23, #R24;
      react-console:components/accounting-config/products/product-section-types.ts:REMOVED_SECTION_KEYS;
      services-accounting:docs/accounting/products.md#Features (2026-10-16)
  - finding: FND-ACC-PRD-025
    source: 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D3; #D4; #D12'
  - finding: FND-ACC-PRD-026
    source: >-
      react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts;
      services-accounting:modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js
  - finding: FND-ACC-PRD-027
    source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0147.spec.ts'
  - finding: FND-ACC-PRD-028
    source: >-
      services-accounting:modules/products/services/persistence/product-type-tax-classes.ts:replaceProductTypeTaxClass
  - finding: FND-ACC-PRD-029
    source: >-
      services-accounting:modules/products/export/products.dataset.ts;
      modules/products/export/products.reader.ts; modules/products/metadata/products.object.ts
  - finding: FND-ACC-PRD-030
    source: 'services-accounting:modules/products/tests tree at f47cb263875bbc0c5640fba7dae6785ec32695f8'
  - finding: FND-ACC-PRD-031
    source: >-
      services-accounting:modules/products/services/persistence/product-types.ts:listProductTypes;
      modules/products/services/persistence/product-accounting-setups.ts:replaceProductAccounting
  - finding: FND-ACC-PRD-032
    source: >-
      services-accounting:docs/accounting/products.md#Features (2026-10-16);
      react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0121.spec.ts
  - finding: FND-ACC-PRD-033
    source: >-
      react-console:lib/accounting-config/product-form.ts:inEffect; :validateProductForm;
      services-accounting:modules/products/services/rules/product-rules.ts:pricesProblem
  - finding: FND-ACC-PRD-034
    source: >-
      services-accounting:db/migrations/20261019201047_product_lock_and_held_bundle_components.sql (bundle
      totals and audience admission);
      services-accounting:modules/products/services/persistence/products.ts:assertProductRules;
      modules/products/tests/integration/db/save-product-function.integration.spec.js (parity cases)
  - finding: FND-ACC-PRD-035
    source: >-
      rhythm-v2-docs:specs/CONVENTIONS.md#9.8 Inference Operation (`IOP`);
      services-accounting:modules/products tree at f47cb263 (no call into the Platform LLM module or a
      provider); react-console:components/accounting-config/products tree at baf6dae3 (none)
  - finding: FND-ACC-PRD-036
    source: >-
      services-accounting:AGENTS.md (When Accounting gets something CRM already has: change events, record
      history; none of them exists in Accounting yet);
      docs/migrations/accounting-modernization/customer-terms/README.md (No change event, no record history);
      modules/products/db/*.table.ts (no history or event tables)
  - finding: FND-ACC-PRD-037
    source: >-
      services-platform not readable by this job (the read credential is limited to services-accounting,
      react-console and rhythm-v2-docs); standards cited through
      services-accounting:modules/products/services/persistence/products.ts (header: docs/persistence.md,
      docs/indexing.md) and docs/accounting/products.md
  - finding: FND-ACC-PRD-038
    source: >-
      services-accounting:modules/products/services/confirmation-emails/confirmation-email-templates.ts
      (header: "at the cost of the product's row lock being held while Platform answers");
      services/persistence/products.ts:updateProduct
  - finding: FND-ACC-PRD-039
    source: >-
      react-console:lib/accounting/configuration/client.ts:createAccountingApi (products.removeAccounting); no
      caller under components/ or app/ at baf6dae3;
      services-accounting:modules/products/aws/api/products.routes.ts (deleteProductAccounting)
  - finding: FND-ACC-PRD-040
    source: >-
      react-console:components/accounting-config/products/use-products.ts:productStatusWrite (no
      availableFrom, availableUntil or hideFromPortal);
      components/accounting-config/products/product-row-actions.tsx (deactivate, activate);
      lib/accounting-config/product-form.ts:preservedProductFields (the editor resends them);
      services-accounting:docs/accounting/products.md#Features (omitted values cleared on replacement)
  - finding: FND-ACC-PRD-041
    source: >-
      services-accounting:docs/architecture/realignment-2026-10-22/contracts.md (today's disagreement where
      the quote ignores a product type's default class while issue applies it);
      modules/products/services/persistence/product-type-tax-classes.ts:resolveProductTaxClasses;
      docs/accounting/products.md#Tax class (2026-10-18)
  - finding: FND-ACC-PRD-042
    source: >-
      rhythm-v2-docs: no Service Contract exists for Commerce, Transactions, Billing, Batch Management or
      Membership; services-accounting:docs/accounting/products.md#Prices (Commerce's pricing engine reads the
      rows directly); modules/products/db/pricing-audience-handovers.table.ts (Commerce reads the table)
  - finding: FND-ACC-PRD-043
    source: >-
      rhythm-v2-docs:briefs/design/accounting-products.brief.md;
      rhythm-v2-docs:briefs/design-examination/accounting-products.brief.md;
      rhythm-v2-docs:specs/accounting/products/planning/**:status
  - finding: FND-ACC-PRD-044
    source: >-
      services-accounting:modules/products/services/persistence/products.ts:createProduct, updateProduct,
      toProducts;
      modules/products/services/confirmation-emails/confirmation-email-templates.ts:applyConfirmationTemplateChange
  - finding: FND-ACC-PRD-045
    source: >-
      services-accounting:modules/products/db/product-prices.table.ts:productPrices;
      modules/products/db/product-accounting-setups.table.ts:productAccountingSetups;
      modules/products/services/persistence/products.ts:assertProductRules, readBundleGraph, updateProduct;
      modules/products/services/rules/product-rules.ts:pricesProblem, bundleCycleProblem
  - finding: FND-ACC-PRD-046
    source: >-
      services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers;
      modules/products/aws/products.module.ts:productsModule;
      docs/migrations/accounting-modernization/products-a12-a13/README.md#Open items
  - finding: FND-ACC-PRD-047
    source: >-
      react-console:components/configuration/tax/product-type-tax-classes-panel.tsx:ProductTypeTaxClassesPanel,
      TypeRow; services-accounting:modules/products/aws/api/products.routes.ts:productsRoutes
  - finding: FND-ACC-PRD-048
    source: >-
      services-accounting:db/migrations/20261019201047_product_lock_and_held_bundle_components.sql:accounting.save_product;
      modules/products/services/persistence/products.ts:updateProduct;
      modules/products/services/persistence/pricing-audiences.ts:readAdmittedAudiences
  - finding: FND-ACC-PRD-049
    source: >-
      services-accounting:modules/products/aws/api/products.routes.ts:productsRoutes;
      modules/products/aws/products.module.ts:productsModule; rhythm-v2-docs:specs/CONVENTIONS.md#9.5 Service
      Contract
testing_findings:
  - id: FND-ACC-PRD-071
    severity: medium
    kind: coverage-gap
    statement: >-
      The maximum-size scenario is unbound, and denial of register read access lacks a dedicated existing
      assertion.
    affects:
      - CAP-ACC-PRD-001
      - ATS-ACC-PRD-001
      - ATS-ACC-PRD-001-05
      - ATS-ACC-PRD-001-06
    missing_categories:
      - validation
      - edge
      - failure
    unbound_scenarios:
      - ATS-ACC-PRD-001-05
      - ATS-ACC-PRD-001-06
    related_edges_without_scenario: []
    workflow_edges_requiring_review: []
    provenance: unknown
    source:
      - 'react-console:components/accounting-config/products/use-products.ts'
      - 'services-accounting:modules/products/aws/api/products.routes.ts'
      - 'services-accounting:modules/products/db/product-types.table.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/product-types.queries.integration.spec.js
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.read
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-001-03
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#reads the product type
          registry
    state_transition_obligations: []
  - id: FND-ACC-PRD-051
    severity: medium
    kind: coverage-gap
    statement: >-
      Concurrent identity creation, initial inactive status, all identity syntax boundaries and recovery after
      a lost creation response need executable proof.
    affects:
      - CAP-ACC-PRD-002
      - ATS-ACC-PRD-002
      - ATS-ACC-PRD-002-14
      - ATS-ACC-PRD-002-15
    missing_categories:
      - rule
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-002-14
      - ATS-ACC-PRD-002-15
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
      - WF-ACC-PRD-002
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0143.spec.ts'
      - 'services-accounting:modules/products/aws/api/products-api-mapper.ts'
      - 'services-accounting:modules/products/aws/api/products.routes.ts'
      - 'services-accounting:modules/products/aws/api/products.schemas.ts'
      - 'services-accounting:modules/products/db/products.table.ts'
      - 'services-accounting:modules/products/services/persistence/product-refusals.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-shared-base.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.features.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-002-save-a-product-and-its-accounting-setup-from.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.create
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-002-13
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused creating a
          product
    state_transition_obligations: []
  - id: FND-ACC-PRD-052
    severity: medium
    kind: coverage-gap
    statement: >-
      Reads during setup or default mutations, complete filter combinations, cursor boundaries and permission
      combinations need fuller scenario coverage.
    affects:
      - CAP-ACC-PRD-003
      - ATS-ACC-PRD-003
      - ATS-ACC-PRD-003-05
    missing_categories:
      - rule
      - validation
      - edge
      - failure
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-003-05
    related_edges_without_scenario: []
    workflow_edges_requiring_review: []
    provenance: unknown
    source:
      - '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
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - 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
    state_transition_obligations: []
  - id: FND-ACC-PRD-053
    severity: medium
    kind: coverage-gap
    statement: >-
      Simultaneous product and setup transactions, every lock reduction, all hidden availability fields
      through list status writes and derived-value input require dedicated proof.
    affects:
      - CAP-ACC-PRD-004
      - ATS-ACC-PRD-004
      - ATS-ACC-PRD-004-08
      - ATS-ACC-PRD-004-10
      - ATS-ACC-PRD-004-11
    missing_categories:
      - edge
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-004-08
      - ATS-ACC-PRD-004-10
      - ATS-ACC-PRD-004-11
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
      - WF-ACC-PRD-002
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts'
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0114.spec.ts'
      - 'react-console:lib/accounting-config/product-form.ts'
      - 'services-accounting:modules/products/aws/api/products-api-mapper.ts'
      - 'services-accounting:modules/products/aws/api/products.routes.ts'
      - 'services-accounting:modules/products/services/persistence/products.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.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/services/persistence/products.features.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/api/products-api-mapper.spec.js'
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-002-save-a-product-and-its-accounting-setup-from.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-004-05
          - ATS-ACC-PRD-004-07
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
          a locked product replaced without stating sys_locked, or with the same lock;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused replacing a
          product
    state_transition_obligations:
      - model: STATE-ACC-PRD-002
        from: unlocked
        to: delete-locked
        scenarios:
          - ATS-ACC-PRD-004-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput'
      - model: STATE-ACC-PRD-002
        from: unlocked
        to: update-and-delete-locked
        scenarios:
          - ATS-ACC-PRD-004-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput'
      - model: STATE-ACC-PRD-002
        from: delete-locked
        to: unlocked
        scenarios:
          - ATS-ACC-PRD-004-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-002
        from: delete-locked
        to: update-and-delete-locked
        scenarios:
          - ATS-ACC-PRD-004-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-002
        from: update-and-delete-locked
        to: unlocked
        scenarios:
          - ATS-ACC-PRD-004-10
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#unlocks
          a locked product replaced with sys_locked null, then edits and deletes it
      - model: STATE-ACC-PRD-002
        from: update-and-delete-locked
        to: delete-locked
        scenarios:
          - ATS-ACC-PRD-004-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
  - id: FND-ACC-PRD-054
    severity: medium
    kind: coverage-gap
    statement: >-
      Inactive retirement, both restoration lock states, invoice preservation and concurrent lifecycle actions
      require complete execution.
    affects:
      - CAP-ACC-PRD-005
      - ATS-ACC-PRD-005
      - ATS-ACC-PRD-005-07
      - ATS-ACC-PRD-005-08
      - ATS-ACC-PRD-005-09
    missing_categories:
      - rule
      - failure
      - boundary
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-005-07
      - ATS-ACC-PRD-005-08
      - ATS-ACC-PRD-005-09
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
      - WF-ACC-PRD-004
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0107.spec.ts'
      - 'react-console:components/accounting-config/products/product-row-actions.tsx'
      - 'services-accounting:modules/products/services/persistence/products.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.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/services/persistence/products.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-004-save-a-domain-product-inside-the-domain-s.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-005-05
          - ATS-ACC-PRD-005-06
          - ATS-ACC-PRD-005-08
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#names
          the lock when a locked product is retired;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused retiring a
          product
    state_transition_obligations:
      - model: STATE-ACC-PRD-001
        from: active
        to: inactive
        scenarios:
          - ATS-ACC-PRD-005-01
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#answers
          the replaced record at version 2, the cleared fields left out and both collections replaced
      - model: STATE-ACC-PRD-001
        from: inactive
        to: active
        scenarios:
          - ATS-ACC-PRD-005-01
          - ATS-ACC-PRD-005-03
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#reactivates
          an inactive product
      - model: STATE-ACC-PRD-001
        from: active
        to: retired
        scenarios:
          - ATS-ACC-PRD-005-02
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#retires
          the product at version 2, changing nothing else
      - model: STATE-ACC-PRD-001
        from: inactive
        to: retired
        scenarios:
          - ATS-ACC-PRD-005-07
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:retireProblem'
      - model: STATE-ACC-PRD-001
        from: retired
        to: active
        scenarios:
          - ATS-ACC-PRD-005-03
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#reactivates
          the retired product at version 3
      - model: STATE-ACC-PRD-001
        from: active
        to: deleted
        scenarios: []
        finding: FND-ACC-PRD-054
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#takes
          its prices, components, accounting setup and the setup’s collections with it
      - model: STATE-ACC-PRD-001
        from: inactive
        to: deleted
        scenarios: []
        finding: FND-ACC-PRD-054
        provenance: unknown
        source: 'services-accounting:modules/products/services/persistence/products.ts:deleteProduct'
      - model: STATE-ACC-PRD-001
        from: retired
        to: deleted
        scenarios: []
        finding: FND-ACC-PRD-054
        provenance: unknown
        source: 'services-accounting:modules/products/services/persistence/products.ts:deleteProduct'
  - id: FND-ACC-PRD-055
    severity: medium
    kind: coverage-gap
    statement: >-
      Inactive and retired deletion, dependency-versus-delete races and unmapped financial dependency refusals
      need execution; cleanup tests double Platform.
    affects:
      - CAP-ACC-PRD-006
      - ATS-ACC-PRD-006
      - ATS-ACC-PRD-006-03
      - ATS-ACC-PRD-006-10
      - ATS-ACC-PRD-006-11
    missing_categories:
      - validation
      - edge
      - boundary
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-006-03
      - ATS-ACC-PRD-006-10
      - ATS-ACC-PRD-006-11
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-003
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0121.spec.ts'
      - 'services-accounting:modules/billing/db/installment-schedule-lines.table.ts'
      - 'services-accounting:modules/products/services/persistence/product-refusals.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.features.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - 'services-accounting:modules/transactions/db/invoice-lines.table.ts'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-003-delete-a-product-and-clear-its-confirmation-template.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.delete
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-006-05
          - ATS-ACC-PRD-006-06
          - ATS-ACC-PRD-006-09
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
          a product locked against deletes;
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses
          a product whose accounting setup is locked against deletes, leaving the product and its setup
          (DEF-ACT-0101); services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is
          refused deleting a product
    state_transition_obligations:
      - model: STATE-ACC-PRD-001
        from: active
        to: inactive
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#answers
          the replaced record at version 2, the cleared fields left out and both collections replaced
      - model: STATE-ACC-PRD-001
        from: inactive
        to: active
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#reactivates
          an inactive product
      - model: STATE-ACC-PRD-001
        from: active
        to: retired
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#retires
          the product at version 2, changing nothing else
      - model: STATE-ACC-PRD-001
        from: inactive
        to: retired
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:retireProblem'
      - model: STATE-ACC-PRD-001
        from: retired
        to: active
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#reactivates
          the retired product at version 3
      - model: STATE-ACC-PRD-001
        from: active
        to: deleted
        scenarios:
          - ATS-ACC-PRD-006-04
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#takes
          its prices, components, accounting setup and the setup’s collections with it
      - model: STATE-ACC-PRD-001
        from: inactive
        to: deleted
        scenarios:
          - ATS-ACC-PRD-006-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/persistence/products.ts:deleteProduct'
      - model: STATE-ACC-PRD-001
        from: retired
        to: deleted
        scenarios:
          - ATS-ACC-PRD-006-10
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/persistence/products.ts:deleteProduct'
      - model: STATE-ACC-PRD-003
        from: not set up
        to: set up
        scenarios: []
        finding: FND-ACC-PRD-055
        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-055
        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-055
        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
      - model: STATE-ACC-PRD-004
        from: 'off'
        to: product-owned
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#saved
          its own template in Platform, owned by the product, once
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: product-owned
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
          one template, as its new version
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: shared
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#clears
          the product’s own template when it switches to a shared one
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: 'off'
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#archives
          the product’s own template in Platform
      - model: STATE-ACC-PRD-004
        from: 'off'
        to: shared
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#names
          a shared template of the purpose
      - model: STATE-ACC-PRD-004
        from: shared
        to: 'off'
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: 'services-accounting:modules/products/services/persistence/products.ts:templateChangeOf'
      - model: STATE-ACC-PRD-004
        from: shared
        to: product-owned
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: 'services-accounting:modules/products/services/persistence/products.ts:templateChangeOf'
      - model: STATE-ACC-PRD-005
        from: handed over
        to: realised
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: FND-ACC-PRD-046
      - model: STATE-ACC-PRD-005
        from: handed over
        to: removed
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers'
      - model: STATE-ACC-PRD-005
        from: realised
        to: removed
        scenarios: []
        finding: FND-ACC-PRD-055
        provenance: unknown
        source: 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers'
  - id: FND-ACC-PRD-056
    severity: medium
    kind: coverage-gap
    statement: >-
      A real domain extension failure, every permission context and simultaneous common-record writes remain
      unproved; the browser domain scenario performs no database write.
    affects:
      - CAP-ACC-PRD-007
      - ATS-ACC-PRD-007
      - ATS-ACC-PRD-007-08
      - ATS-ACC-PRD-007-09
      - ATS-ACC-PRD-007-10
      - INV-DOM-ACC-PRD-001-09
    missing_categories:
      - transition
      - failure
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-007-08
      - ATS-ACC-PRD-007-09
      - ATS-ACC-PRD-007-10
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-002
      - WF-ACC-PRD-004
    provenance: unknown
    source:
      - 'services-accounting:docs/accounting/products.md'
      - 'services-accounting:modules/products/services/persistence/products.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
      - 'services-accounting:modules/products/tests/integration/db/save-product-function.integration.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-002-save-a-product-and-its-accounting-setup-from.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-004-save-a-domain-product-inside-the-domain-s.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.create
        where_checked: service
        scope: record
        scenarios:
          - ATS-ACC-PRD-007-01
          - ATS-ACC-PRD-007-02
        finding: null
        provenance: proposed
        source: >-
          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/unit/rules/product-rules.spec.js#lets a console caller
          write any type (the console calls Accounting first and the domain second);
          services-accounting:modules/products/tests/integration/db/save-product-function.integration.spec.js#refuses
          a transaction with no tenant as RHP04
      - key: accounting.products.update
        where_checked: service
        scope: record
        scenarios:
          - ATS-ACC-PRD-007-01
          - ATS-ACC-PRD-007-02
        finding: null
        provenance: proposed
        source: >-
          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/unit/rules/product-rules.spec.js#lets a console caller
          write any type (the console calls Accounting first and the domain second);
          services-accounting:modules/products/tests/integration/db/save-product-function.integration.spec.js#refuses
          a transaction with no tenant as RHP04
      - key: accounting.products.delete
        where_checked: service
        scope: record
        scenarios:
          - ATS-ACC-PRD-007-01
          - ATS-ACC-PRD-007-02
        finding: null
        provenance: proposed
        source: >-
          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/unit/rules/product-rules.spec.js#lets a console caller
          write any type (the console calls Accounting first and the domain second);
          services-accounting:modules/products/tests/integration/db/save-product-function.integration.spec.js#refuses
          a transaction with no tenant as RHP04
    state_transition_obligations:
      - model: STATE-ACC-PRD-004
        from: 'off'
        to: product-owned
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#saved
          its own template in Platform, owned by the product, once
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: product-owned
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
          one template, as its new version
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: shared
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#clears
          the product’s own template when it switches to a shared one
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: 'off'
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#archives
          the product’s own template in Platform
      - model: STATE-ACC-PRD-004
        from: 'off'
        to: shared
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#names
          a shared template of the purpose
      - model: STATE-ACC-PRD-004
        from: shared
        to: 'off'
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: 'services-accounting:modules/products/services/persistence/products.ts:templateChangeOf'
      - model: STATE-ACC-PRD-004
        from: shared
        to: product-owned
        scenarios: []
        finding: FND-ACC-PRD-056
        provenance: unknown
        source: 'services-accounting:modules/products/services/persistence/products.ts:templateChangeOf'
    invariant_obligations:
      - INV-DOM-ACC-PRD-001-09
  - id: FND-ACC-PRD-057
    severity: medium
    kind: coverage-gap
    statement: >-
      Precision limits, all amount endpoints, concurrent replacements and full cross-capability allocation
      scenarios require execution.
    affects:
      - CAP-ACC-PRD-008
      - ATS-ACC-PRD-008
      - ATS-ACC-PRD-008-10
      - ATS-ACC-PRD-008-11
      - INV-DOM-ACC-PRD-002-09
    missing_categories:
      - transition
      - permission
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-008-10
      - ATS-ACC-PRD-008-11
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
      - WF-ACC-PRD-006
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0136.spec.ts'
      - 'services-accounting:modules/products/db/product-prices.table.ts'
      - 'services-accounting:modules/products/services/persistence/pricing-audiences.ts'
      - 'services-accounting:modules/products/services/persistence/products.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - '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/pricing-audiences.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-006-hand-migrated-special-prices-over-to-commerce.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.create
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-057
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-008-price-a-product-for-each-audience-period-and-currency.md#permissions
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-057
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-008-price-a-product-for-each-audience-period-and-currency.md#permissions
    state_transition_obligations: []
    invariant_obligations:
      - INV-DOM-ACC-PRD-002-09
  - id: FND-ACC-PRD-058
    severity: medium
    kind: coverage-gap
    statement: >-
      Commerce realization, completion stamping, retry and consumer concurrency remain unknown; realization
      and removal transitions are not exercised end to end.
    affects:
      - CAP-ACC-PRD-009
      - ATS-ACC-PRD-009
      - ATS-ACC-PRD-009-03
      - ATS-ACC-PRD-009-04
      - INV-DOM-ACC-PRD-002-10
    missing_categories:
      - rule
      - permission
      - edge
      - failure
      - boundary
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-009-03
      - ATS-ACC-PRD-009-04
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-006
    provenance: unknown
    source:
      - 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts'
      - 'services-accounting:modules/products/services/persistence/pricing-audiences.ts'
      - 'services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/db/special-prices-a12-migration.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/pricing-audiences.integration.spec.js
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-006-hand-migrated-special-prices-over-to-commerce.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-058
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-009-hand-rhythm-1-0-special-prices-over-to-commerce.md#permissions
    state_transition_obligations:
      - model: STATE-ACC-PRD-005
        from: handed over
        to: realised
        scenarios: []
        finding: FND-ACC-PRD-058
        provenance: unknown
        source: FND-ACC-PRD-046
      - model: STATE-ACC-PRD-005
        from: handed over
        to: removed
        scenarios:
          - ATS-ACC-PRD-009-04
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers'
      - model: STATE-ACC-PRD-005
        from: realised
        to: removed
        scenarios:
          - ATS-ACC-PRD-009-04
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers'
    invariant_obligations:
      - INV-DOM-ACC-PRD-002-10
  - id: FND-ACC-PRD-059
    severity: medium
    kind: coverage-gap
    statement: >-
      Exact maximum-size collections, percentage precision endpoints, product permissions and simultaneous
      edits need dedicated execution; purchase-time application is outside these suites.
    affects:
      - CAP-ACC-PRD-010
      - ATS-ACC-PRD-010
      - ATS-ACC-PRD-010-04
      - ATS-ACC-PRD-010-05
    missing_categories:
      - rule
      - permission
      - edge
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-010-04
      - ATS-ACC-PRD-010-05
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts'
      - 'services-accounting:modules/products/db/product-bulk-pricing-rules.table.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - 'services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-059
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-010-offer-discounts-for-buying-in-quantity.md#permissions
    state_transition_obligations: []
  - id: FND-ACC-PRD-060
    severity: medium
    kind: coverage-gap
    statement: >-
      Cross-product cycle races, full allocation interactions and exact maximum-size success require
      execution; existing validation does not lock the whole component graph.
    affects:
      - CAP-ACC-PRD-011
      - ATS-ACC-PRD-011
      - ATS-ACC-PRD-011-09
    missing_categories:
      - permission
      - edge
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-011-09
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0110.spec.ts'
      - 'react-console:components/accounting-config/products/product-section-types.ts'
      - 'services-accounting:modules/products/services/persistence/products.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - 'services-accounting:modules/products/tests/e2e/products.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-060
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-011-sell-products-together-as-a-bundle.md#permissions
    state_transition_obligations: []
  - id: FND-ACC-PRD-061
    severity: medium
    kind: coverage-gap
    statement: >-
      Explicit all-time clearing, every interval endpoint, permission refusal and concurrent product edits
      need dedicated execution; order-time ceilings are outside these suites.
    affects:
      - CAP-ACC-PRD-012
      - ATS-ACC-PRD-012
      - ATS-ACC-PRD-012-03
    missing_categories:
      - rule
      - permission
      - edge
      - failure
      - boundary
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-012-03
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts'
      - 'services-accounting:modules/products/db/products.table.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - 'services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-061
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-012-limit-how-much-one-customer-may-buy.md#permissions
    state_transition_obligations: []
  - id: FND-ACC-PRD-062
    severity: medium
    kind: coverage-gap
    statement: >-
      Task-name and delay endpoints, exact maximum-size success, full permission refusal and concurrent
      replacements need execution; task creation belongs to the purchasing consumer.
    affects:
      - CAP-ACC-PRD-013
      - ATS-ACC-PRD-013
    missing_categories:
      - transition
      - permission
      - edge
      - failure
      - concurrency
      - invariant
    unbound_scenarios: []
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
    provenance: unknown
    source:
      - 'services-accounting:modules/products/services/persistence/products.ts'
      - 'services-accounting:modules/products/services/persistence/task-configurations.ts'
      - 'services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/task-configurations.queries.integration.spec.js
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-062
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-013-create-follow-up-tasks-when-a-product-is-bought.md#permissions
    state_transition_obligations: []
  - id: FND-ACC-PRD-063
    severity: medium
    kind: coverage-gap
    statement: >-
      All shared-to-owned and shared-to-off transitions, local failure after remote success, permission
      refusal and concurrency across the remote call need execution with real communications.
    affects:
      - CAP-ACC-PRD-014
      - ATS-ACC-PRD-014
      - ATS-ACC-PRD-014-05
      - ATS-ACC-PRD-014-06
      - ATS-ACC-PRD-014-07
    missing_categories:
      - permission
      - boundary
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-014-05
      - ATS-ACC-PRD-014-06
      - ATS-ACC-PRD-014-07
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-001
    provenance: unknown
    source:
      - 'services-accounting:modules/products/services/confirmation-emails/confirmation-email-templates.ts'
      - 'services-accounting:modules/products/services/persistence/communication-templates.ts'
      - 'services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/communication-templates.queries.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-001-create-or-replace-a-product-with-its-owned-settings.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.products.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-063
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-014-send-the-buyer-a-confirmation-e-mail.md#permissions
    state_transition_obligations:
      - model: STATE-ACC-PRD-004
        from: 'off'
        to: product-owned
        scenarios:
          - ATS-ACC-PRD-014-02
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#saved
          its own template in Platform, owned by the product, once
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: product-owned
        scenarios:
          - ATS-ACC-PRD-014-02
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
          one template, as its new version
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: shared
        scenarios:
          - ATS-ACC-PRD-014-03
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#clears
          the product’s own template when it switches to a shared one
      - model: STATE-ACC-PRD-004
        from: product-owned
        to: 'off'
        scenarios:
          - ATS-ACC-PRD-014-03
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#archives
          the product’s own template in Platform
      - model: STATE-ACC-PRD-004
        from: 'off'
        to: shared
        scenarios:
          - ATS-ACC-PRD-014-01
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#names
          a shared template of the purpose
      - model: STATE-ACC-PRD-004
        from: shared
        to: 'off'
        scenarios:
          - ATS-ACC-PRD-014-05
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/persistence/products.ts:templateChangeOf'
      - model: STATE-ACC-PRD-004
        from: shared
        to: product-owned
        scenarios:
          - ATS-ACC-PRD-014-05
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/persistence/products.ts:templateChangeOf'
  - id: FND-ACC-PRD-064
    severity: medium
    kind: coverage-gap
    statement: >-
      All lock transitions, setup mutation on retired products, first-setup races and staged console
      failure/retry need execution; unchanged posted accounts have a separate browser proof.
    affects:
      - CAP-ACC-PRD-015
      - ATS-ACC-PRD-015
      - ATS-ACC-PRD-015-15
      - ATS-ACC-PRD-015-16
      - ATS-ACC-PRD-015-17
    missing_categories: []
    unbound_scenarios:
      - ATS-ACC-PRD-015-15
      - ATS-ACC-PRD-015-16
      - ATS-ACC-PRD-015-17
    related_edges_without_scenario:
      - CAP-ACC-PRD-003
    workflow_edges_requiring_review:
      - WF-ACC-PRD-002
      - WF-ACC-PRD-005
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0118.spec.ts'
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0122.spec.ts'
      - 'services-accounting:modules/products/db/product-accounting-setups.table.ts'
      - 'services-accounting:modules/products/services/persistence/product-accounting-setups.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - 'services-accounting:modules/products/tests/e2e/product-accounting.e2e.spec.js'
      - 'services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js'
      - 'services-accounting:modules/products/tests/integration/db/products.table.integration.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/api/products-api-mapper.spec.js'
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-002-save-a-product-and-its-accounting-setup-from.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-005-save-many-accounting-setups-at-once.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.product-accounting.read
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-015-09
          - ATS-ACC-PRD-015-12
        finding: null
        provenance: proposed
        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;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused reading a
          product’s accounting setup
      - key: accounting.product-accounting.update
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-015-09
          - ATS-ACC-PRD-015-12
        finding: null
        provenance: proposed
        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;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused reading a
          product’s accounting setup
      - key: accounting.product-accounting.delete
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-015-09
          - ATS-ACC-PRD-015-12
        finding: null
        provenance: proposed
        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;
          services-accounting:modules/products/tests/e2e/products-security.e2e.spec.js#is refused reading a
          product’s accounting setup
    state_transition_obligations:
      - model: STATE-ACC-PRD-002
        from: unlocked
        to: delete-locked
        scenarios:
          - ATS-ACC-PRD-015-16
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput'
      - model: STATE-ACC-PRD-002
        from: unlocked
        to: update-and-delete-locked
        scenarios:
          - ATS-ACC-PRD-015-16
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput'
      - model: STATE-ACC-PRD-002
        from: delete-locked
        to: unlocked
        scenarios:
          - ATS-ACC-PRD-015-16
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-002
        from: delete-locked
        to: update-and-delete-locked
        scenarios:
          - ATS-ACC-PRD-015-16
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-002
        from: update-and-delete-locked
        to: unlocked
        scenarios:
          - ATS-ACC-PRD-015-16
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#unlocks
          a locked product replaced with sys_locked null, then edits and deletes it
      - model: STATE-ACC-PRD-002
        from: update-and-delete-locked
        to: delete-locked
        scenarios:
          - ATS-ACC-PRD-015-16
        finding: null
        provenance: proposed
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-003
        from: not set up
        to: set up
        scenarios:
          - ATS-ACC-PRD-015-07
          - ATS-ACC-PRD-015-15
        finding: null
        provenance: proposed
        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:
          - ATS-ACC-PRD-015-07
          - ATS-ACC-PRD-015-08
        finding: null
        provenance: proposed
        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:
          - ATS-ACC-PRD-015-10
        finding: null
        provenance: proposed
        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
  - id: FND-ACC-PRD-065
    severity: medium
    kind: coverage-gap
    statement: >-
      Maximum child-collection successes and refusals, price-lowering effects on later setup saves, permission
      combinations and concurrent price/setup changes need execution.
    affects:
      - CAP-ACC-PRD-016
      - ATS-ACC-PRD-016
      - ATS-ACC-PRD-016-08
      - ATS-ACC-PRD-016-09
      - INV-DOM-ACC-PRD-004-08
    missing_categories:
      - rule
      - transition
      - permission
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-016-08
      - ATS-ACC-PRD-016-09
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-002
      - WF-ACC-PRD-005
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0119.spec.ts'
      - 'services-accounting:modules/products/services/persistence/product-accounting-setups.ts'
      - 'services-accounting:modules/products/services/rules/product-rules.ts'
      - 'services-accounting:modules/products/tests/e2e/product-accounting.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/product-accounting-setups.integration.spec.js
      - 'services-accounting:modules/products/tests/unit/rules/product-rules.spec.js'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-002-save-a-product-and-its-accounting-setup-from.md
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-005-save-many-accounting-setups-at-once.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.product-accounting.update
        where_checked: api
        scope: tenant
        scenarios: []
        finding: FND-ACC-PRD-065
        provenance: unknown
        source: >-
          rhythm-v2-docs:specs/accounting/products/planning/capabilities/CAP-ACC-PRD-016-recognise-a-product-s-revenue-over-time-and-share-it.md#permissions
    state_transition_obligations: []
    invariant_obligations:
      - INV-DOM-ACC-PRD-004-08
  - id: FND-ACC-PRD-066
    severity: medium
    kind: coverage-gap
    statement: >-
      Oppositely ordered overlapping groups, complete allocation-failure interactions and missing-setup read
      races need execution; sequential rollback does not prove concurrent ordering.
    affects:
      - CAP-ACC-PRD-017
      - ATS-ACC-PRD-017
      - ATS-ACC-PRD-017-06
      - ATS-ACC-PRD-017-07
    missing_categories:
      - transition
      - edge
      - invariant
    unbound_scenarios:
      - ATS-ACC-PRD-017-06
      - ATS-ACC-PRD-017-07
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-005
    provenance: unknown
    source:
      - '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
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - 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
    state_transition_obligations:
      - 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
  - id: FND-ACC-PRD-067
    severity: medium
    kind: coverage-gap
    statement: >-
      Delete-only protection, every tax permission, inactive-kind defaults and concurrent first assignments
      need execution; tax ownership transfer is a separate product decision.
    affects:
      - CAP-ACC-PRD-018
      - ATS-ACC-PRD-018
      - ATS-ACC-PRD-018-08
      - ATS-ACC-PRD-018-09
    missing_categories:
      - rule
      - failure
      - boundary
    unbound_scenarios:
      - ATS-ACC-PRD-018-08
      - ATS-ACC-PRD-018-09
    related_edges_without_scenario: []
    workflow_edges_requiring_review: []
    provenance: unknown
    source:
      - 'react-console:components/configuration/tax/product-type-tax-classes-panel.tsx'
      - 'services-accounting:modules/products/db/product-type-tax-classes.table.ts'
      - 'services-accounting:modules/products/services/persistence/product-type-tax-classes.ts'
      - 'services-accounting:modules/products/tests/e2e/products-shared-base.e2e.spec.js'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations:
      - key: accounting.tax-classes.read
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-018-06
          - ATS-ACC-PRD-018-07
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
          replacing or deleting a locked default;
          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)
      - key: accounting.tax-classes.update
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-018-06
          - ATS-ACC-PRD-018-07
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
          replacing or deleting a locked default;
          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)
      - key: accounting.tax-classes.delete
        where_checked: api
        scope: tenant
        scenarios:
          - ATS-ACC-PRD-018-06
          - ATS-ACC-PRD-018-07
        finding: null
        provenance: proposed
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.shared-base.integration.spec.js#refuses
          replacing or deleting a locked default;
          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)
    state_transition_obligations:
      - model: STATE-ACC-PRD-002
        from: unlocked
        to: delete-locked
        scenarios: []
        finding: FND-ACC-PRD-067
        provenance: unknown
        source: 'services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput'
      - model: STATE-ACC-PRD-002
        from: unlocked
        to: update-and-delete-locked
        scenarios: []
        finding: FND-ACC-PRD-067
        provenance: unknown
        source: 'services-accounting:modules/products/aws/api/products-api-mapper.ts:toInput'
      - model: STATE-ACC-PRD-002
        from: delete-locked
        to: unlocked
        scenarios: []
        finding: FND-ACC-PRD-067
        provenance: unknown
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-002
        from: delete-locked
        to: update-and-delete-locked
        scenarios: []
        finding: FND-ACC-PRD-067
        provenance: unknown
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
      - model: STATE-ACC-PRD-002
        from: update-and-delete-locked
        to: unlocked
        scenarios: []
        finding: FND-ACC-PRD-067
        provenance: unknown
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#unlocks
          a locked product replaced with sys_locked null, then edits and deletes it
      - model: STATE-ACC-PRD-002
        from: update-and-delete-locked
        to: delete-locked
        scenarios: []
        finding: FND-ACC-PRD-067
        provenance: unknown
        source: 'services-accounting:modules/products/services/rules/product-rules.ts:lockedReplaceProblem'
  - id: FND-ACC-PRD-068
    severity: medium
    kind: coverage-gap
    statement: >-
      Export delivery, all embedded collections, workspace isolation, failure/retry and concurrent edits need
      executable proof; a creation cutoff does not freeze older records.
    affects:
      - CAP-ACC-PRD-019
      - ATS-ACC-PRD-019
      - ATS-ACC-PRD-019-01
      - ATS-ACC-PRD-019-02
      - ATS-ACC-PRD-019-03
    missing_categories:
      - rule
      - validation
      - permission
      - edge
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-ACC-PRD-019-01
      - ATS-ACC-PRD-019-02
      - ATS-ACC-PRD-019-03
    related_edges_without_scenario: []
    workflow_edges_requiring_review:
      - WF-ACC-PRD-007
    provenance: unknown
    source:
      - 'services-accounting:modules/products/export/products.dataset.ts'
      - 'services-accounting:modules/products/export/products.reader.ts'
      - >-
        rhythm-v2-docs:specs/accounting/products/design/workflows/WF-ACC-PRD-007-carry-the-product-catalogue-into-a-workspace-export.md
      - 'services-accounting:modules/products/tests'
      - 'react-console:acceptance/accounting/playwright/journeys/products'
      - 'react-console:e2e'
    status: open
    permission_obligations: []
    state_transition_obligations: []
  - id: FND-ACC-PRD-069
    severity: medium
    kind: inconsistency
    statement: >-
      Earlier development walks expect the editor to remain open after creation and retain visible-section
      expectations that disagree with the pinned return-to-list flow and hidden controls; registration
      supplies no passing result.
    affects:
      - TST-ACC-PRD-017
      - TST-ACC-PRD-018
    provenance: observed
    source:
      - >-
        react-console:e2e/dev/accounting-configuration-walk.dev.spec.ts:expects Edit Accounting Product after
        creation
      - 'react-console:e2e/dev/products-common-walk.dev.spec.ts:fourteen sections'
      - 'react-console:components/accounting-config/products/product-editor-page.tsx'
      - 'react-console:components/accounting-config/products/product-section-types.ts'
    status: open
  - id: FND-ACC-PRD-070
    severity: medium
    kind: coverage-gap
    statement: >-
      Existing executable files without complete current acceptance bindings need an assertion-by-assertion
      extension or retirement review; carried compatibility tests and empty domain fixtures do not close
      current coverage.
    affects:
      - TST-ACC-PRD-002
      - TST-ACC-PRD-004
      - TST-ACC-PRD-008
      - TST-ACC-PRD-016
      - TST-ACC-PRD-017
      - TST-ACC-PRD-018
      - TST-ACC-PRD-019
      - TST-ACC-PRD-020
      - TST-ACC-PRD-022
      - TST-ACC-PRD-023
      - TST-ACC-PRD-024
      - TST-ACC-PRD-034
      - TST-ACC-PRD-043
      - TST-ACC-PRD-045
      - TST-ACC-PRD-046
      - TST-ACC-PRD-047
      - TST-ACC-PRD-048
      - TST-ACC-PRD-049
      - TST-ACC-PRD-050
      - TST-ACC-PRD-051
      - TST-ACC-PRD-052
      - TST-ACC-PRD-053
      - TST-ACC-PRD-054
      - TST-ACC-PRD-055
      - TST-ACC-PRD-056
      - TST-ACC-PRD-057
      - TST-ACC-PRD-058
      - TST-ACC-PRD-059
      - TST-ACC-PRD-060
      - TST-ACC-PRD-061
      - TST-ACC-PRD-062
      - TST-ACC-PRD-063
      - TST-ACC-PRD-064
      - TST-ACC-PRD-065
      - FAS-ACC-PRD-01-02
      - FAS-ACC-PRD-02-01
      - FAS-ACC-PRD-02-02
      - FAS-ACC-PRD-02-04
      - FAS-ACC-PRD-03-01
      - FAS-ACC-PRD-03-02
      - FAS-ACC-PRD-03-03
      - FAS-ACC-PRD-03-04
      - FAS-ACC-PRD-04-01
      - FAS-ACC-PRD-04-02
      - FAS-ACC-PRD-04-03
      - FAS-ACC-PRD-04-04
    provenance: unknown
    source:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0102.spec.ts'
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0108.spec.ts'
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0116.spec.ts'
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0147.spec.ts'
      - 'react-console:e2e/dev/accounting-configuration-walk.dev.spec.ts'
      - 'react-console:e2e/dev/products-common-walk.dev.spec.ts'
      - 'react-console:e2e/dev/products-screens-walk.dev.spec.ts'
      - 'react-console:e2e/mock/accounting-product-common.mock.spec.ts'
      - 'react-console:e2e/mock/accounting-products.mock.spec.ts'
      - 'react-console:e2e/mock/accounting-tax.mock.spec.ts'
      - 'react-console:e2e/mock/eligibility-card.mock.spec.ts'
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/communication-templates.queries.integration.spec.js
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/task-configurations.queries.integration.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/donation-products/object/change-validation.spec.js
      - 'services-accounting:modules/products/tests/unit/carried/donation-products/object/cleaning.spec.js'
      - >-
        services-accounting:modules/products/tests/unit/carried/donation-products/object/deletion-validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/donation-products/object/generate-identifier.spec.js
      - 'services-accounting:modules/products/tests/unit/carried/donation-products/object/validation.spec.js'
      - >-
        services-accounting:modules/products/tests/unit/carried/legacy-import-products/object/change-validation.spec.js
      - 'services-accounting:modules/products/tests/unit/carried/legacy-import-products/object/cleaning.spec.js'
      - >-
        services-accounting:modules/products/tests/unit/carried/legacy-import-products/object/deletion-validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/legacy-import-products/object/generate-identifier.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/legacy-import-products/object/validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/miscellaneous-products/object/change-validation.spec.js
      - 'services-accounting:modules/products/tests/unit/carried/miscellaneous-products/object/cleaning.spec.js'
      - >-
        services-accounting:modules/products/tests/unit/carried/miscellaneous-products/object/deletion-validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/miscellaneous-products/object/validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/product-financial-configs/object/change-validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/product-financial-configs/object/cleaning.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/product-financial-configs/object/deletion-validation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/product-financial-configs/object/id-generation.spec.js
      - >-
        services-accounting:modules/products/tests/unit/carried/product-financial-configs/object/validation.spec.js
      - 'services-accounting:modules/products/tests/unit/carried/products/product-visible-properites.spec.js'
      - 'services-accounting:modules/products/tests/unit/carried/products/validate.spec.js'
    status: open
    feature_scenarios_without_execution:
      - FAS-ACC-PRD-01-02
      - FAS-ACC-PRD-02-01
      - FAS-ACC-PRD-02-02
      - FAS-ACC-PRD-02-04
      - FAS-ACC-PRD-03-01
      - FAS-ACC-PRD-03-02
      - FAS-ACC-PRD-03-03
      - FAS-ACC-PRD-03-04
      - FAS-ACC-PRD-04-01
      - FAS-ACC-PRD-04-02
      - FAS-ACC-PRD-04-03
      - FAS-ACC-PRD-04-04
control_backfill_evidence:
  - finding: FND-ACC-PRD-050
    controls:
      - TC-PI-004
      - TC-AVL-004
    provenance: observed
    source: >-
      services-accounting:modules/products/services/confirmation-emails/confirmation-email-templates.ts:applyConfirmationTemplateChange,clearConfirmationTemplateOfDeletedProduct;
      rhythm-v2-docs:specs/accounting/products/FINDINGS.md#FND-ACC-PRD-044
---

# Findings and Open Questions: Accounting → Products

This register distinguishes implementation disagreements, missing proof and decisions still owned by Product. Findings retain their permanent identities, including the earlier missing-brief finding whose input gap is resolved in pass 2.

## Findings

| id | severity | statement | affects | evidence | kind |
|---|---|---|---|---|---|
| `FND-ACC-PRD-001` | medium | Configuration hosts the Products screens, but the original registry points to absent Accounting routes. The original scope also omits the products guide cited throughout the source. The corrected registry includes these locations. | `MOD-ACC-PRD` | Structured evidence | inconsistency |
| `FND-ACC-PRD-002` | high | The approved realignment assigns product tax configuration to Commerce. Accounting still implements product-kind defaults and the setup’s tax assignment, so the current capability remains recorded as out of scope for the future boundary. The transition still needs a detailed plan. | `CAP-ACC-PRD-018`, `CAP-ACC-PRD-015`, `BR-CAP-ACC-PRD-015-06`, `BR-CAP-ACC-PRD-018-10` | Structured evidence | inconsistency |
| `FND-ACC-PRD-003` | low | The milestone and its index disagree about acceptance: their status summaries retain Changes Requested while acceptance entries record Product Accepted. Named product decisions remain usable evidence, but the record’s overall state needs clarification. | `MOD-ACC-PRD` | Structured evidence | inconsistency |
| `FND-ACC-PRD-004` | low | The products guide describes a backend-only catalogue and a bundle-only deletion restriction. The console already hosts catalogue screens, and transaction and installment references also restrict deletion. The guide needs reconciliation with the implementation. | `CAP-ACC-PRD-003`, `CAP-ACC-PRD-006` | Structured evidence | inconsistency |
| `FND-ACC-PRD-005` | medium | A migrated special-price audience remains admissible before Commerce’s audience table exists. Once that table exists, the audience must be active there; otherwise even an unrelated product edit is refused. This conflicts with the migration record’s assumption that held audiences remain editable. | `BR-CAP-ACC-PRD-009-05`, `CAP-ACC-PRD-008`, `OQ-ACC-PRD-002` | Structured evidence | defect |
| `FND-ACC-PRD-006` | medium | The database blocks deletion for discount-product and installment references, but the refusal translator handles only the invoice’s ordinary product reference. These other restrictions can surface as server errors. Neither case has dedicated product-module proof. | `BR-CAP-ACC-PRD-006-02` | Structured evidence | defect |
| `FND-ACC-PRD-007` | medium | Console saving has separate product and accounting stages. A later setup refusal leaves the earlier product save in place and reports partial completion. The product API exposes no combined transaction for these two records. | `CAP-ACC-PRD-015`, `CAP-ACC-PRD-002`, `JNY-ACC-PRD-001` | Structured evidence | undocumented |
| `FND-ACC-PRD-008` | medium | Console setup serialization omits revenue-split identities, so saving assigns new identities instead of retaining those supplied by service clients. This can disrupt identity-based reconciliation with posting history; the cross-module consequence needs explicit proof. | `BR-CAP-ACC-PRD-016-07`, `BR-CAP-ACC-PRD-016-10` | Structured evidence | defect |
| `FND-ACC-PRD-009` | medium | HTTP replacement clears omitted optional product properties, while the database domain-save function preserves omitted values. The two entry points therefore implement different edit contracts for the same catalogue record. | `BR-CAP-ACC-PRD-007-08`, `BR-CAP-ACC-PRD-004-02`, `OQ-ACC-PRD-003` | Structured evidence | inconsistency |
| `FND-ACC-PRD-010` | low | Products bulk access and product-accounting create and bulk access are declared permissions without matching routes. Bulk setup replacement instead requires update access. Role configuration can expose these inactive powers. | `CAP-ACC-PRD-002`, `CAP-ACC-PRD-015`, `CAP-ACC-PRD-017` | Structured evidence | debt |
| `FND-ACC-PRD-011` | low | Template cleanup happens after product deletion and logs failures without restoring the product. A product commit failure after successful template saving also leaves a remote change. The implementation has no compensation for either window. | `BR-CAP-ACC-PRD-006-06`, `BR-CAP-ACC-PRD-014-04` | Structured evidence | debt |
| `FND-ACC-PRD-012` | low | Several implementation comments attribute details to an unnamed product-owner direction without a decision identifier. Those comments establish documentation, but readable identities, account-slot restrictions and selling details stay proposed unless an identifiable approved decision covers them. | `BR-CAP-ACC-PRD-002-01`, `BR-CAP-ACC-PRD-002-10`, `BR-CAP-ACC-PRD-015-04`, `CAP-ACC-PRD-012`, `CAP-ACC-PRD-013`, `CAP-ACC-PRD-014` | Structured evidence | undocumented |
| `FND-ACC-PRD-013` | low | Earlier acceptance records still describe domain-kind tabs, console creation of Legacy Products, obsolete custom fields and bundle totals without quantity. Some journey text also describes a defect its browser spec reports fixed. The specification follows current code and named decisions rather than copying these obsolete expectations. | `BR-CAP-ACC-PRD-001-07`, `BR-CAP-ACC-PRD-011-06`, `BR-CAP-ACC-PRD-002-13` | Structured evidence | inconsistency |
| `FND-ACC-PRD-014` | low | Earlier acceptance capability identifiers collide with this corpus’s identifiers while describing different scopes. Predecessor references retain a corpus prefix so readers can distinguish the two histories. | `MOD-ACC-PRD` | Structured evidence | inconsistency |
| `FND-ACC-PRD-015` | low | The console requires receivables and restricts relative deferral ranges more than the service does. It rejects ranges extending past December and year offsets beyond ten; backend rules allow larger offsets. An API-created setup can consequently be impossible to resave through the console. | `BR-CAP-ACC-PRD-015-14`, `BR-CAP-ACC-PRD-016-10` | Structured evidence | inconsistency |
| `FND-ACC-PRD-016` | low | Task assignment validates identifier syntax without confirming the user exists. A syntactically valid unknown assignee can be stored. | `BR-CAP-ACC-PRD-013-03` | Structured evidence | debt |
| `FND-ACC-PRD-017` | low | Price validation accepts pricing-period identifiers without checking Commerce’s schedule registry. A spelling error can therefore create an unrecognized period assignment. | `CAP-ACC-PRD-008` | Structured evidence | debt |
| `FND-ACC-PRD-018` | low | Accounting setup replacement remains available for a retired product even though product editing is refused. The records provide no explicit decision about that difference. | `BR-CAP-ACC-PRD-015-15` | Structured evidence | undocumented |
| `FND-ACC-PRD-019` | low | The refusal translator retains a removed custom-field constraint name, and some test titles retain the older UUID identity terminology. These remnants need cleanup in the owning implementation. | `CAP-ACC-PRD-002` | Structured evidence | debt |
| `FND-ACC-PRD-020` | low | Application ownership is checked in product write logic, but the HTTP routes admit console callers only. Domain services currently use the database write functions rather than these HTTP routes. | `BR-CAP-ACC-PRD-007-01` | Structured evidence | undocumented |
| `FND-ACC-PRD-021` | low | The service continues accepting and returning the deprecated audience alias alongside audience identifiers. The console already uses identifiers, and the migration record leaves alias removal undecided. | `BR-CAP-ACC-PRD-008-14` | Structured evidence | debt |
| `FND-ACC-PRD-022` | low | No bound replacement test establishes cross-workspace body rejection and complete ignoring of derived values. The cited browser spec exercises creation, and mapper unit cases cover lock mapping. The replacement scenario is now proposed and needs direct API proof. | `BR-CAP-ACC-PRD-004-09` | Structured evidence | debt |
| `FND-ACC-PRD-023` | low | The API supports finding missing setups and replacing setups in bulk. The console has a missing-setup indicator but exposes neither of those administration workflows. | `BR-CAP-ACC-PRD-017-07` | Structured evidence | undocumented |
| `FND-ACC-PRD-024` | low | The reviewed console hides sale windows, portal visibility, purchase limits, confirmation settings, bundles and cancellation fees. The API retains these settings, while the products guide fails to distinguish their availability from the visible editor. | `CAP-ACC-PRD-011`, `CAP-ACC-PRD-012`, `CAP-ACC-PRD-014`, `BR-CAP-ACC-PRD-004-10` | Structured evidence | inconsistency |
| `FND-ACC-PRD-025` | medium | Capability-wide confirmation makes uncited implementation details appear approved. Capabilities, concepts, features and journeys now remain proposed; individual rules retain authority only through their recorded origins. | `MOD-ACC-PRD` | Structured evidence | inconsistency |
| `FND-ACC-PRD-026` | medium | Several bound scenarios claim additional actions their tests do not execute. Older-identity replacement does not prove deletion; the feature-preservation browser spec skips confirmation e-mail and does not assert availability fields; the pricing-audience query test does not perform a product edit. Narrowed scenarios retain genuine bindings; register authorization denial, all price precision boundaries, all-time purchase clearing, and assignee existence remain outside those bindings. Replacement workspace and derived-field proof is now proposed because its former browser binding only tests creation. | `CAP-ACC-PRD-002`, `CAP-ACC-PRD-004`, `CAP-ACC-PRD-009` | Structured evidence | debt |
| `FND-ACC-PRD-027` | medium | The domain browser spec skips database saves and rollbacks, so an empty product list there proves no transaction rollback. Accounting’s integration suite proves saving and reads but a failure after saving a domain extension still needs an executable cross-service proof. | `BR-CAP-ACC-PRD-007-04`, `JNY-ACC-PRD-006` | Structured evidence | debt |
| `FND-ACC-PRD-028` | low | Tax-default update and delete locks differ: a delete-only lock permits replacement, and an update lock cannot be cleared through replacement. The existing locked-default test covers the combined lock; delete-only behavior needs separate proof. | `BR-CAP-ACC-PRD-018-07` | Structured evidence | undocumented |
| `FND-ACC-PRD-029` | medium | Product exports and read-only metadata registration lack a capability in the draft. The added export capability records their declarations; no in-scope product test exercises actual export delivery, cutoff behavior or embedded collection completeness. | `CAP-ACC-PRD-019`, `BR-CAP-ACC-PRD-019-01`, `BR-CAP-ACC-PRD-019-02`, `BR-CAP-ACC-PRD-019-03`, `BR-CAP-ACC-PRD-019-04` | Structured evidence | debt |
| `FND-ACC-PRD-030` | low | Draft coverage counts are inaccurate: the module contains six end-to-end files, thirteen integration files, two current unit files and twenty-one carried spec files, rather than the sixteen carried files the charter claims. The examination reports physical files separately from test bindings. Twenty carried files remain without a direct planning binding, although their adapted behavior falls within existing catalogue and accounting capabilities. | `MOD-ACC-PRD` | Structured evidence | inconsistency |
| `FND-ACC-PRD-031` | low | The registry-size refusal and accounting child-collection limits are must-prove refusals without bound scenarios. Existing rule rows now identify the requirement, and this finding retains the missing boundary proofs. | `BR-CAP-ACC-PRD-001-05`, `BR-CAP-ACC-PRD-016-09` | Structured evidence | debt |
| `FND-ACC-PRD-032` | medium | Catalog configuration alone does not prove price conversion, task creation, purchase-limit enforcement, confirmation sending, invoice preservation or posting. Documented downstream responsibilities now have no claimed enforcement point in this module. The existing posting browser spec proves default resolution and preservation after setup changes; it now has a dedicated bound scenario. Other downstream effects still need contracts and executable cross-module proofs. | `CAP-ACC-PRD-005`, `CAP-ACC-PRD-009`, `CAP-ACC-PRD-010`, `CAP-ACC-PRD-011`, `CAP-ACC-PRD-012`, `CAP-ACC-PRD-013`, `CAP-ACC-PRD-014`, `CAP-ACC-PRD-015`, `CAP-ACC-PRD-018` | Structured evidence | debt |
| `FND-ACC-PRD-033` | low | The console evaluates price windows using date strings and includes the end boundary, while backend validation uses instants with an exclusive end. The console also requires a current always standard base price, whereas backend validation accepts a standard base price in a named period. These differences need price-boundary and period-only tests before a shared editor contract is settled. | `CAP-ACC-PRD-008` | Structured evidence | inconsistency |
| `FND-ACC-PRD-034` | medium | The latest domain-save function still defaults omitted component prices to zero and sums allocations without quantity, while HTTP writes require a component price and multiply by quantity. It also admits held audiences after Commerce activation where HTTP writes require active audiences. Existing parity tests omit these divergent variants. The added rule rows describe the database contract without assigning it approval. | `CAP-ACC-PRD-007`, `CAP-ACC-PRD-011`, `CAP-ACC-PRD-009` | Structured evidence | inconsistency |
| `FND-ACC-PRD-035` | low | No model invocation appears in the examined product service or screens. Service, workflow and screen contracts therefore declare empty inference lists. The required no-inference sentence is still absent from the charter, which this job cannot edit. | `MOD-ACC-PRD`, `SVC-ACC-PRD-products` | Structured evidence | undocumented |
| `FND-ACC-PRD-036` | medium | Catalogue records have modification stamps but no declared revision history or change events. Finance cannot reconstruct earlier prices or account settings from those current records, and shared readers receive no announced changes. | `DOM-ACC-PRD-001`, `DOM-ACC-PRD-004`, `ADR-ACC-PRD-015`, `OQ-ACC-PRD-004` | Structured evidence | debt |
| `FND-ACC-PRD-037` | low | Platform's persistence, queue, job, history, security and indexing standards remain unavailable within this job's three-repository access. Accounting references those standards, but those references do not establish conformance; design authority remains proposed where a standard would be required. | `SVC-ACC-PRD-products`, `ADR-ACC-PRD-005`, `ADR-ACC-PRD-013` | Structured evidence | undocumented |
| `FND-ACC-PRD-038` | low | Product replacement holds its row lock while waiting for Platform template saving or clearing and while assembling the response. Remote latency therefore delays other writes of that product and its setup. | `WF-ACC-PRD-001`, `ADR-ACC-PRD-008`, `STATE-ACC-PRD-004` | Structured evidence | debt |
| `FND-ACC-PRD-039` | low | Setup deletion is exposed by the service and console adapter but no examined product screen invokes it. Staff cannot use this editor to remove a setup and return to unit-default treatment. | `BR-CAP-ACC-PRD-015-10`, `SCR-ACC-PRD-003`, `STATE-ACC-PRD-003` | Structured evidence | undocumented |
| `FND-ACC-PRD-040` | medium | Quick Activate and Deactivate submit product replacement without loaded sale-window or portal-visibility values. Replacement clears those omissions, so a status action can erase the window and restore visibility for a hidden product. The editor retains them. This consequence is inferred from source and has no direct test. | `BR-CAP-ACC-PRD-004-10`, `BR-CAP-ACC-PRD-005-01`, `SCR-ACC-PRD-001`, `ADR-ACC-PRD-006` | Structured evidence | defect |
| `FND-ACC-PRD-041` | medium | The realignment architecture reports that quotes ignore kind tax defaults while issue applies them. Product resolution also prefers setup class, then kind default. The reported consumer difference remains unproved in this module and must be resolved during tax ownership transfer. | `INV-DOM-ACC-PRD-004-11`, `BR-CAP-ACC-PRD-018-01`, `ADR-ACC-PRD-011` | Structured evidence | inconsistency |
| `FND-ACC-PRD-042` | low | The documented table readers include Commerce, Transactions, Billing and Batch Management, whose service contracts are absent from this corpus. Their reader lists and schema dependencies therefore remain incomplete; this job has not verified each downstream implementation. | `DOM-ACC-PRD-001`, `DOM-ACC-PRD-002`, `DOM-ACC-PRD-004`, `ADR-ACC-PRD-013` | Structured evidence | undocumented |
| `FND-ACC-PRD-043` | medium | Pass 2 resolves the missing-brief portion: both requested briefs are present and have been read. The planning records still declare draft or proposed maturity, so this checkout does not establish a completed planning approval gate. Individual named Andrew decisions remain authoritative for the choices they cover. | `MOD-ACC-PRD` | Structured evidence | undocumented |
| `FND-ACC-PRD-044` | medium | A Platform template write commits outside Accounting's product transaction. Its success can survive a lost answer, failed response read or failed local commit. Accounting implements neither compensation nor durable reconciliation for these mismatches. | `WF-ACC-PRD-001`, `ADR-ACC-PRD-008`, `STATE-ACC-PRD-004` | Structured evidence | debt |
| `FND-ACC-PRD-045` | medium | The draft overstated several table guarantees. Price overlap, active-kind admission, sellable revenue requirements and bundle-graph cycle checks rely on write validation rather than general database enforcement. Separate product locks do not serialize the whole graph, and a product-price reduction does not revalidate existing fixed shares. The final design states these limits. | `DOM-ACC-PRD-001`, `DOM-ACC-PRD-002`, `DOM-ACC-PRD-004`, `ADR-ACC-PRD-005` | Structured evidence | debt |
| `FND-ACC-PRD-046` | medium | Migration and handover declarations assign realization to Commerce but do not establish its worker, delivery mechanism, retries, deadline or executable completion proof. The downstream transition stays unknown. No conclusion is drawn that every stored handover is still waiting. | `STATE-ACC-PRD-005`, `WF-ACC-PRD-006`, `ADR-ACC-PRD-013` | Structured evidence | undocumented |
| `FND-ACC-PRD-047` | medium | The tax-default API supports inactive kinds, but the panel renders active kinds only. Console edit authority enables both assignment and clearing, although clearing requires backend delete authority; loading kinds additionally requires product read authority. These permission and coverage differences still need a decision and proof. | `SCR-ACC-PRD-004`, `CAP-ACC-PRD-018` | Structured evidence | inconsistency |
| `FND-ACC-PRD-048` | medium | SQL replacement rejects an inactive kind while HTTP replacement does not repeat the creation-only activity check. With a readable Commerce register, SQL admits active and held audiences without a separate built-in exemption; denied register access bypasses audience validation. Existing parity descriptions and tests do not cover these variants. | `WF-ACC-PRD-004`, `CAP-ACC-PRD-007`, `DOM-ACC-PRD-002` | Structured evidence | inconsistency |
| `FND-ACC-PRD-049` | low | No local Submissions publication or capture binding is declared. The external registry cannot be verified with the available repositories, so complete publication status and any architecture exemption remain unestablished. | `SVC-ACC-PRD-products`, `ADR-ACC-PRD-014` | Structured evidence | undocumented |

| `FND-ACC-PRD-050` | medium | Product confirmation content can commit remotely before the local product write fails, and deletion cleanup can fail after local deletion commits. Neither path retains durable reconciliation or compensation work, leaving remote content outside resumable recovery. | `TC-PI-004`, `TC-AVL-004`, `CAP-ACC-PRD-014`, `CAP-ACC-PRD-006`, `WF-ACC-PRD-001`, `WF-ACC-PRD-003`, `SVC-ACC-PRD-products` | Structured control evidence | control-gap |

## Testing Coverage Findings

| Id | Severity | Statement | Affects | Evidence | Kind |
|---|---|---|---|---|---|
| `FND-ACC-PRD-071` | medium | The maximum-size scenario is unbound, and denial of register read access lacks a dedicated existing assertion. | CAP-ACC-PRD-001, ATS-ACC-PRD-001, ATS-ACC-PRD-001-05, ATS-ACC-PRD-001-06 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-051` | medium | Concurrent identity creation, initial inactive status, all identity syntax boundaries and recovery after a lost creation response need executable proof. | CAP-ACC-PRD-002, ATS-ACC-PRD-002, ATS-ACC-PRD-002-14, ATS-ACC-PRD-002-15 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-052` | medium | Reads during setup or default mutations, complete filter combinations, cursor boundaries and permission combinations need fuller scenario coverage. | CAP-ACC-PRD-003, ATS-ACC-PRD-003, ATS-ACC-PRD-003-05 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-053` | medium | Simultaneous product and setup transactions, every lock reduction, all hidden availability fields through list status writes and derived-value input require dedicated proof. | CAP-ACC-PRD-004, ATS-ACC-PRD-004, ATS-ACC-PRD-004-08, ATS-ACC-PRD-004-10, ATS-ACC-PRD-004-11 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-054` | medium | Inactive retirement, both restoration lock states, invoice preservation and concurrent lifecycle actions require complete execution. | CAP-ACC-PRD-005, ATS-ACC-PRD-005, ATS-ACC-PRD-005-07, ATS-ACC-PRD-005-08, ATS-ACC-PRD-005-09 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-055` | medium | Inactive and retired deletion, dependency-versus-delete races and unmapped financial dependency refusals need execution; cleanup tests double Platform. | CAP-ACC-PRD-006, ATS-ACC-PRD-006, ATS-ACC-PRD-006-03, ATS-ACC-PRD-006-10, ATS-ACC-PRD-006-11 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-056` | medium | A real domain extension failure, every permission context and simultaneous common-record writes remain unproved; the browser domain scenario performs no database write. | CAP-ACC-PRD-007, ATS-ACC-PRD-007, ATS-ACC-PRD-007-08, ATS-ACC-PRD-007-09, ATS-ACC-PRD-007-10 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-057` | medium | Precision limits, all amount endpoints, concurrent replacements and full cross-capability allocation scenarios require execution. | CAP-ACC-PRD-008, ATS-ACC-PRD-008, ATS-ACC-PRD-008-10, ATS-ACC-PRD-008-11 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-058` | medium | Commerce realization, completion stamping, retry and consumer concurrency remain unknown; realization and removal transitions are not exercised end to end. | CAP-ACC-PRD-009, ATS-ACC-PRD-009, ATS-ACC-PRD-009-03, ATS-ACC-PRD-009-04 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-059` | medium | Exact maximum-size collections, percentage precision endpoints, product permissions and simultaneous edits need dedicated execution; purchase-time application is outside these suites. | CAP-ACC-PRD-010, ATS-ACC-PRD-010, ATS-ACC-PRD-010-04, ATS-ACC-PRD-010-05 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-060` | medium | Cross-product cycle races, full allocation interactions and exact maximum-size success require execution; existing validation does not lock the whole component graph. | CAP-ACC-PRD-011, ATS-ACC-PRD-011, ATS-ACC-PRD-011-09 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-061` | medium | Explicit all-time clearing, every interval endpoint, permission refusal and concurrent product edits need dedicated execution; order-time ceilings are outside these suites. | CAP-ACC-PRD-012, ATS-ACC-PRD-012, ATS-ACC-PRD-012-03 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-062` | medium | Task-name and delay endpoints, exact maximum-size success, full permission refusal and concurrent replacements need execution; task creation belongs to the purchasing consumer. | CAP-ACC-PRD-013, ATS-ACC-PRD-013 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-063` | medium | All shared-to-owned and shared-to-off transitions, local failure after remote success, permission refusal and concurrency across the remote call need execution with real communications. | CAP-ACC-PRD-014, ATS-ACC-PRD-014, ATS-ACC-PRD-014-05, ATS-ACC-PRD-014-06, ATS-ACC-PRD-014-07 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-064` | medium | All lock transitions, setup mutation on retired products, first-setup races and staged console failure/retry need execution; unchanged posted accounts have a separate browser proof. | CAP-ACC-PRD-015, ATS-ACC-PRD-015, ATS-ACC-PRD-015-15, ATS-ACC-PRD-015-16, ATS-ACC-PRD-015-17 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-065` | medium | Maximum child-collection successes and refusals, price-lowering effects on later setup saves, permission combinations and concurrent price/setup changes need execution. | CAP-ACC-PRD-016, ATS-ACC-PRD-016, ATS-ACC-PRD-016-08, ATS-ACC-PRD-016-09 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-066` | medium | Oppositely ordered overlapping groups, complete allocation-failure interactions and missing-setup read races need execution; sequential rollback does not prove concurrent ordering. | CAP-ACC-PRD-017, ATS-ACC-PRD-017, ATS-ACC-PRD-017-06, ATS-ACC-PRD-017-07 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-067` | medium | Delete-only protection, every tax permission, inactive-kind defaults and concurrent first assignments need execution; tax ownership transfer is a separate product decision. | CAP-ACC-PRD-018, ATS-ACC-PRD-018, ATS-ACC-PRD-018-08, ATS-ACC-PRD-018-09 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-068` | medium | Export delivery, all embedded collections, workspace isolation, failure/retry and concurrent edits need executable proof; a creation cutoff does not freeze older records. | CAP-ACC-PRD-019, ATS-ACC-PRD-019, ATS-ACC-PRD-019-01, ATS-ACC-PRD-019-02, ATS-ACC-PRD-019-03 | Frontmatter testing evidence | coverage-gap |
| `FND-ACC-PRD-069` | medium | Earlier development walks expect the editor to remain open after creation and retain visible-section expectations that disagree with the pinned return-to-list flow and hidden controls; registration supplies no passing result. | TST-ACC-PRD-017, TST-ACC-PRD-018 | Frontmatter testing evidence | inconsistency |
| `FND-ACC-PRD-070` | medium | Existing executable files without complete current acceptance bindings need an assertion-by-assertion extension or retirement review; carried compatibility tests and empty domain fixtures do not close current coverage. | TST-ACC-PRD-002, TST-ACC-PRD-004, TST-ACC-PRD-008, TST-ACC-PRD-016, TST-ACC-PRD-017, TST-ACC-PRD-018, TST-ACC-PRD-019, TST-ACC-PRD-020, TST-ACC-PRD-022, TST-ACC-PRD-023, TST-ACC-PRD-024, TST-ACC-PRD-034, TST-ACC-PRD-043, TST-ACC-PRD-045, TST-ACC-PRD-046, TST-ACC-PRD-047, TST-ACC-PRD-048, TST-ACC-PRD-049, TST-ACC-PRD-050, TST-ACC-PRD-051, TST-ACC-PRD-052, TST-ACC-PRD-053, TST-ACC-PRD-054, TST-ACC-PRD-055, TST-ACC-PRD-056, TST-ACC-PRD-057, TST-ACC-PRD-058, TST-ACC-PRD-059, TST-ACC-PRD-060, TST-ACC-PRD-061, TST-ACC-PRD-062, TST-ACC-PRD-063, TST-ACC-PRD-064, TST-ACC-PRD-065 | Frontmatter testing evidence | coverage-gap |

## Open Questions

| id | question | why_it_matters | options | recommendation | affects |
|---|---|---|---|---|---|
| `OQ-ACC-PRD-001` | How will stored product tax assignments move to Commerce? | Missing or competing assignments during cutover can change the class used on financial lines. | A: retain Accounting until Commerce can accept the existing assignments; B: cut over immediately to Commerce reads; C: keep two sources with reconciliation. | Choose A with an explicit migration and ownership cutover plan. | `CAP-ACC-PRD-018`, `CAP-ACC-PRD-015` |
| `OQ-ACC-PRD-002` | Can staff correct migrated products while their special-price audiences await Commerce activation? | Audience admission can otherwise prevent unrelated catalogue edits. | A: retain admission for already held audiences; B: block all resubmitted inactive audiences; C: activate migrated audiences before enabling the register. | Admit held audiences and require activation proof as part of rollout. | `CAP-ACC-PRD-009`, `CAP-ACC-PRD-008` |
| `OQ-ACC-PRD-003` | Should the domain function use the same complete replacement contract as HTTP saving? | Two omission contracts for one record can discard or preserve different values. | A: make domain replacement complete; B: preserve HTTP omissions; C: keep and explicitly document both contracts. | Align domain replacement with the complete-payload contract after reviewing caller expectations. | `CAP-ACC-PRD-007`, `CAP-ACC-PRD-004` |
| `OQ-ACC-PRD-004` | Which catalogue and financial records need revision history and change announcements? | Current stamps do not show earlier price or account choices, and readers cannot react to announced changes. | A: adopt Platform history and product and setup events; B: add history only for setups and kind defaults; C: retain stamps until an event consumer needs more. | Choose A using the Platform conventions Accounting is instructed to follow when adopting these mechanisms. | `DOM-ACC-PRD-001`, `DOM-ACC-PRD-004`, `ADR-ACC-PRD-015` |
| `OQ-ACC-PRD-005` | Should a console save changing both product and setup offer one transaction? | A financial refusal leaves a changed product with old accounting or a new product without a setup. | A: combine saving when the caller holds both authorities; B: retain separately committed stages and resume failures; C: combine creation only. | Keep B for now, with explicit partial-success reporting and retained baselines; this recommendation does not decide the open question. | `WF-ACC-PRD-002`, `ADR-ACC-PRD-004`, `CAP-ACC-PRD-015` |
