---
id: TST-CRM-ENT-784
title: Additional deployed CRM console checks
kind: browser-lifecycle
product_area: crm
module: entities
revision: 1
status: draft
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: react-console
files:
  - e2e/dev/contact-edit.dev.spec.ts
  - e2e/dev/contact-forms.dev.spec.ts
  - e2e/dev/contact-roles.dev.spec.ts
  - e2e/dev/contact-types.dev.spec.ts
  - e2e/dev/contact-version-history.spec.ts
  - e2e/dev/organization-360.dev.spec.ts
  - e2e/dev/organization-types.dev.spec.ts
  - e2e/dev/record-links.dev.spec.ts
  - e2e/dev/record-views.dev.spec.ts
implements: []
environment: deployed-dev
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: null
estimate_basis: >-
  No measured duration is available for this cohesive group; per-file allowances
  are not runtime estimates.
isolation: >-
  The development project uses its repository global setup and seeded sign-in
  fixtures. Individual tests own records they create; this register does not
  turn a development fixture into permission to alter unrelated shared data. The
  repository config runs one worker because fixture sessions and shared changes
  can interfere.
binding_scope: >-
  Bindings preserve the existing assertion contributions and exact source file.
  Composite scenarios still require every bound contribution and any unbound
  checks; consolidation does not certify conformance.
bindings: []
evidence:
  - 'react-console:e2e/dev/contact-edit.dev.spec.ts'
  - 'react-console:e2e/dev/contact-forms.dev.spec.ts'
  - 'react-console:e2e/dev/contact-roles.dev.spec.ts'
  - 'react-console:e2e/dev/contact-types.dev.spec.ts'
  - 'react-console:e2e/dev/contact-version-history.spec.ts'
  - 'react-console:e2e/dev/organization-360.dev.spec.ts'
  - 'react-console:e2e/dev/organization-types.dev.spec.ts'
  - 'react-console:e2e/dev/record-links.dev.spec.ts'
  - 'react-console:e2e/dev/record-views.dev.spec.ts'
