Skip to content

CAP-PFM-MTD-017Define Meaningful Record Relationships

Markdown

CAP-PFM-MTD-017

Define Meaningful Record Relationships

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationObserved

KindCapabilityProduct areaPlatformModuleMetadata and Organization-defined 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
Administrators need a shared vocabulary for connections the organization tracks.Retiring a used type preserves its existing links.
Surfaces
consoleapi
Postconditions
Type mutations leave security events identifying the changed fields.
Intent sources
services-platform:docs/milestones/plans/PLAT-M6-plan.md#4. Assumptions A1, A2; 5. D1, D3, D5 (approved 2026-10-21)services-platform:docs/proposals/custom-objects/09-decisions.md#D-04, D-12, D-16

Controls

23 controls apply, from the corpus control catalogue.

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

Permissions

KeyChecked atScope
platform.association-types.readapitenant
platform.association-types.createapitenant
platform.association-types.updateapitenant
platform.association-types.deleteapitenant

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
A relationship type has a permanent bounded key, labels from both sides, one-to-one, one-to-many or many-to-many cardinality, dating and primary settings and detach, cascade or restrict rules for each side, rejecting invalid choices.
validationapi, service, databasetest
services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#answers 400 to an unknown cardinality, naming the three
02must prove
Confirmed
Endpoints may be contacts, organizations or active custom objects of the workspace, including two sides of the same type, but not draft custom objects.
origin: services-platform:docs/milestones/plans/PLAT-M6-plan.md#5. D1 (Andrew, 2026-10-21: contacts, organizations, custom records)
validationservicetest
services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#answers 400 to a type of a draft custom object, naming it as not active
03must prove
Confirmed
A relationship type cannot define a cascade that would delete a contact or organization.
validationservicetest
04must prove
Confirmed
Endpoint types, cardinality and dating are immutable; versioned changes may alter labels and policies, and primary support cannot be disabled while an in-force primary remains.
invariantservicetest
services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#refuses a change of cardinality, the shape of a type being immutable, and leaves the row as it was
05must prove
Confirmed
Removal deletes an unused type or deactivates a used type, preserving links and blocking new ones while allowing subsequent revival.
lifecycleservicetest
06must prove
Confirmed
A relationship named as an object owner cannot be deleted or deactivated regardless of object status, and the refusal names the affected objects and required owner change.
origin: services-platform:docs/milestones/plans/PLAT-M6-plan.md#5. D3 (Andrew, 2026-10-21: "Refuse, name the object")
validationservicetest
services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#refuses deactivating the type of one object, naming it by its label and what to change first
07must prove
Confirmed
Required-link flags can be stored on a type but have no enforcement in record or link writes.
no proof recorded yet
validationserviceunknown
08must prove
Confirmed
The approved relationship limits are one hundred types per workspace and twenty touching an object, but current code enforces neither limit.
no proof recorded yet
validationdocumented
09must prove
Confirmed
Type mutations audit changed field names and advance the workspace query description so relationship changes become available to queries.
policyservice, databasetest
services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#records a delete and a deactivation in the security trail, each by its action
10must prove
Confirmed
The relationship-type editor explains choices and validation issues, saves no invalid definition and remains unavailable to standard users.
policyconsoletest
react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S02.spec.ts#PLAT-M6-S02: a relationship type with a missing label, a cascade onto contacts or a duplicate id is refused and nothing is saved

Scenarios

IdGivenWhenThenProvenance
01An administrator opens relationship configuration.Define dated many-to-many Crew between contacts and boats.The contact and boat pages offer the relationship card using the appropriate directional label.test
react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S01.spec.ts#PLAT-M6-S01: an administrator defines Crew and both Osprey's and Tom's pages show it under their own label

Edge Cases

IdGivenWhenThenProvenance
02Boat selects a contact ownership type.Attempt to retire that type.The refusal identifies Boat as a dependent owner definition.test
react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S09.spec.ts#PLAT-M6-S09: a relationship type is relabelled, retired, revived and removed, and Boat's owner type cannot be retired

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.