A rule-free deduction strategy. For every objective it keeps the most pertinent function, assigns the most expert actors, wraps the resulting task graph into one sub-task dedicated to that objective, and chains these sub-tasks strictly one after the other. The campaign also explores preventive and corrective procedure combinations, streams progress reports, removes duplicate solutions and wires Exception_Flow and Event_Flow recoveries.
strategy nameNative Basic Bloc Satisfaction Strategy Process Deduction
One objective, one basic bloc
The generated process is not a flat scheduled graph: the top-level process contains one SubProcess_Task per objective, named after the objective, linked by Sequence_Flows in objective priority order. Each sub-task holds the complete task graph of the function chosen for its objective, with its assigned resources and its Exception_Flow recoveries.
00 · At a glance
What goes in, what is decided, what comes out
Inputs
From the model and the dialog
The selected Objectives_Manager and its Plans edges.
Satisfies (with its pertinence property), Needs, Implies, Supports, Provides, Consumes relations of the collaborative model.
satisfactionProperties: planner, actor selection mode, resource-combination cap, maximum number of solutions, campaign configuration (actualities, emerging/intrinsic and implementation potentialities with their procedures).
Decisions
Taken natively
Objectives: every planned objective is kept, no filtering.
Functions: candidates with at least one actor are sorted by pertinence; the most pertinent one is retained.
Actors: the Default planner assigns resources and keeps the best expertise (no injected ranker).
Procedures: preventive and corrective candidates are ordered by the pertinence of their Satisfies edge.
Outputs
Persisted by the campaign
Campaign solutions holding Solution → Process → one SubProcess_Task per objective → Task/Sequence_Flow with expected dates and assigned resources.
Progress, scenario and error results streamed through the deduction callback.
In first-good mode, the first unique solution is also published to the graph synchronously.
01 · Positioning
From the dialog to the campaign
The dialog is not part of the host applications: it is a deduction strategy extension, a separate Angular bundle loaded at start-up and registered under the name returned by the backend strategy.
ConfigExtension listwebjars/r-io/solution/strategy/extensions/deduction-strategy-extensions.json lists the runtime.js and main.js of the extension bundle.UIExtension dialogThe bundle registers createNativeBasicBlocSatisfactionStrategyDialog, the value of getJavascriptFunction(); the host runs it when the strategy is chosen.RESTSolutionResourcePOST …/r-ioga/solution/deduceSolutionASync with the satisfactionProperties.SOAPGovDeductionDeductionImpl.deduceASync finds the generator through ServiceLoader.SPINativeBasicBlocSatisfactionProcessGeneratorDeclared in META-INF/services/fr.emac.gind.workflow.AbstractProcessGenerator.CampaignNativeBasicBlocSatisfactionStrategyDeductionCampaignCombinations, native ranking, 4-task pipeline, deduplication, publication.PlanNativeBasicBlocPlannerResource assignment inherited from RioDefaultPlanner; builds one sequential sub-task per objective.
satisfactionProperties gives the planner type (Default), the actor selection mode (PERSON_FIRST by default), the resource-combination cap, the maximum number of solutions, the move-improver flag and the campaign configuration. The campaign stops early when an objective has no impacted resource.
02
Expand the procedure combinations
Each actuality or potentiality groups its objectives; an activated group gives one function to each of them (inner Cartesian product) and a NONE alternative is added per group (outer product). Candidate functions of each procedure objective are sorted by the pertinence of their Satisfies edge, read in one batched query.
03
Rank the functions natively
For each objective, candidates are read by descending pertinence; a candidate is kept when at least one actor provides every function of its graph. The first kept candidate is the most pertinent function of the objective; the ordered list feeds the ALL_SOLUTIONS plan combinatorics. When no candidate survives, the collected repair hints are reported.
04
Assign actors and resources
NativeBasicBlocPlanner is created without any ActorCandidateRanker: the inherited RioDefaultPlanner.solve enumerates resource assignments with ResourceAssigner and keeps, per objective, the assignments with the best expertise and the fewest unavailability slots.
05
Build one basic bloc per objective
For each objective, in plan order, its assigned tasks are scheduled on their own; every task gets an earliest start equal to the end of the previous objective's bloc. The scheduled graph (with its Exception_Flow recoveries) becomes a process wrapped into a SubProcess_Task named after the objective; its aggregated indicators are copied onto the wrapper.
06
Chain the blocs and wire Event_Flows
The top-level process links Start → bloc 1 → bloc 2 → … → End. When emerging or intrinsic potentialities bring corrective procedures, the whole chain is wrapped into a Nominal SubTask; each correction is attached with an Event_Flow whose 2L condition checks that the actuality is active and generated by the selected potentiality.
07
Value the process
Indicators are evaluated on every task and aggregated on the process. Reports and campaign indicators (tasks used, expertise, functions and resources counts) expand structural sub-tasks without a function, so the per-objective wrappers do not hide the real tasks.
08
Deduplicate and publish
A campaign-wide signature set drops equivalent solutions (same functions, actors, resources and procedures, including inside sub-tasks). Unique solutions are stored through the campaign manager; in FIRST_GOOD_SOLUTION mode the first one is published to the graph and the campaign ends.
previousEnd = null
for solution in orderedSolutionsByObjective: # plan / priority order
tasks = solution.graphAssignedTasks
schedule = Scheduler(tasks, earliestStart = previousEnd)
inner = createProcessFromScheduleTask(schedule, tasks) # Exception_Flow recoveries included
bloc = SubProcess_Task(solution.objective.name, inner) # indicators copied on the wrapper
bloc.expected = [min(task.start), max(task.end)]
previousEnd = bloc.expected.end
process = Start -> bloc1 -> bloc2 -> ... -> End
if eventFlowCorrections:
process = Start -> SubProcess_Task("Nominal SubTask", process) -> End
+ Event_Flow(nominal -> correction) for each correction
03 · Process shape
Strictly sequential basic blocs
An objective bloc can only start once the previous bloc is over, even when their resources do not overlap. Inside a bloc, the Default scheduler keeps its usual behaviour (prerequisites, parallel tasks, actor and resource availability).
StartStart_Event
Objective 1SubProcess_Task · task graph
Objective 2SubProcess_Task · task graph
Objective nSubProcess_Task · task graph
EndEnd_Event
Element
Where it lives
Built by
Objective bloc
Top-level process (or inside the Nominal SubTask)
wrapIntoSubTask(objectiveName, innerProcess)
Function tasks
Inside the objective bloc
createProcessFromScheduleTask on the objective's own schedule
Conditioned Sequence_Flow (Condition Evaluation of Implies / Supports / Needs, see conditioned links)
Inside the objective bloc, entering the dependent task, plus an otherwise flow to the bloc End_Event and, when a guarded task was placed after a sibling that may be skipped, a bypass flow
NativeBasicBlocPlanner.createProcess, same wiring as RioDefaultPlanner
04 · Walkthrough
IMT Albi Crisis, from the objectives to the sub-tasks
Captured in r-ioda after the CEP rules of the Gas Rapsodee and Intrusion Main Entrance sensors raised two actualities. Launch: header Action → Deduce solution → Deduce solution from one objectives manager, then Native Basic Bloc Satisfaction Strategy Process Deduction.
1 · The Default Objectives Manager plans four objectives treating the two actualities (gas leak at Rapsodee, presence detected at Iomega).2 · The strategy dialog: FIRST_GOOD_SOLUTION, ALL_SOLUTIONS or MY_SOLUTION, and the resource-combination cap.3 · Actuality Management: each actuality with the corrective objectives and the candidate functions that can treat it.4 · The selected objectives summary, kept in sync with the tables above, just before clicking Deduce.5 · The campaign ends with Solution_1_FIRST: COMPLETE, pertinence 97, expertise 100.6 · The Collaborative Process tab shows the published solution; a double-click opens it.7 · Process_1_1: Start → one sub-task per objective, named after it → End.8 · Hovering “Treats Analyze the gas leak” previews its mini-process: cut off the local gas valve, then report the damage.9 · Hovering “Treats Presence detected” previews a six-task mini-process (safety equipment, communications, guard dog round, arrest, event report).
Sub-task (published process)
Expected start
Inner tasks
Treats Presence detected
23:44
Put on safety equipment, Pick up communications equipment, Makes a round with the watchdog, Arrest the suspects with the surveillance dog, Retrieve the guard dog, Event report
Treats Analyze the gas leak
00:00
Cut off the local gas valve, Report the damage
Secured the site
00:04
Establish a security perimeter, Secured the site
Contact the center manager
00:08
Notify the authorities, Contact the center manager
Each bloc starts exactly when the previous one ends. This scenario only raises actualities: no implementation or emerging potentiality is involved, so neither Exception_Flow nor Event_Flow appears in this process.
05 · Combinatorics
Solution modes
FIRST_GOOD_SOLUTION — procedure candidates are reduced to the most pertinent function per objective and only the last, fully specified combination is processed, so a NONE combination cannot silently drop a selected procedure. The campaign stops after the first unique persisted solution, which is also published to the graph.
ALL_SOLUTIONS — every procedure combination, every function plan (Cartesian product of the pertinence-ordered candidates) and every actor/resource assignment is explored; the signature set removes equivalent solutions. numberOfSolutions (−1 = no limit) caps the queued solutions across the whole campaign and ends it once reached.
MY_SOLUTION — a front-end presentation only: one function is picked per objective with radio buttons and the request is sent as FIRST_GOOD_SOLUTION.
Campaign loopdeduce()
combinations = cartesian(group bundles + NONE per group)
start = FIRST_GOOD ? last : 0
for combination in combinations[start:]:
deduceOneCombination(combination) # 4-task pipeline, awaited
if FIRST_GOOD and processed > 0: break
if ALL_SOLUTIONS and queued >= numberOfSolutions: break
report ENDED on the last combination, the first good solution
or when the solutions cap is reached
06 · Runtime
A sequential campaign hosting a four-task pipeline
deduce() returns immediately; a single-thread executor processes the combinations one after another, each through a fixed pool of four tasks linked by two queues closed by poison pills.
TASK 1Progress reporterevery 1 sReconciles generated and persisted counts and emits RUNNING, ENDED or CRASHED; cumulative counters and the solution estimate survive combination boundaries.
TASK 2Plan producer→ plansQueueNative function ranking; pushes the most pertinent plan, then every plan combination in ALL_SOLUTIONS.
QUEUEplansQueue — PlanWithFunctions
TASK 3Solution producer→ solutionQueueSolves each plan with NativeBasicBlocPlanner, which builds the sequential sub-task process; resource shortages become error results, not crashes.
QUEUEsolutionQueue — planned solutions
TASK 4Solution consumerpersistsDeduplicates by signature, stores the solution, emits a ScenarioResult; publishes the model synchronously in first-good mode.
07 · Parameters & UI
What the dialog sends and how it is loaded
satisfactionProperties key
Default
Used for
selectedPlanningSolver
Default
Any other planner is refused (UnsupportedOperationException)
Cap on enumerated resource assignments per main function
numberOfSolutions
−1
Campaign-wide solutions cap in ALL_SOLUTIONS
campaignConfiguration
—
Actualities, emerging/intrinsic and implementation potentialities with their selected functions
activeMoveImprover
false
Runs the “move nodes improver” on each objective bloc: walks along the networks of the site, road trips through Google when its key is set; ignored when the indicators script does not declare Function:distance
activeWaitImprover
false
Then runs the “wait nodes improver” on the same bloc: a wait task where an actor stands idle at least 60 s; ignored when the indicators script does not declare Function:wait
Extension bundle. The dialog lives in the workspace project gind-npm-strategy-deduction-native-basic-bloc-satisfaction (Angular target …-extension). Its form groups: solution mode, caps, Actuality Management, Emerging and Intrinsic Potentiality Management, selected objectives, Implementation Potentiality Management, actor selection mode, move tasks and planning solver. Clicking Deduce closes the dialog at once; FIRST_GOOD_SOLUTION then shows the progress reports, while ALL_SOLUTIONS opens a “Go to campaign” dialog whose Open campaign button launches r-iosepe on the new campaign.
Loading.DeductionStrategyExtensionLoaderService reads deduction-strategy-extensions.json (shipped by gind-webapp-generic-application-users, which also depends on the extension jar) and injects the scripts; the bundle registers itself in window.gindDeductionStrategyExtensions.
Host services. The extension runs its own zoneless Angular application but works on the host's already-initialised services (app, init, modal, core, models, solution and project services) passed through the extension context; it never imports the generic application's app.service.ts.
08 · Watch points
What to keep in mind
Strict sequence
Objective blocs never overlap, even when their resources are independent: total duration is the sum of the blocs, not the critical path of a merged schedule.
Nesting depth
With Event_Flow corrections the structure reaches three levels: Nominal SubTask → objective bloc → recovery sub-process. Consumers must expand structural sub-tasks (getEffectiveTasks).
Pertinence data
Function ranking relies on the pertinence property (0–100) of Satisfies; equal or missing values keep the discovery order.
Extension must stay zoneless
A second NgZone bound to the host's zone raises NG0909 and the dialog is never rendered.
Redeploying the extension
The server serves the jar from its classpath: install the npm module while the server is stopped (a jar overwritten under a running JVM answers HTTP 500 “invalid LOC header”), then force a browser reload of runtime.js and main.js, which are cached.
Planner limitation
Only the Default planner is supported; Choco and Cofiade stay disabled in the dialog.
The dialog filters a copy of embeddedObjectivesManagerModel before deduction. Disabling an actuality row or an emerging/intrinsic preventive row removes its unselected objectives and incident edges, not just the campaign configuration. Objectives still selected through another row remain. A row offering no function is retained so the backend can report the missing solution: absence of a function is not interpreted as a user choice to ignore the objective.
In the Default planner, a selected corrective procedure for an emerging/intrinsic potentiality is also carried when no preventive/enabling procedure was selected. ResourceTaskGraph attaches it at the main objective task as an Event_Flow correction, with recursive and duplicate guards. It is not an ordinary step of the nominal sequence. See conditioned links and r-iota for execution and supervision.
Stratégie de déduction / Native
Native Basic Bloc Satisfaction
Une stratégie de déduction sans règles. Pour chaque objectif, elle retient la fonction la plus pertinente, affecte les acteurs les plus experts, place le graphe de tâches obtenu dans une sous-tâche dédiée à cet objectif et enchaîne ces sous-tâches strictement l’une après l’autre. La campagne explore aussi les combinaisons de procédures préventives et correctives, diffuse des rapports de progression, écarte les solutions en double et câble les reprises Exception_Flow et Event_Flow.
nom de la stratégieNative Basic Bloc Satisfaction Strategy Process Deduction
Un objectif, un bloc basique
Le processus généré n’est pas un graphe ordonnancé à plat : le processus de premier niveau contient une SubProcess_Task par objectif, portant le nom de l’objectif, reliées par des Sequence_Flow dans l’ordre de priorité des objectifs. Chaque sous-tâche contient le graphe de tâches complet de la fonction choisie pour son objectif, avec ses ressources affectées et ses reprises Exception_Flow.
00 · En un coup d’œil
Ce qui entre, ce qui est décidé, ce qui sort
Entrées
Depuis le modèle et le dialogue
L’Objectives_Manager sélectionné et ses arêtes Plans.
Les relations Satisfies (avec sa propriété pertinence), Needs, Implies, Supports, Provides, Consumes du modèle collaboratif.
satisfactionProperties : planificateur, mode de sélection des acteurs, plafond de combinaisons de ressources, nombre maximal de solutions, configuration de campagne (actualités, potentialités émergentes/intrinsèques et d’implémentation avec leurs procédures).
Décisions
Prises nativement
Objectifs : tous les objectifs planifiés sont conservés, sans filtrage.
Fonctions : les candidates ayant au moins un acteur sont triées par pertinence ; la plus pertinente est retenue.
Acteurs : le planificateur Default affecte les ressources et garde la meilleure expertise (aucun classeur injecté).
Procédures : les candidates préventives et correctives sont ordonnées par la pertinence de leur arête Satisfies.
Sorties
Persistées par la campagne
Des solutions de campagne portant Solution → Process → une SubProcess_Task par objectif → Task/Sequence_Flow avec dates attendues et ressources affectées.
Des résultats de progression, de scénario et d’erreur transmis via le rappel de déduction.
En mode « première bonne solution », la première solution unique est aussi publiée dans le graphe en synchrone.
01 · Positionnement
Du dialogue à la campagne
Le dialogue ne fait pas partie des applications hôtes : c’est une extension de stratégie de déduction, un bundle Angular séparé chargé au démarrage et enregistré sous le nom renvoyé par la stratégie backend.
ConfigListe des extensionswebjars/r-io/solution/strategy/extensions/deduction-strategy-extensions.json liste le runtime.js et le main.js du bundle d’extension.UIDialogue d’extensionLe bundle enregistre createNativeBasicBlocSatisfactionStrategyDialog, valeur de getJavascriptFunction() ; l’hôte l’exécute quand la stratégie est choisie.RESTSolutionResourcePOST …/r-ioga/solution/deduceSolutionASync avec les satisfactionProperties.SOAPGovDeductionDeductionImpl.deduceASync trouve le générateur via ServiceLoader.SPINativeBasicBlocSatisfactionProcessGeneratorDéclaré dans META-INF/services/fr.emac.gind.workflow.AbstractProcessGenerator.CampagneNativeBasicBlocSatisfactionStrategyDeductionCampaignCombinaisons, classement natif, pipeline à 4 tâches, dédoublonnage, publication.PlanNativeBasicBlocPlannerAffectation des ressources héritée de RioDefaultPlanner ; construit une sous-tâche séquentielle par objectif.
satisfactionProperties fournit le type de planificateur (Default), le mode de sélection des acteurs (PERSON_FIRST par défaut), le plafond de combinaisons de ressources, le nombre maximal de solutions, l’indicateur d’amélioration par déplacement et la configuration de campagne. La campagne s’arrête tôt quand un objectif n’a aucune ressource impactée.
02
Développer les combinaisons de procédures
Chaque actualité ou potentialité regroupe ses objectifs ; un groupe activé donne une fonction à chacun d’eux (produit cartésien interne) et une alternative NONE est ajoutée par groupe (produit externe). Les fonctions candidates de chaque objectif de procédure sont triées par la pertinence de leur arête Satisfies, lue en une seule requête groupée.
03
Classer les fonctions nativement
Pour chaque objectif, les candidates sont lues par pertinence décroissante ; une candidate est conservée quand au moins un acteur fournit chaque fonction de son graphe. La première candidate conservée est la fonction la plus pertinente de l’objectif ; la liste ordonnée alimente la combinatoire des plans en ALL_SOLUTIONS. Quand aucune candidate ne survit, les pistes de réparation collectées sont rapportées.
04
Affecter acteurs et ressources
NativeBasicBlocPlanner est créé sans ActorCandidateRanker : le RioDefaultPlanner.solve hérité énumère les affectations de ressources avec ResourceAssigner et garde, par objectif, les affectations de meilleure expertise et avec le moins de créneaux d’indisponibilité.
05
Construire un bloc basique par objectif
Pour chaque objectif, dans l’ordre du plan, ses tâches affectées sont ordonnancées seules ; chaque tâche reçoit un démarrage au plus tôt égal à la fin du bloc de l’objectif précédent. Le graphe ordonnancé (avec ses reprises Exception_Flow) devient un processus placé dans une SubProcess_Task portant le nom de l’objectif ; ses indicateurs agrégés sont recopiés sur l’enveloppe.
06
Enchaîner les blocs et câbler les Event_Flow
Le processus de premier niveau relie Start → bloc 1 → bloc 2 → … → End. Quand des potentialités émergentes ou intrinsèques apportent des procédures correctives, toute la chaîne est placée dans une Nominal SubTask ; chaque correction est rattachée par un Event_Flow dont la condition 2L vérifie que l’actualité est active et générée par la potentialité sélectionnée.
07
Valoriser le processus
Les indicateurs sont évalués sur chaque tâche et agrégés sur le processus. Les rapports et indicateurs de campagne (tâches utilisées, expertise, nombres de fonctions et de ressources) déplient les sous-tâches structurelles sans fonction : les enveloppes par objectif ne masquent pas les vraies tâches.
08
Dédupliquer et publier
Un ensemble de signatures à l’échelle de la campagne écarte les solutions équivalentes (mêmes fonctions, acteurs, ressources et procédures, y compris dans les sous-tâches). Les solutions uniques sont stockées via le gestionnaire de campagnes ; en mode FIRST_GOOD_SOLUTION, la première est publiée dans le graphe et la campagne s’arrête.
Pseudo-code de haut niveauNativeBasicBlocPlanner.createProcess
finPrecedente = null
pour solution dans solutionsOrdonneesParObjectif : # ordre du plan / des priorités
taches = solution.graphAssignedTasks
ordo = Scheduler(taches, demarrageAuPlusTot = finPrecedente)
interne = createProcessFromScheduleTask(ordo, taches) # reprises Exception_Flow incluses
bloc = SubProcess_Task(solution.objectif.nom, interne) # indicateurs recopiés sur l’enveloppe
bloc.attendu = [min(tache.debut), max(tache.fin)]
finPrecedente = bloc.attendu.fin
processus = Start -> bloc1 -> bloc2 -> ... -> End
si correctionsEventFlow :
processus = Start -> SubProcess_Task("Nominal SubTask", processus) -> End
+ Event_Flow(nominale -> correction) pour chaque correction
03 · Forme du processus
Des blocs basiques strictement séquentiels
Un bloc d’objectif ne peut démarrer qu’une fois le bloc précédent terminé, même quand leurs ressources ne se chevauchent pas. Dans un bloc, l’ordonnanceur Default garde son comportement habituel (prérequis, tâches parallèles, disponibilité des acteurs et des ressources).
StartStart_Event
Objectif 1SubProcess_Task · graphe de tâches
Objectif 2SubProcess_Task · graphe de tâches
Objectif nSubProcess_Task · graphe de tâches
EndEnd_Event
Élément
Emplacement
Construit par
Bloc d’objectif
Processus de premier niveau (ou dans la Nominal SubTask)
wrapIntoSubTask(nomObjectif, processusInterne)
Tâches de la fonction
Dans le bloc d’objectif
createProcessFromScheduleTask sur l’ordonnancement propre à l’objectif
Dans le bloc d’objectif, entrant dans la tâche dépendante, plus un flux otherwise vers l’End_Event du bloc et, lorsqu’une tâche gardée suit une tâche sœur pouvant être ignorée, un flux de contournement bypass
Processus de premier niveau, depuis la Nominal SubTask
NativeBasicBlocPlanner.createProcess, même câblage que RioDefaultPlanner
04 · Démonstration
IMT Albi Crisis, des objectifs aux sous-tâches
Captures réalisées dans r-ioda après que les règles CEP des capteurs Gas Rapsodee et Intrusion Main Entrance ont levé deux actualités. Lancement : en-tête Action → Deduce solution → Deduce solution from one objectives manager, puis Native Basic Bloc Satisfaction Strategy Process Deduction.
1 · Le Default Objectives Manager planifie quatre objectifs traitant les deux actualités (fuite de gaz à Rapsodee, présence détectée à Iomega).2 · Le dialogue de la stratégie : FIRST_GOOD_SOLUTION, ALL_SOLUTIONS ou MY_SOLUTION, et le plafond de combinaisons de ressources.3 · Actuality Management : chaque actualité avec les objectifs correctifs et les fonctions candidates qui peuvent la traiter.4 · La liste des objectifs sélectionnés, synchronisée avec les tableaux, juste avant de cliquer sur Deduce.5 · La campagne se termine avec Solution_1_FIRST : COMPLETE, pertinence 97, expertise 100.6 · L’onglet Collaborative Process affiche la solution publiée ; un double-clic l’ouvre.7 · Process_1_1 : Start → une sous-tâche par objectif, portant son nom → End.8 · Le survol de « Treats Analyze the gas leak » affiche son mini-processus : couper la vanne de gaz locale, puis signaler les dégâts.9 · Le survol de « Treats Presence detected » affiche un mini-processus de six tâches (équipement de sécurité, communications, ronde avec le chien, interpellation, rapport d’événement).
Sous-tâche (processus publié)
Début attendu
Tâches internes
Treats Presence detected
23:44
Put on safety equipment, Pick up communications equipment, Makes a round with the watchdog, Arrest the suspects with the surveillance dog, Retrieve the guard dog, Event report
Treats Analyze the gas leak
00:00
Cut off the local gas valve, Report the damage
Secured the site
00:04
Establish a security perimeter, Secured the site
Contact the center manager
00:08
Notify the authorities, Contact the center manager
Chaque bloc démarre exactement à la fin du précédent. Ce scénario ne lève que des actualités : aucune potentialité d’implémentation ou émergente n’intervient, ce processus ne contient donc ni Exception_Flow ni Event_Flow.
05 · Combinatoire
Modes de solution
FIRST_GOOD_SOLUTION — les candidates des procédures sont réduites à la fonction la plus pertinente par objectif et seule la dernière combinaison, entièrement spécifiée, est traitée : une combinaison NONE ne peut donc pas écarter en silence une procédure sélectionnée. La campagne s’arrête après la première solution unique persistée, aussi publiée dans le graphe.
ALL_SOLUTIONS — toutes les combinaisons de procédures, tous les plans de fonctions (produit cartésien des candidates ordonnées par pertinence) et toutes les affectations acteurs/ressources sont explorés ; l’ensemble de signatures écarte les solutions équivalentes. numberOfSolutions (−1 = sans limite) plafonne les solutions mises en file sur toute la campagne et la termine une fois atteint.
MY_SOLUTION — une présentation front uniquement : une fonction est choisie par objectif avec des boutons radio et la requête part en FIRST_GOOD_SOLUTION.
Boucle de campagnededuce()
combinaisons = cartesien(bundles de groupe + NONE par groupe)
debut = FIRST_GOOD ? derniere : 0
pour combinaison dans combinaisons[debut:] :
deduceOneCombination(combinaison) # pipeline à 4 tâches, attendu
si FIRST_GOOD et traitees > 0 : arrêt
si ALL_SOLUTIONS et enFile >= numberOfSolutions : arrêt
rapporter ENDED sur la dernière combinaison, la première bonne solution
ou quand le plafond de solutions est atteint
06 · Exécution
Une campagne séquentielle hébergeant un pipeline à quatre tâches
deduce() rend la main immédiatement ; un exécuteur mono-thread traite les combinaisons l’une après l’autre, chacune via un pool fixe de quatre tâches reliées par deux files fermées par des pilules empoisonnées.
TÂCHE 1Rapporteur de progressiontoutes les 1 sRéconcilie compteurs générés et persistés et émet RUNNING, ENDED ou CRASHED ; les compteurs cumulés et l’estimation du nombre de solutions survivent aux frontières de combinaison.
TÂCHE 2Producteur de plans→ plansQueueClassement natif des fonctions ; pousse le plan le plus pertinent, puis toutes les combinaisons de plans en ALL_SOLUTIONS.
FILEplansQueue — PlanWithFunctions
TÂCHE 3Producteur de solutions→ solutionQueueRésout chaque plan avec NativeBasicBlocPlanner, qui construit le processus en sous-tâches séquentielles ; les pénuries de ressources deviennent des résultats d’erreur, pas des crashs.
FILEsolutionQueue — solutions planifiées
TÂCHE 4Consommateur de solutionspersisteDédoublonne par signature, stocke la solution, émet un ScenarioResult ; publie le modèle en synchrone en mode première bonne solution.
07 · Paramètres & UI
Ce que le dialogue envoie et comment il est chargé
Clé de satisfactionProperties
Défaut
Usage
selectedPlanningSolver
Default
Tout autre planificateur est refusé (UnsupportedOperationException)
Plafond d’affectations de ressources énumérées par fonction principale
numberOfSolutions
−1
Plafond de solutions sur toute la campagne en ALL_SOLUTIONS
campaignConfiguration
—
Actualités, potentialités émergentes/intrinsèques et d’implémentation avec leurs fonctions sélectionnées
activeMoveImprover
false
Exécute le « move nodes improver » sur chaque bloc d’objectif : marche le long des réseaux du site, trajets routiers par Google si sa clé est configurée ; ignoré si le script d’indicateurs ne déclare pas Function:distance
activeWaitImprover
false
Exécute ensuite le « wait nodes improver » sur le même bloc : une tâche d’attente là où un acteur reste inactif au moins 60 s ; ignoré si le script d’indicateurs ne déclare pas Function:wait
Bundle d’extension. Le dialogue vit dans le projet du workspace gind-npm-strategy-deduction-native-basic-bloc-satisfaction (cible Angular …-extension). Son formulaire regroupe : mode de solution, plafonds, Actuality Management, Emerging and Intrinsic Potentiality Management, objectifs sélectionnés, Implementation Potentiality Management, mode de sélection des acteurs, tâches de déplacement et planificateur. Un clic sur Deduce ferme aussitôt le dialogue ; FIRST_GOOD_SOLUTION affiche ensuite les rapports de progression, tandis qu’ALL_SOLUTIONS ouvre un dialogue « Go to campaign » dont le bouton Open campaign lance r-iosepe sur la nouvelle campagne.
Chargement.DeductionStrategyExtensionLoaderService lit deduction-strategy-extensions.json (livré par gind-webapp-generic-application-users, qui dépend aussi du jar de l’extension) et injecte les scripts ; le bundle s’enregistre dans window.gindDeductionStrategyExtensions.
Services de l’hôte. L’extension exécute sa propre application Angular sans zone mais travaille sur les services déjà initialisés de l’hôte (services app, init, modal, core, models, solution et project) transmis par le contexte d’extension ; elle n’importe jamais le app.service.ts de l’application générique.
08 · Points de vigilance
À garder en tête
Séquence stricte
Les blocs d’objectifs ne se chevauchent jamais, même quand leurs ressources sont indépendantes : la durée totale est la somme des blocs, pas le chemin critique d’un ordonnancement fusionné.
Profondeur d’imbrication
Avec des corrections Event_Flow, la structure atteint trois niveaux : Nominal SubTask → bloc d’objectif → sous-processus de reprise. Les consommateurs doivent déplier les sous-tâches structurelles (getEffectiveTasks).
Données de pertinence
Le classement des fonctions repose sur la propriété pertinence (0–100) de Satisfies ; des valeurs égales ou absentes conservent l’ordre de découverte.
L’extension doit rester sans zone
Une seconde NgZone liée à la zone de l’hôte lève NG0909 et le dialogue ne s’affiche jamais.
Redéployer l’extension
Le serveur sert le jar depuis son classpath : installer le module npm serveur arrêté (un jar écrasé sous une JVM en cours répond HTTP 500 « invalid LOC header »), puis forcer le rechargement de runtime.js et main.js dans le navigateur, qui les met en cache.
Limitation du planificateur
Seul le planificateur Default est pris en charge ; Choco et Cofiade restent désactivés dans le dialogue.
NativeBasicBlocSatisfactionProcessGenerator.javaEntrée SPI de la stratégie.
NativeBasicBlocSatisfactionStrategyDeductionCampaign.javaParamètres, combinaisons, classement natif, pipeline à quatre tâches, plafond de solutions, publication.
NativeBasicBlocPlanner.javaOrdonnancement par objectif, enveloppe en sous-tâche, enchaînement séquentiel, câblage Event_Flow.
gind-governance-workflow-planner-default/…/RioDefaultPlanner.javaAffectation des ressources, conversion ordonnancement → processus, reprises Exception_Flow.
gind-governance-workflow-deduction-strategy-abstract/…/AbstractDeductionStrategy.javaRapports et indicateurs de campagne, getEffectiveTasks.
gind-npm-strategy-deduction-native-basic-bloc-satisfaction/src/Entrée de l’extension, composant de dialogue, service, jeton des services de l’hôte.
gind-webapp-generic-application-users/…/deduction-strategy-extensions.jsonScripts chargés par les applications hôtes.
Les objectifs décochés quittent réellement la requête
Le dialogue filtre une copie de embeddedObjectivesManagerModel avant la déduction. Désactiver une ligne d’actualité ou une ligne préventive émergente/intrinsèque retire ses objectifs non sélectionnés et les arêtes incidentes, pas seulement la configuration de campagne. Les objectifs encore sélectionnés par une autre ligne restent présents. Une ligne ne proposant aucune fonction est conservée pour que le backend signale l’absence de solution : ce manque n’est pas interprété comme un choix d’ignorer l’objectif.
Dans le planificateur Default, une procédure corrective sélectionnée pour une potentialité émergente/intrinsèque est également portée lorsqu’aucune procédure préventive/permissive n’a été choisie. ResourceTaskGraph la rattache à la tâche principale de l’objectif comme correction Event_Flow, avec protections contre récursion et doublons. Ce n’est pas une étape ordinaire de la séquence nominale. Voir les liens conditionnés et r-iota pour l’exécution et la supervision.