---
id: MOD-PFM-MTD
title: Metadata and Organization-defined Records
product_area: platform
module: metadata
revision: 2
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repositories:
  - name: services-platform
    paths:
      - modules/metadata
      - modules/layouts
      - modules/custom-objects
      - modules/associations
      - modules/files
      - tests/acceptance/custom-objects
      - docs/metadata.md
      - docs/layouts.md
      - docs/custom-objects.md
      - docs/associations.md
      - docs/files.md
      - docs/assets.md
      - docs/business-events.md
      - docs/record-history.md
      - docs/standards/custom-field-capability.md
      - docs/proposals/custom-objects/09-decisions.md
      - docs/milestones/PLAT-M5-custom-records.md
      - docs/milestones/PLAT-M6-custom-record-relationships.md
      - docs/milestones/PLAT-M7-custom-record-loads-reports-events.md
      - docs/milestones/PLAT-M8-custom-objects-console.md
      - docs/milestones/PLAT-M9-custom-field-capability.md
      - docs/milestones/PLAT-M10-image-and-file-fields.md
      - docs/milestones/plans/PLAT-M5-plan.md
      - docs/milestones/plans/PLAT-M6-plan.md
      - docs/milestones/plans/PLAT-M9-plan.md
      - docs/milestones/plans/PLAT-M10-plan.md
      - >-
        aws/platform.service.ts (metadata, custom-fields, field-labels, layouts, association-types,
        associations, custom-objects, custom-records, files)
  - name: react-console
    paths:
      - 'app/(console)/console/[tenantId]/configuration/fields'
      - 'app/(console)/console/[tenantId]/configuration/forms'
      - 'app/(console)/console/[tenantId]/configuration/recordLayouts'
      - 'app/(console)/console/[tenantId]/configuration/[module]/fields'
      - 'app/(console)/console/[tenantId]/configuration/[module]/forms'
      - 'app/(console)/console/[tenantId]/configuration/[module]/recordLayouts'
      - >-
        app/(console)/console/[tenantId]/configuration/[module]/[area] (customObjects, customApps,
        relationshipTypes)
      - 'app/(console)/console/[tenantId]/objects'
      - components/configuration/custom-objects
      - components/configuration/relationship-types
      - components/configuration/fields
      - 'components/configuration/resources (custom-objects, custom-apps, relationship-types)'
      - components/console/custom-objects
      - components/custom-objects
      - components/record-explorer
      - components/forms/designer
      - components/forms/management
      - components/forms/registry
      - components/layout-designer
      - lib/configuration/layout-definitions.ts
      - lib/forms/storage
      - lib/layout-designer
      - acceptance/custom-objects
      - acceptance/extensibility (business event delivery entries only)
owns:
  - >-
    Registered categories, declared fields and collections, capability eligibility and local standard-field
    labels.
  - 'Additional-field definitions and rules, including custom-object properties.'
  - 'Stored console and portal forms and layouts, with assignment references.'
  - 'Custom-object definitions, custom apps, placement and staff reach.'
  - 'Custom records and their typed values, derived identities, attachments, lifecycle and revisions.'
  - 'Business-event facts, pending delivery work, dispatch, consumption and retention.'
  - 'Relationship types, links and endpoint deletion and merge protocols.'
  - Authorized upload issuance and its ledger.
does_not_own:
  - record: 'Native records and their values, owner-selected presentation assignments and CRM settings.'
    owner: MOD-CRM-ENT
  - record: Duplicate detection and native-record consolidation.
    owner: MOD-CRM-DQ
  - record: 'Role and policy definitions, scoped assignments and permission evaluation.'
    owner: MOD-PFM-SEC
  - record: 'Datasets, Explorer views, search indexes and query exports.'
    owner: MOD-PFM-QRY
  - record: 'Data-job orchestration, run storage and dependent operations.'
    owner: MOD-PFM-OPS
  - record: 'Extension registration, event-type registration and external destinations.'
    owner: MOD-PFM-INT
  - record: Eligibility references used by member access predicates.
    owner: MOD-PFM-ELG
  - record: Workspace lifecycle orchestration.
    owner: MOD-PFM-TNL
  - record: 'Shared asset preparation, permanent storage and delivery.'
    owner: 'macroservice-libraries (macroservice-assets), used by each owning service'
hosted_screens:
  - route: '/console/{tenantId}/configuration/fields'
    purpose: Select additional-field categories.
  - route: '/console/{tenantId}/configuration/{module}/fields/{recordType}'
    purpose: Browse a category’s field definitions.
  - route: '/console/{tenantId}/configuration/{module}/fields/{recordType}/{fieldId}'
    purpose: Edit a particular field definition.
  - route: '/console/{tenantId}/configuration/forms'
    purpose: Browse forms by audience.
  - route: '/console/{tenantId}/configuration/{module}/forms/console/contacts'
    purpose: Manage contact forms for staff.
  - route: '/console/{tenantId}/configuration/{module}/forms/portal/contacts'
    purpose: Manage contact forms for members.
  - route: '/console/{tenantId}/configuration/recordLayouts'
    purpose: Browse record-page designs.
  - route: '/console/{tenantId}/configuration/{module}/recordLayouts/{recordType}/designer'
    purpose: Design contact record pages.
  - route: '/console/{tenantId}/configuration/platform/customObjects'
    purpose: 'Manage object settings, properties, placement and access.'
  - route: '/console/{tenantId}/configuration/platform/customApps'
    purpose: Manage organization-defined apps.
  - route: '/console/{tenantId}/configuration/platform/relationshipTypes'
    purpose: Manage connection definitions.
  - route: '/console/{tenantId}/objects/{objectKey}'
    purpose: Browse a custom category’s records.
  - route: '/console/{tenantId}/objects/{objectKey}/new'
    purpose: Enter a new custom record.
  - route: '/console/{tenantId}/objects/{objectKey}/{recordId}'
    purpose: 'Inspect record information, related cards, actions and revisions.'
  - route: '/console/{tenantId}/objects/{objectKey}/{recordId}/edit'
    purpose: Edit retained custom-record information.
  - route: >-
      Related records and owned records cards on /console/{tenantId}/crm/contacts/{id} and
      /crm/organizations/{id}
    purpose: Present related and owned records within native pages.
