# Inventory reorder — risk brief contract

Companion to **AI inventory agent: what should we reorder today?**

Demo SKUs are fixtures, not client data. Fill **Owner** and **Approval** for your store.

## Inputs (named tools only)

| Signal | Tool (example operationId) | Must not |
| ------ | -------------------------- | -------- |
| On-hand + reserved | `getInventoryPosition` | Treat reserved as available |
| 7 / 28-day velocity | `getSkuVelocity` | Use a flash-sale day as the run rate |
| Open POs + ETA | `getOpenPurchaseOrders` | Ignore inbound that lands inside lead time |
| Vendor lead time | `getVendorLeadTime` | Invent days from a chatty ASN email |
| Seasonality / campaign | `getPromoCalendar` (optional) | Assume ads are off if the tool is missing |
| Safety stock policy | `getReorderPolicy` | Let the model pick a new service level |

If a signal has no tool, the brief must say **unknown**, not guess.

## SKU classes (output)

| Class | Meaning | Default next step |
| ----- | ------- | ----------------- |
| **A — Reorder** | Cover < lead time + safety, inbound does not close the gap | Draft PO; **human approval** |
| **B — Wait** | Cover is thin but an open PO or inbound ASN closes it | Watch; do not stack a second PO |
| **C — Stockout risk** | Cover < 7 days **or** advertised SKU with inbound slip | Alert merch + ops; draft PO if A also true |
| **D — Excess** | Cover >> policy (slow / aging) | Do **not** reorder; hand to excess-inventory matrix |

## Sample brief (fixture)

```json
{
  "date": "2026-08-27",
  "store": "example-shop",
  "rows": [
    {
      "sku": "SKU-TEE-BLU-M",
      "class": "A",
      "days_of_cover": 5,
      "lead_time_days": 18,
      "open_po_qty": 0,
      "evidence_tool": "getInventoryPosition",
      "recommended_qty": 240,
      "recommended_vendor": "VENDOR-KNIT-01",
      "approval_required": true,
      "do_not": "createPurchaseOrder"
    },
    {
      "sku": "SKU-HOOD-BLK-L",
      "class": "B",
      "days_of_cover": 9,
      "open_po_qty": 120,
      "eta": "2026-09-04",
      "evidence_tool": "getOpenPurchaseOrders",
      "recommended_qty": 0,
      "approval_required": false,
      "do_not": "stack another PO"
    }
  ]
}
```

## HITL

- The agent **never** sends a PO. `createPurchaseOrder` stays DENY until a buyer JWT + Cedar ALLOW.
- Class D is a handoff, not a markdown. See `excess-inventory-action-matrix.md`.
- If velocity and promo calendar disagree, class **C** and a human — not an auto-PO.
