---
id: FAS-PFM-INT-05
title: Customer extensions acceptance
feature: FEAT-PFM-INT-05
product_area: platform
module: integrations
revision: 2
status: proposed
product_intent: proposed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  macroservice-libraries: 54536a441935c6e09fdb7f96f0bec71c52ba4e03
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
capabilities:
  - CAP-PFM-INT-016
  - CAP-PFM-INT-017
scenarios:
  - id: FAS-PFM-INT-05-01
    title: A registered contract supports a tested customization
    kind: behaviour
    exercises:
      - CAP-PFM-INT-016
      - CAP-PFM-INT-017
    relies_on:
      - ATS-PFM-INT-016-01
      - ATS-PFM-INT-017-05
      - ATS-PFM-INT-017-10
    preconditions: A live pricing point has a current contract and a rule author can configure it.
    steps: 'Save a valid rule, test matching and nonmatching input, then attach it at an allowed scope.'
    expected: 'The rule fits its contract, test outcomes enter history and the valid attachment can be enabled.'
    negative: false
    data_needs: 'Run-owned declarations, records and role fixtures in an isolated workspace.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#refuses
        a malformed fragment as ObjectInvalid, naming the path
      - >-
        services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
        a rule that does not fit, naming each problem by its path and code, and writes nothing
      - >-
        services-platform:modules/extensions/tests/e2e/rule-handlers.e2e.spec.js#records each run as a
        test invocation of the handler
  - id: FAS-PFM-INT-05-02
    title: Point withdrawal preserves orphaned customer configuration
    kind: interaction
    exercises:
      - CAP-PFM-INT-016
      - CAP-PFM-INT-017
    relies_on:
      - ATS-PFM-INT-016-04
      - ATS-PFM-INT-017-07
    preconditions: Two workspaces attach handlers to one point.
    steps: 'Withdraw the point and redeclare it, then attempt to enable an orphaned attachment.'
    expected: The bindings remain orphaned after redeclaration and cannot be reactivated directly.
    negative: false
    data_needs: 'Run-owned declarations, records and role fixtures in an isolated workspace.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#orphans
        every binding of a retired point, in every tenant, whatever its status
      - >-
        services-platform:modules/extensions/tests/unit/lifecycle.spec.js#allows draft to become enabled,
        shadow or disabled, enabled and shadow to trade places, disabled to return, and orphaned only to
        be disabled
  - id: FAS-PFM-INT-05-03
    title: Contract withdrawal respects existing enabled use
    kind: lifecycle
    exercises:
      - CAP-PFM-INT-016
      - CAP-PFM-INT-017
    relies_on:
      - ATS-PFM-INT-016-03
      - ATS-PFM-INT-017-07
    preconditions: One enabled binding uses an old version while a draft uses another omitted version.
    steps: 'Replace registration, inspect version standing and disable the enabled attachment.'
    expected: >-
      Referenced use is deprecated rather than silently removed and attachment changes remain subject to
      lifecycle validation.
    negative: false
    data_needs: 'Run-owned declarations, records and role fixtures in an isolated workspace.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#deprecates
        a version no longer declared that an enabled binding still names
      - >-
        services-platform:modules/extensions/tests/unit/lifecycle.spec.js#allows draft to become enabled,
        shadow or disabled, enabled and shadow to trade places, disabled to return, and orphaned only to
        be disabled
  - id: FAS-PFM-INT-05-04
    title: Rule authors remain separate from code administrators
    kind: permission
    exercises:
      - CAP-PFM-INT-016
      - CAP-PFM-INT-017
    relies_on:
      - ATS-PFM-INT-016-06
      - ATS-PFM-INT-017-02
      - ATS-PFM-INT-017-12
    preconditions: 'A point reader, rule author and invocation reader have separate permissions.'
    steps: >-
      Browse contracts, attempt code creation as the rule author and inspect invocation history with and
      without read authority.
    expected: >-
      Each read and mutation follows its distinct permission and unauthorized code creation saves
      nothing.
    negative: true
    data_needs: 'Run-owned declarations, records and role fixtures in an isolated workspace.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/extensions/tests/e2e/extensions.e2e.spec.js#admits the catalogue with
        platform.extension-points.read alone
      - >-
        services-platform:modules/extensions/tests/e2e/extensions.e2e.spec.js#refuses a Lambda handler to
        a caller who may manage only rules
      - >-
        services-platform:modules/extensions/tests/e2e/extensions.e2e.spec.js#refuses the invocation
        history without platform.extension-invocations.read
  - id: FAS-PFM-INT-05-05
    title: Retirement does not silently repair a single-answer scope
    kind: regression
    exercises:
      - CAP-PFM-INT-016
      - CAP-PFM-INT-017
    relies_on:
      - ATS-PFM-INT-016-04
      - ATS-PFM-INT-017-08
    preconditions: An enabled single-answer binding exists before point withdrawal.
    steps: >-
      Withdraw and redeclare the point, inspect its orphaned binding and attempt conflicting enabled
      configuration at an occupied live scope.
    expected: Orphaned configuration stays explicit and an occupied single-answer scope refuses a second winner.
    negative: true
    data_needs: 'Run-owned declarations, records and role fixtures in an isolated workspace.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#orphans
        every binding of a retired point, in every tenant, whatever its status
      - >-
        services-platform:modules/extensions/tests/e2e/extensions.e2e.spec.js#refuses a second enabled
        binding at one scope of a single point as 409
evidence:
  - >-
    The feature, its capabilities and the detailed scenarios listed in each reliance are examined at the
    pinned revisions.
---
# Customer extensions: Feature Acceptance Suite

## What the Feature Must Do as a Whole

The suite follows registration into customer rule configuration, testing and binding. Acceptance checks how customer configuration responds when a point or contract changes, with the proposed combined sequence kept distinct from the sample console surfaces.

## Interactions Between Capabilities

Withdrawal and redeclaration cross the registry and binding boundary. The cases inspect orphaned configuration and occupied scopes, then check rule-author and code-administrator permissions separately; the existing component tests do not establish this complete connected workflow.

The reliance links identify detailed capability scenarios. None of these composed acceptance sequences has a verified executable binding at the pinned revisions; the corresponding coverage finding remains open.

## Regression Record

| Revision | Change | Scenarios | Reason |
|---|---|---|---|
| 1 | Initial | All | Establish the cumulative acceptance sequences and initial regression cases. |
| 2 | Testing examination continuation | All | Clarify the feature boundary and preserve proposed status for unbound composed sequences. |