supersedes:
  - 'react-console acceptance inventory custom objects areas DEF, PRP, REC, ASC, SEC, EVT, DAT, XAP (CAP-CO-*)'
  - 'react-console acceptance inventory extensibility area EVT, delivery entries only (CAP-EXT-EVT-002 to 004)'
evidence:
  - >-
    services-platform at ad3f6a6582843008ed0f5a17b131878d15829af1: the route, schema, persistence, rule and
    table files of the five modules; their unit, integration and end-to-end tests; the custom objects API
    acceptance journeys; the module documentation, the custom field standard, the custom objects decisions and
    the PLAT-M5 to PLAT-M10 records and plans. Other modules were read only to name a dependency .
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: the configuration and objects pages and the
    components and libraries behind them; the custom objects acceptance inventory, journeys and Playwright
    specifications; the extensibility inventory .
  - >-
    Measured 19 capabilities, 183 rules , 6 journeys, 6 concepts, 6 features, 30 findings and 3 open
    questions; ratios in coverage_catalog.
coverage_catalog: >-
  The following inventory maps the pinned implementation to capabilities and findings. Bindings identify test
  assertions; recorded execution results remain a separate obligation.


  ### Coverage against the code at the pinned commit


  | Measure | Covered | Ratio |

  |---|---|---|

  | HTTP operations declared literally in the five modules' route files | 86 of 86 | 86/86 |

  | Health routes generated by the shared factory (metadata, layouts, associations), operational | 3 of 3
  named as operational evidence | 3/3 |

  | Tables and views in the five modules' db directories, each named by a capability | 26 of 26 (25 tables and
  one view) | 26/26 |

  | Published permission keys of the eight groups (metadata, custom-fields, field-labels, layouts,
  association-types, associations, custom-objects with custom-records, files) | 41 of 41 mapped to a
  capability, a dependency or a finding | 41/41 |

  | End-to-end specification files in the five modules (16 specifications; helpers excluded) | 16 of 16 |
  16/16 |

  | Playwright specifications of the custom objects acceptance (PLAT-M5-S01 to S14, PLAT-M6-S01 to S12) | 26
  of 26 bound in a journey or an acceptance set | 26/26 |

  | Custom objects acceptance inventory capabilities named in a supersedes | 112 of 112 | 112/112 |

  | State machines | none declared in the five modules | 0/0 |

  | Queues: the business events work queue | 1 of 1 (CAP-PFM-MTD-015) | 1/1 |

  | Schedules: the dispatcher's schedule and the nightly ledger sweep (05:20 UTC) | 2 of 2 (CAP-PFM-MTD-015) |
  2/2 |

  | IAM-invoked functions: metadata registration | 1 of 1 (CAP-PFM-MTD-001) | 1/1 |

  | Console pages in scope (page files under configuration fields, forms and record layouts, the platform
  areas customObjects, customApps and relationshipTypes, and objects) | 21 of 21 named as hosted screens |
  21/21 |

  | Business rules written | 188 rules, 171 must prove; every must-prove rule has a scenario or a finding |
  171/171 |


  ### Operations by capability


  | Operation | Capability |

  |---|---|

  | `listFieldTypes` | `CAP-PFM-MTD-002` |

  | `listObjects` | `CAP-PFM-MTD-002` |

  | `describeObject` | `CAP-PFM-MTD-002` |

  | `setFieldLabel` | `CAP-PFM-MTD-004` |

  | `removeFieldLabel` | `CAP-PFM-MTD-004` |

  | `listCustomFields` | `CAP-PFM-MTD-005` |

  | `createCustomField` | `CAP-PFM-MTD-005` |

  | `getCustomField` | `CAP-PFM-MTD-005` |

  | `updateCustomField` | `CAP-PFM-MTD-005` |

  | `archiveCustomField` | `CAP-PFM-MTD-005` |

  | `restoreCustomField` | `CAP-PFM-MTD-005` |

  | `getCustomFieldRules` | `CAP-PFM-MTD-006` |

  | `setCustomFieldRules` | `CAP-PFM-MTD-006` |

  | `issueFileUpload` | `CAP-PFM-MTD-007` |

  | `getFilesHealth` | `CAP-PFM-MTD-007` |

  | `createConsolePageLayout` | `CAP-PFM-MTD-008` |

  | `getConsolePageLayout` | `CAP-PFM-MTD-008` |

  | `updateConsolePageLayout` | `CAP-PFM-MTD-008` |

  | `patchConsolePageLayout` | `CAP-PFM-MTD-008` |

  | `deleteConsolePageLayout` | `CAP-PFM-MTD-008` |

  | `createPortalPageLayout` | `CAP-PFM-MTD-008` |

  | `getPortalPageLayout` | `CAP-PFM-MTD-008` |

  | `updatePortalPageLayout` | `CAP-PFM-MTD-008` |

  | `patchPortalPageLayout` | `CAP-PFM-MTD-008` |

  | `deletePortalPageLayout` | `CAP-PFM-MTD-008` |

  | `createConsoleForm` | `CAP-PFM-MTD-008` |

  | `getConsoleForm` | `CAP-PFM-MTD-008` |

  | `updateConsoleForm` | `CAP-PFM-MTD-008` |

  | `patchConsoleForm` | `CAP-PFM-MTD-008` |

  | `deleteConsoleForm` | `CAP-PFM-MTD-008` |

  | `createPortalForm` | `CAP-PFM-MTD-008` |

  | `getPortalForm` | `CAP-PFM-MTD-008` |

  | `updatePortalForm` | `CAP-PFM-MTD-008` |

  | `patchPortalForm` | `CAP-PFM-MTD-008` |

  | `deletePortalForm` | `CAP-PFM-MTD-008` |

  | `listConsolePageLayouts` | `CAP-PFM-MTD-008` |

  | `listPortalPageLayouts` | `CAP-PFM-MTD-008` |

  | `listConsoleForms` | `CAP-PFM-MTD-008` |

  | `listPortalForms` | `CAP-PFM-MTD-008` |

  | `listCustomObjects` | `CAP-PFM-MTD-009` |

  | `createCustomObject` | `CAP-PFM-MTD-009` |

  | `getCustomObject` | `CAP-PFM-MTD-009` |

  | `updateCustomObject` | `CAP-PFM-MTD-009` |

  | `activateCustomObject` | `CAP-PFM-MTD-009` |

  | `archiveCustomObject` | `CAP-PFM-MTD-009` |

  | `restoreCustomObject` | `CAP-PFM-MTD-009` |

  | `getCustomObjectsHealth` | `CAP-PFM-MTD-009` |

  | `listCustomApps` | `CAP-PFM-MTD-010` |

  | `createCustomApp` | `CAP-PFM-MTD-010` |

  | `getCustomApp` | `CAP-PFM-MTD-010` |

  | `updateCustomApp` | `CAP-PFM-MTD-010` |

  | `archiveCustomApp` | `CAP-PFM-MTD-010` |

  | `restoreCustomApp` | `CAP-PFM-MTD-010` |

  | `getCustomObjectsNavigation` | `CAP-PFM-MTD-010` |

  | `listCustomObjectRecords` | `CAP-PFM-MTD-012` |

  | `createCustomObjectRecord` | `CAP-PFM-MTD-012` |

  | `getCustomObjectRecord` | `CAP-PFM-MTD-012` |

  | `updateCustomObjectRecord` | `CAP-PFM-MTD-012` |

  | `replaceCustomObjectRecord` | `CAP-PFM-MTD-012` |

  | `publishCustomObjectRecord` | `CAP-PFM-MTD-013` |

  | `archiveCustomObjectRecord` | `CAP-PFM-MTD-013` |

  | `restoreCustomObjectRecord` | `CAP-PFM-MTD-013` |

  | `deleteCustomObjectRecord` | `CAP-PFM-MTD-013` |

  | `listCustomObjectRecordHistory` | `CAP-PFM-MTD-014` |

  | `getCustomObjectRecordRevision` | `CAP-PFM-MTD-014` |

  | `listCustomObjectRecordHistoryActors` | `CAP-PFM-MTD-014` |

  | `submitAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `listAssociationDataJobs` | `CAP-PFM-MTD-016` |

  | `getAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `listAssociationDataJobResults` | `CAP-PFM-MTD-016` |

  | `listAssociationDataJobRejections` | `CAP-PFM-MTD-016` |

  | `applyAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `pauseAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `resumeAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `cancelAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `retryAssociationDataJob` | `CAP-PFM-MTD-016` |

  | `listAssociationTypes` | `CAP-PFM-MTD-017` |

  | `createAssociationType` | `CAP-PFM-MTD-017` |

  | `getAssociationType` | `CAP-PFM-MTD-017` |

  | `updateAssociationType` | `CAP-PFM-MTD-017` |

  | `deleteAssociationType` | `CAP-PFM-MTD-017` |

  | `listRecordAssociations` | `CAP-PFM-MTD-018` |

  | `createAssociation` | `CAP-PFM-MTD-018` |

  | `updateAssociation` | `CAP-PFM-MTD-018` |

  | `endAssociation` | `CAP-PFM-MTD-018` |

  | `deleteAssociation` | `CAP-PFM-MTD-018` |


  ### Tables by capability


  | Table file | Capabilities |

  |---|---|

  | `registered-objects.table.ts` | `CAP-PFM-MTD-001`, `CAP-PFM-MTD-002`, `CAP-PFM-MTD-003` |

  | `registered-fields.table.ts` | `CAP-PFM-MTD-001`, `CAP-PFM-MTD-002` |

  | `registered-collections.table.ts` | `CAP-PFM-MTD-001`, `CAP-PFM-MTD-002` |

  | `custom-fields.table.ts` | `CAP-PFM-MTD-005` |

  | `custom-field-rules.table.ts` | `CAP-PFM-MTD-006` |

  | `standard-field-label-overrides.table.ts` | `CAP-PFM-MTD-004` |

  | `current-and-former-users.view.ts (view)` | `CAP-PFM-MTD-002` |

  | `console-page-layouts.table.ts` | `CAP-PFM-MTD-008` |

  | `portal-page-layouts.table.ts` | `CAP-PFM-MTD-008` |

  | `console-forms.table.ts` | `CAP-PFM-MTD-008` |

  | `portal-forms.table.ts` | `CAP-PFM-MTD-008` |

  | `layout-assignments.table.ts` | `CAP-PFM-MTD-008` |

  | `custom-objects.table.ts` | `CAP-PFM-MTD-009`, `CAP-PFM-MTD-010`, `CAP-PFM-MTD-011` |

  | `custom-apps.table.ts` | `CAP-PFM-MTD-010` |

  | `custom-object-records.table.ts` | `CAP-PFM-MTD-012`, `CAP-PFM-MTD-013` |

  | `custom-object-record-values.table.ts` | `CAP-PFM-MTD-012` |

  | `custom-object-unique-values.table.ts` | `CAP-PFM-MTD-006`, `CAP-PFM-MTD-012` |

  | `managed-assets.table.ts` | `CAP-PFM-MTD-012`, `CAP-PFM-MTD-013` |

  | `record-revisions.table.ts` | `CAP-PFM-MTD-014` |

  | `custom-object-record-change-events.table.ts` | `CAP-PFM-MTD-014` |

  | `business-events.table.ts` | `CAP-PFM-MTD-015` |

  | `business-event-queue.table.ts` | `CAP-PFM-MTD-015` |

  | `association-types.table.ts` | `CAP-PFM-MTD-017` |

  | `associations.table.ts` | `CAP-PFM-MTD-018`, `CAP-PFM-MTD-019` |

  | `association-change-events.table.ts` | `CAP-PFM-MTD-014`, `CAP-PFM-MTD-018` |

  | `file-uploads.table.ts` | `CAP-PFM-MTD-007` |


  ### Published permission keys


  | Permission key | Capability or evidence home |

  |---|---|

  | `platform.metadata.read` | CAP-PFM-MTD-002, CAP-PFM-MTD-003 |

  | `platform.metadata.create, .update, .delete, .bulk` | published, no route (FND-PFM-MTD-007) |

  | `platform.custom-fields.read` | CAP-PFM-MTD-005, CAP-PFM-MTD-006 |

  | `platform.custom-fields.create` | CAP-PFM-MTD-005 |

  | `platform.custom-fields.update` | CAP-PFM-MTD-005, CAP-PFM-MTD-006 |

  | `platform.custom-fields.delete` | CAP-PFM-MTD-005 |

  | `platform.custom-fields.bulk` | MOD-PFM-OPS dependency (custom field data jobs); CAP-PFM-MTD-016 evidence
  |

  | `platform.field-labels.update` | CAP-PFM-MTD-004 |

  | `platform.field-labels.read, .create, .delete, .bulk` | published, no route (FND-PFM-MTD-007) |

  | `platform.layouts.read` | CAP-PFM-MTD-008 |

  | `platform.layouts.create` | CAP-PFM-MTD-008 |

  | `platform.layouts.update` | CAP-PFM-MTD-008 |

  | `platform.layouts.delete` | CAP-PFM-MTD-008 |

  | `platform.layouts.bulk` | published, no route (FND-PFM-MTD-007) |

  | `platform.custom-objects.read` | CAP-PFM-MTD-009, CAP-PFM-MTD-010, CAP-PFM-MTD-008 |

  | `platform.custom-objects.create` | CAP-PFM-MTD-009, CAP-PFM-MTD-010 |

  | `platform.custom-objects.update` | CAP-PFM-MTD-009, CAP-PFM-MTD-010, CAP-PFM-MTD-008 |

  | `platform.custom-objects.delete` | CAP-PFM-MTD-009, CAP-PFM-MTD-010, CAP-PFM-MTD-008 |

  | `platform.custom-records.read` | CAP-PFM-MTD-011, CAP-PFM-MTD-012, CAP-PFM-MTD-010, CAP-PFM-MTD-008 |

  | `platform.custom-records.query` | CAP-PFM-MTD-011; MOD-PFM-QRY dependency |

  | `platform.custom-records.create` | CAP-PFM-MTD-011, CAP-PFM-MTD-012, CAP-PFM-MTD-016 |

  | `platform.custom-records.update` | CAP-PFM-MTD-011, CAP-PFM-MTD-012, CAP-PFM-MTD-016 |

  | `platform.custom-records.delete` | CAP-PFM-MTD-011, CAP-PFM-MTD-013 |

  | `platform.custom-records.publish` | CAP-PFM-MTD-011, CAP-PFM-MTD-013 |

  | `platform.custom-records.export` | CAP-PFM-MTD-011 (no route; FND-PFM-MTD-030) |

  | `platform.custom-records.history` | CAP-PFM-MTD-011, CAP-PFM-MTD-014 |

  | `platform.association-types.read` | CAP-PFM-MTD-017 |

  | `platform.association-types.create` | CAP-PFM-MTD-017 |

  | `platform.association-types.update` | CAP-PFM-MTD-017 |

  | `platform.association-types.delete` | CAP-PFM-MTD-017 |

  | `platform.associations.read` | CAP-PFM-MTD-018 |

  | `platform.associations.create` | CAP-PFM-MTD-018, CAP-PFM-MTD-016 |

  | `platform.associations.update` | CAP-PFM-MTD-018, CAP-PFM-MTD-016 |

  | `platform.associations.delete` | CAP-PFM-MTD-018 |

  | `platform.files.upload` | CAP-PFM-MTD-007 |


  ### E2E specifications by capability


  | Spec file | Capabilities |

  |---|---|

  | `metadata/tests/e2e/custom-fields.e2e.spec.js` | CAP-PFM-MTD-005 |

  | `metadata/tests/e2e/metadata-api-observability.e2e.spec.js` | CAP-PFM-MTD-005 (request logging and
  metrics; operational) |

  | `metadata/tests/e2e/registered-objects.e2e.spec.js` | CAP-PFM-MTD-001, CAP-PFM-MTD-002, CAP-PFM-MTD-003 |

  | `metadata/tests/e2e/standard-field-label-overrides.e2e.spec.js` | CAP-PFM-MTD-004 |

  | `layouts/tests/e2e/console-forms-api.e2e.spec.js` | CAP-PFM-MTD-008 |

  | `layouts/tests/e2e/console-page-layouts-api.e2e.spec.js` | CAP-PFM-MTD-008 |

  | `layouts/tests/e2e/custom-object-forms.e2e.spec.js` | CAP-PFM-MTD-008 |

  | `layouts/tests/e2e/portal-forms-api.e2e.spec.js` | CAP-PFM-MTD-008 |

  | `layouts/tests/e2e/portal-page-layouts-api.e2e.spec.js` | CAP-PFM-MTD-008 |

  | `custom-objects/tests/e2e/business-events.e2e.spec.js` | CAP-PFM-MTD-015 |

  | `custom-objects/tests/e2e/custom-apps.e2e.spec.js` | CAP-PFM-MTD-010 |

  | `custom-objects/tests/e2e/custom-object-record-history.e2e.spec.js` | CAP-PFM-MTD-014 |

  | `custom-objects/tests/e2e/custom-object-records.e2e.spec.js` | CAP-PFM-MTD-010, CAP-PFM-MTD-011,
  CAP-PFM-MTD-012 |

  | `custom-objects/tests/e2e/custom-objects.e2e.spec.js` | CAP-PFM-MTD-005, CAP-PFM-MTD-006, CAP-PFM-MTD-009
  |

  | `associations/tests/e2e/associations.e2e.spec.js` | CAP-PFM-MTD-017, CAP-PFM-MTD-018 |

  | `files/tests/e2e/files.e2e.spec.js` | CAP-PFM-MTD-007 |
