---
id: ATS-COM-FUL-010
scope: CAP-COM-FUL-010
product_area: commerce
module: fulfillment
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-COM-FUL-010-01
    title: Invalid destination values fail by field
    level: api
    proves:
      - BR-CAP-COM-FUL-010-01
    preconditions: An administrator can configure zones.
    steps: >-
      Submit lowercase country codes and blank region or prefix values, then
      clear a description explicitly.
    expected: >-
      Malformed fields fail validation and the explicit clearing value removes
      the description.
    negative: true
    data_needs: Fixtures for invalid destination values fail by field.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a zone naming a country that is not two upper-case letters, by
        shipping_zones_country_codes_check
      - >-
        services-commerce:modules/shipping/tests/unit/api/blank-shipping-configuration-values.spec.js#refuses
        a zone with region_codes [""] 400 naming region_codes, instead of making
        a zone of no region
      - >-
        services-commerce:modules/shipping/tests/unit/api/blank-shipping-configuration-values.spec.js#refuses
        a whitespace-only postal code prefix on a zone replacement, naming
        postal_code_prefixes
      - >-
        services-commerce:modules/shipping/tests/unit/api/blank-shipping-configuration-values.spec.js#clears
        a zone’s description on an explicit null, the one way to clear it
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        a zone with a blank region code 400 naming region_codes and creates
        nothing; a blank description on a replacement 400, only null clearing it
        (Q06)
      - TST-COM-FUL-077
      - TST-COM-FUL-083
      - TST-COM-FUL-075
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
      a zone naming a country that is not two upper-case letters, by
      shipping_zones_country_codes_check
    category: validation
  - id: ATS-COM-FUL-010-02
    title: Zone version and deletion guards preserve configuration
    level: api
    proves:
      - BR-CAP-COM-FUL-010-02
      - BR-CAP-COM-FUL-010-03
      - INV-DOM-COM-FUL-004-11
    preconditions: A zone owns shipping strategies.
    steps: 'Try duplicate identity, stale replacement and zone deletion.'
    expected: >-
      Identity and version conflicts fail, while successful deletion removes the
      dependent strategies.
    negative: true
    data_needs: Fixtures for zone version and deletion guards preserve configuration.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        the zone under the id its name suggests, the countries upper-cased, at
        version 1
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#replaces
        it at the version read, and refuses the stale version 409
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a taken id 400, and deletes a zone with its strategies (404 after)
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        deleting an account a strategy rates through (RESTRICT), by
        shipping_strategies_carrier_account_fk, and cascades a zone’s strategies
        with the zone
      - TST-COM-FUL-081
      - TST-COM-FUL-077
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
      the zone under the id its name suggests, the countries upper-cased, at
      version 1
    category: concurrency
  - id: ATS-COM-FUL-010-03
    title: Strategy validation includes pickup dependencies
    level: api
    proves:
      - BR-CAP-COM-FUL-010-04
      - BR-CAP-COM-FUL-010-05
      - INV-DOM-COM-FUL-004-11
      - INV-DOM-COM-FUL-004-12
    preconditions: A zone and warehouse exist.
    steps: >-
      Try unsupported kinds, unordered bands, missing carrier account, charged
      pickup and two pickup destinations, then delete a referenced warehouse.
    expected: Invalid strategies and dependent-warehouse deletion are rejected.
    negative: true
    data_needs: Fixtures for strategy validation includes pickup dependencies.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        the rules before the row: bands in ascending order with the open one
        last, a carrier naming its account, no bands on a flat one
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        a strategy of a kind outside the four 400, and one whose bands are out
        of order 400
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
        a carrier strategy to naming its account and a flat one to naming none,
        by shipping_strategies_carrier_check
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
        a pickup strategy to naming where the buyer collects and charging
        nothing, by shipping_strategies_pickup_check
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a pickup at a warehouse the tenant does not have, by
        shipping_strategies_pickup_warehouse_fk, and a warehouse delete while a
        pickup names it (RESTRICT)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        a pickup strategy’s rules before the row: a location named, one only, no
        charge; and a shipped kind naming none
      - TST-COM-FUL-081
      - TST-COM-FUL-075
      - TST-COM-FUL-077
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
      the rules before the row: bands in ascending order with the open one last,
      a carrier naming its account, no bands on a flat one
    category: validation
  - id: ATS-COM-FUL-010-04
    title: Carrier configuration retains connection references without secrets
    level: api
    proves:
      - BR-CAP-COM-FUL-010-06
      - BR-CAP-COM-FUL-010-07
      - BR-CAP-COM-FUL-010-08
      - INV-DOM-COM-FUL-004-10
      - INV-DOM-COM-FUL-004-11
    preconditions: An administrator can manage carrier accounts.
    steps: >-
      Try an unknown carrier, markup above 100 percent, absent UPS connection,
      connection removal and referenced-account deletion.
    expected: >-
      Invalid or dependent changes fail and valid reads expose references
      without credentials.
    negative: true
    data_needs: >-
      Fixtures for carrier configuration retains connection references without
      secrets.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a carrier outside the six and a markup above 100 %, by
        carrier_accounts_carrier_check and carrier_accounts_markup_check
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#answers
        the carrier account with its connection reference and never a secret
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a UPS account without its Integration Platform connection 400
        connection_required, writing nothing
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a replacement that takes a UPS account’s connection away 400
        connection_required, the account unchanged
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        an account with its connection reference and shipper number and no
        secret, lists by carrier, and refuses deleting one a strategy rates
        through (409)
      - TST-COM-FUL-077
      - TST-COM-FUL-075
      - TST-COM-FUL-081
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
      a carrier outside the six and a markup above 100 %, by
      carrier_accounts_carrier_check and carrier_accounts_markup_check
    category: invariant
  - id: ATS-COM-FUL-010-05
    title: Configuration access separates reads from writes
    level: api
    proves:
      - BR-CAP-COM-FUL-010-09
    preconditions: 'Reader, application-denied and unauthenticated identities are available.'
    steps: 'Exercise list, detail and mutation requests under each identity.'
    expected: >-
      Only authorized reading is allowed to the reader, and denied or missing
      identities fail.
    negative: true
    data_needs: Fixtures for configuration access separates reads from writes.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#lets a
        reader list and read, refuses the reader every write 403
        permission_missing, a denied principal 403 app_not_permitted, and no
        context 401
      - TST-COM-FUL-075
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#lets a
      reader list and read, refuses the reader every write 403
      permission_missing, a denied principal 403 app_not_permitted, and no
      context 401
    category: permission
  - id: ATS-COM-FUL-010-06
    title: Changing an active zone changes the buyer options
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-010-10
      - BR-CAP-COM-FUL-011-02
    exercises:
      - CAP-COM-FUL-010
      - CAP-COM-FUL-011
    relies_on:
      - ATS-COM-FUL-010-02
      - ATS-COM-FUL-011-02
    preconditions: A physical cart address matches a configured shipping zone.
    steps: 'Preview, deactivate the matching zone, preview again, then restore it.'
    expected: >-
      The offered options follow the configuration changes and the absent match
      carries the no-coverage warning.
    negative: false
    data_needs: >-
      An isolated workspace with the products, records, authority and quantities
      described in the preconditions.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        the zone under the id its name suggests, the countries upper-cased, at
        version 1
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#matches
        a zone naming nothing to every address, and to no address at all
  - id: ATS-COM-FUL-010-07
    title: The account selected by shipping configuration supplies label invocation
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-010-07
      - BR-CAP-COM-FUL-013-06
    exercises:
      - CAP-COM-FUL-010
      - CAP-COM-FUL-013
    relies_on:
      - ATS-COM-FUL-010-04
      - ATS-COM-FUL-013-05
    preconditions: >-
      A packed carrier shipment references a UPS account connected through the
      integration service.
    steps: >-
      Purchase a label with the invocation grant, then use an account without a
      valid connection or grant.
    expected: >-
      The connected purchase records a label; the invalid configuration makes no
      carrier request.
    negative: false
    data_needs: >-
      An isolated workspace with the products, records, authority and quantities
      described in the preconditions.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a carrier outside the six and a markup above 100 %, by
        carrier_accounts_carrier_check and carrier_accounts_markup_check
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#buys
        a label through shipping.label.purchase@1 under the label’s key, the
        shipment as the subject
  - id: ATS-COM-FUL-010-08
    title: A configured collection place prevents its removal
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-016-03
      - BR-CAP-COM-FUL-010-05
    exercises:
      - CAP-COM-FUL-016
      - CAP-COM-FUL-010
    relies_on:
      - ATS-COM-FUL-016-02
      - ATS-COM-FUL-010-03
    preconditions: An active warehouse is referenced by a pickup strategy.
    steps: >-
      Attempt to delete the warehouse, remove the strategy and retry deletion
      after clearing other dependencies.
    expected: The first deletion fails; dependency-free deletion succeeds.
    negative: false
    data_needs: >-
      An isolated workspace with the products, records, authority and quantities
      described in the preconditions.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#reads
        the warehouse made with the shelf, lists it, replaces it at the version
        read (a stale one 409) and refuses its delete while locations belong to
        it (409)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        the rules before the row: bands in ascending order with the open one
        last, a carrier naming its account, no bands on a flat one
