---
id: ADR-CRM-ACT-003
title: Task closing is a dedicated action with its own record
product_area: crm
module: activities-tasks
revision: 1
status: proposed
design_intent: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Use dedicated task completion, cancellation and reopening actions for crossing the
  closed-work boundary, while ordinary edits can move among unfinished statuses.
constrains:
  - DOM-CRM-ACT-003
  - STATE-CRM-ACT-002
  - SVC-CRM-ACT-tasks
  - WF-CRM-ACT-003
  - WF-CRM-ACT-005
  - SCR-CRM-ACT-006
origin: >-
  Task management migration design §4 (services-crm
  docs/migrations/task-management/README.md); the version requirement on the three actions
  is Andrew's ruling D-52 (CRM-M8, 2026-10-19).
alternatives:
  - option: Allow ordinary edits to choose any task status.
    why_not: >-
      That approach would need another mechanism to enforce closing attribution and
      protect closed work.
  - option: Rely on full revision history while allowing ordinary status edits.
    why_not: >-
      History could describe changes but would not itself enforce the closed-work
      boundary; the task-history question remains separate.
consequences:
  - >-
    Closed work rejects ordinary editing until reopened, including unchanged edit
    requests.
  - Changing one closed outcome to another requires reopening first.
  - Coded refusals distinguish lifecycle conditions for console and service callers.
  - Public closing and reopening actions require the version that was read.
supersedes: []
evidence:
  - >-
    services-crm at a8d1364f: modules/tasks/services/tasks/lifecycle.ts;
    services/persistence/tasks.ts (closeTask); db/tasks.table.ts (completion and
    cancellation checks); docs/milestones/CRM-M8-activities-and-tasks.md (D-52).
---

# Task closing is a dedicated action with its own record

## Context

Completion and cancellation describe accountable decisions about work. Closing attribution and write restrictions need to agree.

## Decision

A shared lifecycle function governs ordinary edits and dedicated actions. Closing records actor and instant; reopening clears closing stamps and chooses Open. This record preserves the separately confirmed public-action version requirement.

## Alternatives Considered

The structured alternatives describe concrete competing designs and their tradeoffs. Where the origin records an existing ruling, it remains the authority; an observed implementation does not establish Product’s rejection of every alternative.

## Consequences

The drawer mirrors closed standing through disabled fields. Workflow callers use a distinct repeat policy and receive coded refusals when a changed command no longer applies.