testing_artifacts:
  design_tests:
    - id: ATS-PFM-MTD-001
      path: design/tests/ATS-PFM-MTD-001-keep-platform-s-catalogue-of-record-types-equal-to-what-each.md
    - id: ATS-PFM-MTD-002
      path: design/tests/ATS-PFM-MTD-002-tell-every-screen-what-fields-a-record-type-has-and-how-each.md
    - id: ATS-PFM-MTD-003
      path: design/tests/ATS-PFM-MTD-003-offer-custom-fields-forms-and-layouts-only-on-the-record-types.md
    - id: ATS-PFM-MTD-004
      path: design/tests/ATS-PFM-MTD-004-call-a-standard-field-by-the-workspace-s-own-name.md
    - id: ATS-PFM-MTD-005
      path: design/tests/ATS-PFM-MTD-005-add-the-workspace-s-own-fields-to-a-record-type-and-evolve.md
    - id: ATS-PFM-MTD-006
      path: design/tests/ATS-PFM-MTD-006-make-a-field-required-shown-unique-defaulted-or-exposed-by.md
    - id: ATS-PFM-MTD-007
      path: design/tests/ATS-PFM-MTD-007-give-a-person-a-safe-short-lived-place-to-upload-a-picture-or.md
    - id: ATS-PFM-MTD-008
      path: design/tests/ATS-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
    - id: ATS-PFM-MTD-009
      path: design/tests/ATS-PFM-MTD-009-design-a-record-type-of-the-organization-s-own-and-bring-it.md
    - id: ATS-PFM-MTD-010
      path: design/tests/ATS-PFM-MTD-010-put-custom-objects-where-staff-look-for-them.md
    - id: ATS-PFM-MTD-011
      path: design/tests/ATS-PFM-MTD-011-decide-which-staff-reach-a-custom-object-s-records-and-which.md
    - id: ATS-PFM-MTD-012
      path: design/tests/ATS-PFM-MTD-012-keep-the-records-of-a-custom-object-validated-by-its-properties.md
    - id: ATS-PFM-MTD-013
      path: design/tests/ATS-PFM-MTD-013-publish-archive-restore-and-delete-custom-records-deliberately.md
    - id: ATS-PFM-MTD-014
      path: design/tests/ATS-PFM-MTD-014-see-every-change-to-a-custom-record-and-who-made-it.md
    - id: ATS-PFM-MTD-015
      path: design/tests/ATS-PFM-MTD-015-announce-every-custom-record-and-link-change-to-the-rest-of.md
    - id: ATS-PFM-MTD-016
      path: design/tests/ATS-PFM-MTD-016-load-custom-records-and-their-links-from-a-file-again-and-again.md
    - id: ATS-PFM-MTD-017
      path: design/tests/ATS-PFM-MTD-017-define-how-two-kinds-of-record-relate.md
    - id: ATS-PFM-MTD-018
      path: design/tests/ATS-PFM-MTD-018-link-records-to-one-another-dated-primary-and-in-force-until.md
    - id: ATS-PFM-MTD-019
      path: design/tests/ATS-PFM-MTD-019-apply-each-relationship-s-rule-when-a-linked-record-is-deleted.md
  feature_acceptance:
    - id: FAS-PFM-MTD-01
      path: planning/acceptance/FAS-PFM-MTD-01-record-type-registry.md
    - id: FAS-PFM-MTD-02
      path: planning/acceptance/FAS-PFM-MTD-02-custom-fields-and-files.md
    - id: FAS-PFM-MTD-03
      path: planning/acceptance/FAS-PFM-MTD-03-forms-and-page-layouts.md
    - id: FAS-PFM-MTD-04
      path: planning/acceptance/FAS-PFM-MTD-04-custom-object-design.md
    - id: FAS-PFM-MTD-05
      path: planning/acceptance/FAS-PFM-MTD-05-custom-records.md
    - id: FAS-PFM-MTD-06
      path: planning/acceptance/FAS-PFM-MTD-06-relationships-between-records.md
  executable_tests:
    - id: TST-PFM-MTD-001
      path: implementation/tests/TST-PFM-MTD-001-plat-m5-s01.md
    - id: TST-PFM-MTD-002
      path: implementation/tests/TST-PFM-MTD-002-plat-m5-s02.md
    - id: TST-PFM-MTD-003
      path: implementation/tests/TST-PFM-MTD-003-plat-m5-s03.md
    - id: TST-PFM-MTD-004
      path: implementation/tests/TST-PFM-MTD-004-plat-m5-s04.md
    - id: TST-PFM-MTD-005
      path: implementation/tests/TST-PFM-MTD-005-plat-m5-s05.md
    - id: TST-PFM-MTD-006
      path: implementation/tests/TST-PFM-MTD-006-plat-m5-s06.md
    - id: TST-PFM-MTD-007
      path: implementation/tests/TST-PFM-MTD-007-plat-m5-s07.md
    - id: TST-PFM-MTD-008
      path: implementation/tests/TST-PFM-MTD-008-plat-m5-s08.md
    - id: TST-PFM-MTD-009
      path: implementation/tests/TST-PFM-MTD-009-plat-m5-s09.md
    - id: TST-PFM-MTD-010
      path: implementation/tests/TST-PFM-MTD-010-plat-m5-s10.md
    - id: TST-PFM-MTD-011
      path: implementation/tests/TST-PFM-MTD-011-plat-m5-s11.md
    - id: TST-PFM-MTD-012
      path: implementation/tests/TST-PFM-MTD-012-plat-m5-s12.md
    - id: TST-PFM-MTD-013
      path: implementation/tests/TST-PFM-MTD-013-plat-m5-s13.md
    - id: TST-PFM-MTD-014
      path: implementation/tests/TST-PFM-MTD-014-plat-m5-s14.md
    - id: TST-PFM-MTD-015
      path: implementation/tests/TST-PFM-MTD-015-plat-m6-s01.md
    - id: TST-PFM-MTD-016
      path: implementation/tests/TST-PFM-MTD-016-plat-m6-s02.md
    - id: TST-PFM-MTD-017
      path: implementation/tests/TST-PFM-MTD-017-plat-m6-s03.md
    - id: TST-PFM-MTD-018
      path: implementation/tests/TST-PFM-MTD-018-plat-m6-s04.md
    - id: TST-PFM-MTD-019
      path: implementation/tests/TST-PFM-MTD-019-plat-m6-s05.md
    - id: TST-PFM-MTD-020
      path: implementation/tests/TST-PFM-MTD-020-plat-m6-s06.md
    - id: TST-PFM-MTD-021
      path: implementation/tests/TST-PFM-MTD-021-plat-m6-s07.md
    - id: TST-PFM-MTD-022
      path: implementation/tests/TST-PFM-MTD-022-plat-m6-s08.md
    - id: TST-PFM-MTD-023
      path: implementation/tests/TST-PFM-MTD-023-plat-m6-s09.md
    - id: TST-PFM-MTD-024
      path: implementation/tests/TST-PFM-MTD-024-plat-m6-s10.md
    - id: TST-PFM-MTD-025
      path: implementation/tests/TST-PFM-MTD-025-plat-m6-s11.md
    - id: TST-PFM-MTD-026
      path: implementation/tests/TST-PFM-MTD-026-plat-m6-s12.md
    - id: TST-PFM-MTD-027
      path: implementation/tests/TST-PFM-MTD-027-contact-forms.md
    - id: TST-PFM-MTD-028
      path: implementation/tests/TST-PFM-MTD-028-contact-forms.md
    - id: TST-PFM-MTD-029
      path: implementation/tests/TST-PFM-MTD-029-custom-object-designer.md
    - id: TST-PFM-MTD-030
      path: implementation/tests/TST-PFM-MTD-030-custom-object-navigation.md
    - id: TST-PFM-MTD-031
      path: implementation/tests/TST-PFM-MTD-031-custom-object-properties.md
    - id: TST-PFM-MTD-032
      path: implementation/tests/TST-PFM-MTD-032-custom-objects-owner-card.md
    - id: TST-PFM-MTD-033
      path: implementation/tests/TST-PFM-MTD-033-custom-objects.md
    - id: TST-PFM-MTD-034
      path: implementation/tests/TST-PFM-MTD-034-fields-custom-object.md
    - id: TST-PFM-MTD-035
      path: implementation/tests/TST-PFM-MTD-035-relationship-types.md
    - id: TST-PFM-MTD-036
      path: implementation/tests/TST-PFM-MTD-036-associations.md
    - id: TST-PFM-MTD-037
      path: implementation/tests/TST-PFM-MTD-037-apply-endpoint-deletion.md
    - id: TST-PFM-MTD-038
      path: implementation/tests/TST-PFM-MTD-038-association-types.table.md
    - id: TST-PFM-MTD-039
      path: implementation/tests/TST-PFM-MTD-039-associations-merge.md
    - id: TST-PFM-MTD-040
      path: implementation/tests/TST-PFM-MTD-040-associations.table.md
    - id: TST-PFM-MTD-041
      path: implementation/tests/TST-PFM-MTD-041-association-types.md
    - id: TST-PFM-MTD-042
      path: implementation/tests/TST-PFM-MTD-042-association-types.queries.md
    - id: TST-PFM-MTD-043
      path: implementation/tests/TST-PFM-MTD-043-associations.events.md
    - id: TST-PFM-MTD-044
      path: implementation/tests/TST-PFM-MTD-044-associations.in-force.md
    - id: TST-PFM-MTD-045
      path: implementation/tests/TST-PFM-MTD-045-associations.md
    - id: TST-PFM-MTD-046
      path: implementation/tests/TST-PFM-MTD-046-associations.queries.md
    - id: TST-PFM-MTD-047
      path: implementation/tests/TST-PFM-MTD-047-endpoints.md
    - id: TST-PFM-MTD-048
      path: implementation/tests/TST-PFM-MTD-048-business-events.md
    - id: TST-PFM-MTD-049
      path: implementation/tests/TST-PFM-MTD-049-custom-apps.md
    - id: TST-PFM-MTD-050
      path: implementation/tests/TST-PFM-MTD-050-custom-object-record-history.md
    - id: TST-PFM-MTD-051
      path: implementation/tests/TST-PFM-MTD-051-custom-object-records.md
    - id: TST-PFM-MTD-052
      path: implementation/tests/TST-PFM-MTD-052-custom-objects.md
    - id: TST-PFM-MTD-053
      path: implementation/tests/TST-PFM-MTD-053-custom-object-records-merge.md
    - id: TST-PFM-MTD-054
      path: implementation/tests/TST-PFM-MTD-054-custom-object-records.table.md
    - id: TST-PFM-MTD-055
      path: implementation/tests/TST-PFM-MTD-055-custom-objects.table.md
    - id: TST-PFM-MTD-056
      path: implementation/tests/TST-PFM-MTD-056-business-events.md
    - id: TST-PFM-MTD-057
      path: implementation/tests/TST-PFM-MTD-057-custom-object-record-history.md
    - id: TST-PFM-MTD-058
      path: implementation/tests/TST-PFM-MTD-058-business-events.md
    - id: TST-PFM-MTD-059
      path: implementation/tests/TST-PFM-MTD-059-business-events.queries.md
    - id: TST-PFM-MTD-060
      path: implementation/tests/TST-PFM-MTD-060-custom-apps.md
    - id: TST-PFM-MTD-061
      path: implementation/tests/TST-PFM-MTD-061-custom-apps.queries.md
    - id: TST-PFM-MTD-062
      path: implementation/tests/TST-PFM-MTD-062-custom-object-endpoints.md
    - id: TST-PFM-MTD-063
      path: implementation/tests/TST-PFM-MTD-063-custom-object-recipes.md
    - id: TST-PFM-MTD-064
      path: implementation/tests/TST-PFM-MTD-064-custom-object-records.events.md
    - id: TST-PFM-MTD-065
      path: implementation/tests/TST-PFM-MTD-065-custom-object-records.md
    - id: TST-PFM-MTD-066
      path: implementation/tests/TST-PFM-MTD-066-custom-object-records.queries.md
    - id: TST-PFM-MTD-067
      path: implementation/tests/TST-PFM-MTD-067-custom-objects.md
    - id: TST-PFM-MTD-068
      path: implementation/tests/TST-PFM-MTD-068-custom-objects.queries.md
    - id: TST-PFM-MTD-069
      path: implementation/tests/TST-PFM-MTD-069-portal-ownership-predicates.md
    - id: TST-PFM-MTD-070
      path: implementation/tests/TST-PFM-MTD-070-record-revisions.md
    - id: TST-PFM-MTD-071
      path: implementation/tests/TST-PFM-MTD-071-record-revisions.queries.md
    - id: TST-PFM-MTD-072
      path: implementation/tests/TST-PFM-MTD-072-custom-object-permission-keys.md
    - id: TST-PFM-MTD-073
      path: implementation/tests/TST-PFM-MTD-073-exposure.md
    - id: TST-PFM-MTD-074
      path: implementation/tests/TST-PFM-MTD-074-placement-apps.md
    - id: TST-PFM-MTD-075
      path: implementation/tests/TST-PFM-MTD-075-portal-access-rules.md
    - id: TST-PFM-MTD-076
      path: implementation/tests/TST-PFM-MTD-076-record-rules.md
    - id: TST-PFM-MTD-077
      path: implementation/tests/TST-PFM-MTD-077-rules.md
    - id: TST-PFM-MTD-078
      path: implementation/tests/TST-PFM-MTD-078-files.md
    - id: TST-PFM-MTD-079
      path: implementation/tests/TST-PFM-MTD-079-file-uploads.table.md
    - id: TST-PFM-MTD-080
      path: implementation/tests/TST-PFM-MTD-080-file-uploads.md
    - id: TST-PFM-MTD-081
      path: implementation/tests/TST-PFM-MTD-081-file-uploads.queries.md
    - id: TST-PFM-MTD-082
      path: implementation/tests/TST-PFM-MTD-082-issue-upload.md
    - id: TST-PFM-MTD-083
      path: implementation/tests/TST-PFM-MTD-083-upload-keys.md
    - id: TST-PFM-MTD-084
      path: implementation/tests/TST-PFM-MTD-084-upload-permission.md
    - id: TST-PFM-MTD-085
      path: implementation/tests/TST-PFM-MTD-085-upload-presign.md
    - id: TST-PFM-MTD-086
      path: implementation/tests/TST-PFM-MTD-086-console-forms-api.md
    - id: TST-PFM-MTD-087
      path: implementation/tests/TST-PFM-MTD-087-console-page-layouts-api.md
    - id: TST-PFM-MTD-088
      path: implementation/tests/TST-PFM-MTD-088-custom-object-forms.md
    - id: TST-PFM-MTD-089
      path: implementation/tests/TST-PFM-MTD-089-portal-forms-api.md
    - id: TST-PFM-MTD-090
      path: implementation/tests/TST-PFM-MTD-090-portal-page-layouts-api.md
    - id: TST-PFM-MTD-091
      path: implementation/tests/TST-PFM-MTD-091-console-forms.table.md
    - id: TST-PFM-MTD-092
      path: implementation/tests/TST-PFM-MTD-092-console-page-layouts.table.md
    - id: TST-PFM-MTD-093
      path: implementation/tests/TST-PFM-MTD-093-layout-assignments.table.md
    - id: TST-PFM-MTD-094
      path: implementation/tests/TST-PFM-MTD-094-portal-forms.table.md
    - id: TST-PFM-MTD-095
      path: implementation/tests/TST-PFM-MTD-095-portal-page-layouts.table.md
    - id: TST-PFM-MTD-096
      path: implementation/tests/TST-PFM-MTD-096-console-forms.md
    - id: TST-PFM-MTD-097
      path: implementation/tests/TST-PFM-MTD-097-console-forms.queries.md
    - id: TST-PFM-MTD-098
      path: implementation/tests/TST-PFM-MTD-098-console-page-layouts.md
    - id: TST-PFM-MTD-099
      path: implementation/tests/TST-PFM-MTD-099-console-page-layouts.queries.md
    - id: TST-PFM-MTD-100
      path: implementation/tests/TST-PFM-MTD-100-portal-forms.md
    - id: TST-PFM-MTD-101
      path: implementation/tests/TST-PFM-MTD-101-portal-forms.queries.md
    - id: TST-PFM-MTD-102
      path: implementation/tests/TST-PFM-MTD-102-portal-page-layouts.md
    - id: TST-PFM-MTD-103
      path: implementation/tests/TST-PFM-MTD-103-portal-page-layouts.queries.md
    - id: TST-PFM-MTD-104
      path: implementation/tests/TST-PFM-MTD-104-purpose-capabilities.md
    - id: TST-PFM-MTD-105
      path: implementation/tests/TST-PFM-MTD-105-custom-fields.md
    - id: TST-PFM-MTD-106
      path: implementation/tests/TST-PFM-MTD-106-metadata-api-observability.md
    - id: TST-PFM-MTD-107
      path: implementation/tests/TST-PFM-MTD-107-registered-objects.md
    - id: TST-PFM-MTD-108
      path: implementation/tests/TST-PFM-MTD-108-standard-field-label-overrides.md
    - id: TST-PFM-MTD-109
      path: implementation/tests/TST-PFM-MTD-109-custom-field-rules.table.md
    - id: TST-PFM-MTD-110
      path: implementation/tests/TST-PFM-MTD-110-custom-fields.table.md
    - id: TST-PFM-MTD-111
      path: implementation/tests/TST-PFM-MTD-111-registered-collections.table.md
    - id: TST-PFM-MTD-112
      path: implementation/tests/TST-PFM-MTD-112-registered-fields.table.md
    - id: TST-PFM-MTD-113
      path: implementation/tests/TST-PFM-MTD-113-registered-objects.table.md
    - id: TST-PFM-MTD-114
      path: implementation/tests/TST-PFM-MTD-114-standard-field-label-overrides.table.md
    - id: TST-PFM-MTD-115
      path: implementation/tests/TST-PFM-MTD-115-describe-custom-object.md
    - id: TST-PFM-MTD-116
      path: implementation/tests/TST-PFM-MTD-116-describe-object.md
    - id: TST-PFM-MTD-117
      path: implementation/tests/TST-PFM-MTD-117-custom-fields.custom-objects.md
    - id: TST-PFM-MTD-118
      path: implementation/tests/TST-PFM-MTD-118-custom-fields.md
    - id: TST-PFM-MTD-119
      path: implementation/tests/TST-PFM-MTD-119-custom-fields.queries.md
    - id: TST-PFM-MTD-120
      path: implementation/tests/TST-PFM-MTD-120-custom-fields.rules.md
    - id: TST-PFM-MTD-121
      path: implementation/tests/TST-PFM-MTD-121-registered-objects.md
    - id: TST-PFM-MTD-122
      path: implementation/tests/TST-PFM-MTD-122-registered-objects.queries.md
    - id: TST-PFM-MTD-123
      path: implementation/tests/TST-PFM-MTD-123-registered-objects.union.queries.md
    - id: TST-PFM-MTD-124
      path: implementation/tests/TST-PFM-MTD-124-standard-field-label-overrides.md
    - id: TST-PFM-MTD-125
      path: implementation/tests/TST-PFM-MTD-125-standard-field-label-overrides.queries.md
    - id: TST-PFM-MTD-126
      path: implementation/tests/TST-PFM-MTD-126-entity-capabilities.md
    - id: TST-PFM-MTD-127
      path: implementation/tests/TST-PFM-MTD-127-register-application.md
    - id: TST-PFM-MTD-128
      path: implementation/tests/TST-PFM-MTD-128-approved-custom-field-objects.md
    - id: TST-PFM-MTD-129
      path: implementation/tests/TST-PFM-MTD-129-custom-object-properties.md
    - id: TST-PFM-MTD-130
      path: implementation/tests/TST-PFM-MTD-130-effective-capabilities.md
    - id: TST-PFM-MTD-131
      path: implementation/tests/TST-PFM-MTD-131-write-vocabulary.md
    - id: TST-PFM-MTD-132
      path: implementation/tests/TST-PFM-MTD-132-quick-search-archived-field.md
    - id: TST-PFM-MTD-133
      path: implementation/tests/TST-PFM-MTD-133-co-acc-0256.md
    - id: TST-PFM-MTD-134
      path: implementation/tests/TST-PFM-MTD-134-co-acc-0400.md
    - id: TST-PFM-MTD-135
      path: implementation/tests/TST-PFM-MTD-135-co-acc-0401.md
    - id: TST-PFM-MTD-136
      path: implementation/tests/TST-PFM-MTD-136-co-acc-0402.md
    - id: TST-PFM-MTD-137
      path: implementation/tests/TST-PFM-MTD-137-co-acc-0404.md
    - id: TST-PFM-MTD-138
      path: implementation/tests/TST-PFM-MTD-138-co-acc-0014.md
    - id: TST-PFM-MTD-139
      path: implementation/tests/TST-PFM-MTD-139-co-acc-0015.md
    - id: TST-PFM-MTD-140
      path: implementation/tests/TST-PFM-MTD-140-contact-editor-layout-measurements.md
  report: reports/TESTING-BACKFILL-2026-10-23.md
