Skip to content

CAP-PFM-OPS-008Remember a person’s visits to records

Markdown

CAP-PFM-OPS-008

Remember a person’s visits to records

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationObserved

KindCapabilityProduct areaPlatformModuleOperational RecordsRevision1

Read atservices-platform ad3f6a65react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Accepted delivery repeats retain one visit event.The visit can feed personal recent-work queries without exposing reporting errors.
Surfaces
consoleapi
Preconditions
The caller holds view-reporting authority, which built-in reading roles include.
Postconditions
Accepted repeat deliveries share one event and rejected reports leave no new event.
Constraints
Accepted first and repeated reports both return success, distinguished by the duplicate indicator.
Intent sources
services-platform:docs/audit-events.md#2026-10-12 — Final acceptance (accepted by Andrew)services-platform:docs/audit-events.md#What an event means, and what it does not (Andrew, 2026-10-10)

Controls

29 controls apply, from the corpus control catalogue.

TC-AVL-004 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-DAT-001 TC-DAT-002 TC-DAT-003 TC-IAM-001 TC-IAM-002 TC-IAM-004 TC-IAM-005 TC-LOG-002 TC-LOG-003 TC-LOG-004 TC-LOG-005 TC-MON-001 TC-PI-001 TC-PI-002 TC-PI-004 TC-PI-005 TC-PRV-001 TC-PRV-002 TC-TEN-001 TC-TEN-002 TC-TEN-003 TC-VEN-001 TC-VEN-002 TC-VEN-003

Permissions

KeyChecked atScope
platform.record-views.createapitenant
crm.contacts.readservicetenant
crm.organizations.readservicetenant
committees.committees.readservicetenant

Business Rules

10 rules, 10 to be proved before approval. A rule's product intent is derived from its origin: 10 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
The view-reporting registry accepts contacts, organizations and committees and rejects unsupported record types with the supported vocabulary.
origin: services-platform:docs/audit-events.md#Which record types report views
validationservicetest
services-platform:modules/audit/tests/integration/services/record-views/record-view.integration.spec.js#refuses a record type the registry does not hold, naming the types it does
02must prove
Confirmed
View reporting resolves the target under the caller’s record-read and dataset-query authority before writing; refused or missing targets create no event.
✓ A request satisfying the stated conditions receives the permitted result.✗ A request outside the allowed conditions cannot establish the claimed result.
origin: services-platform:docs/audit-events.md#2026-10-12 — Final acceptance
permissionapi, servicetest
03must prove
Confirmed
Organization views require organization readership rather than contact readership.
permissionservicetest
services-platform:modules/audit/tests/integration/services/record-views/record-view.integration.spec.js#refuses an organization when the caller holds only contact read, because opening one needs organization read
04must prove
Confirmed
The server derives attribution and event identity from verified execution context and refuses request bodies that supply those values or undeclared fields.
validationapitest
services-platform:modules/audit/tests/unit/aws/api/audit-api-mapper.spec.ts#refuses a body naming the actor, which is how a trail would be written in somebody else’s name
05must prove
Confirmed
A repeat visit key for the same record returns the original event as a duplicate, while reuse for another record is refused and a fresh visit needs a fresh key.
invariantservice, databasetest
services-platform:modules/audit/tests/integration/services/record-views/record-view.integration.spec.js#reports the retry as a duplicate rather than refusing it, because the client has nothing to fix
06must prove
Confirmed
Visit keys use UUID form, are normalized to lower case and are unique within a person’s workspace history.
validationservice, databasetest
services-platform:modules/audit/tests/integration/services/persistence/audit-events.integration.spec.js#lower-cases the occurrence key, so one visit cannot become two by changing its case
07must prove
Confirmed
View metadata admits only short application and screen tokens and stores no record name, image or content.
validationservice, databasetest
08must prove
Confirmed
Console tracking records one visit after a successfully displayed record navigation; tab changes retain that visit, returning or reloading creates another, and unresolved screens report nothing.
policyconsoletest
react-console:e2e/controlled/record-views.controlled.spec.ts#switching tab on the same record is still one visit
09must prove
Confirmed
View-reporting errors remain invisible to the person; retryable transport, throttle and server failures reuse the visit key, while client refusals are not retried.
policyconsoletest
react-console:e2e/controlled/record-views.controlled.spec.ts#a failure to report a visit never reaches the person, and the retries are one visit
10must prove
Confirmed
The custom-record read endpoint records a server-attributed view with a newly generated key rather than relying on console reporting.
policyserviceobserved

Scenarios

IdGivenWhenThenProvenance
01A reader navigates to a successfully loaded contact.Contact 360 reports the navigation visit.The visit is retained and can feed the person’s Recent Items query.inferred
react-console:e2e/controlled/record-views.controlled.spec.ts#reports one visit per navigation, and the header lists the records newest first
02The caller can read contacts but lacks organization readership.The caller reports a visit to an organization.The reporting operation refuses it and leaves the trail unchanged.inferred
services-platform:modules/audit/tests/integration/services/record-views/record-view.integration.spec.js#refuses an organization when the caller holds only contact read, because opening one needs organization read

Edge Cases

IdGivenWhenThenProvenance
03A visit key already identifies another record.A client reuses that key for a new record report.The server asks for a fresh visit key and preserves the original event.inferred

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.