---
id: ATS-CRM-ACT-005
scope: CAP-CRM-ACT-005
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-005-01
    title: Require record and activity read authority
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-01
    preconditions: Callers independently lack activity or related-record read rights.
    steps: Request timelines and summaries.
    expected: Each unauthorized request 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 timeline to a caller who may not read the contact: 403
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses
        a contact’s timeline summary to a caller without crm.activities.read:
        403
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses
        an organization’s timeline summary to a caller who may not read the
        organization: 403
    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
  - id: ATS-CRM-ACT-005-02
    title: Combine timeline kinds in the correct sections
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-02
      - BR-CAP-CRM-ACT-005-03
    preconditions: A record has activities in each status and open and closed tasks.
    steps: Read Upcoming and History.
    expected: >-
      The streams follow their ordering and tasks use their defined calendar-day
      positions.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#lists
        the history newest first: completed and cancelled activities and closed
        tasks
      - >-
        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
      - >-
        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
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#answers
        a contact’s upcoming soonest first, the open task among the scheduled
        activities
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#lists
      the history newest first: completed and cancelled activities and closed
      tasks
  - id: ATS-CRM-ACT-005-03
    title: Omit task information without task read permission
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-04
    preconditions: A record has related tasks and the caller cannot read tasks.
    steps: Read its timeline and summary.
    expected: Task entries and task counts are absent.
    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#leaves
        the tasks out for a caller who may not read tasks
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#leaves
        the task counts out of the summary for a caller who may not read tasks
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/timelines.queries.integration.spec.js#leaves
        the task counts, the assignees and the open tasks out for a caller who
        may not read tasks
    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
  - id: ATS-CRM-ACT-005-04
    title: Count and display shared interactions once per record
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-05
    preconditions: One activity links three contacts and an organization.
    steps: Read each record’s timeline and summary.
    expected: Each receives one entry and one contribution to its counts.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        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
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/timelines.queries.integration.spec.js#counts
        the activity linked to three contacts and an organization once on each
        of the four summaries
    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
  - id: ATS-CRM-ACT-005-05
    title: Search visible text without accent or case sensitivity
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-07
    preconditions: 'Notes contain accented text, uppercase text and escaped ampersands.'
    steps: Search equivalent plain text and text occurring only in markup encoding.
    expected: Visible equivalents match and encoding-only text does not.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
        “Café” by “cafe”
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
        a body stored as “Tom &amp; Jerry” by “Tom & Jerry”
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
        “ILGAZ” by “ılgaz”, the dotless ı read as i
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
        nothing by “amp”, which only the stored entity spells
    provenance: test
    source: >-
      services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
      “Café” by “cafe”
  - id: ATS-CRM-ACT-005-06
    title: Continue merged timeline pages without repetition
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-08
    preconditions: The fixture contains 90 activities and 40 closed tasks.
    steps: Read successive pages of 25 entries.
    expected: All 130 entries appear once in order across six pages.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        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
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#answers
        six pages of 25, 25, 25, 25, 25 and 5
    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
  - id: ATS-CRM-ACT-005-07
    title: Flag past scheduled work
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-09
    preconditions: A scheduled activity is past and an open task was due yesterday.
    steps: Read Upcoming.
    expected: Both entries carry overdue flags.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        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
    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
  - id: ATS-CRM-ACT-005-08
    title: Aggregate the full record independently of pages
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-11
    preconditions: A record contains mixed activity and task statuses and owners.
    steps: Read its timeline summary.
    expected: >-
      Type and status counts, bounded actor choices and upcoming totals match
      the full fixture.
    negative: false
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        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
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/timelines.queries.integration.spec.js#names
        at most 200 owners, the first by id
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#counts
        the summary’s upcoming items as the scheduled activities and the open
        tasks
    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
  - id: ATS-CRM-ACT-005-09
    title: Hide foreign record existence
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-12
    preconditions: The requested contact belongs to another workspace.
    steps: Request its timeline and summary.
    expected: Both requests report Not Found.
    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#answers
        404 for a contact the tenant does not have
      - >-
        services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#answers
        404 for the summary of a contact the tenant does not have
      - >-
        services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#refuses
        the timeline of another tenant’s contact as one the tenant does not have
    provenance: test
    source: >-
      services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#answers
      404 for a contact the tenant does not have
  - id: ATS-CRM-ACT-005-10
    title: Identify a merged record’s survivor
    level: api
    proves:
      - BR-CAP-CRM-ACT-005-12
    preconditions: Two contacts have been merged.
    steps: Request the former contact’s timeline.
    expected: The response reports Gone and identifies the survivor.
    negative: true
    data_needs: Each run creates and isolates the records it needs.
    bound_to:
      - >-
        react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
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.
---

# Read past interactions and upcoming work on a record timeline: 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-005-01` | `ATS-CRM-ACT-005-01` |
| `BR-CAP-CRM-ACT-005-02` | `ATS-CRM-ACT-005-02` |
| `BR-CAP-CRM-ACT-005-03` | `ATS-CRM-ACT-005-02` |
| `BR-CAP-CRM-ACT-005-04` | `ATS-CRM-ACT-005-03` |
| `BR-CAP-CRM-ACT-005-05` | `ATS-CRM-ACT-005-04` |
| `BR-CAP-CRM-ACT-005-07` | `ATS-CRM-ACT-005-05` |
| `BR-CAP-CRM-ACT-005-08` | `ATS-CRM-ACT-005-06` |
| `BR-CAP-CRM-ACT-005-09` | `ATS-CRM-ACT-005-07` |
| `BR-CAP-CRM-ACT-005-11` | `ATS-CRM-ACT-005-08` |
| `BR-CAP-CRM-ACT-005-12` | `ATS-CRM-ACT-005-09`, `ATS-CRM-ACT-005-10` |
| `BR-CAP-CRM-ACT-005-13` | no scenario: `FND-CRM-ACT-028` |
| `BR-CAP-CRM-ACT-005-14` | no scenario: `FND-CRM-ACT-028` |
