---
id: ATS-COM-FUL-019
scope: CAP-COM-FUL-019
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-019-01
    title: Completed counts retain corrections and refuse reopening
    level: api
    proves:
      - BR-CAP-COM-FUL-019-01
      - BR-CAP-COM-FUL-019-02
      - INV-DOM-COM-FUL-005-10
    preconditions: Two count items include one discrepancy.
    steps: >-
      Record and complete a count, then edit or complete again and cancel
      another count.
    expected: >-
      One correction and count timestamps remain, repeated changes fail and
      cancellation adds no correction.
    negative: true
    data_needs: Fixtures for completed counts retain corrections and refuse reopening.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#opens
        the count open with no lines, records the lines with what the shelf
        expected, and completes it with one correction for the variance
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#leaves
        the shelf as counted, stamped last_counted_at on both items
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#refuses
        lines on a completed count and a second completion (409), and the
        cancelled count wrote nothing
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#opens
        a count, records what was counted, completes it with one correction, and
        cancels another; lines on a completed count 409
      - TST-COM-FUL-066
      - TST-COM-FUL-057
    provenance: test
    source: >-
      services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#opens
      the count open with no lines, records the lines with what the shelf
      expected, and completes it with one correction for the variance
    category: transition
  - id: ATS-COM-FUL-019-02
    title: Finding resolution requires a result and allows later recurrence
    level: api
    proves:
      - BR-CAP-COM-FUL-019-03
      - INV-DOM-COM-FUL-005-11
    preconditions: A stock finding is open.
    steps: >-
      Acknowledge, try reasonless result, resolve properly, repeat and raise
      again.
    expected: >-
      Missing resolution and repeated closure fail, while later recurrence opens
      a fresh finding.
    negative: true
    data_needs: >-
      Fixtures for finding resolution requires a result and allows later
      recurrence.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#is
        raised open, acknowledged, resolved with its resolution, and raised
        again as a new row once resolved
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#is
        listed and read, acknowledged, then resolved with its resolution (a
        second resolve 409; a resolution missing 400)
      - >-
        services-commerce:modules/inventory/tests/integration/db/inventory-tables.table.integration.spec.js#refuses
        two open findings of one kind about one subject, by
        inventory_exceptions_open_uidx, and a kind outside the six
      - TST-COM-FUL-066
      - TST-COM-FUL-057
      - TST-COM-FUL-059
    provenance: test
    source: >-
      services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#is
      raised open, acknowledged, resolved with its resolution, and raised again
      as a new row once resolved
    category: validation
  - id: ATS-COM-FUL-019-03
    title: Nightly reconciliation reports discrepancies and expires holds
    level: api
    proves:
      - BR-CAP-COM-FUL-019-04
      - BR-CAP-COM-FUL-019-05
      - BR-CAP-COM-FUL-019-06
      - BR-CAP-COM-FUL-019-07
      - BR-CAP-COM-FUL-019-10
    preconditions: >-
      Fixtures include expired hold, balance mismatch, terminal allocation and
      low stock.
    steps: Run reconciliation twice.
    expected: >-
      Only expiry releases stock automatically and repeated discrepancies
      increment their open findings.
    negative: false
    data_needs: >-
      Fixtures for nightly reconciliation reports discrepancies and expires
      holds.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#counts
        what it did: the tenant, one hold expired, three items checked, one
        mismatch, one stale unit, one low-stock SKU of two with a point, and the
        cost pass: three items whose stock no layer costs (the fixture’s bare
        receipts), no handoff without a relief
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#releases
        the expired hold (reason expiry) and raises expired_hold on it, giving
        the unit back
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        balance_mismatch on the item knocked out of line, with what was kept and
        what the ledgers say, and corrects nothing
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        low_stock on shirt L at its own reorder point with the product’s reorder
        quantity, and nothing on the cap above its point
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        stale_allocation on the committed unit whose obligation is cancelled
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#finds
        the same on a second run and adds an occurrence to each open finding
        rather than another row
      - TST-COM-FUL-063
    provenance: test
    source: >-
      services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#counts
      what it did: the tenant, one hold expired, three items checked, one
      mismatch, one stale unit, one low-stock SKU of two with a point, and the
      cost pass: three items whose stock no layer costs (the fixture’s bare
      receipts), no handoff without a relief
    category: invariant
  - id: ATS-COM-FUL-019-04
    title: Paged reconciliation reports a time-limited run honestly
    level: api
    proves:
      - BR-CAP-COM-FUL-019-08
    preconditions: Items and tracked products exceed one page.
    steps: Run with sufficient time and then with an exhausted time budget.
    expected: >-
      The full scan reaches later pages and the exhausted scan stops with
      incomplete coverage.
    negative: false
    data_needs: Fixtures for paged reconciliation reports a time-limited run honestly.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#checks
        every tracked SKU with a reorder point and raises each one at or below
        it, the last page’s included
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#re-derives
        every item, following the cursor past its first page
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#stops
        before it reads anything when the run has no time left, and answers that
        it is incomplete
      - TST-COM-FUL-062
    provenance: test
    source: >-
      services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#checks
      every tracked SKU with a reorder point and raises each one at or below it,
      the last page’s included
    category: boundary
  - id: ATS-COM-FUL-019-05
    title: Stock discovery rejects an existing transaction
    level: api
    proves:
      - BR-CAP-COM-FUL-019-11
    preconditions: A caller owns an open transaction.
    steps: Discover workspaces with stock within that transaction.
    expected: The sweep read fails rather than joining the caller's transaction.
    negative: true
    data_needs: Fixtures for stock discovery rejects an existing transaction.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#finds
        the tenants that hold stock across tenants, under the sweep policy, this
        one among them, and refuses that read inside another transaction
      - TST-COM-FUL-063
    provenance: test
    source: >-
      services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#finds
      the tenants that hold stock across tenants, under the sweep policy, this
      one among them, and refuses that read inside another transaction
    category: boundary
  - id: ATS-COM-FUL-019-06
    title: Counts and findings require mutation authority
    level: api
    proves:
      - BR-CAP-COM-FUL-019-12
    preconditions: A read-only inventory identity is available.
    steps: 'Try count creation and finding resolution, then read the records.'
    expected: Mutations fail while authorized inspection succeeds.
    negative: true
    data_needs: Fixtures for counts and findings require mutation authority.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#lets
        a reader list and read everything, and refuses it every write 403
        permission_missing
      - TST-COM-FUL-057
    provenance: test
    source: >-
      services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#lets a
      reader list and read everything, and refuses it every write 403
      permission_missing
    category: permission
  - id: ATS-COM-FUL-019-07
    title: A shelf count corrects the ledger and changes availability
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-019-02
      - BR-CAP-COM-FUL-017-03
      - BR-CAP-COM-FUL-018-06
    exercises:
      - CAP-COM-FUL-019
      - CAP-COM-FUL-017
      - CAP-COM-FUL-018
    relies_on:
      - ATS-COM-FUL-019-01
      - ATS-COM-FUL-017-02
      - ATS-COM-FUL-018-06
    preconditions: A sellable item holds ten units and a scoped count observes eight.
    steps: 'Complete the count, inspect its correction movement and read availability.'
    expected: >-
      The count retains one correction and buyers see the corrected stock;
      repeated completion changes nothing.
    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/integration/services/stock/staff-movements.integration.spec.js#opens
        the count open with no lines, records the lines with what the shelf
        expected, and completes it with one correction for the variance
      - >-
        services-commerce:modules/inventory/tests/integration/db/inventory-tables.table.integration.spec.js#refuses
        the application role a balance: UPDATE on on_hand is 42501 (the column
        grant), while its settings are its to change
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#answers
        the availability in the storefront’s words: limited with what is left,
        unavailable for more than the shelf has, backorder for the shirt,
        available for a product it does not track
  - id: ATS-COM-FUL-019-08
    title: Nightly expiry gives held stock back to buyers
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-019-04
      - BR-CAP-COM-FUL-018-04
    exercises:
      - CAP-COM-FUL-019
      - CAP-COM-FUL-018
    relies_on:
      - ATS-COM-FUL-019-03
      - ATS-COM-FUL-018-04
    preconditions: An expired checkout hold consumes one unit of tracked sellable stock.
    steps: >-
      Run nightly reconciliation, inspect the expiry finding and read the
      allocation and availability.
    expected: The hold releases with an expiry reason and its unit becomes available.
    negative: false
    data_needs: >-
      An isolated workspace with the products, records, authority and quantities
      described in the preconditions.
    bound_to:
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#counts
        what it did: the tenant, one hold expired, three items checked, one
        mismatch, one stale unit, one low-stock SKU of two with a point, and the
        cost pass: three items whose stock no layer costs (the fixture’s bare
        receipts), no handoff without a relief
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#releases
        the expired hold (reason expiry) and raises expired_hold on it, giving
        the unit back
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        balance_mismatch on the item knocked out of line, with what was kept and
        what the ledgers say, and corrects nothing
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        low_stock on shirt L at its own reorder point with the product’s reorder
        quantity, and nothing on the cap above its point
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        stale_allocation on the committed unit whose obligation is cancelled
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#finds
        the same on a second run and adds an occurrence to each open finding
        rather than another row
      - TST-COM-FUL-063
    provenance: test
    source:
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#counts
        what it did: the tenant, one hold expired, three items checked, one
        mismatch, one stale unit, one low-stock SKU of two with a point, and the
        cost pass: three items whose stock no layer costs (the fixture’s bare
        receipts), no handoff without a relief
      - >-
        services-commerce:modules/inventory/tests/e2e/merchandise-placement.e2e.spec.js#holds
        the two caps for the item under hold:<item> (the units held with the
        product’s expiry), and the shelf shows one left
  - id: ATS-COM-FUL-019-09
    title: Stock diagnoses remain inspectable through their owning list
    category: interaction
    level: api
    proves:
      - BR-CAP-COM-FUL-019-03
      - BR-CAP-COM-FUL-008-01
    exercises:
      - CAP-COM-FUL-019
      - CAP-COM-FUL-008
    relies_on:
      - ATS-COM-FUL-019-02
      - ATS-COM-FUL-008-01
    preconditions: >-
      One stock mismatch and one order delivery failure are recorded in the same
      workspace.
    steps: >-
      Inspect the stock finding and the order queue, acknowledge each using its
      own authority, then resolve the stock finding.
    expected: >-
      Each retained diagnosis uses its owning list and permission; resolving the
      stock finding leaves the delivery failure open.
    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/integration/services/stock/staff-movements.integration.spec.js#is
        raised open, acknowledged, resolved with its resolution, and raised
        again as a new row once resolved
      - >-
        services-commerce:modules/operations/tests/e2e/operations.e2e.spec.js#lists
        the finding the reconciler raised about the unbilled order, filtered by
        kind, state and order, and never another tenant’s
