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

Un technicien ne voit que l'app de la maintenance

Objectif Donner à chaque métier son app sur le même hub, sans qu'un technicien puisse lire les données des achats.

La maintenance et les achats partagent un ERP où chacun voit tout. Sur le même hub, lumnik compose une app par métier.

workorders-1-day.csv
wo_id;asset;priority;status
WO-101;Convoyeur ligne 2;URGENT;OPEN
WO-102;Compresseur atelier B;NORMAL;OPEN
WO-103;Four de cuisson;LOW;CLOSED
invoices-1-day.csv
invoice_id;supplier;amount;status
INV-501;Fournisseur Alpha;18500;OPEN
INV-502;Fournisseur Beta;2300;OPEN
INV-503;Fournisseur Gamma;12750;OPEN
$ lm --context maintenance app list
NAME                    TITLE        SCOPE        ICON     ACCENT   BACKGROUND  DEFAULT  TABS
scenario-maintenance-b  Maintenance  maintenance  generic  #8b7ff0  #14121f              (all)
$ lm --context maintenance view list
NAME                          SCOPE        TITLE
scenario-metier-workorders-b  maintenance  Ordres de travail

$ lm --context maintenance view scenario-metier-workorders-b
Ordres de travail

Ordre   Équipement             Priorité  Statut
WO-000  calibration            LOW       CLOSED
WO-101  Convoyeur ligne 2      URGENT    OPEN
WO-102  Compresseur atelier B  NORMAL    OPEN
WO-103  Four de cuisson        LOW       CLOSED

$ lm --context maintenance view scenario-metier-invoices-b
Error: access refused (403): scope not granted
$ lm --context maintenance entity get ScenarioWorkOrderB -o json
[
  {
    "wo_id": "WO-000",
    "asset": "calibration",
    "priority": "LOW",
    "status": "CLOSED",
    "_conflicts": "{}"
  },
  {
    "wo_id": "WO-101",
    "asset": "Convoyeur ligne 2",
    "priority": "URGENT",
    "status": "OPEN",
    "_conflicts": "{}"
  },
  {
    "wo_id": "WO-102",
    "asset": "Compresseur atelier B",
    "priority": "NORMAL",
    "status": "OPEN",
    "_conflicts": "{}"
  },
  {
    "wo_id": "WO-103",
    "asset": "Four de cuisson",
    "priority": "LOW",
    "status": "CLOSED",
    "_conflicts": "{}"
  }
]

$ lm --context maintenance entity get ScenarioSupplierInvoiceB
Error: access refused (403): scope not granted
$ lm --context maintenance inbox --process scenario-metier-urgent-wo-b
ID   WHEN      PROCESS                      MESSAGE                                        ENTITY_KEY
248  just now  scenario-metier-urgent-wo-b  Urgent work order WO-101 on Convoyeur ligne 2  a61f7e7532807c18c48f0cc3126fe9e6ccdc6def4aa35b3723ec3b1dc2f953b6
$ lm --context maintenance inbox ack 255
Error: API error 404: no decision 255 in your inbox

Limites

  • Le métier est un rôle Keycloak scope:<tag>; un utilisateur sans aucun rôle scope: voit tout le tenant.
  • Une entité inconnue répond 404, celle d'un autre métier 403: les noms se distinguent, jamais les lignes.
  • Le scénario passe par lm; la PWA lit les mêmes portes.
  • Données synthétiques.

Maintenance · achats

Dans l'ERP, chacun voit tout.

Le technicien voit les factures fournisseurs.

La maintenance et les achats partagent la même base.

Entreprise fictive · données synthétiques

Le problème

Ouvrir les données, c'est ouvrir à tous.

  • Un écran par métier ne suffit pas.
  • Une requête directe passe à côté de l'écran.
  • Un id connu ouvre la décision d'un autre.

Rien n'est modifié

L'ERP et Keycloak restent en place.

  • Le métier est un rôle Keycloak.
  • lumnik le lit, il ne le gère pas.
  • Aucune application à développer.

Ce qu'il a fallu écrire

spec:
  title: Maintenance
  scope: maintenance

Chaque manifeste porte son scope.

Le scénario complet tient en 10 fichiers de déclaration, 126 lignes.

Ce que voit le technicien

Une app, une vue, quatre ordres.

  • L'app Maintenance seule.
  • Les quatre ordres de travail.
  • La décision de l'ordre urgent.

Ce qu'il ne voit pas

Chaque porte des achats refuse.

lm --context maintenance
access refused (403): scope not granted

Réponse réelle, rejeu du 3 novembre 2026, OIDC Keycloak.

La limite

Sans rôle scope, on voit tout le tenant.

  • Le métier se pose dans Keycloak.
  • Un nom d'entité inconnu répond 404, un autre métier 403.
  • Les noms se distinguent, jamais les lignes.

Essayer

Le scénario se rejoue de bout en bout.

Deux métiers, un hub, un vrai Keycloak: chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →