---
id: CAP-CRM-ACT-005
title: Read past interactions and upcoming work on a record timeline
feature: FEAT-CRM-ACT-01
product_area: crm
module: activities-tasks
revision: 2
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - react-console acceptance inventory CAP-CRM-ACT-003
  - react-console acceptance inventory CAP-CRM-ACT-016
  - react-console acceptance inventory CAP-CRM-ACT-019
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-20'
purpose: >-
  Staff prepare for a conversation by reviewing related interactions and work
  together.
outcomes:
  - Past and future context in one place
  - Task visibility aligned with read authority
  - A summary independent of pagination
concepts:
  - CON-CRM-ACT-005
  - CON-CRM-ACT-001
  - CON-CRM-ACT-003
actors:
  - ACT-CRM-001
  - ACT-CRM-002
  - ACT-CRM-006
surfaces:
  - console
  - api
preconditions:
  - The caller holds activity read and related-record read authority.
postconditions: []
permissions:
  - key: crm.activities.read
    where_checked: api
    scope: tenant
  - key: crm.contacts.read
    where_checked: api
    scope: tenant
  - key: crm.organizations.read
    where_checked: api
    scope: tenant
  - key: crm.tasks.read
    where_checked: service
    scope: tenant
  - key: crm.activities.update
    where_checked: service
    scope: tenant
  - key: crm.tasks.update
    where_checked: service
    scope: tenant
rules:
  - id: BR-CAP-CRM-ACT-005-01
    statement: >-
      Opening a record timeline requires activity read permission and read
      permission for that contact or organization.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a
      timeline to a caller who may not read the contact: 403
    origin: none
  - id: BR-CAP-CRM-ACT-005-02
    statement: >-
      Upcoming orders scheduled activities and open tasks from earliest to
      latest, while History orders completed or cancelled activities and closed
      tasks from latest to earliest.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#lists
      the upcoming soonest first: the overdue scheduled activity, then open
      tasks and scheduled activities in time order
    origin: none
  - id: BR-CAP-CRM-ACT-005-03
    statement: >-
      An open task uses its due day or, without one, its task date; a closed
      task uses its task date, positioned at workspace midnight.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#answers
      a task item whole: its envelope at the start of its day in the tenant’s
      zone, and the task
    origin: none
  - id: BR-CAP-CRM-ACT-005-04
    statement: >-
      Task rows and task summary counts are omitted when the caller lacks task
      read permission.
    kind: permission
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#leaves
      the tasks out for a caller who may not read tasks
    origin: none
  - id: BR-CAP-CRM-ACT-005-05
    statement: >-
      Each shared activity appears once on each linked record’s timeline and
      contributes once to that record’s summary.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#shows
      the activity linked to three contacts and an organization once on each of
      the four timelines
    origin: none
  - id: BR-CAP-CRM-ACT-005-06
    statement: >-
      Timeline filters support type, owner or assignee, outcome, status and time
      range; selecting an outcome excludes tasks, and selecting the task kind
      includes them.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: false
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#filters
      by type, the tasks left out unless `task` is named
    origin: none
  - id: BR-CAP-CRM-ACT-005-07
    statement: >-
      Text search matches activity subjects and notes and task titles and
      descriptions without distinguishing accents or letter case.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
      “Café” by “cafe”
    origin: none
  - id: BR-CAP-CRM-ACT-005-08
    statement: >-
      Timeline pages contain 25 items by default and at most 100, continuing
      across both sources without repeated or skipped items.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#answers
      every item exactly once, in order, across pages of 25 that interleave the
      two sources
    origin: none
  - id: BR-CAP-CRM-ACT-005-09
    statement: >-
      Past scheduled activities and open tasks due before today carry an overdue
      flag.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#marks
      an overdue scheduled activity and an overdue open task as overdue
    origin: none
  - id: BR-CAP-CRM-ACT-005-10
    statement: >-
      An item’s editable flag reflects the caller’s update permission for its
      record kind.
    kind: permission
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#marks
      nothing editable for a caller who may change neither kind
    origin: none
  - id: BR-CAP-CRM-ACT-005-11
    statement: >-
      The summary aggregates the entire timeline by type and status, lists no
      more than 200 owners and assignees, and counts upcoming work independently
      of pagination.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/timelines.queries.integration.spec.js#counts
      a contact’s mix by type, by status, its owners and assignees, its upcoming
      items and its tasks
    origin: none
  - id: BR-CAP-CRM-ACT-005-12
    statement: >-
      A missing workspace record produces a not-found response; a merged record
      produces a gone response identifying the survivor.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#answers
      404 for a contact the tenant does not have
    origin: 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-20'
  - id: BR-CAP-CRM-ACT-005-13
    statement: >-
      Unknown query parameters and invalid page cursors cause a refusal rather
      than being ignored.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a
      timeline query parameter it does not know: 400
    origin: none
  - id: BR-CAP-CRM-ACT-005-14
    statement: >-
      Both contact and organization activity tabs load their own timelines, and
      task entries navigate to the task drawer on the Tasks screen.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: >-
      react-console:components/activities/record-activity-timeline.tsx:RecordActivityTimeline
    origin: none
scenarios:
  - id: SC-CAP-CRM-ACT-005-01
    given: 'A contact has a timeline containing 5,000 activities.'
    when: Read its opening page and summary.
    then: Indexed record reads satisfy the benchmark’s response budget.
    provenance: test
    source: >-
      services-crm:modules/activities/tests/benchmark/timeline.benchmark.spec.js#answers
      every page within the budget
  - id: SC-CAP-CRM-ACT-005-02
    given: A contact has many timeline entries.
    when: 'Apply owner and text filters, then request another page.'
    then: Results match the filters and pagination introduces no duplicates.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0696.spec.ts#CRM-ACC-0696
edge_cases:
  - id: SC-CAP-CRM-ACT-005-03
    given: A scheduled activity and task share a calendar day.
    when: Read the Upcoming section.
    then: >-
      Each uses its timeline position, with undated-due tasks positioned by task
      date.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0697.spec.ts#CRM-ACC-0697
constraints: []
depends_on:
  - CAP-CRM-ACT-001
  - CAP-CRM-ACT-010
related:
  - CAP-CRM-ACT-018
journeys:
  - JNY-CRM-ACT-001
  - JNY-CRM-ACT-006
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-004, TC-LOG-005, TC-PI-001, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003]
---

# Read past interactions and upcoming work on a record timeline

## Purpose

Staff prepare for a conversation by reviewing related interactions and work together.

## How It Works

A reader opens the Activity tab of a contact or organization. Rhythm combines the activities linked to that record with tasks about it. Upcoming and History provide the two entry points into that stream. Filters and text search help the reader narrow a busy record. The summary gives counts and actor choices for the whole timeline. Additional pages continue across both record kinds. Callers without task read permission receive activity information alone. Task entries open the Tasks screen with the relevant drawer selected. Editability indicates permission, so a locked item can still require a later refusal.

## Relationships

- Activity logging supplies interactions for the stream.
- Task recording supplies related work.
- Record changes and merges determine which record provides the context.
