---
id: ATS-COM-FUL-012
scope: CAP-COM-FUL-012
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-012-01
    title: Shipment creation gathers only unassigned units
    level: api
    proves:
      - BR-CAP-COM-FUL-012-01
    preconditions: An order has three picked units at a warehouse.
    steps: Create its shipment and request another without new units.
    expected: >-
      The first shipment contains the contiguous three-unit range and saved
      destination and charge; the next request fails.
    negative: true
    data_needs: Fixtures for shipment creation gathers only unassigned units.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#makes
        the shipment from the order’s three picked units as one line (units
        0..2) at the warehouse, numbered, addressed from the order, charged what
        the order paid, on the strategy’s carrier and service
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        a third wave: nothing is left to ship (409 nothing_to_ship)
      - TST-COM-FUL-078
      - TST-COM-FUL-075
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#makes
      the shipment from the order’s three picked units as one line (units 0..2)
      at the warehouse, numbered, addressed from the order, charged what the
      order paid, on the strategy’s carrier and service
    category: rule
  - id: ATS-COM-FUL-012-02
    title: Replenishment enables a later shipping wave
    level: api
    proves:
      - BR-CAP-COM-FUL-012-02
    preconditions: Three of five ordered units are ready and two are backordered.
    steps: 'Dispatch the first wave, receive stock and create the next shipment.'
    expected: >-
      The replenished units become the second shipment and are picked during
      creation.
    negative: false
    data_needs: Fixtures for replenishment enables a later shipping wave.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#makes
        the first wave of the three picked units (0..2), charged what the order
        paid, and walks it to the handoff
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#fills
        the two backorders at the receipt, and the second wave picks the filled
        units at its creation (3..4) and ships them
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#completes
        the order’s shipping: every unit shipped, every obligation completed,
        the shelf down five, the cost facts emitted per wave
      - TST-COM-FUL-075
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#makes
      the first wave of the three picked units (0..2), charged what the order
      paid, and walks it to the handoff
    category: interaction
  - id: ATS-COM-FUL-012-03
    title: Pickup creation retains collection without carrier cost
    level: api
    proves:
      - BR-CAP-COM-FUL-012-03
    preconditions: The buyer selected pickup for the order.
    steps: Create a shipment.
    expected: It references the collection warehouse without carrier or shipping charge.
    negative: false
    data_needs: Fixtures for pickup creation retains collection without carrier cost.
    bound_to:
      - >-
        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
      - >-
        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-078
      - TST-COM-FUL-075
    provenance: test
    source: >-
      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
    category: edge
  - id: ATS-COM-FUL-012-04
    title: Picking and packing advance released warehouse work
    level: api
    proves:
      - BR-CAP-COM-FUL-012-04
      - BR-CAP-COM-FUL-012-05
      - BR-CAP-COM-FUL-012-06
    preconditions: A shipment is open.
    steps: 'Release it, form and claim picking work, record picks and pack parcels.'
    expected: >-
      Picked quantities become parcels with derived weights and the shipment
      reaches packed state.
    negative: false
    data_needs: Fixtures for picking and packing advance released warehouse work.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#releases
        the shipment to the floor and lists its line for picking at the bin the
        ledger names, the shipment picking
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#records
        the pick: the list line picked, the shipment line picked with its
        quantity, the shipment picked
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#packs
        the three units into two parcels, the second weighed from nothing (the
        shirt has no weight), the line packed, the shipment packed with two
        packages
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
        a picked line to its whole quantity and a short one to less, by
        pick_list_lines_picked_check, and a claimed list to its picker, by
        pick_lists_claimed_check
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a package line of nothing, by package_lines_quantity_check, and one
        naming a line the tenant does not have, by
        package_lines_shipment_line_fk
      - TST-COM-FUL-078
      - TST-COM-FUL-077
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#releases
      the shipment to the floor and lists its line for picking at the bin the
      ledger names, the shipment picking
    category: transition
  - id: ATS-COM-FUL-012-05
    title: Short picking creates an actionable SKU finding
    level: api
    proves:
      - BR-CAP-COM-FUL-012-05
    preconditions: A three-unit pick line yields only two units.
    steps: Record the actual picked quantity.
    expected: The line is short and its finding identifies the SKU and picking work.
    negative: false
    data_needs: Fixtures for short picking creates an actionable SKU finding.
    bound_to: []
    provenance: proposed
    source: >-
      services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
      a picked line to its whole quantity and a short one to less, by
      pick_list_lines_picked_check, and a claimed list to its picker, by
      pick_lists_claimed_check
    category: failure
  - id: ATS-COM-FUL-012-06
    title: Collected shipments reject cancellation
    level: api
    proves:
      - BR-CAP-COM-FUL-012-08
    preconditions: A pickup shipment has already been collected.
    steps: Request cancellation of the collected shipment.
    expected: Cancellation is refused and the collected result remains.
    negative: true
    data_needs: Fixtures for shipment cancellation retains the underlying order.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#refuses
        a second handover (not packed any more) and the cancellation of a
        collected shipment
      - TST-COM-FUL-078
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#refuses
      a second handover (not packed any more) and the cancellation of a
      collected shipment
    category: boundary
  - id: ATS-COM-FUL-012-07
    title: Application credentials cannot rewrite shipment events
    level: api
    proves:
      - BR-CAP-COM-FUL-012-09
      - INV-DOM-COM-FUL-004-08
    preconditions: Shipment history already contains events.
    steps: 'Attempt event update, deletion and truncation under the application role.'
    expected: Each mutation fails and reads retain chronological history.
    negative: true
    data_needs: Fixtures for application credentials cannot rewrite shipment events.
    bound_to:
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#lets
        the application role insert an event and refuses it UPDATE, DELETE and
        TRUNCATE, 42501
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipment-events.queries.integration.spec.js#reads
        the shipment’s history oldest first, the void intents among it
      - TST-COM-FUL-077
      - TST-COM-FUL-080
    provenance: test
    source: >-
      services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#lets
      the application role insert an event and refuses it UPDATE, DELETE and
      TRUNCATE, 42501
    category: invariant
  - id: ATS-COM-FUL-012-08
    title: Warehouse progression checks mutation authority
    level: api
    proves:
      - BR-CAP-COM-FUL-012-11
    preconditions: A reader and ordinary warehouse clerk are available.
    steps: 'Exercise shipment creation, release and cancellation for both.'
    expected: >-
      The reader cannot write and the clerk lacks administrator cancellation
      authority.
    negative: true
    data_needs: Fixtures for warehouse progression checks mutation authority.
    bound_to: []
    provenance: proposed
    source: 'services-commerce:aws/commerce.service.ts:ShipmentsPermissions'
    category: permission
  - id: ATS-COM-FUL-012-09
    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
  - id: ATS-COM-FUL-012-10
    title: Packing permits label purchase and manifestation before departure
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-012-04
      - BR-CAP-COM-FUL-012-06
      - BR-CAP-COM-FUL-012-07
      - BR-CAP-COM-FUL-013-01
      - BR-CAP-COM-FUL-014-01
    exercises:
      - CAP-COM-FUL-012
      - CAP-COM-FUL-013
      - CAP-COM-FUL-014
    relies_on:
      - ATS-COM-FUL-012-04
      - ATS-COM-FUL-013-01
      - ATS-COM-FUL-014-01
    preconditions: An authorized merchandise order has released warehouse work.
    steps: 'Pick, pack, purchase labels for every parcel, manifest and hand off.'
    expected: >-
      Parcel preparation reaches labelled and manifested states before the
      shipment leaves; departure completes its units.
    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/integration/services/fulfillment/shipping-flow.integration.spec.js#releases
        the shipment to the floor and lists its line for picking at the bin the
        ledger names, the shipment picking
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#records
        the pick: the list line picked, the shipment line picked with its
        quantity, the shipment picked
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#packs
        the three units into two parcels, the second weighed from nothing (the
        shirt has no weight), the line packed, the shipment packed with two
        packages
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#buys
        the first label through UPS under package:<id>:1 (the intent then the
        outcome), the tracking number and the cost on the label, the package
        labelled
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#records
        the refused purchase failed (carrier_unavailable), not in flight, so the
        next purchase buys on attempt 2
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#answers
        a purchase the platform refused before anything ran 503
        carrier_unavailable with the reason, sent once
      - >-
        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
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#completes
        every unit’s obligation through the register (the allocation as the
        record), and emits one deferred cost relief fact per item
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#writes
        the shipped quantity on the order line, the order’s shipping_summary
        complete, and the order’s history
      - TST-COM-FUL-078
    provenance: test
    source:
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#releases
        the shipment to the floor and lists its line for picking at the bin the
        ledger names, the shipment picking
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#buys
        the first label through UPS under package:<id>:1 (the intent then the
        outcome), the tracking number and the cost on the label, the package
        labelled
      - >-
        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
  - id: ATS-COM-FUL-012-11
    title: Replenishment creates the second dispatch wave
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-012-02
      - BR-CAP-COM-FUL-017-07
      - BR-CAP-COM-FUL-018-02
      - BR-CAP-COM-FUL-014-01
    exercises:
      - CAP-COM-FUL-012
      - CAP-COM-FUL-017
      - CAP-COM-FUL-018
      - CAP-COM-FUL-014
    relies_on:
      - ATS-COM-FUL-012-02
      - ATS-COM-FUL-017-04
      - ATS-COM-FUL-018-02
      - ATS-COM-FUL-014-01
    preconditions: A five-shirt order has three available units and two backorders.
    steps: >-
      Ship the first wave, receive two more shirts and create and ship the next
      wave.
    expected: >-
      The second wave contains only the two replenished units; all five
      obligations complete.
    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#makes
        the first wave of the three picked units (0..2), charged what the order
        paid, and walks it to the handoff
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#fills
        the two backorders at the receipt, and the second wave picks the filled
        units at its creation (3..4) and ships them
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#completes
        the order’s shipping: every unit shipped, every obligation completed,
        the shelf down five, the cost facts emitted per wave
      - TST-COM-FUL-075
    provenance: test
    source:
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#makes
        the first wave of the three picked units (0..2), charged what the order
        paid, and walks it to the handoff
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#converts
        both backordered units to committed in the receipt’s transaction, oldest
        order first, leaving one to sell
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/merchandise-claims.integration.spec.js#is
        refused insufficient_stock with nothing written when the product
        prohibits backorders (the last cap)
      - >-
        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
  - id: ATS-COM-FUL-012-12
    title: >-
      Cancellation fencing releases selected allocations while retained units
      ship later
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-012-08
      - BR-CAP-COM-FUL-014-06
      - BR-CAP-COM-FUL-018-07
    exercises:
      - CAP-COM-FUL-012
      - CAP-COM-FUL-014
      - CAP-COM-FUL-018
    relies_on:
      - ATS-COM-FUL-012-06
      - ATS-COM-FUL-014-04
      - ATS-COM-FUL-018-07
    preconditions: >-
      Three picked shirts share a labelled shipment and cancellation selects the
      final unit.
    steps: >-
      Commit cancellation, deliver its instruction and create a new shipment for
      the retained units.
    expected: >-
      The selected unit releases, the old parcel is pulled, and two retained
      picked units use new shipment work.
    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/post-purchase-shipping.e2e.spec.js#fences
        and cancels the shipment line, pulls the package and voids the counter
        label, and refuses the handoff asked after (409)
      - >-
        services-commerce:modules/shipping/tests/e2e/post-purchase-shipping.e2e.spec.js#carries
        the two kept units on a new shipment (0..1)
      - >-
        services-commerce:modules/shipping/tests/e2e/post-purchase-shipping.e2e.spec.js#delivers
        the cancel to the Merchandise participant: unit 2 released, the kept
        units unfenced and picked, the document completed, the memo and the
        refund after the domain
      - TST-COM-FUL-074
    provenance: test
    source:
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#refuses
        a second handover (not packed any more) and the cancellation of a
        collected shipment
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#cancels
        the fenced line at the cancel step: the units unstamped (still the
        order’s, picked), the label voided and the package pulled, the shipment
        cancelled
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/merchandise-claims.integration.spec.js#releases
        a line’s committed units on a void, giving the stock back; a release
        naming nothing live answers released: []
  - id: ATS-COM-FUL-012-13
    title: >-
      Cancelling a labelled shipment clears warehouse assignments without
      cancelling its order
    category: transition
    level: api
    proves:
      - BR-CAP-COM-FUL-012-08
    preconditions: An authorized order has a labelled shipment whose goods have not departed.
    steps: >-
      Cancel the shipment and inspect its lines, parcels, labels, order and
      allocations.
    expected: >-
      The shipment and its preparation close; the order remains and its retained
      picked units can use another shipment.
    negative: false
    data_needs: >-
      A labelled three-unit shipment, its order and an authorized cancellation
      identity.
    bound_to: []
    provenance: proposed
    source: >-
      services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#refuses
      a second handover (not packed any more) and the cancellation of a
      collected shipment
evidence:
  - repository: services-commerce
    tests:
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#makes
        the shipment from the order’s three picked units as one line (units
        0..2) at the warehouse, numbered, addressed from the order, charged what
        the order paid, on the strategy’s carrier and service
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#refuses
        a third wave: nothing is left to ship (409 nothing_to_ship)
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#makes
        the first wave of the three picked units (0..2), charged what the order
        paid, and walks it to the handoff
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#fills
        the two backorders at the receipt, and the second wave picks the filled
        units at its creation (3..4) and ships them
      - >-
        services-commerce:modules/shipping/tests/e2e/shipping.e2e.spec.js#completes
        the order’s shipping: every unit shipped, every obligation completed,
        the shelf down five, the cost facts emitted per wave
      - >-
        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
      - >-
        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
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#releases
        the shipment to the floor and lists its line for picking at the bin the
        ledger names, the shipment picking
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#records
        the pick: the list line picked, the shipment line picked with its
        quantity, the shipment picked
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#packs
        the three units into two parcels, the second weighed from nothing (the
        shirt has no weight), the line packed, the shipment packed with two
        packages
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#holds
        a picked line to its whole quantity and a short one to less, by
        pick_list_lines_picked_check, and a claimed list to its picker, by
        pick_lists_claimed_check
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#refuses
        a package line of nothing, by package_lines_quantity_check, and one
        naming a line the tenant does not have, by
        package_lines_shipment_line_fk
      - >-
        services-commerce:modules/shipping/tests/integration/services/fulfillment/shipping-flow.integration.spec.js#refuses
        a second handover (not packed any more) and the cancellation of a
        collected shipment
      - >-
        services-commerce:modules/shipping/tests/integration/db/shipping-tables.table.integration.spec.js#lets
        the application role insert an event and refuses it UPDATE, DELETE and
        TRUNCATE, 42501
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipment-events.queries.integration.spec.js#reads
        the shipment’s history oldest first, the void intents among it
  - repository: react-console
    tests: []
coverage:
  rule: covered
  transition: covered
  validation: 'gap: FND-COM-FUL-067'
  permission: covered
  edge: covered
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-COM-FUL-067'
  invariant: covered
  interaction: covered
coverage_notes:
  validation: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
  concurrency: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
transition_audit:
  - model: STATE-COM-FUL-005
    from: open
    to: released
    source: >-
      services-commerce:modules/shipping/services/fulfillment/shipment-creation.ts:releaseShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: released
    to: picking
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:createPickListForWarehouse
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picking
    to: picked
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:recordPickOnList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picked
    to: packing
    source: >-
      services-commerce:modules/shipping/services/fulfillment/packing.ts:packShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picked
    to: packed
    source: >-
      services-commerce:modules/shipping/services/fulfillment/packing.ts:packShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: packing
    to: packed
    source: >-
      services-commerce:modules/shipping/services/fulfillment/packing.ts:packShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: packed
    to: labelled
    source: >-
      services-commerce:modules/shipping/services/fulfillment/labels.ts:purchaseLabelForPackage
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: labelled
    to: packed
    source: >-
      services-commerce:modules/shipping/services/fulfillment/labels.ts:voidLabelOfPackage
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: labelled
    to: manifested
    source: >-
      services-commerce:modules/shipping/services/fulfillment/handoff.ts:manifestShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: manifested
    to: handed_to_carrier
    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
    coverage: covered
    scenarios:
      - ATS-COM-FUL-004-12
      - ATS-COM-FUL-012-10
      - ATS-COM-FUL-013-10
      - ATS-COM-FUL-014-01
      - ATS-COM-FUL-014-06
      - ATS-COM-FUL-014-07
      - ATS-COM-FUL-018-08
  - model: STATE-COM-FUL-005
    from: packed
    to: collected
    source: 'services-commerce:docs/migrations/shipping/README.md#D-P8S-14'
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: handed_to_carrier
    to: delivered
    source: >-
      services-commerce:modules/shipping/services/fulfillment/labels.ts:trackPackage
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: handed_to_carrier
    to: exception
    source: >-
      services-commerce:modules/shipping/services/fulfillment/labels.ts:trackPackage
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: handed_to_carrier
    to: returned_to_sender
    source: >-
      services-commerce:modules/shipping/services/fulfillment/labels.ts:trackPackage
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: open
    to: cancelled
    source: >-
      services-commerce:modules/shipping/services/fulfillment/shipment-creation.ts:cancelShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: manifested
    to: cancelled
    source: >-
      services-commerce:modules/shipping/services/fulfillment/cancellation-fence.ts:cancelFencedShipmentLines
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: allocated
    to: released_to_warehouse
    source: >-
      services-commerce:modules/shipping/services/fulfillment/shipment-creation.ts:releaseShipment
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: released_to_warehouse
    to: picking
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:createPickListForWarehouse
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picking
    to: picked
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:recordPickOnList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picking
    to: short
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:recordPickOnList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picking
    to: released_to_warehouse
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:cancelPickList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: allocated
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: released_to_warehouse
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picking
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: picked
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: packing
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: packed
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: labelled
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: manifested
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: short
    to: cancellation_pending
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:fenceLinesForCancellation
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-005
    from: cancellation_pending
    to: cancelled
    source: >-
      services-commerce:modules/shipping/services/persistence/shipments.ts:cancelFencedLines
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-007
    from: open
    to: claimed
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:claimPickList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-007
    from: claimed
    to: completed
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:completePickList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-007
    from: open
    to: completed
    source: >-
      services-commerce:modules/shipping/services/persistence/pick-lists.ts:completePickList
      (open or claimed)
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-007
    from: open
    to: cancelled
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:cancelPickList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
  - model: STATE-COM-FUL-007
    from: claimed
    to: cancelled
    source: >-
      services-commerce:modules/shipping/services/fulfillment/picking.ts:cancelPickList
    coverage: 'gap: FND-COM-FUL-067'
    scenarios: []
