---
id: CAP-PFM-MTD-006
title: Configure Field Requirements and Exposure
feature: FEAT-PFM-MTD-02
product_area: platform
module: metadata
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-CO-PRP-008
  - CAP-CO-PRP-009
  - CAP-CO-PRP-010
  - CAP-CO-PRP-011
  - CAP-CO-PRP-012
  - CAP-CO-PRP-015
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-platform:docs/proposals/custom-objects/09-decisions.md#D-10 (exposure levels), D-20 (refuse the
    archive)
  - >-
    services-platform:docs/milestones/PLAT-M5-custom-records.md#D-20 and PLAT-M5 D6 (build the deferred
    definition rules)
  - 'services-platform:docs/milestones/plans/PLAT-M5-plan.md#PLAT-M5-S04, PLAT-M5-S05, PLAT-M5-S09'
purpose: >-
  Fields need behaviour appropriate to the organization process and audience. Administrators can express that
  behaviour through a shared rule vocabulary.
outcomes:
  - Fields need behaviour appropriate to the organization process and audience.
  - Dependent properties can prevent a custom-object field from being archived.
actors:
  - ACT-PFM-007
  - ACT-PFM-009
surfaces:
  - console
  - api
preconditions:
  - The target field exists and remains unarchived.
postconditions: []
permissions:
  - key: platform.custom-fields.read
    where_checked: api
    scope: tenant
  - key: platform.custom-fields.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-MTD-006-01
    proved_by: [ATS-PFM-MTD-006-01, TST-PFM-MTD-109, TST-PFM-MTD-120]
    statement: >-
      Rules are replaced as a complete set of five possible kinds, with one entry per kind; omitted kinds
      disappear and the default staff exposure needs no stored entry.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#removes
      the kinds a replacement leaves out
    origin: none
  - id: BR-CAP-PFM-MTD-006-02
    proved_by: [ATS-PFM-MTD-006-02, ATS-PFM-MTD-006-11, TST-PFM-MTD-120, TST-PFM-MTD-129]
    statement: >-
      Conditions may reference other fields of the same type using compatible operators, cannot reference
      their own field and must fit sixteen kilobytes; rejected sets leave existing rules intact.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#refuses
      a condition naming a field the object does not have, and leaves the rules unchanged
    origin: none
  - id: BR-CAP-PFM-MTD-006-03
    proved_by: [ATS-PFM-MTD-006-03, ATS-PFM-MTD-006-10, TST-PFM-MTD-065, TST-PFM-MTD-120]
    statement: >-
      Uniqueness rules are supported only for custom objects and are refused with a duplicate-value count
      until existing records satisfy uniqueness.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
      a unique rule on a property two records already share, with the count
    origin: 'services-platform:docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 D6'
  - id: BR-CAP-PFM-MTD-006-04
    proved_by: [ATS-PFM-MTD-006-04, TST-PFM-MTD-129]
    statement: >-
      Defaults accept a compatible literal, the workspace current date, the portal caller contact or the
      caller organization token, and incompatible defaults are refused.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/unit/custom-object-properties.spec.ts#refuses a default the
      field cannot hold
    origin: none
  - id: BR-CAP-PFM-MTD-006-05
    proved_by: [ATS-PFM-MTD-006-05, ATS-PFM-MTD-006-10, TST-PFM-MTD-109, TST-PFM-MTD-129]
    statement: >-
      Exposure selects the widest permitted readership along the staff, owner, portal and public ladder, with
      broader levels including narrower audiences and invalid levels rejected.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/unit/custom-object-properties.spec.ts#refuses an exposure off
      the ladder before the description is read
    origin: 'services-platform:docs/proposals/custom-objects/09-decisions.md#D-10 (approved 2026-10-18)'
  - id: BR-CAP-PFM-MTD-006-06
    proved_by: [ATS-PFM-MTD-005-13, ATS-PFM-MTD-006-06, TST-PFM-MTD-009, TST-PFM-MTD-120]
    statement: >-
      A custom-object property named by another property condition cannot be archived until those dependencies
      are changed; the refusal identifies each dependent field and rule without deleting them.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#refuses
      the archive naming each dependent property and rule, and leaves the field and the rules unchanged
    origin: >-
      services-platform:docs/proposals/custom-objects/09-decisions.md#D-20 (Andrew, 2026-10-18: "Refuse the
      archive")
  - id: BR-CAP-PFM-MTD-006-07
    proved_by: [ATS-PFM-MTD-005-13, ATS-PFM-MTD-006-07, TST-PFM-MTD-120]
    statement: >-
      Field archival deletes that field’s own rules atomically, and rule replacement is unavailable while the
      field is archived.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#removes
      a field’s rules when the field is archived
    origin: none
  - id: BR-CAP-PFM-MTD-006-08
    proved_by: [ATS-PFM-MTD-006-08, TST-PFM-MTD-109]
    statement: Writing a field rule advances the workspace query-description stamp in the same transaction.
    kind: policy
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/integration/db/custom-field-rules.table.integration.spec.js#moves
      the tenant’s query description stamp when a rule is written
    origin: none
  - id: BR-CAP-PFM-MTD-006-09
    proved_by: [ATS-PFM-MTD-006-09, TST-PFM-MTD-120]
    statement: >-
      The archive dependency safeguard applies to custom objects; a registered-type field can be archived
      despite another field condition naming it.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#does
      not apply to a native object: a contacts field its rule depends on is archived
    origin: none