evidence:
  - repository: services-commerce
    tests:
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#opens
        the count open with no lines, records the lines with what the shelf
        expected, and completes it with one correction for the variance
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#leaves
        the shelf as counted, stamped last_counted_at on both items
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#refuses
        lines on a completed count and a second completion (409), and the
        cancelled count wrote nothing
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#opens
        a count, records what was counted, completes it with one correction, and
        cancels another; lines on a completed count 409
      - >-
        services-commerce:modules/inventory/tests/integration/services/stock/staff-movements.integration.spec.js#is
        raised open, acknowledged, resolved with its resolution, and raised
        again as a new row once resolved
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#is
        listed and read, acknowledged, then resolved with its resolution (a
        second resolve 409; a resolution missing 400)
      - >-
        services-commerce:modules/inventory/tests/integration/db/inventory-tables.table.integration.spec.js#refuses
        two open findings of one kind about one subject, by
        inventory_exceptions_open_uidx, and a kind outside the six
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#counts
        what it did: the tenant, one hold expired, three items checked, one
        mismatch, one stale unit, one low-stock SKU of two with a point, and the
        cost pass: three items whose stock no layer costs (the fixture’s bare
        receipts), no handoff without a relief
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#releases
        the expired hold (reason expiry) and raises expired_hold on it, giving
        the unit back
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        balance_mismatch on the item knocked out of line, with what was kept and
        what the ledgers say, and corrects nothing
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        low_stock on shirt L at its own reorder point with the product’s reorder
        quantity, and nothing on the cap above its point
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
        stale_allocation on the committed unit whose obligation is cancelled
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#finds
        the same on a second run and adds an occurrence to each open finding
        rather than another row
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#checks
        every tracked SKU with a reorder point and raises each one at or below
        it, the last page’s included
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#re-derives
        every item, following the cursor past its first page
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory-paging.integration.spec.js#stops
        before it reads anything when the run has no time left, and answers that
        it is incomplete
      - >-
        services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#finds
        the tenants that hold stock across tenants, under the sweep policy, this
        one among them, and refuses that read inside another transaction
      - >-
        services-commerce:modules/inventory/tests/e2e/inventory.e2e.spec.js#lets
        a reader list and read everything, and refuses it every write 403
        permission_missing
