---
id: ATS-CRM-ENT-019
scope: CAP-CRM-ENT-019
product_area: crm
module: entities
revision: 1
status: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-ENT-019-01
    title: Settings answer only readable sections
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-01
    preconditions: Prepare a caller who may read contact layouts only.
    steps: Read the settings.
    expected: >-
      The contacts section only; the organizations section and the default
      affiliation type absent.
    negative: true
    data_needs: Use personas by key.
    bound_to:
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
      answered the section it may not read: it is ABSENT, not null, so
      "forbidden" and "unset" never look alike
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
        answered the section it may not read: it is ABSENT, not null, so
        "forbidden" and "unset" never look alike
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
        answered the section it may not read: it is ABSENT, not null, so
        "forbidden" and "unset" never look alike
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        answered the section it may read
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
        answered the section it may not read: it is ABSENT, not null, so
        "forbidden" and "unset" never look alike
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
        answered the default affiliation type, which the affiliation types keys
        govern
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-02
    title: Saves need every named section's key
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-02
      - INV-DOM-CRM-ENT-033-13
    preconditions: Prepare a caller who may update contact layouts only.
    steps: Save its own section; the other; both.
    expected: Saved; 403; 403 and neither written.
    negative: true
    data_needs: Use personas by key.
    bound_to:
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#writes
      NEITHER section for that refused save: the decision is made before
      anything is written
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#writes
        NEITHER section for that refused save: the decision is made before
        anything is written
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#writes
        NEITHER section for that refused save: the decision is made before
        anything is written
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#may
        save its own section
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        refused (403) when it saves the other section
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        refused (403) for a body naming both sections, though it may change one
        of them
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#writes
        NEITHER section for that refused save: the decision is made before
        anything is written
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-03
    title: Version and unknown properties
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-03
    preconditions: Prepare saved settings at version 1.
    steps: Save one section; save from version 0; save an unknown property.
    expected: The other section preserved; 409; 400.
    negative: true
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses a
      save from a stale version (409)
    category: concurrency
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        a save from a stale version (409)
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        a save from a stale version (409)
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#saves a
        default and answers it, at version 1
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#leaves
        a section a later save does not name
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        a save from a stale version (409)
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        an unknown property rather than ignoring it (400)
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-04
    title: Only fitting definitions may be chosen
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-04
    preconditions: 'Prepare definitions of both purposes and types, one of another workspace.'
    steps: >-
      Choose an unknown id, another workspace’s, an organizations layout under
      contacts, a console form in the layout slot.
    expected: Each rejected naming the section and field.
    negative: true
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-791
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
      a definition of the wrong kind: a console form in the console page layout
      slot
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        a definition of the wrong kind: a console form in the console page
        layout slot
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        a definition of the wrong kind: a console form in the console page
        layout slot
    test_anchors:
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        an id no definition of the tenant has, naming the section and the field
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        another tenant’s definition
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        a definition of the other purpose in a section: an organizations layout
        under contacts
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        a definition of the wrong kind: a console form in the console page
        layout slot
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        a definition of the organizations purpose on a contact type (400)
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-05
    title: Type assignments survive an unaware replacement
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-05
    preconditions: Prepare a contact type with five assignments.
    steps: Replace it without them; patch one out; patch one to null.
    expected: All five preserved; that one cleared; that one cleared.
    negative: false
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS all
      five through a PUT that does not mention them: an older client cannot wipe
      a tenant’s assignments
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS
        all five through a PUT that does not mention them: an older client
        cannot wipe a tenant’s assignments
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS
        all five through a PUT that does not mention them: an older client
        cannot wipe a tenant’s assignments
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS
        all five through a PUT that does not mention them: an older client
        cannot wipe a tenant’s assignments
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#CLEARS
        the one a PATCH removes, and keeps the rest: the opposite of the same
        silence in a PUT
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#clears
        one a PATCH replaces with null
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-06
    title: Resolution of the definitions in force
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-06
    preconditions: Prepare workspace defaults and a type with some assignments.
    steps: >-
      Resolve for the type; with no type; for console only; for an unknown type;
      with no record type.
    expected: Type then default then not configured; defaults; console types; 404; 400.
    negative: true
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#falls
      back to the tenant’s default for a kind the type leaves empty
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#falls
        back to the tenant’s default for a kind the type leaves empty
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#falls
        back to the tenant’s default for a kind the type leaves empty
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#answers
        the type’s own definition for the kind the type assigns
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#falls
        back to the tenant’s default for a kind the type leaves empty
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#says a
        kind nothing configures is not configured
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#answers
        only the console kinds for ?context=console
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        a type_id the tenant does not have (404) rather than answering the
        defaults
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses
        a request that names no entity (400)
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-07
    title: Readers see the definitions in force but not the defaults
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-07
    preconditions: Prepare a caller who may read contacts only.
    steps: Resolve contact definitions; organization ones; read the defaults.
    expected: Displayed; 403; 403.
    negative: true
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
      refused the tenant’s defaults (403): reading a record does not make one an
      administrator of layouts
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        refused the tenant’s defaults (403): reading a record does not make one
        an administrator of layouts
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        refused the tenant’s defaults (403): reading a record does not make one
        an administrator of layouts
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        shown the contact definitions: being told which layout is in force is
        part of reading the record
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        refused the organization ones (403): the key is the entity’s own
      - >-
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
        refused the tenant’s defaults (403): reading a record does not make one
        an administrator of layouts
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-019-08
    title: Invalid layout assignment preserves the previous settings
    category: failure
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-04
      - BR-CAP-CRM-ENT-019-03
    preconditions: A valid workspace default layout is already assigned.
    steps: >-
      Attempt to replace it with a form definition in the layout slot and reread
      settings.
    expected: >-
      The refusal names the invalid slot and leaves the previous assignment and
      settings version unchanged.
    negative: true
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
      a definition of the wrong kind: a console form in the console page layout
      slot
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        a definition of the wrong kind: a console form in the console page
        layout slot
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
        a definition of the wrong kind: a console form in the console page
        layout slot
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-019-09
    title: Settings do not expose the affiliation default through layout-only access
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-ENT-017-06
      - BR-CAP-CRM-ENT-019-01
    preconditions: A caller may read contact layouts but cannot read affiliation types.
    steps: 'Read settings with that access, then with affiliation-type read added.'
    expected: >-
      The layout-only response omits the default affiliation type; the
      additional catalogue authority exposes it.
    negative: false
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses
      a caller who may only read affiliation types the change of the default
      (403); services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
      not answered the section it may not read: it is ABSENT, not null, so
      "forbidden" and "unset" never look alike
    exercises:
      - CAP-CRM-ENT-017
      - CAP-CRM-ENT-019
    workflows: []
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses
        a caller who may only read affiliation types the change of the default
        (403);
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
        answered the section it may not read: it is ABSENT, not null, so
        "forbidden" and "unset" never look alike
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses
        a caller who may only read affiliation types the change of the default
        (403);
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
        answered the section it may not read: it is ABSENT, not null, so
        "forbidden" and "unset" never look alike
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-019-10
    title: Classification edits retain their presentation assignments
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-ENT-018-07
      - BR-CAP-CRM-ENT-019-05
    preconditions: A contact classification has all five form and layout slots assigned.
    steps: >-
      Replace its ordinary classification fields without the slots; then clear
      one slot with a patch and resolve definitions.
    expected: >-
      Replacement retains every assignment; clearing one slot changes only that
      slot’s effective inheritance.
    negative: false
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#then,
      when the version is off, refuses the change (409);
      services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS all
      five through a PUT that does not mention them: an older client cannot wipe
      a tenant’s assignments
    exercises:
      - CAP-CRM-ENT-018
      - CAP-CRM-ENT-019
    workflows: []
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#then,
        when the version is off, refuses the change (409);
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS
        all five through a PUT that does not mention them: an older client
        cannot wipe a tenant’s assignments
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#then,
        when the version is off, refuses the change (409);
        services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS
        all five through a PUT that does not mention them: an older client
        cannot wipe a tenant’s assignments
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-019-11
    title: Exercise every declared authority independently
    category: permission
    level: api
    proves:
      - BR-CAP-CRM-ENT-019-01
      - BR-CAP-CRM-ENT-019-02
      - BR-CAP-CRM-ENT-019-07
    preconditions: >-
      An eligible record and configuration fixture exist for each operation; the
      caller can reach only the run’s workspace.
    steps: >-
      For each declared permission, execute its matching operation with that
      permission, then without it while retaining the other required grants.
      Read affected records after every refused mutation.
    expected: >-
      The authorized case reaches the operation; the missing-grant case is
      refused and preserves saved data. Record access alone does not authorize
      the other declared actions.
    negative: true
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:aws/crm.service.ts:ApplicationPermissions;
      services-crm:modules/entities/aws/api/entities.routes.ts
    permission_keys:
      - crm.contact-layouts.read
      - crm.contact-layouts.update
      - crm.organization-layouts.read
      - crm.organization-layouts.update
      - crm.contacts.read
      - crm.organizations.read
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:aws/crm.service.ts:ApplicationPermissions;
        services-crm:modules/entities/aws/api/entities.routes.ts
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:aws/crm.service.ts:ApplicationPermissions;
        services-crm:modules/entities/aws/api/entities.routes.ts
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
evidence:
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
    answered the section it may not read: it is ABSENT, not null, so "forbidden"
    and "unset" never look alike
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is answered
    the section it may read
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is not
    answered the default affiliation type, which the affiliation types keys
    govern
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#writes
    NEITHER section for that refused save: the decision is made before anything
    is written
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#may save
    its own section
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is refused
    (403) when it saves the other section
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is refused
    (403) for a body naming both sections, though it may change one of them
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses a
    save from a stale version (409)
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#saves a
    default and answers it, at version 1
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#leaves a
    section a later save does not name
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses an
    unknown property rather than ignoring it (400)
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
    a definition of the wrong kind: a console form in the console page layout
    slot
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
    an id no definition of the tenant has, naming the section and the field
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
    another tenant’s definition
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/crm-settings.integration.spec.js#refuses
    a definition of the other purpose in a section: an organizations layout
    under contacts
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses a
    definition of the organizations purpose on a contact type (400)
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS all
    five through a PUT that does not mention them: an older client cannot wipe a
    tenant’s assignments
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#CLEARS the
    one a PATCH removes, and keeps the rest: the opposite of the same silence in
    a PUT
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#clears one
    a PATCH replaces with null
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#falls back
    to the tenant’s default for a kind the type leaves empty
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#answers the
    type’s own definition for the kind the type assigns
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#says a kind
    nothing configures is not configured
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#answers
    only the console kinds for ?context=console
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses a
    type_id the tenant does not have (404) rather than answering the defaults
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#refuses a
    request that names no entity (400)
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is refused
    the tenant’s defaults (403): reading a record does not make one an
    administrator of layouts
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is shown
    the contact definitions: being told which layout is in force is part of
    reading the record
  - >-
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is refused
    the organization ones (403): the key is the entity’s own
  - >-
    services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses
    a caller who may only read affiliation types the change of the default
    (403); services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#is
    not answered the section it may not read: it is ABSENT, not null, so
    "forbidden" and "unset" never look alike
  - >-
    services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#then, when
    the version is off, refuses the change (409);
    services-crm:modules/entities/tests/e2e/page-layouts.e2e.spec.js#KEEPS all
    five through a PUT that does not mention them: an older client cannot wipe a
    tenant’s assignments
  - >-
    services-crm:aws/crm.service.ts:ApplicationPermissions;
    services-crm:modules/entities/aws/api/entities.routes.ts
