---
id: ATS-CRM-ACT-010
scope: CAP-CRM-ACT-010
product_area: crm
module: activities-tasks
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-ACT-010-01
    title: Reject missing or excessive task text
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-01
    preconditions: A valid task type exists.
    steps: >-
      Create with missing, blank and 501-character titles and a 20,001-character
      description.
    expected: Each invalid field is identified and no task is created.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a create whose title is blank, naming the field
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a create whose title is longer than 500 characters, naming the field
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a create whose description is longer than 20000 characters, naming the
        field
      - >-
        services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 400 for a
        task with no title
      - >-
        services-crm:modules/tasks/tests/integration/db/tasks.table.integration.spec.js#refuses
        a title that is blank
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
      a create whose title is blank, naming the field
  - id: ATS-CRM-ACT-010-02
    title: Require an existing task classification
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-02
    preconditions: The workspace can be addressed for task creation.
    steps: Create without a type and with an unknown type.
    expected: Both requests fail validation.
    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 400 for a
        task with no type, since every task is of some kind
      - >-
        services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 400 for a
        task type the tenant does not have
      - >-
        services-crm:modules/tasks/tests/integration/db/tasks.table.integration.spec.js#refuses
        a task with no type at all, which Rhythm 1.0 required too
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 400 for a
      task with no type, since every task is of some kind
  - id: ATS-CRM-ACT-010-03
    title: Prevent creation in a closed status
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-03
    preconditions: A valid task type is available.
    steps: Create directly as Completed.
    expected: The refusal points to the closing action.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a create in a closed status, naming the operation that does close a task
      - >-
        services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 400 for a
        task created already completed, since a task is created open
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
      a create in a closed status, naming the operation that does close a task
  - id: ATS-CRM-ACT-010-04
    title: Apply task defaults and retain task date
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-04
    preconditions: A task type exists.
    steps: 'Create without priority or task date, then replace without task date.'
    expected: >-
      The task starts Open at Normal priority with today’s workspace date, which
      replacement preserves.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#dates
        a task today, in the tenant's calendar, when the create gives no task
        date
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#opens
        a task at normal priority when the create says neither
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0712.spec.ts#CRM-ACC-0712
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#dates
      a task today, in the tenant's calendar, when the create gives no task date
  - id: ATS-CRM-ACT-010-05
    title: Reject impossible due days
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-05
    preconditions: A valid task type is available.
    steps: Create work due on February 30.
    expected: The response identifies the invalid due-date field.
    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 400
        naming the field for a due date that is not a day of the calendar
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 400 naming
      the field for a due date that is not a day of the calendar
  - id: ATS-CRM-ACT-010-06
    title: Discard supplied due time while keeping its day
    level: browser
    proves:
      - BR-CAP-CRM-ACT-010-06
    preconditions: A valid task type is available.
    steps: Submit a due date containing a time component.
    expected: Creation succeeds and the stored due value contains only its calendar day.
    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-0712.spec.ts#CRM-ACC-0712
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0712.spec.ts#CRM-ACC-0712
  - id: ATS-CRM-ACT-010-07
    title: Reject local references outside the workspace
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-07
    preconditions: 'Another workspace owns contact, organization, type and queue fixtures.'
    steps: Create tasks referencing each fixture.
    expected: Each foreign reference fails and no task is retained.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a contact the tenant does not have
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        an organization the tenant does not have
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a queue the tenant does not have
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a task of this tenant that would name the other tenant’s task type
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#writes
        no task at all for a create it refused
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
      a contact the tenant does not have
  - id: ATS-CRM-ACT-010-08
    title: Preserve work after related-record deletion
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-08
    preconditions: A task refers to a contact and organization.
    steps: Delete both related records.
    expected: The task remains with both local references cleared.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/tasks/tests/integration/db/tasks.table.integration.spec.js#keeps
        the task: the work outlives the record it was about
      - >-
        services-crm:modules/tasks/tests/integration/db/tasks.table.integration.spec.js#clears
        the contact it was about
      - >-
        services-crm:modules/tasks/tests/integration/db/tasks.table.integration.spec.js#clears
        the organization it was about
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0719.spec.ts#CRM-ACC-0719
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/db/tasks.table.integration.spec.js#keeps
      the task: the work outlives the record it was about
  - id: ATS-CRM-ACT-010-09
    title: Reserve external task references within each workspace
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-09
    preconditions: A task already holds an external reference.
    steps: Reuse that reference locally and in another workspace.
    expected: Local reuse fails and the other workspace can use it.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a second task of the tenant with an external id another task holds
        (DEF-CRM-0719)
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#lets
        another tenant’s task hold an external id this tenant’s task holds
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
      a second task of the tenant with an external id another task holds
      (DEF-CRM-0719)
  - id: ATS-CRM-ACT-010-10
    title: Preserve partial edits and reject stale replacement
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-10
    preconditions: A saved task has a current version and optional details.
    steps: >-
      Patch one field, replace using an older version and submit a mismatched
      task reference.
    expected: >-
      The patch preserves other fields, stale replacement conflicts and the
      mismatched reference fails.
    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#and leaves what
        the patch said nothing about as it was
      - >-
        services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#then, when the
        version is off, refuses the change (409)
      - >-
        services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#then, when the id
        is wrong, refuses the change (400)
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        a replacement at a version the row has moved past, and leaves the row as
        it was
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#and leaves what the
      patch said nothing about as it was
  - id: ATS-CRM-ACT-010-11
    title: Apply task update and deletion locks
    level: api
    proves:
      - BR-CAP-CRM-ACT-010-11
    preconditions: Separate tasks have full and deletion-only locks.
    steps: Try prohibited editing and deletion.
    expected: The relevant locks cause refusals and preserve the records.
    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 deleting
        a task locked against deletes
      - >-
        services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#refuses changing
        a task locked against updates
      - >-
        services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#refuses
        the delete of a locked task, and leaves it in the table
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#refuses deleting a
      task locked against deletes
  - id: ATS-CRM-ACT-010-12
    title: Restrict deletion to administrator API use
    level: browser
    proves:
      - BR-CAP-CRM-ACT-010-12
    preconditions: A task and Standard User caller are available.
    steps: Inspect console actions and attempt deletion through the API.
    expected: >-
      The console exposes no delete action and the API requires deletion
      authority.
    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-0707.spec.ts#CRM-ACC-0707
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0716.spec.ts#CRM-ACC-0716
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0707.spec.ts#CRM-ACC-0707
evidence:
  - >-
    Pinned service assertions and proposed proof cases are identified in the
    scenario sources and bindings.
  - >-
    Pinned console assertions and proposed proof cases are identified in the
    scenario sources and bindings.