coverage:
  rule: 'gap: FND-COM-FUL-074'
  transition: covered
  validation: covered
  permission: covered
  edge: 'gap: FND-COM-FUL-074'
  failure: 'gap: FND-COM-FUL-074'
  boundary: covered
  concurrency: 'gap: FND-COM-FUL-074'
  invariant: covered
  interaction: covered
coverage_notes:
  rule: >-
    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.
  concurrency: >-
    No scenario specifically isolates this dimension; the coverage finding
    retains the missing proof.
transition_audit:
  - model: STATE-COM-FUL-009
    from: held
    to: committed
    source: >-
      services-commerce:modules/inventory/db/inventory-allocations.table.ts
      (commerce_commit_claims)
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: held
    to: released
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-allocations.ts:expireHolds
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: committed
    to: picked
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-allocations.ts:pickUnitsOfLine
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: backordered
    to: committed
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-allocations.ts:fillBackorders
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: picked
    to: shipped
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-allocations.ts:shipUnits
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: committed
    to: released
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-allocations.ts:releaseFencedUnitsOfLine
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: picked
    to: released
    source: >-
      services-commerce:docs/migrations/inventory/README.md (D-P7-24 amendment
      of D-P8I-13)
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-009
    from: backordered
    to: released
    source: >-
      services-commerce:modules/inventory/db/inventory-allocations.table.ts
      (commerce_release_claims)
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-010
    from: open
    to: completed
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-counts.ts:completeCount
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-010
    from: open
    to: cancelled
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-counts.ts:cancelCount
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-010
    from: open
    to: open
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-counts.ts:recordCountLines
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-011
    from: open
    to: acknowledged
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-exceptions.ts:acknowledgeInventoryException
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-011
    from: open
    to: resolved
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-exceptions.ts:resolveInventoryException
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-011
    from: acknowledged
    to: resolved
    source: >-
      services-commerce:modules/inventory/services/persistence/inventory-exceptions.ts:resolveInventoryException
    coverage: 'gap: FND-COM-FUL-074'
    scenarios: []
  - model: STATE-COM-FUL-011
    from: open
    to: open
    source: >-
      services-commerce:modules/inventory/tests/integration/services/reconciliation/nightly-inventory.integration.spec.js#raises
      stale_allocation on the committed unit whose obligation is cancelled
    coverage: covered
    scenarios:
      - ATS-COM-FUL-018-15
      - ATS-COM-FUL-019-03
      - ATS-COM-FUL-019-08
