---
id: ATS-COM-FUL-011
scope: CAP-COM-FUL-011
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-011-01
    title: Digital-only carts bypass shipping
    level: api
    proves:
      - BR-CAP-COM-FUL-011-01
    preconditions: Fixtures contain an e-book-only cart and shippable merchandise.
    steps: Preview each cart.
    expected: The digital cart needs no shipping and the merchandise cart does.
    negative: false
    data_needs: Fixtures for digital-only carts bypass shipping.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#answers
        shipping_required false, no option and no charge for a cart of an e-book
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#requires
        no shipping for a checkout of an e-book alone: no option, zero, no zone
        consulted
      - TST-COM-FUL-075
      - TST-COM-FUL-081
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#answers
      shipping_required false, no option and no charge for a cart of an e-book
    category: edge
  - id: ATS-COM-FUL-011-02
    title: Destination matching respects specificity and activation
    level: unit
    proves:
      - BR-CAP-COM-FUL-011-02
    preconditions: >-
      Prefix, region, country and unrestricted zones include an inactive
      fixture.
    steps: Match representative addresses and an absent address.
    expected: >-
      The most specific active match wins with priority, name and identity as
      tie-breakers.
    negative: false
    data_needs: Fixtures for destination matching respects specificity and activation.
    bound_to:
      - >-
        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
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#matches
        a country zone to its countries alone, case-insensitively on the address
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#matches
        a region zone within its country without case, and a prefix zone on the
        postal code without case or spaces
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#never
        matches an inactive zone
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#ranks
        a prefix over a region over a country over anywhere
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#picks
        the most specific matching zone, and the first of equals in the order
        given (priority, name, id)
      - TST-COM-FUL-085
    provenance: test
    source: >-
      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
    category: rule
  - id: ATS-COM-FUL-011-03
    title: Charging methods produce their defined unit and weight results
    level: unit
    proves:
      - BR-CAP-COM-FUL-011-03
      - BR-CAP-COM-FUL-011-04
    preconditions: >-
      Flat, per-unit, banded, free-threshold and foreign-currency strategies
      exist.
    steps: Rate five physical units and exercise excess weight.
    expected: >-
      Applicable methods return their charges while excess-weight and
      currency-mismatched options are excluded.
    negative: false
    data_needs: >-
      Fixtures for charging methods produce their defined unit and weight
      results.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
        a flat strategy once, whatever the units
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
        a per-unit strategy per UNIT shipped, never per line, plus its base once
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
        a weight-band strategy the first band the weight fits, the open-ended
        band taking the rest
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#leaves
        a weight past every closed band unrated, by name
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#makes
        an option free at or above free_above_minor, measured against the
        merchandise subtotal
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#leaves
        a strategy in another currency unrated
      - TST-COM-FUL-085
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
      a flat strategy once, whatever the units
    category: boundary
  - id: ATS-COM-FUL-011-04
    title: Missing coverage produces a zero-charge warning
    level: api
    proves:
      - BR-CAP-COM-FUL-011-05
    preconditions: The unrestricted zone is inactive.
    steps: Rate an unmatched address and a matched zone lacking the cart currency.
    expected: Both results retain zero shipping charge with a warning.
    negative: false
    data_needs: Fixtures for missing coverage produces a zero-charge warning.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#charges
        nothing with a warning when no zone matches (the worldwide zone
        inactive) and when the zone offers no option in the currency
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#rates
        an address nowhere else, and no address at all, by the worldwide zone,
        with the warning when the address is unknown
      - TST-COM-FUL-081
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#charges
      nothing with a warning when no zone matches (the worldwide zone inactive)
      and when the zone offers no option in the currency
    category: failure
  - id: ATS-COM-FUL-011-05
    title: Carrier quotes apply markup and retain soft failure
    level: unit
    proves:
      - BR-CAP-COM-FUL-011-06
    preconditions: A UPS account has configured markup.
    steps: Rate a successful quote and then a failed quote.
    expected: >-
      The successful option includes markup and failure returns a warning
      without an option.
    negative: false
    data_needs: Fixtures for carrier quotes apply markup and retain soft failure.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#applies
        the markup in basis points, rounding half away from zero
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#answers
        the quoted options with the account’s markup on each, the carrier the
        account’s
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#answers
        a failed quote as no option with the contract’s code in a warning, never
        a throw
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#rates
        UPS Ground at the preview through shipping.rate.quote on the account’s
        connection, as commerce
      - TST-COM-FUL-084
      - TST-COM-FUL-075
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#applies
      the markup in basis points, rounding half away from zero
    category: failure
  - id: ATS-COM-FUL-011-06
    title: Option selection can change or return to the default
    level: api
    proves:
      - BR-CAP-COM-FUL-011-07
    preconditions: A destination has two offered shipping choices.
    steps: >-
      Select per-unit charging, request an unavailable choice and clear
      selection.
    expected: >-
      The valid choice rerates, the absent choice fails and clearing restores
      the first option.
    negative: true
    data_needs: Fixtures for option selection can change or return to the default.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#re-rates
        with the buyer’s choice (five units at 150), and refuses a strategy the
        zone does not offer 400 shipping_option_unavailable
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#clears
        the choice on PUT shipping_strategy_id null: nothing stored, the preview
        back on the first option and its charge (DEF-COM-0868)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#honours
        the buyer’s choice when the zone offers it, and replaces a choice the
        zone does not offer with the first option, saying so
      - TST-COM-FUL-075
      - TST-COM-FUL-081
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#re-rates
      with the buyer’s choice (five units at 150), and refuses a strategy the
      zone does not offer 400 shipping_option_unavailable
    category: transition
  - id: ATS-COM-FUL-011-07
    title: Pickup appears only at an active collection warehouse
    level: api
    proves:
      - BR-CAP-COM-FUL-011-08
    preconditions: Pickup strategies reference active and inactive warehouses.
    steps: Rate the cart and select the active pickup.
    expected: >-
      The active choice identifies collection at zero charge and the inactive
      choice is excluded.
    negative: false
    data_needs: Fixtures for pickup appears only at an active collection warehouse.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#offers
        each pick-up at zero beside the zone’s shipped options, kind pickup,
        with where the buyer collects
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#leaves
        a pick-up at an inactive warehouse unrated, by its reason
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#selects
        the pick-up the buyer chose, charging nothing
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#offers
        the pick-up at zero beside UPS Ground for the shirts, with the warehouse
        it is collected from
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#rates
        a pickup strategy at zero, whatever the units, the weight or the
        subtotal
      - TST-COM-FUL-081
      - TST-COM-FUL-075
      - TST-COM-FUL-085
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#offers
      each pick-up at zero beside the zone’s shipped options, kind pickup, with
      where the buyer collects
    category: edge
  - id: ATS-COM-FUL-011-08
    title: Placement requires the profile's shipping product
    level: api
    proves:
      - BR-CAP-COM-FUL-011-09
    preconditions: One profile has a shipping product and another lacks it.
    steps: Place merchandise orders under each profile.
    expected: >-
      Configured placement freezes destination and appends shipping after items;
      missing setup rejects placement and retains checkout.
    negative: true
    data_needs: Fixtures for placement requires the profile's shipping product.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#places
        the order with the charge, the shipping line on the shipping product
        after the item line, the ship-to address frozen and the choice in the
        snapshot
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        the placement 409 placement_refused with the problem
        shipping_product_required, naming the profile
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#leaves
        the checkout open, with nothing placed
      - TST-COM-FUL-075
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#places
      the order with the charge, the shipping line on the shipping product after
      the item line, the ship-to address frozen and the choice in the snapshot
    category: validation
  - id: ATS-COM-FUL-011-09
    title: Rating cannot consume another workspace's configuration
    level: api
    proves:
      - BR-CAP-COM-FUL-011-10
    preconditions: Two workspaces have separate zones.
    steps: Change the first workspace and rate in the second.
    expected: The second result uses only its own zones.
    negative: true
    data_needs: Fixtures for rating cannot consume another workspace's configuration.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#never
        reads another tenant’s zones: the other tenant’s rating sees its own
        domestic zone, not this tenant’s changes
      - TST-COM-FUL-081
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#never
      reads another tenant’s zones: the other tenant’s rating sees its own
      domestic zone, not this tenant’s changes
    category: boundary
  - id: ATS-COM-FUL-011-10
    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-011-11
    title: The selected buyer option becomes warehouse shipment work
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-011-08
      - BR-CAP-COM-FUL-012-03
    exercises:
      - CAP-COM-FUL-011
      - CAP-COM-FUL-012
    relies_on:
      - ATS-COM-FUL-011-07
      - ATS-COM-FUL-012-03
    preconditions: An active collection warehouse offers pickup beside carrier delivery.
    steps: >-
      Select pickup, place and pay the order, dispatch its goods and create a
      shipment.
    expected: >-
      The shipment uses the selected collection warehouse, without a carrier
      charge.
    negative: false
    data_needs: >-
      An isolated workspace with the products, records, authority and quantities
      described in the preconditions.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#offers
        the pick-up at zero beside UPS Ground for the shirts, with the warehouse
        it is collected from
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#makes
        a pickup shipment of the paid order, on no carrier, and refuses its
        label 409 operation_not_supported
      - TST-COM-FUL-075
    provenance: test
    source:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#offers
        each pick-up at zero beside the zone’s shipped options, kind pickup,
        with where the buyer collects
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#makes
        a pickup shipment of the order at the pick-up warehouse, on no carrier,
        charged nothing
