---
id: CAP-CRM-ACT-011
title: 'Complete, cancel and reopen work with clear attribution'
feature: FEAT-CRM-ACT-03
product_area: crm
module: activities-tasks
revision: 2
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - react-console acceptance inventory CAP-CRM-ACT-013
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-crm:docs/milestones/CRM-M8-activities-and-tasks.md#D-52'
purpose: Staff make deliberate closing decisions and can reopen work when needed.
outcomes:
  - Recorded closing actor and time
  - Closed details protected from ordinary edits
  - Stale lifecycle actions refused
concepts:
  - CON-CRM-ACT-003
actors:
  - ACT-CRM-001
  - ACT-CRM-006
surfaces:
  - console
  - api
preconditions:
  - The task is present and has no full update lock.
postconditions: []
permissions:
  - key: crm.tasks.update
    where_checked: api
    scope: tenant
  - key: crm.tasks.update
    where_checked: console
    scope: tenant
rules:
  - id: BR-CAP-CRM-ACT-011-01
    statement: >-
      Open, Waiting for someone else and Deferred remain work in progress, while
      Completed and Cancelled are closed; ordinary edits move only among the
      open statuses.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/unit/services/tasks/lifecycle.spec.js#allows
      an open task to move to any of the three open statuses
    origin: none
  - id: BR-CAP-CRM-ACT-011-02
    statement: >-
      Completion and cancellation use their dedicated actions and cannot be
      performed by a general task edit.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/unit/services/tasks/lifecycle.spec.js#refuses
      an update that would complete the task, naming the operation that would
      have worked
    origin: none
  - id: BR-CAP-CRM-ACT-011-03
    statement: >-
      Completion and cancellation record the actor and time, retaining those
      stamps only for the corresponding closed status.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#completes the task,
      stamping who finished it and when
    origin: none
  - id: BR-CAP-CRM-ACT-011-04
    statement: Switching between Completed and Cancelled requires reopening first.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/unit/services/tasks/lifecycle.spec.js#refuses
      a cancelled task, asking for the reopen that would make it possible
    origin: none
  - id: BR-CAP-CRM-ACT-011-05
    statement: >-
      A person cannot repeat completion of a completed task or cancellation of a
      cancelled task.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 409 to
      completing a task that is already completed
    origin: none
  - id: BR-CAP-CRM-ACT-011-06
    statement: >-
      Reopening a closed task sets Open and removes closing stamps; reopening
      work already in an open status is refused.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#reopens
      it as open, whatever status it was in before it closed
    origin: none
  - id: BR-CAP-CRM-ACT-011-07
    statement: >-
      General edits to a closed task are rejected even when the requested values
      are unchanged.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/unit/services/tasks/lifecycle.spec.js#refuses
      an update of a completed task even where the status is left alone
    origin: none
  - id: BR-CAP-CRM-ACT-011-08
    statement: >-
      Complete, Cancel and Reopen require the version read and reject a stale
      version.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#answers 409 to the
      reopen sent at the version the completion moved on from
    origin: 'services-crm:docs/milestones/CRM-M8-activities-and-tasks.md#D-52'
  - id: BR-CAP-CRM-ACT-011-09
    statement: Closing a task preserves its holder and queue membership.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#leaves
      the assignment and the queue alone: completing is not releasing
    origin: none
  - id: BR-CAP-CRM-ACT-011-10
    statement: >-
      Lifecycle refusals include a problem code and explanatory message, but
      other task refusals do not uniformly include codes.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/unit/services/tasks/lifecycle.spec.js#gives
      every refusal of the table a code
    origin: none
  - id: BR-CAP-CRM-ACT-011-11
    statement: Only a signed-in user or registered service principal can close a task.
    kind: permission
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/integration/services/persistence/tasks.integration.spec.js#is
      refused a completion
    origin: none
  - id: BR-CAP-CRM-ACT-011-12
    statement: >-
      A closed task’s console fields are disabled and Reopen is the available
      state-changing action.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: test
    source: >-
      react-console:components/tasks/__tests__/task-detail-sheet.test.tsx#disables
      every field, so a finished task cannot be quietly edited
    origin: none
scenarios:
  - id: SC-CAP-CRM-ACT-011-01
    given: One editor completed a task while another retained its earlier version.
    when: Submit Reopen from the stale version.
    then: The task stays completed and the action reports a conflict.
    provenance: test
    source: >-
      services-crm:modules/tasks/tests/e2e/tasks.e2e.spec.js#leaves the task
      completed, as the first person left it
edge_cases:
  - id: SC-CAP-CRM-ACT-011-02
    given: The task is completed.
    when: 'Attempt an unchanged general edit, cancellation and reassignment.'
    then: Each action is rejected until reopening permits it.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0708.spec.ts#CRM-ACC-0708
constraints: []
depends_on:
  - CAP-CRM-ACT-010
related:
  - CAP-CRM-ACT-015
  - CAP-CRM-ACT-017
journeys:
  - JNY-CRM-ACT-002
open_questions: []
evidence:
  - >-
    services-crm at a8d1364f1dd44b723bb5f9acba12f983e9ec8d69: Independently
    reviewed declarations, behavior and assertions identified in this
    capability’s row citations.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: Independently
    reviewed declarations, behavior and assertions identified in this
    capability’s row citations.
controls: [TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-006, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003]
---

# Complete, cancel and reopen work with clear attribution

## Purpose

Staff make deliberate closing decisions and can reopen work when needed.

## How It Works

The worker opens a task and decides whether the work is finished or abandoned. Complete and Cancel record that decision through dedicated actions. Rhythm checks the task version and current status first. General field editing cannot close the work. Closed fields remain unavailable until the task is reopened. Reopen restores Open and clears the prior closing stamps. The task keeps its holder and queue context when closed. A repeated person-driven close is refused rather than accepted as another decision. A service uses its own replay behavior when delivering workflow actions.

## Relationships

- Task recording supplies the work being closed.
- Task assignment retains routing information across closure.
- Workflow task actions apply service-specific repeat behavior.
