🔥 USE CASE #04 - RISQUES CRITIQUES

Travaux à Chaud

Détection Proactive des Non-Conformités Hot Work
Hot Work Compliance & Risk Detection
📋 Contexte Opérationnel / Operational Context

🇫🇷 Français

Les travaux à chaud (soudage, meulage, découpage thermique) représentent un risque majeur d'incendie et d'explosion dans les environnements industriels. La surveillance en temps réel des permis de travail, des combustibles à proximité, de la surveillance incendie (fire watch), des lectures de gaz et des dispositifs pare-étincelles est essentielle pour prévenir les incidents graves.

🇬🇧 English

Hot work operations (welding, grinding, thermal cutting) pose significant fire and explosion risks in industrial environments. Real-time monitoring of work permits, nearby combustibles, fire watch personnel, gas readings, and spark containment devices is critical to prevent serious incidents.

⚠️ Question Métier / Business Question: Comment identifier en temps réel les travaux à chaud non conformes avant qu'un incident se produise? / How to identify non-compliant hot work operations in real-time before an incident occurs?
🕸️ Schéma de Graphe Neo4j / Neo4j Graph Schema
🔥 Architecture SafetyGraph - Travaux à Chaud / Hot Work
:Task
🔥
HotWork
:Permit
📜
Permis
:Worker
👨‍🚒
Fire Watch
:Asset
Combustible
:Reading
📊
Gas Reading
:Control
🛡️
Pare-étincelles
COVERS
FIRE_WATCH
LOCATED_IN
AT
REQUIRES_CONTROL
Task:HotWork - Travail à chaud
Permit - Permis de travail
Worker - Surveillant incendie
Asset:Combustible - Matière inflammable
Reading - Lecture atmosphérique
Control - Mesure de contrôle
🔍 Requête #1 - Hot Work sans Permis ou Fire Watch
🇫🇷 Objectif: Identifier les travaux à chaud actifs sans permis valide ou sans surveillant incendie assigné.
🇬🇧 Objective: Identify active hot work operations without valid permit or assigned fire watch personnel.
💻 Requête Cypher Neo4j
// 🔥 Détection: Hot Work sans permis OU sans fire-watch
// Detection: Hot Work without permit OR without fire watch

MATCH (t:Task {type: 'HotWork'})-[:LOCATED_IN]->(z)-[:PART_OF]->(p {id: $projectId})
WHERE NOT (:Permit {type: 'HotWork'})-[:COVERS]->(t)
   OR NOT (:Worker)-[:FIRE_WATCH]->(t)
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.startDate AS startDate,
    z.name AS zoneName,
    CASE
        WHEN NOT (:Permit)-[:COVERS]->(t) THEN 'MISSING_PERMIT'
        ELSE 'MISSING_FIRE_WATCH'
    END AS violation
ORDER BY t.startDate DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "HW-2024-1847",
  "description": "Soudage réservoir principal / Main tank welding",
  "startDate": "2024-11-04T08:30:00Z",
  "zoneName": "Zone Production B",
  "violation": "MISSING_FIRE_WATCH",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL"
}
⏱️ Requête #2 - Post-Watch 60 Minutes Manquant
🇫🇷 Objectif: Détecter les travaux à chaud terminés sans confirmation de surveillance post-travaux (60 min obligatoires).
🇬🇧 Objective: Detect completed hot work operations without post-work watch confirmation (60 min mandatory).
💻 Requête Cypher Neo4j
// ⏱️ Détection: Surveillance post-travaux (60 min) non confirmée
// Detection: Post-work watch (60 min) not confirmed

MATCH (t:Task {type: 'HotWork'})-[:PART_OF]->(p {id: $projectId})
WHERE t.endDate >= $since
  AND NOT (:Event {type: 'PostWatchComplete'})-[:FOR]->(t)
WITH t,
     duration.between(t.endDate, datetime()) AS timeSinceEnd
WHERE timeSinceEnd.minutes > 60
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.endDate AS endDate,
    timeSinceEnd.minutes AS minutesSinceEnd,
    'POST_WATCH_MISSING' AS violation