---

# Metadata and Organization-defined Records

## Purpose

This module supplies shared record descriptions and workspace configuration. It groups additional fields, presentation definitions, custom categories and their records, linked-record protocols and attachment staging. The capabilities hold the behavior; this charter identifies ownership and entry points.

## Boundary

Application owners retain their native records and presentation selections. Security supplies grants, Queries supplies query and search consumers, Operations orchestrates loads, Integrations manages external destinations, Eligibility supplies referenced bindings and workspace lifecycle coordinates reset and deletion. Shared asset preparation participates in record saving.

## Features

| Feature | Concepts | Capabilities | Journeys |
|---|---|---|---|
| `FEAT-PFM-MTD-01` — Record Type Catalogue | 1 | 4 | 0 |
| `FEAT-PFM-MTD-02` — Additional Fields and Attachments | 1 | 3 | 1 |
| `FEAT-PFM-MTD-03` — Record Presentations | 1 | 1 | 0 |
| `FEAT-PFM-MTD-04` — Organization-defined Record Categories | 1 | 3 | 2 |
| `FEAT-PFM-MTD-05` — Keeping Custom Records | 1 | 5 | 1 |
| `FEAT-PFM-MTD-06` — Linked Records | 1 | 3 | 2 |

## Capabilities

| Capability | Title | Intent | Evidence |
|---|---|---|---|
| `CAP-PFM-MTD-001` | Keep the Record Catalogue Current | confirmed | observed |
| `CAP-PFM-MTD-002` | Describe Records for Shared Clients | confirmed | observed |
| `CAP-PFM-MTD-003` | Keep Configurability Within Product Scope | confirmed | observed |
| `CAP-PFM-MTD-004` | Use Workspace Labels for Standard Fields | confirmed | observed |
| `CAP-PFM-MTD-005` | Extend Records With Durable Custom Fields | confirmed | observed |
| `CAP-PFM-MTD-006` | Configure Field Requirements and Exposure | confirmed | observed |
| `CAP-PFM-MTD-007` | Prepare Image and File Uploads | confirmed | partially-observed |
| `CAP-PFM-MTD-008` | Manage Shared Forms and Record Layouts | confirmed | observed |
| `CAP-PFM-MTD-009` | Bring a Custom Record Type Into Use | confirmed | observed |
| `CAP-PFM-MTD-010` | Make Custom Records Discoverable | confirmed | observed |
| `CAP-PFM-MTD-011` | Control Custom Record Audiences | confirmed | partially-observed |
| `CAP-PFM-MTD-012` | Maintain Valid Custom Records | confirmed | observed |
| `CAP-PFM-MTD-013` | Retire or Publish Custom Records | confirmed | observed |
| `CAP-PFM-MTD-014` | Explain Custom Record Changes | confirmed | observed |
| `CAP-PFM-MTD-015` | Deliver Committed Record and Link Events | proposed | observed |
| `CAP-PFM-MTD-016` | Load and Reconcile Record Files | proposed | observed |
| `CAP-PFM-MTD-017` | Define Meaningful Record Relationships | confirmed | observed |
| `CAP-PFM-MTD-018` | Maintain Dated Links Between Records | confirmed | observed |
| `CAP-PFM-MTD-019` | Preserve Relationships Through Deletion and Merge | confirmed | observed |

## Journeys

| Journey | Title | Browser policy |
|---|---|---|
| `JNY-PFM-MTD-001` | Create a club register and its first boat | required |
| `JNY-PFM-MTD-002` | Maintain a boat and inspect its changes | required |
| `JNY-PFM-MTD-003` | Limit a sensitive register to its assigned role | required |
| `JNY-PFM-MTD-004` | Define connections and maintain dated links | required |
| `JNY-PFM-MTD-005` | Apply deletion policies and consolidate duplicate endpoints | required |
| `JNY-PFM-MTD-006` | Add a contact field and inspect its description | optional |

## Testing Artifact Tree

The design layer contains nineteen capability test specifications. The planning layer contains one cumulative acceptance suite for each of the six features. The implementation register identifies each existing executable suite and its scenario bindings; the structured tree names every artifact. Detailed coverage findings keep missing cases and unbound proposals visible.