evidence:
  - repository: services-commerce
    tests:
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a zone naming a country that is not two upper-case letters, by
        shipping_zones_country_codes_check
      - >-
        services-commerce:modules/shipping/tests/unit/api/blank-shipping-configuration-values.spec.js#refuses
        a zone with region_codes [""] 400 naming region_codes, instead of making
        a zone of no region
      - >-
        services-commerce:modules/shipping/tests/unit/api/blank-shipping-configuration-values.spec.js#refuses
        a whitespace-only postal code prefix on a zone replacement, naming
        postal_code_prefixes
      - >-
        services-commerce:modules/shipping/tests/unit/api/blank-shipping-configuration-values.spec.js#clears
        a zone’s description on an explicit null, the one way to clear it
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        a zone with a blank region code 400 naming region_codes and creates
        nothing; a blank description on a replacement 400, only null clearing it
        (Q06)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        the zone under the id its name suggests, the countries upper-cased, at
        version 1
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#replaces
        it at the version read, and refuses the stale version 409
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a taken id 400, and deletes a zone with its strategies (404 after)
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        deleting an account a strategy rates through (RESTRICT), by
        shipping_strategies_carrier_account_fk, and cascades a zone’s strategies
        with the zone
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        the rules before the row: bands in ascending order with the open one
        last, a carrier naming its account, no bands on a flat one
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        a strategy of a kind outside the four 400, and one whose bands are out
        of order 400
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
        a carrier strategy to naming its account and a flat one to naming none,
        by shipping_strategies_carrier_check
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
        a pickup strategy to naming where the buyer collects and charging
        nothing, by shipping_strategies_pickup_check
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a pickup at a warehouse the tenant does not have, by
        shipping_strategies_pickup_warehouse_fk, and a warehouse delete while a
        pickup names it (RESTRICT)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        a pickup strategy’s rules before the row: a location named, one only, no
        charge; and a shipped kind naming none
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a carrier outside the six and a markup above 100 %, by
        carrier_accounts_carrier_check and carrier_accounts_markup_check
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#answers
        the carrier account with its connection reference and never a secret
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a UPS account without its Integration Platform connection 400
        connection_required, writing nothing
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a replacement that takes a UPS account’s connection away 400
        connection_required, the account unchanged
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        an account with its connection reference and shipper number and no
        secret, lists by carrier, and refuses deleting one a strategy rates
        through (409)
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#lets a
        reader list and read, refuses the reader every write 403
        permission_missing, a denied principal 403 app_not_permitted, and no
        context 401