ORDER BY timeSinceEnd.minutes DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "HW-2024-1823",
  "description": "Découpage métal ligne 3 / Metal cutting line 3",
  "endDate": "2024-11-04T14:15:00Z",
  "minutesSinceEnd": 127,  // Plus de 2 heures sans surveillance!
  "violation": "POST_WATCH_MISSING",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL"
}
📏 Requête #3 - Combustibles en Zone d'Exclusion
🇫🇷 Objectif: Identifier les matières combustibles situées à moins de la distance réglementaire d'exclusion d'un travail à chaud.
🇬🇧 Objective: Identify combustible materials located within the regulatory exclusion distance from hot work.
💻 Requête Cypher Neo4j
// 📏 Détection: Combustibles trop proches (< zone d'exclusion)
// Detection: Combustibles too close (< exclusion zone)

MATCH (t:Task {type: 'HotWork'})-[:LOCATED_IN]->(z1)-[:PART_OF]->(p {id: $projectId})
MATCH (c:Asset {class: 'Combustible'})-[:LOCATED_IN]->(z2)
WITH t, z1, c, z2,
     point.distance(point(z1), point(z2)) AS distanceMeters
WHERE distanceMeters < $exclusionM  // Paramètre: 10.7m (35 pieds NFPA)
RETURN 
    t.id AS taskId,
    t.description AS taskDescription,
    z1.name AS hotWorkZone,
    c.id AS combustibleId,
    c.type AS combustibleType,
    z2.name AS combustibleZone,
    round(distanceMeters, 2) AS distanceMeters,
    ($exclusionM - distanceMeters) AS violationMargin
ORDER BY distanceMeters ASC
📊 Exemple de Résultat / Result Example
{
  "taskId": "HW-2024-1891",
  "taskDescription": "Soudage tuyauterie / Pipeline welding",
  "hotWorkZone": "Atelier B-14",
  "combustibleId": "COMB-4782",
  "combustibleType": "Solvant inflammable / Flammable solvent",
  "combustibleZone": "Entrepôt B-15",
  "distanceMeters": 6.3,  // Seulement 6.3m! Minimum requis: 10.7m (NFPA 51B)
  "violationMargin": 4.4,
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL"
}
🧪 Requête #4 - Absence de Pré-Lecture Gaz
🇫🇷 Objectif: Détecter les travaux à chaud initiés sans lecture atmosphérique préalable dans le délai requis (ex: 30 min avant).
🇬🇧 Objective: Detect hot work operations initiated without prior atmospheric reading within required timeframe (e.g., 30 min before).
💻 Requête Cypher Neo4j
// 🧪 Détection: Absence de pré-lecture gaz atmosphérique
// Detection: Missing pre-work atmospheric gas reading

MATCH (t:Task {type: 'HotWork'})-[:LOCATED_IN]->(z)-[:PART_OF]->(p {id: $projectId})
WITH t, z,
     SIZE([
         (r:Reading)-[:AT]->(z) 
         WHERE r.timestamp >= t.startDate - duration({minutes: $preMin})
           AND r.timestamp <= t.startDate
         | r
     ]) AS readingsCount
WHERE readingsCount = 0
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.startDate AS startDate,
    z.name AS zoneName,
    readingsCount,
    'MISSING_GAS_READING' AS violation,
    'O2, LEL, H2S, CO requis avant travaux / O2, LEL, H2S, CO required before work' AS requiredTests
ORDER BY t.startDate DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "HW-2024-1905",
  "description": "Meulage structure métallique / Metal structure grinding",
  "startDate": "2024-11-04T09:00:00Z",
  "zoneName": "Aire de fabrication C",
  "readingsCount": 0,  // Aucune lecture dans les 30 min précédentes!
  "violation": "MISSING_GAS_READING",
  "requiredTests": "O2, LEL, H2S, CO requis avant travaux / O2, LEL, H2S, CO required before work",
  "criticalityLevel": "🟠 ÉLEVÉ / HIGH"
}
🛡️ Requête #5 - Pare-Étincelles Non Prévu
🇫🇷 Objectif: Identifier les travaux à chaud sans mesure de contrôle "Containment des étincelles" associée dans le plan de travail.
🇬🇧 Objective: Identify hot work operations without "Spark Containment" control measure in the work plan.
💻 Requête Cypher Neo4j
// 🛡️ Détection: Pare-étincelles (spark shield) non prévu
// Detection: Spark shield (spark containment) not planned

