---
id: ATS-CRM-ACT-016
scope: CAP-CRM-ACT-016
product_area: crm
module: activities-tasks
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  rhythm-v2-docs: 18a49edf30ee6bda18b159b65a2b91e093ea713d
scenarios:
- id: ATS-CRM-ACT-016-01
  title: Reject configuration maintenance without authority
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-01
  preconditions: The caller may read task types only.
  steps: Submit a reorder.
  expected: The API returns Forbidden.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 403 to a caller who may only read task
    types
  - TST-CRM-ACT-015
  provenance: test
  source: services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 403 to a caller who may only
    read task types
  category: permission
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-02
  title: Derive configuration references and reject invalid forms
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-02
  preconditions: Task configuration creation is available.
  steps: Omit the reference and try malformed, reserved and trailing-underscore references.
  expected: The valid name derives a reference; invalid requests create nothing.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#derives
    the id from the name when the create names none
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    an id that is not a configuration id, saying what an id may hold
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    an id that is reserved
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#writes
    no type at all for an id it refused
  - services-crm:modules/tasks/tests/integration/db/task-configurations.table.integration.spec.js#refuses
    an id ending in an underscore, which a configuration id may not
  - services-crm:modules/tasks/tests/integration/db/task-configurations.table.integration.spec.js#refuses
    an id under the prefix Rhythm keeps for itself
  - TST-CRM-ACT-022
  - TST-CRM-ACT-016
  provenance: test
  source: services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#derives
    the id from the name when the create names none
  category: validation
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-03
  title: Reject invalid names in task configuration
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-03
  preconditions: An existing type reserves a name.
  steps: Submit its name again, spaces only and a 101-character name.
  expected: Each request reports the name failure.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a create whose name another type of the tenant already has
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a create whose name is nothing but spaces
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a create whose name is longer than 100 characters, naming the field
  - services-crm:modules/tasks/tests/integration/db/task-configurations.table.integration.spec.js#refuses
    a second row of the tenant with the same name
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.queries.integration.spec.js#answers
    the tenant’s types in display order, then by id
  - services-crm:modules/tasks/tests/integration/services/persistence/task-queues.queries.integration.spec.js#lists
    the tenant’s queues in display order, and no task type among them
  - TST-CRM-ACT-022
  - TST-CRM-ACT-016
  - TST-CRM-ACT-023
  - TST-CRM-ACT-021
  provenance: test
  source: services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a create whose name another type of the tenant already has
  category: boundary
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-04
  title: Protect task configuration while referenced
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-04
  preconditions: A task names a type and queue.
  steps: Delete each referenced configuration record.
  expected: Both requests conflict and retain the referenced record.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#refuses the delete of a task type a task is
    of (409)
  - services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#refuses the delete of a task queue a task waits
    in (409)
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#is
    refused, naming the task type that is in use
  - services-crm:modules/tasks/tests/integration/services/persistence/task-queues.integration.spec.js#is
    refused, naming the task queue that is in use
  - TST-CRM-ACT-015
  - TST-CRM-ACT-022
  - TST-CRM-ACT-020
  provenance: test
  source: services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#refuses the delete of a task type a task
    is of (409)
  category: invariant
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-05
  title: Reorder the complete list including locked entries
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-05
  preconditions: Several task types include a locked entry.
  steps: Send complete, omitted-entry, repeated-entry and foreign-entry lists.
  expected: The valid list moves every entry; invalid lists move none.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#answers
    every type of the tenant, in its new order, each as the API returns it
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a list that leaves a type out, naming it, and moves no type at all
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a list that names a type twice, and moves no type at all
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#moves
    every type to its new place, the locked one included
  - services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#refuses a reorder that leaves the tenant’s
    other types out (400), and moves the one it names nowhere
  - TST-CRM-ACT-022
  - TST-CRM-ACT-015
  provenance: test
  source: services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#answers
    every type of the tenant, in its new order, each as the API returns it
  category: invariant
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-06
  title: Preserve current configuration on stale or locked edits
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-07
  preconditions: A type has advanced and another is fully locked.
  steps: Replace those records and separately omit description in a valid replacement.
  expected: Invalid edits fail and valid omission clears description.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#is
    refused as a stale object
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#refuses
    a replacement of a type locked against updates
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#clears
    the description the replacement omitted
  - services-crm:modules/tasks/tests/integration/services/persistence/task-queues.integration.spec.js#refuses
    a replacement at a version the row has moved past
  - TST-CRM-ACT-022
  - TST-CRM-ACT-020
  provenance: test
  source: services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#is
    refused as a stale object
  category: concurrency
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-07
  title: Accept work under inactive configuration
  level: browser
  proves:
  - BR-CAP-CRM-ACT-016-08
  preconditions: A task type and queue have been deactivated.
  steps: Create work referring to both.
  expected: The task is accepted and earlier references remain valid.
  negative: false
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0713.spec.ts#CRM-ACC-0713
  - TST-CRM-ACT-057
  provenance: test
  source: react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0713.spec.ts#CRM-ACC-0713
  category: transition
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-08
  title: Adopt task type seeds without overwriting customization
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-09
  preconditions: The customer changed the Follow-up type.
  steps: Apply the baseline repeatedly.
  expected: Missing types are inserted, later application preserves customer values and no queue seed
    is supplied.
  negative: false
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#writes
    the type the first time
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#adopts
    the tenant’s own the second time, rather than writing it again
  - services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#adopts
    a record the tenant edited, which is what makes a seed a starting point
  - 'services-crm:modules/tasks/tests/integration/services/persistence/task-queues.integration.spec.js#has
    no provisioning seed of its own: the service offers no insert-if-absent for a queue'
  - react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0728.spec.ts#CRM-ACC-0728
  - TST-CRM-ACT-022
  - TST-CRM-ACT-020
  - TST-CRM-ACT-068
  provenance: test
  source: services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#writes
    the type the first time
  category: rule
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-016-09
  title: Inactive routing accepts work and baseline adoption keeps edits
  category: interaction
  level: api
  proves:
  - BR-CAP-CRM-ACT-016-08
  - BR-CAP-CRM-ACT-016-09
  - BR-CAP-CRM-ACT-012-12
  preconditions: A customized baseline task type and a queue are inactive.
  steps: Reapply both baseline catalogs, create work using the inactive task type and queue, then claim
    it.
  expected: Customization survives and the service still accepts creation and claim under inactive task
    configuration; activity retirement retains its distinct contract.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0713.spec.ts#CRM-ACC-0713;
    services-crm:modules/tasks/tests/integration/services/persistence/task-types.integration.spec.js#adopts
    a record the tenant edited, which is what makes a seed a starting point; react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0710.spec.ts#CRM-ACC-0710
  exercises:
  - CAP-CRM-ACT-016
  - CAP-CRM-ACT-010
  - CAP-CRM-ACT-012
  - CAP-CRM-ACT-009
  related:
  - CAP-CRM-ACT-010
  - CAP-CRM-ACT-012
  - CAP-CRM-ACT-009