coverage:
  rule: covered
  transition: 'gap: FND-CRM-ENT-067'
  validation: covered
  permission: covered
  edge: 'gap: FND-CRM-ENT-067'
  failure: covered
  boundary: 'gap: FND-CRM-ENT-067'
  concurrency: covered
  invariant: 'gap: FND-CRM-ENT-067'
  interaction: covered
previous_approval:
  revision: 1
  approved_by: Andrew
  approved_at: '2026-10-22T00:00:00.000Z'
coverage_notes:
  transition:
    reason: >-
      No detailed transition scenario currently specifies this aspect; the
      coverage finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-067
  edge:
    reason: >-
      No detailed edge scenario currently specifies this aspect; the coverage
      finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-067
  boundary:
    reason: >-
      No detailed boundary scenario currently specifies this aspect; the
      coverage finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-067
  invariant:
    reason: >-
      No detailed invariant scenario currently specifies this aspect; the
      coverage finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-067
coverage_findings:
  - FND-CRM-ENT-067
  - FND-CRM-ENT-075
permission_coverage:
  - key: crm.contact-layouts.read
    where_checked: api
    scenario: ATS-CRM-ENT-019-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md
  - key: crm.contact-layouts.update
    where_checked: api
    scenario: ATS-CRM-ENT-019-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md
  - key: crm.organization-layouts.read
    where_checked: api
    scenario: ATS-CRM-ENT-019-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md
  - key: crm.organization-layouts.update
    where_checked: api
    scenario: ATS-CRM-ENT-019-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md
  - key: crm.contacts.read
    where_checked: api
    scenario: ATS-CRM-ENT-019-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md
  - key: crm.organizations.read
    where_checked: api
    scenario: ATS-CRM-ENT-019-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md
