Category coverage identifies the kind of proof present. Detailed transition, permission and invariant obligations and unbound proposals remain in the coverage finding until their individual cases are accounted for.
The ended connection is explained in history and no longer protects its endpoint. The structured interaction rows identify the related capabilities exercised and any remaining gap. Cross-capability workflow seams remain subject to the detailed coverage audit.
Coverage
Rulegap: FND-PFM-MTD-080
Transitioncovered
Validationcovered
Permissioncovered
Edgegap: FND-PFM-MTD-080
Failurecovered
Boundarycovered
Concurrencycovered
Invariantcovered
Interactioncovered
Test Scenarios
13 scenarios proving CAP-PFM-MTD-018; 11 bound to an existing test.
01Creating links validates both endpointsvalidationapinegativetest
[
{
"do": "Use an unknown type, missing or foreign endpoint, self-link and a route-supplied endpoint.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses a record associated with itself"
}
]
Expected
Invalid cases fail and the route-supplied counterpart creates a valid link.
[
{
"do": "Book overlaps from today and the inclusive end date, then an adjacent booking and inspect after expiry.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#refuses a second link of a one-place type that starts today, naming the link whose end date has not passed"
}
]
Expected
Overlaps fail, the adjacent span succeeds and the current place becomes free after the end date.
Pair, cardinality and primary fixtures contain existing links.
Steps
[
{
"do": "Add overlapping, adjacent, unbounded and competing primary links through API and console.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#refuses a second link of one pair whose dates overlap the first, leaving the first alone"
}
]
Expected
Conflicts identify the existing place, adjacent spans succeed and the console saves no conflicting insurer.
Data
Pair, cardinality and primary fixtures contain existing links.
[
{
"do": "Race overlapping creates and separately race adjacent spans.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#refuses one of two writers of overlapping links of one pair, as a refusal and not a database error"
}
]
Expected
Only one conflicting writer succeeds while adjacent writers can both succeed.
[
{
"do": "Submit forbidden dates, a reversed span, an invalid calendar day and a forbidden primary.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses an end before the start on a dated type"
}
]
[
{
"do": "Replace an endpoint, correct notes and repeat with a stale version.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#answers 400 to a replacement that names another record"
}
]
Expected
Endpoint replacement and stale changes fail while valid notes change.
[
{
"do": "End with default or explicit days, an invalid earlier day, an expired link and an undated type.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses an end before the association started, leaving it open"
}
]
Expected
Valid dated endings are stored, invalid and unsupported endings fail, and ended links appear in historical browsing.
[
{
"do": "Remove each link.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#removes a link that has an end date when it is deleted, correcting history, and ends one with none"
}
]
Expected
The open dated link ends today and the other links are deleted.
A record already holds one thousand links of a type.
Steps
[
{
"do": "Create another link.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses an association past the per-record limit of the type, writing nothing"
}
]
Expected
Creation fails and historical links count toward the limit.
Data
A record already holds one thousand links of a type.
Contact, organization and custom-record relationships exist.
Steps
[
{
"do": "List from both directions and refresh each relevant console page.",
"provenance": "test",
"source": "services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#lists it on the organization’s path in the reverse direction, naming the contact"
}
]
Expected
Directional labels and opposite names appear locally and another workspace sees none of the links.
Data
Contact, organization and custom-record relationships exist.
Standard, read-only and API reader contexts exist.
Steps
[
{
"do": "Maintain links as the standard user and attempt those actions as readers.",
"provenance": "test",
"source": "react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S12.spec.ts#PLAT-M6-S12: a standard user links, ends and removes but has no Relationship Types screen, and a read-only colleague sees no actions"
}
]
Expected
The standard user succeeds, reader cards lack actions and unauthorized API creation fails.
Data
Standard, read-only and API reader contexts exist.
[
{
"do": "Edit and end an update-locked link, remove a locked link and maintain an unlocked one.",
"provenance": "proposed",
"source": "services-platform:modules/associations/services/persistence/associations.ts:updateAssociation"
}
]
Expected
Locks refuse the protected operations and the unlocked existing link can still change.
A dated restricting link joins two custom records.
Steps
[
{
"do": "End it on a past valid date, inspect both histories and its event, then delete an endpoint.",
"provenance": "proposed",
"source": [
"services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses an end before the association started, leaving it open",
"services-platform:docs/associations.md#7a. History",
"services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.events.integration.spec.js#publishes nothing when the transaction that wrote the record rolls back, in the ledger or the queue",
"services-platform:modules/associations/tests/integration/db/apply-endpoint-deletion.integration.spec.js#answers what endpointDeletionOutcome says for an open association on the to side under restrict"
]
}
]
Expected
Compare ended browsing, captured change and subsequent deletion outcome.
Data
A dated restricting link joins two custom records.
Source
services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses an end before the association started, leaving it open,services-platform:docs/associations.md#7a. History,services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.events.integration.spec.js#publishes nothing when the transaction that wrote the record rolls back, in the ledger or the queue,services-platform:modules/associations/tests/integration/db/apply-endpoint-deletion.integration.spec.js#answers what endpointDeletionOutcome says for an open association on the to side under restrict