---

# Record and maintain a piece of work: Acceptance Test Set

## Coverage

Bound scenarios identify existing assertions; unbound scenarios remain proposed proof. Static inspection does not establish a passing execution.

| Rule | Proof Scenario Or Gap |
|---|---|
| `BR-CAP-CRM-ACT-010-01` | `ATS-CRM-ACT-010-01` |
| `BR-CAP-CRM-ACT-010-02` | `ATS-CRM-ACT-010-02` |
| `BR-CAP-CRM-ACT-010-03` | `ATS-CRM-ACT-010-03` |
| `BR-CAP-CRM-ACT-010-04` | `ATS-CRM-ACT-010-04` |
| `BR-CAP-CRM-ACT-010-05` | `ATS-CRM-ACT-010-05` |
| `BR-CAP-CRM-ACT-010-06` | `ATS-CRM-ACT-010-06` |
| `BR-CAP-CRM-ACT-010-07` | `ATS-CRM-ACT-010-07` |
| `BR-CAP-CRM-ACT-010-08` | `ATS-CRM-ACT-010-08` |
| `BR-CAP-CRM-ACT-010-09` | `ATS-CRM-ACT-010-09` |
| `BR-CAP-CRM-ACT-010-10` | `ATS-CRM-ACT-010-10` |
| `BR-CAP-CRM-ACT-010-11` | `ATS-CRM-ACT-010-11` |
| `BR-CAP-CRM-ACT-010-12` | `ATS-CRM-ACT-010-12` |
| `BR-CAP-CRM-ACT-010-13` | no scenario: `FND-CRM-ACT-028` |
