---
id: ATS-CRM-ACT-008
scope: CAP-CRM-ACT-008
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-008-01
  title: Reject type maintenance by readers
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-01
  preconditions: The caller can read activity types only.
  steps: Create an activity type.
  expected: The API returns Forbidden.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - 'services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a type’s create to a caller
    who may only read types: 403'
  - TST-CRM-ACT-002
  provenance: test
  source: 'services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a type’s create to
    a caller who may only read types: 403'
  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-008-02
  title: Derive valid type identifiers and reserve reorder
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-02
  preconditions: No conflicting custom type exists.
  steps: Create using only a name, explicitly use the reserved reorder identifier and derive it from a
    name.
  expected: The ordinary name yields an identifier; reserved-address cases fail without records.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#derives
    the id from the name when the create names none
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    the id order, the path of the reorder
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#asks
    for an id when the name alone would give the type the id order
  - 'services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a type whose id is order,
    the path of the reorder: 400'
  - TST-CRM-ACT-009
  - TST-CRM-ACT-002
  provenance: test
  source: services-crm:modules/activities/tests/integration/services/persistence/activity-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-008-03
  title: Reject invalid type names and descriptions
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-03
  preconditions: An activity type already reserves a name.
  steps: Submit duplicate, blank and 101-character names and a 1,001-character description.
  expected: Each request reports the invalid field.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a name another type of the tenant has
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a blank name
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a name of more than 100 characters, naming the field
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a description of more than 1000 characters, naming the field
  - TST-CRM-ACT-009
  provenance: test
  source: services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a name another type of the tenant 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-008-04
  title: Validate field-mode and default configuration limits
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-04
  - BR-CAP-CRM-ACT-008-05
  preconditions: Configuration fixtures support direct validation.
  steps: Send unknown modes, colours and icons, out-of-range durations and follow-up intervals.
  expected: Every invalid configuration fails without retaining a type.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/activities/tests/integration/db/activities.table.integration.spec.js#refuses
    a field mode other than hidden, optional or required
  - services-crm:modules/activities/tests/integration/db/activities.table.integration.spec.js#refuses
    a colour the console has no palette entry for
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    an icon the console cannot draw, in the database too
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a default duration of 0 minutes, naming the field
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a default duration of 1441 minutes, naming the field
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a follow-up of 0 days, naming the field
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a follow-up of 366 days, naming the field
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#writes
    no type at all for a range it refused
  - TST-CRM-ACT-003
  - TST-CRM-ACT-009
  provenance: test
  source: services-crm:modules/activities/tests/integration/db/activities.table.integration.spec.js#refuses
    a field mode other than hidden, optional or required
  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-008-05
  title: Apply outcome-list replacement semantics
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-06
  preconditions: A type holds three outcomes.
  steps: Supply a changed list, omit the list, exceed 50 entries and repeat an outcome name.
  expected: Changed lists replace, omissions preserve, and invalid lists fail.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - 'services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#replaces
    the outcomes as a list: kept by id, created by name, removed when missing'
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#keeps
    the outcomes when the replacement states none
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    more than 50 outcomes
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    two outcomes of one name
  - TST-CRM-ACT-009
  provenance: test
  source: 'services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#replaces
    the outcomes as a list: kept by id, created by name, removed when missing'
  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-008-06
  title: Retain types and outcomes referenced by activities
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-07
  preconditions: An activity uses the type and one outcome.
  steps: Remove that outcome and delete the type.
  expected: Both actions fail with guidance to deactivate instead.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    to remove an outcome an activity has, saying to deactivate it instead
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a type an activity has, saying to deactivate it instead
  - services-crm:modules/activities/tests/integration/db/activities.table.integration.spec.js#refuses
    the delete of a type an activity has
  - services-crm:modules/activities/tests/integration/db/activities.table.integration.spec.js#refuses
    the removal of an outcome an activity has
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.queries.integration.spec.js#maps
    a type whole, with its outcomes in order
  - TST-CRM-ACT-009
  - TST-CRM-ACT-003
  - TST-CRM-ACT-010
  provenance: test
  source: services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    to remove an outcome an activity has, saying to deactivate it instead
  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-008-07
  title: Retire a type while preserving prior activities
  level: browser
  proves:
  - BR-CAP-CRM-ACT-008-08
  preconditions: A type already has logged interactions.
  steps: Deactivate it, create another activity and correct an earlier one.
  expected: New work is rejected and the earlier interaction remains correctable.
  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-0700.spec.ts#CRM-ACC-0700
  - react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0698.spec.ts#CRM-ACC-0698
  - services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#refuses
    an inactive type for a new activity
  - TST-CRM-ACT-044
  - TST-CRM-ACT-042
  - TST-CRM-ACT-007
  provenance: test
  source: react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0700.spec.ts#CRM-ACC-0700
  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-008-08
  title: Reorder types atomically
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-09
  preconditions: Several activity types are present.
  steps: Send complete, incomplete, repeated and foreign-record reorder lists.
  expected: Only the complete valid list moves the types.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#creates a type with its outcomes,
    lists it and puts the list in a new order
  - react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0698.spec.ts#CRM-ACC-0698
  - TST-CRM-ACT-002
  - TST-CRM-ACT-042
  provenance: test
  source: services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#creates a type with its outcomes,
    lists it and puts the list in a new order
  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-008-09
  title: Reject stale type replacement
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-11
  preconditions: A type has advanced beyond an older edit version; separate locked fixtures require additional
    proof.
  steps: Replace it using the earlier version.
  expected: The version conflict preserves the current configuration.
  negative: true
  data_needs: Each run creates and isolates the records it needs.
  bound_to:
  - services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a version the type has moved on from
  - TST-CRM-ACT-009
  provenance: test
  source: services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    a version the type has moved on from
  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-008-10
  title: Baseline identity survives customer configuration and retirement
  category: interaction
  level: api
  proves:
  - BR-CAP-CRM-ACT-008-08
  - BR-CAP-CRM-ACT-009-02
  - BR-CAP-CRM-ACT-001-03
  - BR-CAP-CRM-ACT-003-05
  preconditions: A built-in type has an existing interaction and customer-edited name.
  steps: Reapply its baseline, deactivate the type, attempt a new interaction and correct the existing
    one.
  expected: Baseline adoption retains customer configuration; new use is refused and the correction retains
    its retired classification.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#keeps
    an inactive type on an activity that already has it; services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#adopts
    a type the tenant already has under that id, leaving it as the tenant made it; services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#refuses
    an inactive type for a new activity
  exercises:
  - CAP-CRM-ACT-008
  - CAP-CRM-ACT-001
  - CAP-CRM-ACT-009
  related:
  - CAP-CRM-ACT-001
  - CAP-CRM-ACT-009
