---
id: TST-CRM-ENT-796
title: Controlled CRM console failures
kind: browser-lifecycle
product_area: crm
module: entities
revision: 1
status: draft
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: react-console
files:
  - e2e/controlled/contact-types.controlled.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 selected controlled project retains the real sign-in and console, with the
  deliberate response interception described by the test. Restore handlers after
  each case; a fixture response must not leak into a later live scenario. The
  command uses one worker to match the shared-session constraints.
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/controlled/contact-types.controlled.spec.ts'
source_observations:
  - provenance: test
    source: 'react-console:e2e/controlled/contact-types.controlled.spec.ts'
    declared_test_titles:
      - >-
        says it couldn't load the list when CRM answers 500, and loads it on the
        retry
      - >-
        reports a bulk delete that half succeeded, and keeps the refused type
        listed and selected
      - >-
        keeps everything that was typed when a save is refused, and offers Save
        again
    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. Selected
      browser responses are intercepted where the source declares a controlled
      condition.
product_intent: proposed
implementation_evidence: observed
narrative:
  status: enriched
retries: none
proves_controls: []
lifecycles:
  create: not-exercised
  change: partial
  archive: not-applicable
  delete: partial
  merge: not-applicable
  reconcile: not-applicable
lifecycle_gaps:
  - FND-CRM-ENT-091
  - FND-CRM-ENT-092
  - FND-CRM-ENT-094
command: >-
  npx playwright test --config playwright.config.ts --project controlled
  --workers 1 --retries 0 e2e/controlled/contact-types.controlled.spec.ts
---

# Controlled CRM console failures

## Verification Boundary

The selected controlled crm console failures files cross the browser interaction boundary described below.

## What This Suite Proves

The real console handles a supplied catalogue load failure, a partially refused bulk delete and a refused save while preserving typed values. The tests establish recovery controls and selection behavior under otherwise difficult response conditions. No control is claimed without an independently mapped refusal case.

## What It Does Not Prove

An intercepted failure or partial-delete response cannot establish that the CRM service actually refuses, rolls back or deletes those records. The development catalogue suite and local API catalogue tests establish the adjacent live boundaries.

## Level and Rationale

The error recovery experience belongs to the browser: retained fields, selection and retry actions cannot be established by a service refusal alone. A controlled response supplies a reproducible fault at that seam. It establishes client behavior while deliberately leaving the server cause outside the proof boundary.

## Lifecycle Coverage

Create is not exercised as a persisted lifecycle. Change and delete are partial because the browser responds to supplied outcomes while the corresponding real service state is not established by that outcome. Archive and reconcile do not apply to this catalogue failure boundary. Merge belongs to Data Quality.

## Real Dependencies and Test Doubles

The browser, sign-in and development console are real. The selected failure answer is intercepted at the exact seam named by the test. That supplied answer isolates browser recovery; the register does not attribute it to an actual server failure. Other interactions retain their source-declared live dependencies.

## Must Not Be Doubled

Keep the real browser, catalogue editor and error handling. Intercept only the declared response. Replacing the save-failure presentation or selection state would bypass the behavior the test examines. A synthetic HTTP refusal must never be counted as proof of the service permission guard.

## Fixtures and Isolation

The selected controlled project retains the real sign-in and console, with the deliberate response interception described by the test. Restore handlers after each case; a fixture response must not leak into a later live scenario. The command uses one worker to match the shared-session constraints.

## Determinism and Retries

The load retry button is a product recovery action, distinct from rerunning a failed Playwright test. The registered command overrides the CI retry default to zero, so failures of the recovery behavior remain failures.

## 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. An intercepted failure or partial-delete response cannot establish that the CRM service actually refuses, rolls back or deletes those records. The development catalogue suite and local API catalogue tests establish the adjacent live boundaries. Existing unbound files supply engineering observations; they do not silently implement additional capability or screen scenarios.