evidence:
  - repository: services-commerce
    tests:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#answers
        shipping_required false, no option and no charge for a cart of an e-book
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#requires
        no shipping for a checkout of an e-book alone: no option, zero, no zone
        consulted
      - >-
        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
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#matches
        a country zone to its countries alone, case-insensitively on the address
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#matches
        a region zone within its country without case, and a prefix zone on the
        postal code without case or spaces
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#never
        matches an inactive zone
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#ranks
        a prefix over a region over a country over anywhere
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#picks
        the most specific matching zone, and the first of equals in the order
        given (priority, name, id)
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
        a flat strategy once, whatever the units
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
        a per-unit strategy per UNIT shipped, never per line, plus its base once
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#charges
        a weight-band strategy the first band the weight fits, the open-ended
        band taking the rest
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#leaves
        a weight past every closed band unrated, by name
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#makes
        an option free at or above free_above_minor, measured against the
        merchandise subtotal
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#leaves
        a strategy in another currency unrated
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#charges
        nothing with a warning when no zone matches (the worldwide zone
        inactive) and when the zone offers no option in the currency
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#rates
        an address nowhere else, and no address at all, by the worldwide zone,
        with the warning when the address is unknown
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#applies
        the markup in basis points, rounding half away from zero
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#answers
        the quoted options with the account’s markup on each, the carrier the
        account’s
      - >-
        services-commerce:modules/shipping/tests/unit/carriers/carrier-adapters.spec.js#answers
        a failed quote as no option with the contract’s code in a warning, never
        a throw
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#rates
        UPS Ground at the preview through shipping.rate.quote on the account’s
        connection, as commerce
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#re-rates
        with the buyer’s choice (five units at 150), and refuses a strategy the
        zone does not offer 400 shipping_option_unavailable
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#clears
        the choice on PUT shipping_strategy_id null: nothing stored, the preview
        back on the first option and its charge (DEF-COM-0868)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#honours
        the buyer’s choice when the zone offers it, and replaces a choice the
        zone does not offer with the first option, saying so
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#offers
        each pick-up at zero beside the zone’s shipped options, kind pickup,
        with where the buyer collects
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#leaves
        a pick-up at an inactive warehouse unrated, by its reason
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#selects
        the pick-up the buyer chose, charging nothing
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#offers
        the pick-up at zero beside UPS Ground for the shirts, with the warehouse
        it is collected from
      - >-
        services-commerce:modules/shipping/tests/unit/rating/zone-strategy-rating.spec.js#rates
        a pickup strategy at zero, whatever the units, the weight or the
        subtotal
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#places
        the order with the charge, the shipping line on the shipping product
        after the item line, the ship-to address frozen and the choice in the
        snapshot
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        the placement 409 placement_refused with the problem
        shipping_product_required, naming the profile
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#leaves
        the checkout open, with nothing placed
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#never
        reads another tenant’s zones: the other tenant’s rating sees its own
        domestic zone, not this tenant’s changes
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: not-applicable
  edge: covered
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-COM-FUL-066'
  invariant: 'gap: FND-COM-FUL-066'
  interaction: covered
