Skip to content

CAP-PFM-MTD-010Make Custom Records Discoverable

Markdown

CAP-PFM-MTD-010

Make Custom Records Discoverable

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
Staff need recognizable entry points for the organization own record types.A custom app cannot be archived while live object placements depend on it.
Surfaces
consoleapi
Intent sources
services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 D9 (placement), D15 (custom apps), B2, B3, B4services-platform:docs/milestones/plans/PLAT-M5-plan.md#2. Andrew's placement direction; PLAT-M5-S01, S13services-platform:docs/proposals/custom-objects/09-decisions.md#D-14 (the administrator chooses an area)

Controls

27 controls apply, from the corpus control catalogue.

TC-AI-001 TC-AI-002 TC-AI-003 TC-AI-004 TC-AI-006 TC-AI-007 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-DAT-001 TC-DAT-003 TC-DAT-004 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.custom-objects.readapitenant
platform.custom-objects.createapitenant
platform.custom-objects.updateapitenant
platform.custom-objects.deleteapitenant
platform.custom-records.readapirecord

Business Rules

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

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Placement accepts the seventeen console navigation apps or a workspace unarchived custom app and an optional trimmed group of one to one hundred characters, rejecting unknown apps.
origin: services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 D9 (Andrew, 2026-10-19)
validationservicetest
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
02must prove
Confirmed
An object can be created, activated and used without placement or ownership, remaining accessible through links and queries.
origin: services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 B4 (Andrew, 2026-10-19: "Allow neither")
policyservicetest
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)
03must prove
Confirmed
A custom app has a permanent nonreserved key, bounded label, icon and order from zero to ten thousand, supports archival and restoration instead of deletion and uses versioned replacement.
origin: services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 D15 (Andrew, 2026-10-19: "Build in PLAT-M5")
validationservice, databasetest
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
04must prove
Confirmed
App archival is refused while draft or active objects are placed there, naming those objects; archived objects may retain the placement.
origin: services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 B3 (Andrew, 2026-10-19: "Refuse, name objects")
validationservicetest
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
05must prove
Confirmed
An archived app rejects new placements and replacements until it is restored.
validationservicetest
06
Confirmed
Custom-app counts remain unrestricted pending the product-wide limits mechanism.
origin: services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 B2 (Andrew, 2026-10-19: deferred)
policyservicetest
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#accepts the tenant’s twenty-first app and lists all twenty-one (Andrew’s B2: no limit until the app-wide limits mechanism)
07
Confirmed
App reads include placed active objects with their groups and staff access and omit draft or archived objects.
calculationservicetest
services-platform:modules/custom-objects/tests/e2e/custom-apps.e2e.spec.js#leaves a draft object placed in the app out of its objects
08must prove
Confirmed
Navigation includes only readable active objects and apps containing them, respects object-scoped roles and refuses callers with no record-read reach.
permissionapi, service, consoletest
services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone
09must prove
Confirmed
Reset preserves custom apps and object placements, whereas workspace deletion removes them.
origin: services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 D7 (Andrew, 2026-10-19: "Keep types")
no proof recorded yet
lifecycleservicedocumented

Scenarios

IdGivenWhenThenProvenance
01Boat belongs to the Marina custom app.Open the console as a boat reader.The app menu offers Marina with Boats beneath it.test
react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S01.spec.ts#PLAT-M5-S01: an administrator creates Boat in a new app, owned by Contact, and Marina > Boats appears

Edge Cases

IdGivenWhenThenProvenance
02Contact ownership is configured for Boat but no app placement exists.Find the boats through the owner record.The contact page provides access without a Boats menu entry.test
react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S13.spec.ts#PLAT-M5-S13: a boat placed only on contacts has no menu entry and is reached from the contact's page

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.