---
id: ATS-PFM-MTD-008
scope: CAP-PFM-MTD-008
product_area: platform
module: metadata
revision: 2
status: proposed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-MTD-008-01
    title: Opaque presentation documents have bounded size
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-01
      - INV-DOM-PFM-MTD-003-02
    preconditions: A layout can be created.
    steps:
      - do: 'Store an object document, retrieve it and submit oversized or nonobject content.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
          a layout larger than the stated maximum, telling the person the limit and the size
    expected: Valid JSON returns unchanged and invalid shape or size is refused.
    negative: true
    data_needs: A layout can be created.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        a blank name
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        a layout that is an array
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        a layout larger than the stated maximum, telling the person the limit and the size
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#accepts
        a layout just inside the maximum, so the limit is where it is stated
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#stores
        an arbitrary nested document unchanged, because the backend never reads inside it
      - TST-PFM-MTD-098
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
      a layout larger than the stated maximum, telling the person the limit and the size
    category: boundary
    assertions:
      - expect: Valid JSON returns unchanged and invalid shape or size is refused.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
          a layout larger than the stated maximum, telling the person the limit and the size
  - id: ATS-PFM-MTD-008-02
    title: Purpose cannot change after creation
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-02
      - INV-DOM-PFM-MTD-003-01
    preconditions: A stored definition has one purpose.
    steps:
      - do: Replace and patch it naming a different purpose.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
          a replacement that names another purpose, naming both the stored one and the request’s
    expected: Both operations fail and identify the conflicting purposes.
    negative: true
    data_needs: A stored definition has one purpose.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        a replacement that names another purpose, naming both the stored one and the request’s
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
        directive that would change the purpose
      - TST-PFM-MTD-098
      - TST-PFM-MTD-087
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
      a replacement that names another purpose, naming both the stored one and the request’s
    category: invariant
    assertions:
      - expect: Both operations fail and identify the conflicting purposes.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
          a replacement that names another purpose, naming both the stored one and the request’s
  - id: ATS-PFM-MTD-008-03
    title: Purpose-specific permissions distinguish use from administration
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-03
    preconditions: A reader and administrator can access contacts.
    steps:
      - do: 'Read as the reader, attempt reader writes and administer as the authorized role.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 403 to a
          caller who may read contacts but not administer their layouts
    expected: 'Reading succeeds, unauthorized writes fail and purpose administration is permitted.'
    negative: true
    data_needs: A reader and administrator can access contacts.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 403 to a
        caller who may read contacts but not administer their layouts
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 200 to a
        caller who may merely read the record the layout is for
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 403 to an
        administrator of another purpose’s layouts
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#names the keys the
        caller would need when it refuses
      - TST-PFM-MTD-087
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 403 to a caller
      who may read contacts but not administer their layouts
    category: permission
    assertions:
      - expect: 'Reading succeeds, unauthorized writes fail and purpose administration is permitted.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 403 to a
          caller who may read contacts but not administer their layouts
  - id: ATS-PFM-MTD-008-04
    title: Inaccessible definitions stay undisclosed
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-04
      - INV-DOM-PFM-MTD-003-06
    preconditions: Two purposes have definitions and a caller reaches one.
    steps:
      - do: Read and mutate the other definition and request all or purpose-filtered lists.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 404 for a
          definition of a purpose the caller may not read, rather than confirming it exists
    expected: 'The hidden definition is not found, omitted from general lists and absent from the filtered page.'
    negative: true
    data_needs: Two purposes have definitions and a caller reaches one.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 404 for a
        definition of a purpose the caller may not read, rather than confirming it exists
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#leaves out the
        purposes the caller may not read, so a list never discloses another
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers an empty list
        for a purpose the caller may not read
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 404, not 403,
        to a caller who may not even read it
      - TST-PFM-MTD-087
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 404 for a
      definition of a purpose the caller may not read, rather than confirming it exists
    category: permission
    assertions:
      - expect: 'The hidden definition is not found, omitted from general lists and absent from the filtered page.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 404 for a
          definition of a purpose the caller may not read, rather than confirming it exists
  - id: ATS-PFM-MTD-008-05
    title: Unknown purposes and broad wildcards do not authorize creation
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-05
    preconditions: A Platform-wide staff context is available.
    steps:
      - do: Create under an unknown purpose and under an unrelated purpose wildcard.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
          purpose this build does not register, naming it
    expected: The unknown purpose is invalid and the wildcard does not authorize the other create.
    negative: true
    data_needs: A Platform-wide staff context is available.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
        purpose this build does not register, naming it
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#is refused the create
        of the other purpose too, because the wildcard is not what this route answers
      - TST-PFM-MTD-087
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
      purpose this build does not register, naming it
    category: permission
    assertions:
      - expect: The unknown purpose is invalid and the wildcard does not authorize the other create.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
          purpose this build does not register, naming it
  - id: ATS-PFM-MTD-008-06
    title: Custom-object definitions follow live object availability
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-06
    preconditions: 'Draft, active and archived objects and record readers exist.'
    steps:
      - do: 'Create and read forms, attempt reader changes and request missing or archived object forms.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#answers 404 for a stored
          form once its custom object is archived
    expected: >-
      Live-object definitions can be stored and read with suitable keys; unauthorized changes and
      unavailable-object requests fail.
    negative: true
    data_needs: 'Draft, active and archived objects and record readers exist.'
    bound_to:
      - >-
        services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#lets a reader of custom
        records read the form
      - >-
        services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#refuses a reader of custom
        records a change to the form, 403
      - >-
        services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#refuses a form for a
        custom object the tenant does not have, 404
      - >-
        services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#answers 404 for a stored
        form once its custom object is archived
      - TST-PFM-MTD-088
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#answers 404 for a stored
      form once its custom object is archived
    category: interaction
    assertions:
      - expect: >-
          Live-object definitions can be stored and read with suitable keys; unauthorized changes and
          unavailable-object requests fail.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#answers 404 for a stored
          form once its custom object is archived
  - id: ATS-PFM-MTD-008-07
    title: Definition mutations respect versions and locks
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-07
      - INV-DOM-PFM-MTD-003-07
    preconditions: A definition is newer than the submitted version and others have write or delete locks.
    steps:
      - do: Replace stale and update-locked definitions and delete a locked definition.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
          the version the caller did not read, as a StaleObject
    expected: Every prohibited mutation is refused.
    negative: true
    data_needs: A definition is newer than the submitted version and others have write or delete locks.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        the version the caller did not read, as a StaleObject
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        a definition locked against updates
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
        a definition locked against deletes
      - TST-PFM-MTD-098
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
      the version the caller did not read, as a StaleObject
    category: concurrency
    assertions:
      - expect: Every prohibited mutation is refused.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#refuses
          the version the caller did not read, as a StaleObject
  - id: ATS-PFM-MTD-008-08
    title: Assignments require a compatible existing definition
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-09
      - INV-DOM-PFM-MTD-003-04
    preconditions: 'Definition fixtures span kinds, purposes and workspaces.'
    steps:
      - do: 'Assign missing, foreign-workspace, wrong-purpose and wrong-kind definitions.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
          an assignment naming a definition of the wrong kind, because each slot’s column references one table
    expected: Database references refuse each incompatible assignment.
    negative: true
    data_needs: 'Definition fixtures span kinds, purposes and workspaces.'
    bound_to:
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
        an assignment naming a definition that does not exist
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
        an assignment naming a definition of another tenant
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
        an assignment naming a definition of another purpose
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
        an assignment naming a definition of the wrong kind, because each slot’s column references one table
      - TST-PFM-MTD-093
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
      an assignment naming a definition of the wrong kind, because each slot’s column references one table
    category: validation
    assertions:
      - expect: Database references refuse each incompatible assignment.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
          an assignment naming a definition of the wrong kind, because each slot’s column references one table
  - id: ATS-PFM-MTD-008-09
    title: Create and edit assignments may share a form
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-10
    preconditions: Two forms belong to one purpose.
    steps:
      - do: 'Assign different forms, then assign one form to both slots.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#holds
          a different console form for creating a record and for editing one, each under its own column
    expected: Both arrangements are stored.
    negative: false
    data_needs: Two forms belong to one purpose.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#holds
        a different console form for creating a record and for editing one, each under its own column
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#holds
        the same console form in both slots, which is what a record type names until somebody splits them
      - TST-PFM-MTD-093
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#holds
      a different console form for creating a record and for editing one, each under its own column
    category: rule
    assertions:
      - expect: Both arrangements are stored.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#holds
          a different console form for creating a record and for editing one, each under its own column
  - id: ATS-PFM-MTD-008-10
    title: References prevent definition deletion
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-11
      - INV-DOM-PFM-MTD-003-05
    preconditions: Two referrers assign a layout.
    steps:
      - do: 'Delete it, race assignment with deletion and repeat after clearing references.'
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#names
          every referring row, in a stable order, when more than one assigns it
    expected: >-
      The initial refusal lists uses, the race leaves no dangling assignment and an unassigned definition can
      be deleted.
    negative: true
    data_needs: Two referrers assign a layout.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#names
        every referring row, in a stable order, when more than one assigns it
      - >-
        services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#leaves
        no assignment pointing at a definition that is gone
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 409 while
        something still assigns the definition, naming the referring row
      - >-
        services-platform:modules/layouts/tests/integration/db/layout-assignments.table.integration.spec.js#refuses
        the delete of a console form assigned as an edit form, by that slot’s own key
      - TST-PFM-MTD-098
      - TST-PFM-MTD-087
      - TST-PFM-MTD-093
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#names
      every referring row, in a stable order, when more than one assigns it
    category: concurrency
    assertions:
      - expect: >-
          The initial refusal lists uses, the race leaves no dangling assignment and an unassigned definition
          can be deleted.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.integration.spec.js#names
          every referring row, in a stable order, when more than one assigns it
  - id: ATS-PFM-MTD-008-11
    title: Malformed cursors are rejected
    level: api
    proves:
      - BR-CAP-PFM-MTD-008-08
    preconditions: A caller can list page layouts.
    steps:
      - do: Supply an invalid cursor.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
          ?cursor= it did not issue
    expected: The list request fails as invalid.
    negative: true
    data_needs: A caller can list page layouts.
    bound_to:
      - >-
        services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
        ?cursor= it did not issue
      - TST-PFM-MTD-087
    provenance: test
    source: >-
      services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
      ?cursor= it did not issue
    category: validation
    assertions:
      - expect: The list request fails as invalid.
        provenance: test
        source: >-
          services-platform:modules/layouts/tests/e2e/console-page-layouts-api.e2e.spec.js#answers 400 for a
          ?cursor= it did not issue
  - id: ATS-PFM-MTD-008-12
    title: Object archival closes form consumption but preserves the record
    category: interaction
    level: api
    exercises:
      - CAP-PFM-MTD-008
      - CAP-PFM-MTD-003
      - CAP-PFM-MTD-009
      - CAP-PFM-MTD-012
    proves:
      - BR-CAP-PFM-MTD-008-06
      - BR-CAP-PFM-MTD-003-06
      - BR-CAP-PFM-MTD-009-08
      - BR-CAP-PFM-MTD-012-01
    preconditions: An active custom object has a stored form and record.
    steps:
      - do: 'Read both, archive the object, request the form and open the record by its retained link.'
        provenance: proposed
        source: &ref_0
          - >-
            services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#answers 404 for a
            stored form once its custom object is archived
          - >-
            services-platform:modules/layouts/tests/integration/services/persistence/purpose-capabilities.integration.spec.js#refuses
            a console form
          - >-
            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#refuses every
            write of it with 409 and changes nothing
    expected: Compare the two read surfaces and attempt a record edit.
    negative: false
    data_needs: An active custom object has a stored form and record.
    bound_to: []
    provenance: proposed
    source: *ref_0
    assertions:
      - expect: Compare the two read surfaces and attempt a record edit.
        provenance: proposed
        source: *ref_0
