Obligation 09: The coverage finding records the missing scenario.
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.
Only reachable active placement contributes to navigation and blocks app archival. 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-072
Transitioncovered
Validationcovered
Permissioncovered
Edgegap: FND-PFM-MTD-072
Failuregap: FND-PFM-MTD-072
Boundarygap: FND-PFM-MTD-072
Concurrencygap: FND-PFM-MTD-072
Invariantgap: FND-PFM-MTD-072
Interactioncovered
Test Scenarios
7 scenarios proving CAP-PFM-MTD-010; 6 bound to an existing test.
01Placement accepts available apps and valid groupsvalidationapinegativetest
[
{
"do": "Place objects in a built-in app, a local custom app, unknown and foreign apps and a blank group.",
"provenance": "test",
"source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses an app that is neither an application nor a custom app, naming it, and writes nothing"
}
]
Expected
Valid destinations succeed and unavailable apps or blank groups fail.
A valid object can be activated without placement or owner.
Steps
[
{
"do": "Activate it and inspect a boat available only through contacts.",
"provenance": "test",
"source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#activates an object that has neither a placement nor an owner association type (B4: no activation rule for either)"
}
]
Expected
Activation succeeds and related records remain accessible without a menu entry.
Data
A valid object can be activated without placement or owner.
[
{
"do": "Submit reserved app keys, invalid labels, icons and order and a stale replacement.",
"provenance": "test",
"source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses the key of a platform application, which a placement could not tell from it"
}
]
Expected
Invalid requests fail while a valid app starts unarchived at its first version.
[
{
"do": "Archive the app before and after moving or archiving its live objects.",
"provenance": "test",
"source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged"
}
]
Expected
The initial refusal names dependencies and the later archival succeeds while archived objects can retain placement.
[
{
"do": "Create or move a placement into it and replace its settings.",
"provenance": "test",
"source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses a new placement in an archived custom app, and writes nothing"
}
]
Scoped roles, broad readers and a caller without record access exist.
Steps
[
{
"do": "Request their custom navigation.",
"provenance": "test",
"source": "services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone"
}
]
Expected
Scoped callers receive only reachable objects, broad readers exclude roles-only objects and the empty-access caller is refused.
Data
Scoped roles, broad readers and a caller without record access exist.
A roles-only active object is placed in a custom app.
Steps
[
{
"do": "Request navigation with broad and scoped grants, attempt app archival, archive the object and request navigation again.",
"provenance": "proposed",
"source": [
"services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged",
"services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone",
"services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#restores an archived object as a draft, keeping its object id",
"services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#keeps a roles-only object from a customer-wide assignment, answering as if it were not there"
]
}
]
Expected
Compare navigation and app archival responses under each configuration.
Data
A roles-only active object is placed in a custom app.
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged,services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone,services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#restores an archived object as a draft, keeping its object id,services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#keeps a roles-only object from a customer-wide assignment, answering as if it were not there