De bout en bout : garde d'inventaire
Vous allez construire : le pipeline d'inventaire vivant du use case Retail — une position mise à jour en continu par SKU, alimentée par les commandes et les réassorts, avec une règle de stock bas qui se déclenche avant la survente.
Prérequis
- Le démarrage rapide terminé. Pas de LLM — ce pipeline est entièrement déterministe.
1 · Générez
pulse new inventory --source webhook \
--stage streaming:position --stage rule-based:guard --sink webhook
2 · Le stage position — un total courant par SKU
stages:
- name: position
engine: streaming
operators:
- type: aggregate
key: sku
aggregations:
sold: "sumWhere(type == 'order')"
received: "sumWhere(type == 'restock')"
Contrairement à une fenêtre, un aggregate par clé garde un état courant continu par clé — exactement ce qu'est une position d'inventaire.
3 · Le stage guard
- name: guard
engine: rule-based
rules:
- { condition: "received - sold < 10", action: flag }
4 · Le sink
pulse secret set OPS_WEBHOOK https://webhook.site/<votre-id>
sink:
kind: webhook
url: ${secret:OPS_WEBHOOK}
5 · Déployez et jouez une journée de vente
pulse secret set PULSE_WEBHOOK_SECRET dev-secret # la source webhook générée l'exige
pulse deploy .
pulse events publish --topic inventory.in --value '{"sku":"tee-black-m","type":"restock","qty":1,"amount":12}'
for i in $(seq 1 8); do
pulse events publish --topic inventory.in --value '{"sku":"tee-black-m","type":"order","qty":1,"amount":1}'
done
pulse events tail --topic inventory.guard.out
À mesure que les commandes entament la position, dès que received - sold franchit le seuil de sécurité, la garde se déclenche — et votre webhook ops reçoit l'alerte de stock bas pendant que le SKU est encore vendable, pas dans le rapport de sync de demain.
6 · Prouvez l'isolation par SKU
pulse events publish --topic inventory.in --value '{"sku":"mug-blue","type":"order","qty":1,"amount":1}'
mug-blue a sa propre position indépendante — les chiffres de tee-black-m ne bougent pas.
Ce qui vient de se passer
La sync d'inventaire nocturne est devenue un abonnement : chaque commande et chaque réassort met à jour un état par clé au moment où il arrive, et chaque canal qui a besoin de la vérité lit les mêmes topics (Appeler votre app de n'importe où). Le mode de défaillance « survendu parce que les canaux étaient en désaccord pendant six heures » n'a plus de place pour exister.
Dépannage
La garde ne se déclenche jamais
Vérifiez inventory.position.out — les totaux courants sold/received doivent réellement franchir votre seuil. Les noms de champs dans la règle doivent correspondre exactement aux noms d'agrégation.
Ensuite
- Joins stream-stream — corrélez les commandes avec les scans d'expédition
- De bout en bout : triage de fraude carte