permission_audit:
  - key: commerce.shipments.read
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipments.create
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipments.update
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.shipments.cancel
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.pick-lists.read
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.pick-lists.create
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.pick-lists.update
    where_checked: api
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: orders.orders.ship
    where_checked: console
    coverage: 'gap: FND-COM-FUL-067'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
related_audit:
  - capability: CAP-COM-FUL-013
    scenarios:
      - ATS-COM-FUL-012-10
  - capability: CAP-COM-FUL-014
    scenarios:
      - ATS-COM-FUL-012-10
      - ATS-COM-FUL-012-11
      - ATS-COM-FUL-012-12
invariant_audit:
  - invariant: INV-DOM-COM-FUL-004-01
    scenarios: []
    coverage: 'gap: FND-COM-FUL-067'
    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-067'
    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-067'
    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-067'
    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
  - invariant: INV-DOM-COM-FUL-005-01
    scenarios:
      - ATS-COM-FUL-017-02
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/db/inventory-items.table.ts (column
      grants, apply_inventory_movement, apply_inventory_allocation)
  - invariant: INV-DOM-COM-FUL-005-02
    scenarios:
      - ATS-COM-FUL-017-02
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/db/inventory-items.table.ts:inventory_items_balances_check
  - invariant: INV-DOM-COM-FUL-005-03
    scenarios:
      - ATS-COM-FUL-017-01
      - ATS-COM-FUL-017-02
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/db/inventory-movements.table.ts:inventory_movements_quantity_sign_check
  - invariant: INV-DOM-COM-FUL-005-04
    scenarios:
      - ATS-COM-FUL-017-03
    coverage: covered
    provenance: documented
    source: 'services-commerce:docs/migrations/inventory/README.md#D-P8I-22'
  - invariant: INV-DOM-COM-FUL-005-05
    scenarios:
      - ATS-COM-FUL-018-05
    coverage: covered
    provenance: observed
    source: 'services-commerce:modules/inventory/db/inventory-allocations.table.ts'
  - invariant: INV-DOM-COM-FUL-005-06
    scenarios:
      - ATS-COM-FUL-018-03
    coverage: covered
    provenance: documented
    source: 'services-commerce:docs/migrations/inventory/README.md#D-P8I-21'
  - invariant: INV-DOM-COM-FUL-005-07
    scenarios:
      - ATS-COM-FUL-014-01
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-allocations.ts:shipUnits
  - invariant: INV-DOM-COM-FUL-005-08
    scenarios:
      - ATS-COM-FUL-017-05
    coverage: covered
    provenance: observed
    source: 'services-commerce:modules/inventory/services/stock/transfer-stock.ts'
  - invariant: INV-DOM-COM-FUL-005-09
    scenarios:
      - ATS-COM-FUL-017-04
    coverage: covered
    provenance: observed
    source: 'services-commerce:modules/inventory/services/stock/staff-movements.ts'
  - invariant: INV-DOM-COM-FUL-005-10
    scenarios:
      - ATS-COM-FUL-019-01
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-counts.ts:completeCount
  - invariant: INV-DOM-COM-FUL-005-11
    scenarios:
      - ATS-COM-FUL-019-02
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/db/inventory-exceptions.table.ts:inventory_exceptions_open_uidx
  - invariant: INV-DOM-COM-FUL-005-12
    scenarios:
      - ATS-COM-FUL-016-06
      - ATS-COM-FUL-017-09
      - ATS-COM-FUL-018-12
    coverage: covered
    provenance: observed
    source: >-
      services-commerce:modules/inventory/services/persistence/warehouses.ts;
      inventory-locations.ts