source_observations:
  - provenance: test
    source: 'react-console:e2e/dev/contact-edit.dev.spec.ts'
    declared_test_titles:
      - a contact's life through the console's own forms
      - 'creates, edits and clears a contact in the dev tenant'
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/contact-forms.dev.spec.ts'
    declared_test_titles:
      - saved contact forms
      - 'creates a form from the default, edits it, clones it and deletes it'
      - /
      - refuses a replace that does not carry the version the row was read at
      - keeps one tenant's forms out of another's
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/contact-roles.dev.spec.ts'
    declared_test_titles:
      - >-
        shows the tenant's contact roles with how each is assigned, reached
        through the navigation and by URL
      - >-
        searches by name and ID, sorts by Auto Assign, and includes inactive
        roles on request
      - >-
        derives the ID from the name, creates a role with a switch on, and
        refuses a blank name without calling the service
      - >-
        lets the ID be changed before the role exists, and says when it is
        already in use
      - >-
        renames a role, flips its switches, deactivates it, and the changes
        survive a reload
      - >-
        deletes a disposable contact role, and explains a role contacts hold by
        name
      - 'does not offer to delete a role CRM has locked, and says why'
      - copies a contact role's ID to the clipboard
      - >-
        shows the read-only user the list, and offers them nothing that changes
        it
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/contact-types.dev.spec.ts'
    declared_test_titles:
      - >-
        shows the tenant's contact types, reached through the configuration
        navigation and by URL
      - >-
        searches by name, includes inactive types on request, and selects
        several at once
      - 're-reads CRM on Refresh, and keeps the search that is in the box'
      - >-
        derives the ID from the name, creates the type, and refuses a blank name
        without calling the service
      - never marks the ID invalid while a type it derived is being created
      - >-
        lets the ID be changed before the type exists, and says when it is
        already in use
      - >-
        renames a contact type, keeps its ID fixed, and deactivates and
        reactivates it
      - >-
        deletes a disposable contact type, and explains a type contacts depend
        on by name
      - copies a contact type's ID to the clipboard
      - >-
        shows the read-only user the list, and offers them nothing that changes
        it
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/contact-version-history.spec.ts'
    declared_test_titles:
      - Version History on a contact
      - the Overview More menu opens the drawer on the contact's real history
      - the whole path works from the keyboard alone
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/organization-360.dev.spec.ts'
    declared_test_titles:
      - >-
        opens a real organization, shows what CRM holds, says what it does not,
        and records the visit
    skipped_declarations:
      - 'test.skip(unavailable !== null, unavailable ?? "")'
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/organization-types.dev.spec.ts'
    declared_test_titles:
      - '["new"]'
      - >-
        saves every setting an organization type carries, and reads them back
        from CRM
      - >-
        inserts a merge field at the caret in the subject and as a chip in the
        body
      - >-
        renders the notice for a real organization and contact, and reports an
        unknown field
      - >-
        switching the notification off keeps the e-mail CRM stored, and
        switching it on finds it again
      - >-
        draws five sibling panels in the standard column, with every header
        switch centred
      - 'shows a contact type the same five layout settings, and saves them'
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/record-links.dev.spec.ts'
    declared_test_titles:
      - record links on dev
      - >-
        a Contacts Explorer row opens its contact with Previous and Next, and
        its organization on its own URL
      - >-
        a contacts query opens the contact, the spouse and the organization of
        one row, and the drawer from a cell that is not a link
      - >-
        a contacts query shows the spouse's name in Spouse, the id in Spouse ID,
        and the name opens that contact
      - >-
        a contacts query keeps No Link on the spouse and the e-mail opening the
        contact through save, reopen and run
      - >-
        a Contacts Explorer view keeps No Link on the spouse and the e-mail
        opening the contact
    skipped_declarations:
      - 'test.skip(unavailable !== null, unavailable ?? "")'
      - >-
        test.skip((await linked.count()) === 0, "no contact on the first page of
        FAA's contacts has an organization")
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
  - provenance: test
    source: 'react-console:e2e/dev/record-views.dev.spec.ts'
    declared_test_titles:
      - >-
        the records a person opens are recorded in the Platform and read back by
        the header
      - somebody else's Recent Items holds none of this person's records
    skipped_declarations: []
    dependency_summary: >-
      Sign-in and development APIs provide the records used by the browser; the
      suite’s existing cleanup and runner own its fixture lifecycle.
product_intent: proposed
implementation_evidence: observed
narrative:
  status: enriched
retries: none
proves_controls: []
lifecycles:
  create: partial
  change: partial
  archive: partial
  delete: partial
  merge: not-applicable
  reconcile: partial
lifecycle_gaps:
  - FND-CRM-ENT-091
  - FND-CRM-ENT-092
  - FND-CRM-ENT-093
  - FND-CRM-ENT-094
  - FND-CRM-ENT-095
command: >-
  npx playwright test --config playwright.config.ts --project dev --workers 1
  --retries 0 e2e/dev/contact-edit.dev.spec.ts e2e/dev/contact-forms.dev.spec.ts
  e2e/dev/contact-roles.dev.spec.ts e2e/dev/contact-types.dev.spec.ts
  e2e/dev/contact-version-history.spec.ts e2e/dev/organization-360.dev.spec.ts
  e2e/dev/organization-types.dev.spec.ts e2e/dev/record-links.dev.spec.ts
  e2e/dev/record-views.dev.spec.ts
---

# Additional deployed CRM console checks

## Verification Boundary

The selected additional deployed crm console checks files cross the browser interaction boundary described below.

## What This Suite Proves

The selected development-console checks inspect real contact editing, forms, classifications, history, organization views and record links. They extend the journey inventory with console-specific observations. No product scenario binding is inferred from a file’s title or from a permitted interaction. No control is claimed without an independently mapped refusal case.

## What It Does Not Prove

These development checks are not the full acceptance inventory and do not establish every persisted lifecycle. Removing unrelated query, payment, session and shell tests keeps those owners’ proof outside Entities. Controlled responses have a separate register.

## Level and Rationale

These assertions join staff actions to the console’s route, form or record presentation and, where present, an independent stored read. A service integration test cannot establish that the person can reach and use those controls. Browser execution supplies the interaction boundary while stronger server cases retain their separate API register.

## Lifecycle Coverage

Create, change, archive, delete and reconcile are conservatively partial: this supplementary group has related interactions but no reviewed complete matrix for every record family. Merge belongs to Data Quality. Dedicated contact and organization acceptance registers and local API checks provide the stronger positive-lifecycle evidence.

## Real Dependencies and Test Doubles

The browser, sign-in and development APIs supply record interactions. Journey helpers perform console actions and independent API verification. Selected tests declare controlled outcomes in their own source; a supplied response proves only the matching browser behavior, while fresh service reads establish any stored result claimed by that case.

## Must Not Be Doubled

Keep the actual console workflow and every independent API read used as persisted verification. Setup may create related fixtures through the API, but cannot stand in for the customer action claimed as console-driven. A cleanup delete is not lifecycle proof unless the journey independently asserts the deleted stored result.

## Fixtures and Isolation

The development project uses its repository global setup and seeded sign-in fixtures. Individual tests own records they create; this register does not turn a development fixture into permission to alter unrelated shared data. The repository config runs one worker because fixture sessions and shared changes can interfere.

## Determinism and Retries

The repository config enables one retry in CI. This command explicitly sets retries to zero so the registered invocation preserves first-attempt results. Readiness waits remain the source assertions; this authoring pass reports no passing development run.

## How It Runs

Use the exact command in the frontmatter from the owning repository. The command selects this register’s browser boundary and limits worker count. Acceptance commands use run-marked development fixtures; fixture and controlled projects retain their distinct environments. The register remains not-run because this authoring pass produces no execution report.

## Coverage Gaps

The lifecycle findings linked above identify every applicable partial or absent lifecycle in this register. These development checks are not the full acceptance inventory and do not establish every persisted lifecycle. Removing unrelated query, payment, session and shell tests keeps those owners’ proof outside Entities. Controlled responses have a separate register. Existing unbound files supply engineering observations; they do not silently implement additional capability or screen scenarios.
