---
id: SCR-PFM-MTD-015
title: New custom record
route: /console/{tenantId}/objects/{objectKey}/new
surface: console
product_area: platform
module: metadata
revision: 1
status: draft
design_intent: confirmed
origin: PLAT-M5 D17 (forms and record views), Product Accepted 2026-10-20
implementation_evidence: observed
inference: []
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
purpose: A record keeper creates an entry in a custom register. Entry from an owner page carries the selected owner
  into the form.
supports:
- JNY-PFM-MTD-001
- CAP-PFM-MTD-012
- CAP-PFM-MTD-007
- CAP-PFM-MTD-018
permission: platform.custom-records.create at the object's scope; platform.associations.create to set the owner
entry_from:
- SCR-PFM-MTD-014
- SCR-PFM-MTD-018 (?owner=<record id>)
exits_to:
- SCR-PFM-MTD-016
displays:
- field: The generated form from the object's description
  source: describeObject (objects.<plural>) and getCustomObject
- field: Owner choices
  source: listRecordAssociations and the owner record type's records
actions:
- label: Save
  operation_id: createCustomObjectRecord
  permission: platform.custom-records.create
  confirm: false
- label: Set the owner (after the save)
  operation_id: createAssociation
  permission: platform.associations.create
  confirm: false
- label: Upload a picture or file
  operation_id: issueFileUpload
  permission: platform.files.upload
  confirm: false
states:
- loading
- error
- not found
- 'inactive (object not active: no new records)'
- partial (saved without its owner)
validation:
- BR-CAP-PFM-MTD-012-02
- BR-CAP-PFM-MTD-012-03
- BR-CAP-PFM-MTD-012-04
- BR-CAP-PFM-MTD-012-05
- BR-CAP-PFM-MTD-012-06
- BR-CAP-PFM-MTD-012-07
- BR-CAP-PFM-MTD-012-08
- BR-CAP-PFM-MTD-012-13
patterns:
- PageLayout (standard width)
- shared form engine
- EditorActionBar
- unsaved-changes guard
- held draft
- object gate
component: components/console/custom-objects/record-editor.tsx
evidence:
- 'react-console at baf6dae3: app/(console)/console/[tenantId]/objects/[objectKey]/new/page.tsx; components/console/custom-objects/record-editor.tsx;
  lib/forms/custom-objects/**; lib/custom-objects/api.ts'
controls: [TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-004, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-MON-002, 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]
---

# New custom record

## What the Screen Is For

A record keeper creates an entry in a custom register. Entry from an owner page carries the selected owner into the form.

## What It Shows and Lets People Do

The shared description generates controls, requirements, conditions and defaults. The save creates record content; ownership is a later connection call, and attachment bytes are staged before persistence.

## States and Errors

Validation appears at properties and focuses the first issue. A failed ownership call reports saved content without completed ownership. Inactive categories offer no create form.

## Patterns It Must Respect

The built shared form engine uses a standard frame, action bar, draft retention and unsaved-change protection under the object gate.