- id: ATS-CRM-ACT-008-11
  title: Persist activity classification from Active to Inactive
  category: transition
  level: api
  proves:
  - INV-DOM-CRM-ACT-001-03
  - INV-DOM-CRM-ACT-001-12
  preconditions: Run-owned activity classification has Active standing. The parent type’s read version
    matches and updates are unlocked.
  steps: Save the type or its result list with availability disabled. Read the resulting record and affected
    projections after commit.
  expected: The resulting activity classification has Inactive standing. New selections are refused while
    existing interactions may retain the entry.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: services-crm:modules/activities/tests/integration/services/persistence/activities.integration.spec.js#keeps
    an inactive type on an activity that already has it
  state_model: STATE-CRM-ACT-005
  transition:
    from: active
    to: inactive
    trigger: Save the type or its result list with availability disabled.
- id: ATS-CRM-ACT-008-12
  title: Persist activity classification from Inactive to Active
  category: transition
  level: api
  proves:
  - INV-DOM-CRM-ACT-001-03
  - INV-DOM-CRM-ACT-001-12
  preconditions: Run-owned activity classification has Inactive standing. The parent type’s read version
    matches and updates are unlocked.
  steps: Save the type or its result list with availability enabled. Read the resulting record and affected
    projections after commit.
  expected: The resulting activity classification has Active standing. The entry becomes available for
    new selections.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: services-crm:modules/activities/services/persistence/activity-types.ts:updateActivityType
  state_model: STATE-CRM-ACT-005
  transition:
    from: inactive
    to: active
    trigger: Save the type or its result list with availability enabled.