coverage:
  rule: 'gap: FND-COM-FUL-065'
  transition: 'gap: FND-COM-FUL-065'
  validation: covered
  permission: covered
  edge: 'gap: FND-COM-FUL-065'
  failure: 'gap: FND-COM-FUL-065'
  boundary: 'gap: FND-COM-FUL-065'
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
  transition: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
  edge: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
  failure: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
  boundary: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
transition_audit: []
permission_audit:
  - key: commerce.shipping-zones.read
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-zones.create
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-zones.update
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-zones.delete
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-strategies.read
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-strategies.create
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-strategies.update
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipping-strategies.delete
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.carrier-accounts.read
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.carrier-accounts.create
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.carrier-accounts.update
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.carrier-accounts.delete
    where_checked: api
    coverage: 'gap: FND-COM-FUL-065'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
related_audit:
  - capability: CAP-COM-FUL-011
    scenarios:
      - ATS-COM-FUL-010-06
  - capability: CAP-COM-FUL-013
    scenarios:
      - ATS-COM-FUL-010-07
invariant_audit:
  - invariant: INV-DOM-COM-FUL-004-01
    scenarios: []
    coverage: 'gap: FND-COM-FUL-065'
    provenance: observed
    source: >-
      services-commerce:modules/shipping/db/shipments.table.ts;
      packages.table.ts; pick-lists.table.ts; return-receipts.table.ts
  - invariant: INV-DOM-COM-FUL-004-02
    scenarios: []
    coverage: 'gap: FND-COM-FUL-065'
    provenance: observed
    source: 'services-commerce:modules/shipping/db/shipment-lines.table.ts'
  - invariant: INV-DOM-COM-FUL-004-03
    scenarios:
      - ATS-COM-FUL-014-01
    coverage: covered
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#hands
      off: the line handed to the carrier with its whole quantity shipped, the
      units shipped in the ledger, one shipment movement of minus three on the
      item, three fewer on hand
  - invariant: INV-DOM-COM-FUL-004-04
    scenarios:
      - ATS-COM-FUL-014-02
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/shipping/services/fulfillment/handoff.ts:obligationsOfUnits
  - invariant: INV-DOM-COM-FUL-004-05
    scenarios:
      - ATS-COM-FUL-014-03
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation,handoffLinesOfShipment
  - invariant: INV-DOM-COM-FUL-004-06
    scenarios:
      - ATS-COM-FUL-013-02
    coverage: covered
    provenance: documented
    source: 'services-commerce:docs/migrations/shipping/README.md#D-P8S-08'
  - invariant: INV-DOM-COM-FUL-004-07
    scenarios: []
    coverage: 'gap: FND-COM-FUL-065'
    provenance: observed
    source: >-
      services-commerce:modules/shipping/db/shipments.table.ts:shipments_pickup_check
  - invariant: INV-DOM-COM-FUL-004-08
    scenarios:
      - ATS-COM-FUL-012-07
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/shipping/db/shipment-events.table.ts (UPDATE,
      DELETE and TRUNCATE revoked)
  - invariant: INV-DOM-COM-FUL-004-09
    scenarios: []
    coverage: 'gap: FND-COM-FUL-065'
    provenance: observed
    source: >-
      services-commerce:modules/shipping/db/return-receipts.table.ts;
      return-receipt-lines.table.ts:return_receipt_lines_quantities_check
  - invariant: INV-DOM-COM-FUL-004-10
    scenarios:
      - ATS-COM-FUL-010-04
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/shipping/services/persistence/carrier-accounts.ts
  - invariant: INV-DOM-COM-FUL-004-11
    scenarios:
      - ATS-COM-FUL-010-02
      - ATS-COM-FUL-010-03
      - ATS-COM-FUL-010-04
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/shipping/db/shipping-strategies.table.ts;
      modules/shipping/db/shipments.table.ts;
      modules/shipping/db/carrier-labels.table.ts
  - invariant: INV-DOM-COM-FUL-004-12
    scenarios:
      - ATS-COM-FUL-010-03
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/shipping/services/persistence/shipping-strategies.ts:validateStrategyInput
---