MATCH (t:Task {type: 'HotWork'})-[:PART_OF]->(p {id: $projectId})
WHERE NOT (t)-[:REQUIRES_CONTROL]->(:Control {type: 'SparkContainment'})
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.startDate AS startDate,
    t.location AS location,
    'MISSING_SPARK_SHIELD' AS violation,
    CASE
        WHEN t.type IN ['Welding', 'Cutting'] THEN 'CRITICAL'
        WHEN t.type = 'Grinding' THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel
ORDER BY riskLevel, t.startDate DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "HW-2024-1918",
  "description": "Découpage thermique poutre / Thermal beam cutting",
  "startDate": "2024-11-04T10:30:00Z",
  "location": "Atelier principal - Zone haute / Main workshop - High zone",
  "violation": "MISSING_SPARK_SHIELD",
  "riskLevel": "CRITICAL",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "recommendation": "Toiles ignifuges + barrières pare-étincelles requises / Fire blankets + spark barriers required"
}
⚠️ Matrice de Criticité & Actions / Criticality Matrix & Actions
🔴 CRITIQUE / CRITICAL
Violations:
• Permis manquant / Missing permit
• Fire watch absent / Fire watch absent
• Combustibles < 10.7m / Combustibles < 35ft
• Post-watch > 120 min

Actions:
• Arrêt immédiat / Immediate stop
• Notification superviseur / Supervisor alert
• Intervention < 5 min
🟠 ÉLEVÉ / HIGH
Violations:
• Lecture gaz manquante / Missing gas reading
• Post-watch 60-120 min
• Pare-étincelles meulage / Grinding shield

Actions:
• Pause travaux / Pause work
• Lecture immédiate / Immediate reading
• Correction < 15 min
🟡 MOYEN / MEDIUM
Violations:
• Documentation incomplète / Incomplete docs
• Pare-étincelles autres / Other shields
• Combustibles 10.7-15m / 35-50ft

Actions:
• Surveillance renforcée / Enhanced monitoring
• Compléter docs / Complete docs
• Correction < 1h
🟢 FAIBLE / LOW
Conformité:
• Tous contrôles OK / All controls OK
• Permis valide / Valid permit
• Fire watch actif / Active fire watch

Actions:
• Surveillance continue / Continuous monitoring
• Audit qualité / Quality audit
• Rétroaction positive / Positive feedback
📚 Normes & Références / Standards & References
🔥 NFPA 51B
⚠️ OSHA 1910.252
🇨🇦 CNESST Art. 322-323
🏭 CSA W117.2
🌍 ISO 45001
🔧 ANSI Z49.1
🏗️ API RP 2009
📋 FM Global DS 10-3
📖 NFPA 51B - Standard for Fire Prevention During Welding, Cutting, and Other Hot Work: Distance minimale d'exclusion de 10.7 m (35 pieds) pour les combustibles, surveillance post-travaux obligatoire de 60 minutes minimum. / Minimum 10.7m (35 ft) exclusion distance for combustibles, mandatory 60-minute minimum post-work fire watch.
🤖 Agents AgenticX5 / AI Agents
🔥
HotWorkAI
FR: Surveillance en temps réel des travaux à chaud, corrélation permis-zones-travailleurs, détection proactive des non-conformités.

EN: Real-time hot work monitoring, permit-zone-worker correlation, proactive non-compliance detection.
📜
PermitAI
FR: Gestion intelligente des permis de travail, vérification automatique des prérequis, expiration et renouvellement dynamique.

EN: Intelligent work permit management, automatic prerequisite verification, dynamic expiration and renewal.
👨‍🚒
FireWatchAI
FR: Suivi de la présence et des qualifications des surveillants incendie, alertes automatiques pour post-watch manquants.

EN: Fire watch presence and qualification tracking, automatic alerts for missing post-watch.
🧪
AtmosphereAI
FR: Analyse continue des lectures atmosphériques (O₂, LEL, H₂S, CO), ML pour prédiction de dérives dangereuses.

EN: Continuous atmospheric reading analysis (O₂, LEL, H₂S, CO), ML for dangerous drift prediction.
📏
ProximityAI
FR: Calcul géospatial des distances combustibles-travaux, cartographie dynamique des zones d'exclusion.

EN: Geospatial combustible-work distance calculation, dynamic exclusion zone mapping.
🛡️
ControlAI
FR: Vérification intelligente des mesures de contrôle (pare-étincelles, extincteurs), recommandations contextuelles.

EN: Intelligent control measure verification (spark shields, extinguishers), contextual recommendations.