---

# Prepare an order's goods for dispatch: 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-012-01` | `ATS-COM-FUL-012-01` |
| `BR-CAP-COM-FUL-012-02` | `ATS-COM-FUL-012-02`, `ATS-COM-FUL-012-11` |
| `BR-CAP-COM-FUL-012-03` | `ATS-COM-FUL-012-03`, `ATS-COM-FUL-012-09` |
| `BR-CAP-COM-FUL-012-04` | `ATS-COM-FUL-012-04`, `ATS-COM-FUL-012-10` |
| `BR-CAP-COM-FUL-012-05` | `ATS-COM-FUL-012-04`, `ATS-COM-FUL-012-05`, `ATS-COM-FUL-012-10` |
| `BR-CAP-COM-FUL-012-06` | `ATS-COM-FUL-012-04`, `ATS-COM-FUL-012-10` |
| `BR-CAP-COM-FUL-012-08` | `ATS-COM-FUL-012-06`, `ATS-COM-FUL-012-12`, `ATS-COM-FUL-012-13` |
| `BR-CAP-COM-FUL-012-09` | `ATS-COM-FUL-012-07` |
| `BR-CAP-COM-FUL-012-11` | `ATS-COM-FUL-012-08` |

## Interactions With Related Capabilities

The interaction cases exercise purchase and follow carrier labels safely; record goods leaving with a carrier or collector. 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.