coverage_notes:
  permission: >-
    The capability declares no independent caller permission; permissions on the
    invoking operation remain with its owner.
  concurrency: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
  invariant: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
transition_audit: []
permission_audit: []
related_audit:
  - capability: CAP-COM-FUL-012
    scenarios:
      - ATS-COM-FUL-011-11
invariant_audit:
  - invariant: INV-DOM-COM-FUL-004-01
    scenarios: []
    coverage: 'gap: FND-COM-FUL-066'
    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-066'
    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-066'
    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-066'
    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
---

# Quote shipping and pickup choices for a cart: 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-011-01` | `ATS-COM-FUL-011-01` |
| `BR-CAP-COM-FUL-011-02` | `ATS-COM-FUL-011-02`, `ATS-COM-FUL-011-10` |
| `BR-CAP-COM-FUL-011-03` | `ATS-COM-FUL-011-03` |
| `BR-CAP-COM-FUL-011-04` | `ATS-COM-FUL-011-03` |
| `BR-CAP-COM-FUL-011-05` | `ATS-COM-FUL-011-04` |
| `BR-CAP-COM-FUL-011-06` | `ATS-COM-FUL-011-05` |
| `BR-CAP-COM-FUL-011-07` | `ATS-COM-FUL-011-06` |
| `BR-CAP-COM-FUL-011-08` | `ATS-COM-FUL-011-07`, `ATS-COM-FUL-011-11` |
| `BR-CAP-COM-FUL-011-09` | `ATS-COM-FUL-011-08` |
| `BR-CAP-COM-FUL-011-10` | `ATS-COM-FUL-011-09` |

## Interactions With Related Capabilities

The interaction cases exercise prepare an order's goods for dispatch. 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.