evidence:
- 'services-crm at a8d1364f1dd44b723bb5f9acba12f983e9ec8d69: scenario sources, executable assertions and
  local dependency boundaries are inspected.'
- 'react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: scoped component tests and browser journey
  assertions are inspected.'
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: 'gap: FND-CRM-ACT-062'
  failure: 'gap: FND-CRM-ACT-062'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_obligations:
  finding: FND-CRM-ACT-062
  unproved_rules:
  - BR-CAP-CRM-ACT-016-06
  permission_matrix:
    keys:
    - crm.task-types.read
    - crm.task-types.create
    - crm.task-types.update
    - crm.task-types.delete
    - crm.task-types.bulk
    - crm.task-queues.read
    - crm.task-queues.create
    - crm.task-queues.update
    - crm.task-queues.delete
    - crm.task-queues.bulk
    remaining: Complete allow/refuse combinations, including each console guard and each API operation.
  execution_note: Covered means a scenario is specified; it does not mean that scenario has executed or
    every variant has an executable binding.
related_coverage:
- capability: CAP-CRM-ACT-010
  scenarios:
  - ATS-CRM-ACT-016-09
  finding: FND-CRM-ACT-062
- capability: CAP-CRM-ACT-012
  scenarios:
  - ATS-CRM-ACT-016-09
  finding: FND-CRM-ACT-062
- capability: CAP-CRM-ACT-009
  scenarios:
  - ATS-CRM-ACT-016-09
  finding: FND-CRM-ACT-062
permission_coverage:
- key: crm.task-types.read
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-types.create
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-types.update
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-types.delete
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-types.bulk
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-queues.read
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-queues.create
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-queues.update
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-queues.delete
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.task-queues.bulk
  finding: FND-CRM-ACT-062
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
---

# Maintain task classifications and shared queues: Capability Test Specification

## Coverage

Category coverage counts specified proof. Unbound cases remain proposed; registered assertions do not establish a passing run.

| Rule | Proof Scenario Or Finding |
|---|---|
| `BR-CAP-CRM-ACT-016-01` | `ATS-CRM-ACT-016-01` |
| `BR-CAP-CRM-ACT-016-02` | `ATS-CRM-ACT-016-02` |
| `BR-CAP-CRM-ACT-016-03` | `ATS-CRM-ACT-016-03` |
| `BR-CAP-CRM-ACT-016-04` | `ATS-CRM-ACT-016-04` |
| `BR-CAP-CRM-ACT-016-05` | `ATS-CRM-ACT-016-05` |
| `BR-CAP-CRM-ACT-016-06` | `FND-CRM-ACT-062` |
| `BR-CAP-CRM-ACT-016-07` | `ATS-CRM-ACT-016-06` |
| `BR-CAP-CRM-ACT-016-08` | `ATS-CRM-ACT-016-07`, `ATS-CRM-ACT-016-09` |
| `BR-CAP-CRM-ACT-016-09` | `ATS-CRM-ACT-016-08`, `ATS-CRM-ACT-016-09` |

## Interactions With Related Capabilities

A customized baseline task type and a queue are inactive. Reapply both baseline catalogs, create work using the inactive task type and queue, then claim it.

The interaction scenario names the capabilities and rules it exercises. The coverage finding retains incomplete permission combinations and failure variants.
