# Inventory Operations v21

v21 adds controlled operational stock changes on top of the immutable inventory ledger.

## Adjustments

Endpoint:

POST /api/v1/inventory/adjustments

Required:
- warehouse
- variant
- direction: in/out
- quantity
- reason_code
- idempotency_key

Every adjustment produces exactly one signed ledger movement:
- in -> adjustment_in
- out -> adjustment_out

Outgoing adjustments cannot create negative stock.

## Transfers

Endpoint:

POST /api/v1/inventory/transfers

A transfer is posted atomically as:
- transfer_out from source warehouse
- transfer_in to destination warehouse

If the source has insufficient stock, neither side is committed.

The source and destination warehouse must belong to the same tenant and must be different.

## Idempotency

Adjustment and transfer commands are tenant-scoped idempotent operations.

A client retry with the same idempotency key returns the same operation instead of posting
new movements.

## Audit

Both operations are audited:
- inventory.adjustment.posted
- inventory.transfer.posted

## Permission boundary

v21 uses `inventory.adjust` for both manual adjustments and transfers.

A later governance increment may split transfer permissions and add approval policies for
high-value or sensitive stock changes without changing ledger semantics.

## Next

v22:
- Stock Count
- blind count
- warehouse freeze
- variance calculation
- controlled variance posting
