---
id: ATS-PFM-INT-021
scope: CAP-PFM-INT-021
product_area: platform
module: integrations
revision: 3
status: proposed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  macroservice-libraries: 54536a441935c6e09fdb7f96f0bec71c52ba4e03
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-INT-021-01
    title: Shipped recipes refuse customer changes
    level: api
    proves:
      - BR-CAP-PFM-INT-021-01
    preconditions: The shipped recipe collection is available.
    steps: List action recipes and attempt replacement and deletion of a shipped entry.
    expected: Shipped entries appear first and identified; both mutations refuse.
    negative: true
    data_needs: 'Fixtures establishing the stated accounts, declarations and history in an isolated workspace.'
    bound_to:
      - TST-PFM-INT-591
      - TST-PFM-INT-587
      - TST-PFM-INT-604
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
      a replacement of one (405)
    category: rule
    binding_evidence:
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        a replacement of one (405)
      - >-
        services-platform:modules/workflow-actions/tests/e2e/workflow-actions.e2e.spec.js#lists Rhythm’s
        action templates first, each marked shipped
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        a delete of one (405)
      - >-
        services-platform:modules/workflow-actions/tests/unit/contracts/shipped-templates.spec.ts#are the
        six of 09 §4, by name, in display order
    binding_scope: >-
      contributions: the cited tests support their own asserted outcomes. Additional setup, branches
      and combined sequences remain proposed unless the cited assertions exercise them.
  - id: ATS-PFM-INT-021-02
    title: Recipe contents must be configurable now
    level: api
    proves:
      - BR-CAP-PFM-INT-021-02
    preconditions: 'Registry types include retired, inactive and host-restricted actions.'
    steps: >-
      Save recipes using those types, invalid settings and a workflow stage pointing to an absent stage,
      then a valid recipe.
    expected: Each invalid recipe reports its problem and only the valid recipe saves.
    negative: true
    data_needs: 'Fixtures establishing the stated accounts, declarations and history in an isolated workspace.'
    bound_to:
      - TST-PFM-INT-591
      - TST-PFM-INT-605
      - TST-PFM-INT-600
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
      a type that is declared and switched off
    category: validation
    binding_evidence:
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        a type that is declared and switched off
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        a type its application retired
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        a type offered on a host it may not be configured on
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        params the type does not declare
      - >-
        services-platform:modules/workflow-actions/tests/unit/services/validation/action-lists.spec.ts#refuses
        a type whose permission the configuring user does not hold
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/workflow-templates.integration.spec.js#refuses
        an advance to a stage the template does not hold
    binding_scope: >-
      contributions: the cited tests support their own asserted outcomes. Additional setup, branches
      and combined sequences remain proposed unless the cited assertions exercise them.
  - id: ATS-PFM-INT-021-03
    title: Recipe identity and versions prevent ambiguity
    level: api
    proves:
      - BR-CAP-PFM-INT-021-03
    preconditions: A workspace already has a recipe.
    steps: 'Reuse its identifier, use the reserved prefix and replace using a stale version.'
    expected: Every attempt is refused.
    negative: true
    data_needs: 'Fixtures establishing the stated accounts, declarations and history in an isolated workspace.'
    bound_to:
      - TST-PFM-INT-591
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
      an id in Rhythm’s own prefix, which the configuration-id grammar reserves (400)
    category: concurrency
    binding_evidence:
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        an id in Rhythm’s own prefix, which the configuration-id grammar reserves (400)
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        an id the tenant already uses (409)
      - >-
        services-platform:modules/workflow-actions/tests/integration/services/persistence/action-templates.integration.spec.js#refuses
        a replacement at a version that is no longer the template’s (409)
    binding_scope: >-
      contributions: the cited tests support their own asserted outcomes. Additional setup, branches
      and combined sequences remain proposed unless the cited assertions exercise them.
  - id: ATS-PFM-INT-021-04
    title: Configuration mutation requires the matching authority
    level: api
    proves:
      - BR-CAP-PFM-INT-021-05
    preconditions: A caller has registry read alone.
    steps: Attempt creation of an action recipe.
    expected: The creation request is denied without its management permission.
    negative: true
    data_needs: 'Fixtures establishing the stated accounts, declarations and history in an isolated workspace.'
    bound_to:
      - TST-PFM-INT-587
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/e2e/workflow-actions.e2e.spec.js#refuses a caller
      without templates-manage a write (403)
    category: permission
    binding_evidence:
      - >-
        services-platform:modules/workflow-actions/tests/e2e/workflow-actions.e2e.spec.js#refuses a
        caller without templates-manage a write (403)
    binding_scope: >-
      contributions: the cited tests support their own asserted outcomes. Additional setup, branches
      and combined sequences remain proposed unless the cited assertions exercise them.
  - id: ATS-PFM-INT-021-05
    level: api
    negative: false
    data_needs: Run-owned records and principals in an isolated workspace.
    bound_to: []
    provenance: proposed
    title: Copied recipes do not rewrite published actions
    category: interaction
    proves:
      - BR-CAP-PFM-INT-020-04
      - BR-CAP-PFM-INT-021-04
    exercises:
      - CAP-PFM-INT-021
      - CAP-PFM-INT-020
    preconditions: An automation has a published version built from a customer recipe.
    steps: 'Replace the recipe, inspect the published version and raise a matching event.'
    expected: The published version and raised actions retain the original copied settings.
    source:
      - >-
        services-platform:modules/workflow-actions/tests/integration/db/workflow-actions-tables.integration.spec.js#refuses
        a change to a published version’s actions
      - >-
        services-platform:docs/workflow-actions/README.md#Workflow actions: Platform's part of the
        Workflow Action Engine
    workflows: []
evidence:
  - >-
    Each binding identifies an existing source test at the pinned revision; unbound scenarios remain
    proposed proof obligations.
supersedes:
  - ATS-PFM-INT-019
title: Acceptance for reusable action and workflow recipes
coverage:
  rule: covered
  transition: 'gap: FND-PFM-INT-092'
  validation: covered
  permission: covered
  edge: 'gap: FND-PFM-INT-092'
  failure: 'gap: FND-PFM-INT-092'
  boundary: 'gap: FND-PFM-INT-092'
  concurrency: covered
  invariant: 'gap: FND-PFM-INT-092'
  interaction: covered
coverage_notes:
  covered: A designed scenario exists; executable coverage and a passing run require separate evidence.
  gaps: >-
    The finding records categories without a designed scenario and remaining permission and rule audit
    obligations.
---
# Reuse validated action and workflow recipes: Capability Test Specification

## Coverage

| Rule | Proved By |
|---|---|
| `BR-CAP-PFM-INT-021-01` | `ATS-PFM-INT-021-01` |
| `BR-CAP-PFM-INT-021-02` | `ATS-PFM-INT-021-02` |
| `BR-CAP-PFM-INT-021-03` | `ATS-PFM-INT-021-03` |
| `BR-CAP-PFM-INT-021-04` | `ATS-PFM-INT-021-05` |
| `BR-CAP-PFM-INT-021-05` | `ATS-PFM-INT-021-04` |

## Interactions With Related Capabilities

Recipes supply reusable configuration for later automation drafts. The interaction case revalidates saved actions against the current registry, so a stored recipe alone cannot establish that a new publication remains valid.

The structured scenarios name the capabilities and rules involved. A bound test contributes only the outcomes it asserts; proposed transition matrices and composed interactions still require executable proof.