evidence:
  - >-
    services-platform at ad3f6a6582843008ed0f5a17b131878d15829af1: the layouts specs named in each scenario.
    The console page layout specs stand for the four resources, whose specs repeat the same cases.
  - >-
    Codex testing back-fill: pinned capability, domain object, state model and workflow obligations reviewed;
    existing bound test files and exact case titles checked.
coverage:
  rule: covered
  transition: 'gap: FND-PFM-MTD-070'
  validation: covered
  permission: covered
  edge: 'gap: FND-PFM-MTD-070'
  failure: 'gap: FND-PFM-MTD-070'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_obligations:
  - rule: BR-CAP-PFM-MTD-008-01
    scenarios:
      - ATS-PFM-MTD-008-01
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-02
    scenarios:
      - ATS-PFM-MTD-008-02
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-03
    scenarios:
      - ATS-PFM-MTD-008-03
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-04
    scenarios:
      - ATS-PFM-MTD-008-04
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-05
    scenarios:
      - ATS-PFM-MTD-008-05
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-06
    scenarios:
      - ATS-PFM-MTD-008-06
      - ATS-PFM-MTD-008-12
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-07
    scenarios:
      - ATS-PFM-MTD-008-07
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-08
    scenarios:
      - ATS-PFM-MTD-008-11
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-09
    scenarios:
      - ATS-PFM-MTD-008-08
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-10
    scenarios:
      - ATS-PFM-MTD-008-09
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - rule: BR-CAP-PFM-MTD-008-11
    scenarios:
      - ATS-PFM-MTD-008-10
    finding: null
    provenance: documented
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
interactions:
  - with: CAP-PFM-MTD-002
    scenarios: []
    finding: FND-PFM-MTD-070
    provenance: proposed
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
  - with: CAP-PFM-MTD-009
    scenarios:
      - ATS-PFM-MTD-008-12
    finding: null
    provenance: proposed
    source: >-
      specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
---

# Manage Shared Forms and Record Layouts: Capability Test Specification

## Coverage

- Obligation 01: 1 scenario cite this obligation.
- Obligation 02: 1 scenario cite this obligation.
- Obligation 03: 1 scenario cite this obligation.
- Obligation 04: 1 scenario cite this obligation.
- Obligation 05: 1 scenario cite this obligation.
- Obligation 06: 2 scenarios cite this obligation.
- Obligation 07: 1 scenario cite this obligation.
- Obligation 08: 1 scenario cite this obligation.
- Obligation 09: 1 scenario cite this obligation.
- Obligation 10: 1 scenario cite this obligation.
- Obligation 11: 1 scenario cite this obligation.

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.

## Interactions With Related Capabilities

Presentation availability and retained-record access follow their separate lifecycle obligations. The structured interaction rows identify the related capabilities exercised and any remaining gap. Cross-capability workflow seams remain subject to the detailed coverage audit.