# Configure shipping coverage and collection options: Capability Test Specification

## Coverage

The category map distinguishes available cases from missing proof. A covered category has a scenario; the lifecycle and permission audits retain gaps in exhaustive coverage. Proposed cases describe the intended verification and carry no execution result.

| Rule | Scenarios |
|---|---|
| `BR-CAP-COM-FUL-010-01` | `ATS-COM-FUL-010-01` |
| `BR-CAP-COM-FUL-010-02` | `ATS-COM-FUL-010-02`, `ATS-COM-FUL-010-06` |
| `BR-CAP-COM-FUL-010-03` | `ATS-COM-FUL-010-02`, `ATS-COM-FUL-010-06` |
| `BR-CAP-COM-FUL-010-04` | `ATS-COM-FUL-010-03`, `ATS-COM-FUL-010-08` |
| `BR-CAP-COM-FUL-010-05` | `ATS-COM-FUL-010-03`, `ATS-COM-FUL-010-08` |
| `BR-CAP-COM-FUL-010-06` | `ATS-COM-FUL-010-04`, `ATS-COM-FUL-010-07` |
| `BR-CAP-COM-FUL-010-07` | `ATS-COM-FUL-010-04`, `ATS-COM-FUL-010-07` |
| `BR-CAP-COM-FUL-010-08` | `ATS-COM-FUL-010-04`, `ATS-COM-FUL-010-07` |
| `BR-CAP-COM-FUL-010-09` | `ATS-COM-FUL-010-05` |

## Interactions With Related Capabilities

The interaction cases exercise quote shipping and pickup choices for a cart; purchase and follow carrier labels safely. They vary the upstream record or outcome and inspect the resulting work across the capability boundary. Workflow crossings also include stock, financial or application records when the flow depends on them. Existing test bindings retain their source anchors so a reviewer can distinguish supporting assertions from a complete workflow run.
