---
id: ATS-CRM-ACT-005
scope: CAP-CRM-ACT-005
product_area: crm
module: activities-tasks
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  rhythm-v2-docs: 18a49edf30ee6bda18b159b65a2b91e093ea713d
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'
  - TST-CRM-ACT-002
  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'
  category: permission
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-008
  - TST-CRM-ACT-002
  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'
  category: rule
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-002
  - TST-CRM-ACT-011
  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
  category: permission
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-008
  - TST-CRM-ACT-011
  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
  category: invariant
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-008
  provenance: test
  source: services-crm:modules/activities/tests/integration/services/persistence/activities.queries.integration.spec.js#finds
    “Café” by “cafe”
  category: boundary
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-008
  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
  category: boundary
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-008
  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
  category: edge
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-011
  - TST-CRM-ACT-002
  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
  category: rule
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- 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
  - TST-CRM-ACT-002
  - TST-CRM-ACT-008
  provenance: test
  source: services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#answers 404 for a contact the
    tenant does not have
  category: permission
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-005-10
  title: Inspect absence responses after a merge
  level: api
  proves:
  - BR-CAP-CRM-ACT-005-12
  preconditions: Two contacts have been merged.
  steps: Request the former contact’s timeline.
  expected: The historical browser journey accepts Not Found or Gone for the absorbed timeline; it does
    not assert a survivor in that response.
  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
  - TST-CRM-ACT-064
  provenance: test
  source: react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  category: validation
  binding_note: The strict Gone-and-survivor contract has separate proposed proof and a coverage finding.
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-005-11
  title: Merge changes the timeline context without multiplying entries
  category: interaction
  level: api
  proves:
  - BR-CAP-CRM-ACT-005-05
  - BR-CAP-CRM-ACT-018-05
  - BR-CAP-CRM-ACT-018-07
  preconditions: Two contacts share an interaction and the duplicate has an open task.
  steps: Merge into the survivor, then read the survivor timeline and its summary and read the moved task.
  expected: The shared entry contributes once, the task references the survivor and the summary agrees
    with the consolidated context.
  negative: false
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  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; react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  exercises:
  - CAP-CRM-ACT-005
  - CAP-CRM-ACT-018
  related:
  - CAP-CRM-ACT-018
- id: ATS-CRM-ACT-005-12
  title: Reject malformed timeline queries
  category: validation
  level: api
  proves:
  - BR-CAP-CRM-ACT-005-13
  preconditions: An authorized contact timeline exists.
  steps: Request an invented query parameter and an invented page cursor.
  expected: Both requests return a validation refusal.
  negative: true
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to:
  - 'services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a timeline cursor no page
    answered: 400'
  - 'services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a timeline query parameter
    it does not know: 400'
  - TST-CRM-ACT-002
  provenance: test
  source: 'services-crm:modules/activities/tests/e2e/activities.e2e.spec.js#refuses a timeline query parameter
    it does not know: 400'
  binding_scope: Each registered suite contributes the assertions named by the retained file bindings;
    a compound scenario can require several suites. Conformance remains unverified.
- id: ATS-CRM-ACT-005-13
  title: Require the survivor on a merged timeline refusal
  category: validation
  level: api
  proves:
  - BR-CAP-CRM-ACT-005-12
  - BR-CAP-CRM-ACT-018-08
  - INV-DOM-CRM-ACT-005-05
  preconditions: A contact has merged into a known survivor.
  steps: Request the absorbed contact timeline and summary.
  expected: Both responses report Gone and identify the survivor.
  negative: true
  data_needs: Run-owned records in an isolated workspace; fixed clock for calendar checks.
  bound_to: []
  provenance: proposed
  source: services-crm:modules/activities/aws/api/activities.routes.ts:timelineRoutes
evidence:
- 'services-crm at a8d1364f1dd44b723bb5f9acba12f983e9ec8d69: scenario sources, executable assertions and
  local dependency boundaries are inspected.'
- 'react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: scoped component tests and browser journey
  assertions are inspected.'
coverage:
  rule: covered
  transition: 'gap: FND-CRM-ACT-051'
  validation: covered
  permission: covered
  edge: covered
  failure: 'gap: FND-CRM-ACT-051'
  boundary: covered
  concurrency: 'gap: FND-CRM-ACT-051'
  invariant: covered
  interaction: covered
coverage_obligations:
  finding: FND-CRM-ACT-051
  unproved_rules:
  - BR-CAP-CRM-ACT-005-14
  permission_matrix:
    keys:
    - crm.activities.read
    - crm.contacts.read
    - crm.organizations.read
    - crm.tasks.read
    - crm.activities.update
    - crm.tasks.update
    remaining: Complete allow/refuse combinations, including each console guard and each API operation.
  execution_note: Covered means a scenario is specified; it does not mean that scenario has executed or
    every variant has an executable binding.
related_coverage:
- capability: CAP-CRM-ACT-018
  scenarios:
  - ATS-CRM-ACT-005-11
  finding: FND-CRM-ACT-051
permission_coverage:
- key: crm.activities.read
  finding: FND-CRM-ACT-051
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.contacts.read
  finding: FND-CRM-ACT-051
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.organizations.read
  finding: FND-CRM-ACT-051
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.tasks.read
  finding: FND-CRM-ACT-051
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.activities.update
  finding: FND-CRM-ACT-051
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
- key: crm.tasks.update
  finding: FND-CRM-ACT-051
  note: The finding covers unproved operation and surface combinations; a permission-category scenario
    is not a complete permission matrix.
---

# Read past interactions and upcoming work on a record timeline: Capability Test Specification

## Coverage

Category coverage counts specified proof. Unbound cases remain proposed; registered assertions do not establish a passing run.

| Rule | Proof Scenario Or Finding |
|---|---|
| `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`, `ATS-CRM-ACT-005-11` |
| `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`, `ATS-CRM-ACT-005-13` |
| `BR-CAP-CRM-ACT-005-13` | `ATS-CRM-ACT-005-12` |
| `BR-CAP-CRM-ACT-005-14` | `FND-CRM-ACT-051` |

## Interactions With Related Capabilities

Two contacts share an interaction and the duplicate has an open task. Merge into the survivor, then read the survivor timeline and its summary and read the moved task.

The interaction scenario names the capabilities and rules it exercises. The coverage finding retains incomplete permission combinations and failure variants.