- id: ATS-CRM-ACT-008-13
  title: Persist activity classification from Inactive to Deleted
  category: transition
  level: api
  proves:
  - INV-DOM-CRM-ACT-001-03
  - INV-DOM-CRM-ACT-001-12
  preconditions: Run-owned activity classification has Inactive standing. No interaction references the
    entry. Type deletion additionally requires a customer-defined type without either lock; result removal
    requires an update-unlocked parent and current read version. Unused results of baseline types may
    be removed.
  steps: Delete an unused type, or save its result list with an unused result omitted. Read the resulting
    record and affected projections after commit.
  expected: The resulting activity classification has Deleted standing. Removing a type also removes its
    owned results.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: services-crm:modules/activities/tests/integration/services/persistence/activity-types.integration.spec.js#refuses
    to remove an outcome an activity has, saying to deactivate it instead
  state_model: STATE-CRM-ACT-005
  transition:
    from: inactive
    to: deleted
    trigger: Delete an unused type, or save its result list with an unused result omitted.
- id: ATS-CRM-ACT-008-14
  title: Persist activity classification from Active to Deleted
  category: transition
  level: api
  proves:
  - INV-DOM-CRM-ACT-001-03
  - INV-DOM-CRM-ACT-001-12
  preconditions: Run-owned activity classification has Active standing. No interaction references the
    entry. Type deletion additionally requires a customer-defined type without either lock; result removal
    requires an update-unlocked parent and current read version. Unused results of baseline types may
    be removed.
  steps: Delete an unused type, or save its result list with an unused result omitted. Read the resulting
    record and affected projections after commit.
  expected: The resulting activity classification has Deleted standing. Removing a type also removes its
    owned results.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: services-crm:modules/activities/services/persistence/activity-types.ts:deleteActivityType
  state_model: STATE-CRM-ACT-005
  transition:
    from: active
    to: deleted
    trigger: Delete an unused type, or save its result list with an unused result omitted.
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-054'
  failure: 'gap: FND-CRM-ACT-054'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_obligations:
  finding: FND-CRM-ACT-054
  unproved_rules:
  - BR-CAP-CRM-ACT-008-10
  - BR-CAP-CRM-ACT-008-12
  permission_matrix:
    keys:
    - crm.activity-types.read
    - crm.activity-types.create
    - crm.activity-types.update
    - crm.activity-types.delete
    - crm.activity-types.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-001
  scenarios:
  - ATS-CRM-ACT-008-10
  finding: FND-CRM-ACT-054
- capability: CAP-CRM-ACT-009
  scenarios:
  - ATS-CRM-ACT-008-10
  finding: FND-CRM-ACT-054
permission_coverage:
- key: crm.activity-types.read
  finding: FND-CRM-ACT-054
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.activity-types.create
  finding: FND-CRM-ACT-054
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.activity-types.update
  finding: FND-CRM-ACT-054
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.activity-types.delete
  finding: FND-CRM-ACT-054
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.activity-types.bulk
  finding: FND-CRM-ACT-054
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
---

# Configure activity types and the details they collect: 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-008-01` | `ATS-CRM-ACT-008-01` |
| `BR-CAP-CRM-ACT-008-02` | `ATS-CRM-ACT-008-02` |
| `BR-CAP-CRM-ACT-008-03` | `ATS-CRM-ACT-008-03` |
| `BR-CAP-CRM-ACT-008-04` | `ATS-CRM-ACT-008-04` |
| `BR-CAP-CRM-ACT-008-05` | `ATS-CRM-ACT-008-04` |
| `BR-CAP-CRM-ACT-008-06` | `ATS-CRM-ACT-008-05` |
| `BR-CAP-CRM-ACT-008-07` | `ATS-CRM-ACT-008-06` |
| `BR-CAP-CRM-ACT-008-08` | `ATS-CRM-ACT-008-07`, `ATS-CRM-ACT-008-10` |
| `BR-CAP-CRM-ACT-008-09` | `ATS-CRM-ACT-008-08` |
| `BR-CAP-CRM-ACT-008-10` | `FND-CRM-ACT-054` |
| `BR-CAP-CRM-ACT-008-11` | `ATS-CRM-ACT-008-09` |
| `BR-CAP-CRM-ACT-008-12` | `FND-CRM-ACT-054` |

## Interactions With Related Capabilities

A built-in type has an existing interaction and customer-edited name. Reapply its baseline, deactivate the type, attempt a new interaction and correct the existing one.

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