r-io suiter-io suitededuction docs
← All strategies
Deduction strategy / Native

Native Basic Bloc Satisfaction

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 SolutionProcess → 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.
02 · Pipeline

The decision path, step by step

Entry point: doDeduceProcessFromOneObjectivesManager(campaign, mode, collaboration, knowledgeSpace, objectivesManager, data, project, resultsQueue).

01

Read the execution parameters

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.

High-level pseudo-codeNativeBasicBlocPlanner.createProcess
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
ElementWhere it livesBuilt by
Objective blocTop-level process (or inside the Nominal SubTask)wrapIntoSubTask(objectiveName, innerProcess)
Function tasksInside the objective bloccreateProcessFromScheduleTask on the objective's own schedule
Exception_Flow recovery (implementation potentiality)Inside the objective bloc, attached to its taskResourceTaskGraph · Task.tryCatchCorrections
Event_Flow correction (emerging / intrinsic potentiality)Top-level process, from the Nominal SubTaskNativeBasicBlocPlanner.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 ActionDeduce solutionDeduce solution from one objectives manager, then Native Basic Bloc Satisfaction Strategy Process Deduction.

Sub-task (published process)Expected startInner tasks
Treats Presence detected23:44Put 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 leak00:00Cut off the local gas valve, Report the damage
Secured the site00:04Establish a security perimeter, Secured the site
Contact the center manager00:08Notify 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.
QUEUEplansQueuePlanWithFunctions
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 keyDefaultUsed for
selectedPlanningSolverDefaultAny other planner is refused (UnsupportedOperationException)
actorsSelectionModePERSON_FIRSTPERSON_FIRST, GROUP_FIRST, ONLY_PERSON, ONLY_GROUP
numberOfResourceCombinations30 (first good) · −1 (all)Cap on enumerated resource assignments per main function
numberOfSolutions−1Campaign-wide solutions cap in ALL_SOLUTIONS
campaignConfigurationActualities, emerging/intrinsic and implementation potentialities with their selected functions
activeMoveImproverfalseRuns the “move nodes improver” on each objective bloc (requires a Google API key)
objectivesManager · embeddedObjectivesManagerModelRoot of the deduction

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.

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.

09 · Sources

Where to continue reading

Backend module java/backend/gind-governance/gind-governance-workflow-deduction-strategy-native-basic-bloc-satisfaction, package fr.emac.gind.workflow.deduction.

NativeBasicBlocSatisfactionProcessGenerator.javaSPI entry of the strategy.
NativeBasicBlocSatisfactionStrategyDeductionCampaign.javaParameters, combinations, native ranking, four-task pipeline, solutions cap, publication.
NativeBasicBlocPlanner.javaPer-objective scheduling, sub-task wrapping, sequential chaining, Event_Flow wiring.
gind-governance-workflow-planner-default/…/RioDefaultPlanner.javaResource assignment, schedule-to-process conversion, Exception_Flow recoveries.
gind-governance-workflow-deduction-strategy-abstract/…/AbstractDeductionStrategy.javaReports and campaign indicators, getEffectiveTasks.
gind-npm-strategy-deduction-native-basic-bloc-satisfaction/src/Extension entry, dialog component, service, host-service token.
gind-webapp-generic-application-users/…/deduction-strategy-extensions.jsonScripts loaded by the host applications.
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 SolutionProcess → 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.
02 · Pipeline

Le chemin de décision, étape par étape

Point d’entrée : doDeduceProcessFromOneObjectivesManager(campaign, mode, collaboration, knowledgeSpace, objectivesManager, data, project, resultsQueue).

01

Lire les paramètres d’exécution

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émentEmplacementConstruit par
Bloc d’objectifProcessus de premier niveau (ou dans la Nominal SubTask)wrapIntoSubTask(nomObjectif, processusInterne)
Tâches de la fonctionDans le bloc d’objectifcreateProcessFromScheduleTask sur l’ordonnancement propre à l’objectif
Reprise Exception_Flow (potentialité d’implémentation)Dans le bloc d’objectif, attachée à sa tâcheResourceTaskGraph · Task.tryCatchCorrections
Correction Event_Flow (potentialité émergente / intrinsèque)Processus de premier niveau, depuis la Nominal SubTaskNativeBasicBlocPlanner.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 ActionDeduce solutionDeduce solution from one objectives manager, puis Native Basic Bloc Satisfaction Strategy Process Deduction.

Sous-tâche (processus publié)Début attenduTâches internes
Treats Presence detected23:44Put 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 leak00:00Cut off the local gas valve, Report the damage
Secured the site00:04Establish a security perimeter, Secured the site
Contact the center manager00:08Notify 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.
FILEplansQueuePlanWithFunctions
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 satisfactionPropertiesDéfautUsage
selectedPlanningSolverDefaultTout autre planificateur est refusé (UnsupportedOperationException)
actorsSelectionModePERSON_FIRSTPERSON_FIRST, GROUP_FIRST, ONLY_PERSON, ONLY_GROUP
numberOfResourceCombinations30 (première bonne) · −1 (toutes)Plafond d’affectations de ressources énumérées par fonction principale
numberOfSolutions−1Plafond de solutions sur toute la campagne en ALL_SOLUTIONS
campaignConfigurationActualités, potentialités émergentes/intrinsèques et d’implémentation avec leurs fonctions sélectionnées
activeMoveImproverfalseExécute le « move nodes improver » sur chaque bloc d’objectif (clé Google API requise)
objectivesManager · embeddedObjectivesManagerModelRacine de la déduction

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.

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.

09 · Sources

Où poursuivre la lecture

Module backend java/backend/gind-governance/gind-governance-workflow-deduction-strategy-native-basic-bloc-satisfaction, package fr.emac.gind.workflow.deduction.

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.