---
id: ATS-ACC-PRD-013
scope: CAP-ACC-PRD-013
product_area: accounting
module: products
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-PRD-013-01
    title: Task references respect CRM status and scope
    level: unit
    proves:
      - BR-CAP-ACC-PRD-013-02
      - INV-DOM-ACC-PRD-001-15
    preconditions: 'CRM fixtures include active, inactive and foreign-workspace types and queues.'
    steps: Try new invalid assignments and resave instructions holding later-inactive references.
    expected: New invalid choices fail while retained choices survive.
    negative: true
    data_needs: 'CRM fixtures include active, inactive and foreign-workspace types and queues.'
    bound_to:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
        a task type and a queue that became inactive while the product held them
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a task type the tenant does not have
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a queue the tenant does not have
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an inactive task type newly assigned
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an inactive queue newly assigned
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        another tenant’s task type, which reads as absent
      - TST-ACC-PRD-039
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
      a task type and a queue that became inactive while the product held them
    category: validation
    binding_scope:
      - suite: TST-ACC-PRD-039
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
            a task type and a queue that became inactive while the product held them
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            a task type the tenant does not have
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            a queue the tenant does not have
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            an inactive task type newly assigned
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            an inactive queue newly assigned
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            another tenant’s task type, which reads as absent
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
          a task type and a queue that became inactive while the product held them;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          a task type the tenant does not have;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          a queue the tenant does not have;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          an inactive task type newly assigned;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          an inactive queue newly assigned;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          another tenant’s task type, which reads as absent
  - id: ATS-ACC-PRD-013-02
    title: Assignee format differs from existence
    level: api
    proves:
      - BR-CAP-ACC-PRD-013-03
    preconditions: A product has task instructions.
    steps: Submit an assignee value that is a plain name rather than a user identity.
    expected: The API and database reject the invalid identity format.
    negative: true
    data_needs: A product has task instructions.
    bound_to:
      - >-
        services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js#refuses an assignee that
        is not a Platform user id
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an assignee that is not a Platform user id by the database’s check
      - TST-ACC-PRD-027
      - TST-ACC-PRD-039
    provenance: test
    source: >-
      services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js#refuses an assignee that is
      not a Platform user id
    category: validation
    binding_scope:
      - suite: TST-ACC-PRD-027
        assertions:
          - >-
            services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js#refuses an assignee
            that is not a Platform user id
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js#refuses an assignee that
          is not a Platform user id;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          an assignee that is not a Platform user id by the database’s check
      - suite: TST-ACC-PRD-039
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            an assignee that is not a Platform user id by the database’s check
        provenance: test
        source: >-
          services-accounting:modules/products/tests/e2e/product-features.e2e.spec.js#refuses an assignee that
          is not a Platform user id;
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          an assignee that is not a Platform user id by the database’s check
  - id: ATS-ACC-PRD-013-03
    title: Task lists replace within their bound
    level: unit
    proves:
      - BR-CAP-ACC-PRD-013-04
    preconditions: A product supports task fixtures.
    steps: Submit twenty-one task instructions.
    expected: The oversized collection is refused.
    negative: true
    data_needs: A product supports task fixtures.
    bound_to:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        more than 20 tasks to generate
      - TST-ACC-PRD-039
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
      more than 20 tasks to generate
    category: boundary
    binding_scope:
      - suite: TST-ACC-PRD-039
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
            more than 20 tasks to generate
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
          more than 20 tasks to generate
  - id: ATS-ACC-PRD-013-04
    title: Complete task instructions survive a read
    category: rule
    level: api
    proves:
      - BR-CAP-ACC-PRD-013-01
    preconditions: The workspace provides active task types and queues.
    steps: 'Create instructions with name, description, queue, assignee and due delay, then retrieve the product.'
    expected: Each supported instruction value and submitted order reads back.
    negative: true
    data_needs: The workspace provides active task types and queues.
    bound_to:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#answers
        every feature as written, the lists in the order sent
      - TST-ACC-PRD-039
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#answers
      every feature as written, the lists in the order sent
    binding_scope:
      - suite: TST-ACC-PRD-039
        assertions:
          - >-
            services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#answers
            every feature as written, the lists in the order sent
        provenance: test
        source: >-
          services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#answers
          every feature as written, the lists in the order sent
  - id: ATS-ACC-PRD-013-05
    title: A console correction preserves task instructions
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-PRD-013-04
      - BR-CAP-ACC-PRD-004-10
    preconditions: An API-created product has one active CRM task instruction.
    steps: Rename it in the console and deactivate it from the list; read its task instructions after each save.
    expected: The task instruction remains unchanged and the saved product versions advance.
    negative: true
    data_needs: An API-created product has one active CRM task instruction.
    bound_to:
      - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts#ACT-ACC-0112'
      - TST-ACC-PRD-006
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
      more than 20 tasks to generate; react-console:lib/accounting-config/product-form.ts:formToWrite
    exercises:
      - CAP-ACC-PRD-013
      - CAP-ACC-PRD-004
    binding_scope:
      - suite: TST-ACC-PRD-006
        assertions:
          - 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts#ACT-ACC-0112'
        provenance: test
        source: 'react-console:acceptance/accounting/playwright/journeys/products/ACT-ACC-0112.spec.ts#ACT-ACC-0112'
evidence:
  - '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
coverage:
  rule: covered
  transition: 'gap: FND-ACC-PRD-062'
  validation: covered
  permission: 'gap: FND-ACC-PRD-062'
  edge: 'gap: FND-ACC-PRD-062'
  failure: 'gap: FND-ACC-PRD-062'
  boundary: covered
  concurrency: 'gap: FND-ACC-PRD-062'
  invariant: 'gap: FND-ACC-PRD-062'
  interaction: covered
coverage_notes:
  transition:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-062
  permission:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-062
  edge:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-062
  failure:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-062
  concurrency:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-062
  invariant:
    reason: No dedicated scenario isolates this category for the capability.
    provenance: unknown
    source: FND-ACC-PRD-062
  remaining_obligations:
    reason: >-
      Task-name and delay endpoints, exact maximum-size success, full permission refusal and concurrent
      replacements need execution; task creation belongs to the purchasing consumer. Workflow edges not named
      by a scenario remain in this finding rather than gaining a binding from shared workflow membership.
    provenance: unknown
    source: FND-ACC-PRD-062
  meaning:
    reason: >-
      Covered means a specification scenario exists in this category. Executable coverage and run results
      remain independent.
    provenance: documented
    source: 'rhythm-v2-docs:specs/CONVENTIONS.md#9.10 Capability Test Specification (`ATS`, under `design/tests/`)'
coverage_findings:
  - FND-ACC-PRD-062
related_capabilities:
  - CAP-ACC-PRD-004
workflows:
  - WF-ACC-PRD-001
rule_coverage:
  - rule: BR-CAP-ACC-PRD-013-02
    scenarios:
      - ATS-ACC-PRD-013-01
  - rule: BR-CAP-ACC-PRD-013-03
    scenarios:
      - ATS-ACC-PRD-013-02
  - rule: BR-CAP-ACC-PRD-013-04
    scenarios:
      - ATS-ACC-PRD-013-03
      - ATS-ACC-PRD-013-05
interaction_coverage:
  - scenario: ATS-ACC-PRD-013-05
    exercises:
      - CAP-ACC-PRD-013
      - CAP-ACC-PRD-004
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
      more than 20 tasks to generate; react-console:lib/accounting-config/product-form.ts:formToWrite
permission_coverage:
  - 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
invariant_coverage:
  - invariant: INV-DOM-ACC-PRD-001-15
    scenarios:
      - ATS-ACC-PRD-013-01
    finding: null
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
      a task type and a queue that became inactive while the product held them
---

# Record the follow-up work a purchase needs: Capability Test Specification

## Coverage

The frontmatter lists a proof scenario or finding for every required rule and records each applicable category. Scenario coverage describes what to check; bindings identify the assertions that already exist, and execution results remain unverified. Task-name and delay endpoints, exact maximum-size success, full permission refusal and concurrent replacements need execution; task creation belongs to the purchasing consumer. Workflow edges not named by a scenario remain in this finding rather than gaining a binding from shared workflow membership.

## Interactions With Related Capabilities

A console correction preserves task instructions. An API-created product has one active CRM task instruction. Rename it in the console and deactivate it from the list; read its task instructions after each save. The task instruction remains unchanged and the saved product versions advance.