scenarios:
  - id: SC-CAP-PFM-MTD-006-01
    given: Survey Due depends on the Insured selection.
    when: 'Save an insured boat without its survey date, then remove the insured selection and save.'
    then: The insured save requires the date and the other save succeeds.
    provenance: test
    source: >-
      react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S04.spec.ts#PLAT-M5-S04: Survey Due
      is required only when Insured is ticked
edge_cases:
  - id: SC-CAP-PFM-MTD-006-02
    given: The Survey Due condition references Insured.
    when: Attempt to archive Insured.
    then: The dependency refusal identifies the condition.
    provenance: test
    source: >-
      react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S09.spec.ts#PLAT-M5-S09: archiving a
      property another rule depends on is refused, naming the rule
constraints: []
depends_on:
  - CAP-PFM-MTD-005
related:
  - CAP-PFM-MTD-011
  - CAP-PFM-MTD-012
journeys:
  - JNY-PFM-MTD-001
open_questions: []
concepts:
  - CON-PFM-MTD-002
evidence:
  - >-
    services-platform at ad3f6a6582843008ed0f5a17b131878d15829af1: modules/metadata/aws/api/metadata.routes.ts
    , services/persistence/custom-fields.ts , db/custom-field-rules.table.ts;
    modules/custom-objects/services/persistence/custom-object-records.ts ; tests
    integration/services/persistence/custom-fields.rules.integration.spec.js,
    integration/db/custom-field-rules.table.integration.spec.js, unit/custom-object-properties.spec.ts.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f:
    components/configuration/custom-objects/object-properties-tab.tsx; Playwright PLAT-M5-S04, S09.
controls: [TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-DAT-001, TC-DAT-003, TC-DAT-004, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, 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]
exercised_by: [FAS-PFM-MTD-02-01, FAS-PFM-MTD-02-02, FAS-PFM-MTD-02-05]
suites: [TST-PFM-MTD-009, TST-PFM-MTD-065, TST-PFM-MTD-109, TST-PFM-MTD-120, TST-PFM-MTD-129]
---

# Configure Field Requirements and Exposure

## Purpose

Fields need behaviour appropriate to the organization process and audience. Administrators can express that behaviour through a shared rule vocabulary.

## How It Works

An administrator opens the rules for a live field. They can define conditions, uniqueness, defaults and readership. Saving replaces the complete rule set. Platform checks that conditions and defaults fit the described record. Uniqueness also requires the custom-record store to verify existing values. Dependent properties can prevent a custom-object field from being archived. Record saves and audience projections use the resulting rules at their own boundaries.

## Relationships

Field definitions identify the subject of each rule. Custom-record writes evaluate defaults, requirements and uniqueness; access projections apply exposure.