related_coverage:
  - capability: CAP-CRM-ENT-017
    scenarios:
      - ATS-CRM-ENT-019-09
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md:related
  - capability: CAP-CRM-ENT-018
    scenarios:
      - ATS-CRM-ENT-019-10
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-019-choose-the-page-layouts-and-forms-contacts-and-organizations.md:related
examination_evidence:
  provenance: documented
  source: 'rhythm-v2-docs:specs/crm/entities/reports/EXAMINATION-2026-10-23.md'
  heading_conflict: FND-CRM-ENT-075
---

# Resolve the forms and layouts used for CRM records
## Coverage

The category map separates specified cases from recorded gaps. A proposed case describes proof to implement; a binding identifies the assertions supplied by an existing executable file. The permission and transition ledgers record the individual checks needed for the capability.

| Required rule | Scenario or finding |
|---|---|
| `BR-CAP-CRM-ENT-019-01` | `ATS-CRM-ENT-019-01`, `ATS-CRM-ENT-019-09`, `ATS-CRM-ENT-019-11` |
| `BR-CAP-CRM-ENT-019-02` | `ATS-CRM-ENT-019-02`, `ATS-CRM-ENT-019-11` |
| `BR-CAP-CRM-ENT-019-03` | `ATS-CRM-ENT-019-03`, `ATS-CRM-ENT-019-08` |
| `BR-CAP-CRM-ENT-019-04` | `ATS-CRM-ENT-019-04`, `ATS-CRM-ENT-019-08` |
| `BR-CAP-CRM-ENT-019-05` | `ATS-CRM-ENT-019-05`, `ATS-CRM-ENT-019-10` |
| `BR-CAP-CRM-ENT-019-06` | `ATS-CRM-ENT-019-06` |
| `BR-CAP-CRM-ENT-019-07` | `ATS-CRM-ENT-019-07`, `ATS-CRM-ENT-019-11` |

## Interactions With Related Capabilities

The interaction scenarios exercise configure affiliation types and contact roles; organize the workspace’s record classifications. They change one part of a prepared record and inspect the dependent outcome. Unbound interactions remain proposed rather than implying an existing end-to-end implementation.

## Source Evidence

The frontmatter pins the repositories and identifies the source anchors for each scenario. Bindings record inspected assertions, while unbound cases remain proposed. Source inspection supplies no execution result or product approval.