permission_audit:
  - key: commerce.inventory.read
    where_checked: api
    coverage: 'gap: FND-COM-FUL-074'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.inventory.create
    where_checked: api
    coverage: 'gap: FND-COM-FUL-074'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
  - key: commerce.inventory.update
    where_checked: api
    coverage: 'gap: FND-COM-FUL-074'
    note: >-
      Per-key positive and negative coverage is not separately mapped;
      permission scenarios retain the observed aggregate tests.
related_audit:
  - capability: CAP-COM-FUL-018
    scenarios:
      - ATS-COM-FUL-019-07
      - ATS-COM-FUL-019-08
  - capability: CAP-COM-FUL-008
    scenarios:
      - ATS-COM-FUL-019-09
invariant_audit:
  - 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
---

# Reconcile shelf counts and stock findings: 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-019-01` | `ATS-COM-FUL-019-01`, `ATS-COM-FUL-019-07` |
| `BR-CAP-COM-FUL-019-02` | `ATS-COM-FUL-019-01`, `ATS-COM-FUL-019-07` |
| `BR-CAP-COM-FUL-019-03` | `ATS-COM-FUL-019-02`, `ATS-COM-FUL-019-09` |
| `BR-CAP-COM-FUL-019-04` | `ATS-COM-FUL-019-03`, `ATS-COM-FUL-019-08` |
| `BR-CAP-COM-FUL-019-05` | `ATS-COM-FUL-019-03`, `ATS-COM-FUL-019-08` |
| `BR-CAP-COM-FUL-019-06` | `ATS-COM-FUL-019-03`, `ATS-COM-FUL-019-08` |
| `BR-CAP-COM-FUL-019-07` | `ATS-COM-FUL-019-03`, `ATS-COM-FUL-019-08` |
| `BR-CAP-COM-FUL-019-08` | `ATS-COM-FUL-019-04` |
| `BR-CAP-COM-FUL-019-10` | `ATS-COM-FUL-019-03`, `ATS-COM-FUL-019-08` |
| `BR-CAP-COM-FUL-019-11` | `ATS-COM-FUL-019-05` |
| `BR-CAP-COM-FUL-019-12` | `ATS-COM-FUL-019-06` |

## Interactions With Related Capabilities

The interaction cases exercise allocate stock and explain what buyers can obtain; review and resolve operations findings. 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.
