lumnik. / scénarios Tous les scénarios · English

Une porte de congélateur ouverte et un capteur muet

Objectif Être alerté quand une porte de congélateur reste ouverte plus d'une minute, avec le laboratoire et le responsable.

Des capteurs publient l'état des portes de congélateurs sur Kafka. FZ-17 s'ouvre et se tait. FZ-18 s'ouvre et se referme.

freezers.csv
freezer_id,laboratory,room,contents,nominal_temperature_c,criticality,owner
FZ-17,Cryobiology Lab,Cryostorage A,Patient-derived cell lines,-70,critical,Dr. Lina Moreau
FZ-18,Analytical Chemistry Lab,Cold Room 2,Reference standards,-80,high,Marc Vidal
open-events.jsonl
{"event_id":"EV-17-OPEN","door_incident_id":"DOOR-17","freezer_id":"FZ-17","door_state":"OPEN","temperature_c":-67.4,"occurred_at":"2026-10-15T08:00:00Z"}
{"event_id":"EV-18-OPEN","door_incident_id":"DOOR-18","freezer_id":"FZ-18","door_state":"OPEN","temperature_c":-78.0,"occurred_at":"2026-10-15T08:00:05Z"}
manifests/30-enriched-door-event.yaml
kind: Entityname: ScenarioFreezerDoorEventFdescription: "A freezer-door sensor event enriched with the laboratory registry."match: [event_id]scopes: [cold-chain]columns:  event_id: { label: "Event" }  door_incident_id: { label: "Door incident" }  freezer_id: { label: "Freezer" }  door_state: { label: "Door state" }  temperature_c: { label: "Temperature (°C)" }  laboratory: { label: "Laboratory" }  room: { label: "Room" }  contents: { label: "Contents" }  criticality: { label: "Criticality" }  owner: { label: "Owner" }sources:  - table: t_scenario_freezer_events_f    map:      event_id: event_id      door_incident_id: door_incident_id      freezer_id: freezer_id      door_state: door_state      temperature_c: temperature_c      occurred_at: occurred_atjoins:  - table: t_scenario_freezer_registry_f    from: freezer_id    to: freezer_id    map:      laboratory: laboratory      room: room      contents: contents      nominal_temperature_c: nominal_temperature_c      criticality: criticality      owner: owner
manifests/40-door-workflow.yaml
apiVersion: apps.lumnik.io/v1kind: Workflowmetadata:  name: scenario-freezer-door-fspec:  scope: cold-chain  provenance: declared  on:    table: connector.v_scenariofreezerdooreventf    column: door_state    key: door_incident_id    order: occurred_at  dormancy:    after: 1m    message: "{freezer_id} ({laboratory}): door {state} since {since}. Owner: {owner}"    fields: [contents, criticality]  states:    - code: OPEN      label: "Open"      initial: true    - code: CLOSED      label: "Closed"      terminal: true
safe-close.jsonl
{"event_id":"EV-18-CLOSED","door_incident_id":"DOOR-18","freezer_id":"FZ-18","door_state":"CLOSED","temperature_c":-78.8,"occurred_at":"2026-10-15T08:00:25Z"}
$ lm observations list --workflow scenario-freezer-door-f
WORKFLOW                 DOC      STATE   SINCE             ALERTED
scenario-freezer-door-f  DOOR-17  OPEN    2026-10-28 16:52  2026-10-28 16:53
scenario-freezer-door-f  DOOR-18  CLOSED  2026-10-28 16:52  

$ lm inbox --process workflow:scenario-freezer-door-f
ID     WHEN      PROCESS                           MESSAGE                                                                      ENTITY_KEY
20093  just now  workflow:scenario-freezer-door-f  FZ-17 (Cryobiology Lab): door OPEN since 2026-10-28. Owner: Dr. Lina Moreau  DOOR-17
late-close.jsonl
{"event_id":"EV-17-CLOSED","door_incident_id":"DOOR-17","freezer_id":"FZ-17","door_state":"CLOSED","temperature_c":-69.1,"occurred_at":"2026-10-15T08:02:10Z"}

Limites

  • Workflow connaît le dernier message reçu, pas la porte. Un OPEN qui dure peut être un CLOSED perdu avant Kafka.
  • Dormance comptée depuis l'arrivée du message dans lumnik, pas depuis occurred_at du capteur.
  • Démonstration: balayage toutes les 5 secondes. Par défaut: toutes les 15 minutes. Seuil métier: 1 minute, le minimum accepté.
  • Données synthétiques.

Chaîne du froid · laboratoire

Une porte de congélateur reste ouverte.

Le capteur n'envoie plus rien.

FZ-17 contient des lignées cellulaires issues de patients.

Laboratoire fictif · données synthétiques

Le problème

L'information existe, dans deux systèmes.

  • Kafka reçoit l'état de la porte: FZ-17, OPEN.
  • Un fichier CSV donne le laboratoire, le contenu et le responsable.
  • Aucun des deux ne signale une porte restée ouverte.

Rien n'est modifié

Le capteur, Kafka et le fichier restent en place.

  • Le producteur Kafka ne change pas.
  • Le fichier CSV reste à sa place.
  • Aucune application à développer.

Ce qu'il a fallu écrire

dormancy:
  after: 1m

Cette ligne fixe le délai: 1 minute.

Le scénario complet tient en 4 fichiers de déclaration, 83 lignes.

Ce que reçoit l'équipe

La décision nomme le laboratoire et le responsable.

Boîte de décisions
FZ-17 (Cryobiology Lab): door OPEN since 2026-10-28. Owner: Dr. Lina Moreau

Message réel, rejeu du 26 octobre 2026.

Qui voit quoi

Le scope borne la lecture.

scope: cold-chain
  • Chaque fichier déclare le scope cold-chain.
  • Keycloak donne le rôle scope:cold-chain.
  • Les autres utilisateurs ne voient ni ces données ni ces décisions.

La limite

lumnik signale un silence, pas une porte ouverte.

  • Le dernier état reçu est OPEN.
  • Le message CLOSED a pu être perdu avant Kafka.
  • La décision dit ce que lumnik a observé.

Essayer

Le scénario se rejoue de bout en bout.

Kafka, CSV, entité, workflow: chaque étape est publiée avec sa sortie.

Ce scénario demande lumnik Pro.

Voir l'offre →