diff --git a/GUIDE-USAGE.md b/GUIDE-USAGE.md
index e606c56..76b4238 100644
--- a/GUIDE-USAGE.md
+++ b/GUIDE-USAGE.md
@@ -384,6 +384,178 @@ redondance d’appartenance à la cible de la soirée.
Retenir n’est pas obligatoire, mais tout ce qui s’imprime sans placement retenu
porte la mention BROUILLON (étape 12).
+### La page « Qualité »
+
+Avant de retenir, la section « Qualité » dit si un placement est bon, et qui
+y est mal servi. La commande « Qualité » de chaque ligne du tableau classé
+montre la proposition sur le plan et ouvre la page ; sans proposition
+montrée, la page mesure le placement retenu. Sa première ligne dit toujours
+quel placement elle mesure. Regarder la page n’écrit rien : elle se lit en
+lecture comme en écriture.
+
+Chaque graphique a son tableau jumeau, que « Voir le tableau » ouvre : les
+mêmes nombres, ligne par ligne, au clavier et au lecteur d’écran. Un
+pourcentage est toujours suivi du compte qu’il résume : le pire cas d’une
+population, ou le compte de sa ligne.
+
+Les écrans de la grande démonstration viennent d’une génération faite avec
+la graine 4242 et un compte d’arrêt de 2 000 ; ceux de la petite
+démonstration, avec la graine 4242 et le compte d’arrêt par défaut ; les
+autres, avec la graine 4242 et un compte d’arrêt de 300.
+
+
+
+*Le profil trié de la première proposition de la grande démonstration. En
+haut, en comptes de personnes : les rencontres de chacun en trait plein, de
+la personne la moins servie, à gauche, à la mieux servie ; les appartenances
+rencontrées en tirets ; le plafond réalisé en trait mixte et la borne de
+diversité en pointillés, chacun nommé au bout de son tracé. Les triangles
+marquent les personnes ancrées par une réservation. Dessous, au même ordre
+de rangs, les rencontres de chacun en pourcentage de son plafond réalisé,
+sous la règle à 100 % ; le bas de ce second graphique sort de l’image.
+Le pire cas est au premier rang des deux graphiques.*
+
+
+
+*Les collisions d’appartenance de la variante « conflit inévitable » : une
+barre par appartenance, le plus grand excédent d’abord. Pour
+l’appartenance de cinq personnes, à quatre tables, le segment gris « prouvé
+inévitable » vaut 4 collisions cumulées, le plancher que le diagnostic
+annonce ; le segment bleu « reste » est ce que la recherche aurait pu
+éviter. L’effectif, les paires distinctes et l’excédent suivent en encre
+secondaire.*
+
+
+
+*Les appartenances à chaque table, même proposition. Le sélecteur est sur
+« appartenances par siège » : une ligne par table, une colonne par tour, et
+chaque case écrit le nombre de sièges qui n’apportent aucune appartenance
+nouvelle à leur table ; sa couleur fonce avec lui. La pire table vient en
+tête, une table qui n’en a aucun à aucun tour, en dernier. Les deux autres
+positions comptent les personnes assises, puis les doublons parmi les
+personnes d’une appartenance ; le choix tient le temps de la séance, et
+n’écrit rien.*
+
+
+
+*Les paires répétées d’une soirée construite de 12 personnes, 4 tables de
+3 places et 6 tours, où se revoir est forcé : les paires les plus revues
+d’abord. « Voir au tour … » montre le plan au premier tour où la paire se
+revoit ; chaque tour et sa table sont aussi une commande vers le plan.*
+
+
+
+*La fiche d’une personne de la même soirée, sa rubrique « Rencontres » : qui
+elle a rencontré, combien de fois, à quels tours et à quelles tables, les
+plus revues d’abord. Ses rencontres de plus d’une fois sont ses lignes du
+tableau des paires.*
+
+
+
+*Sur la grande démonstration, la matrice « qui a rencontré qui » n’est pas
+dessinée : 260 personnes dépassent son seuil, et la phrase renvoie à la
+fiche de chaque personne. Au-dessus, la fin du tableau des paires
+répétées.*
+
+
+
+*Les objectifs des tables de la « Soirée d’essai », changée depuis
+l’étape 9 et générée de nouveau : d’abord les personnes jamais servies —
+aucune ici —, puis la soirée en texte, sa part des tours possibles servis
+et, dessous, le compte des jamais servies ; puis une barre par tour, le tour
+au plus grand reste en tête, chacune avec ses assis sans table possible en
+encre secondaire ; enfin chaque tour, son pourcentage et ses deux comptes.
+En haut à droite, un avertissement rappelle que le placement retenu et les
+propositions d’avant le changement ne décrivent plus la soirée : ils sont
+gardés.*
+
+
+
+*Les animateurs rencontrés sur la grande démonstration : chaque personne
+concernée, de la moins servie à la mieux servie, sous la borne des
+animateurs en pointillés — ce que la soirée permet au mieux, sans garantie.
+Dessous commence la diversité par animateur : aucune personne présente ne
+porte d’étiquette, et seule la colonne des appartenances se dessine.*
+
+
+
+*La performance du calcul de la proposition montrée, dans la séance qui l’a
+générée : les mouvements évalués sur le compte d’arrêt, puis la durée
+observée, les cœurs, la cadence et le nombre de propositions de la
+génération entière. Chaque petit multiple porte une valeur aux seuls points
+de relevé — après 1, 10, 100 et 1 000 mouvements, puis au dernier, la
+proposition elle-même —, sur une abscisse logarithmique ; entre deux
+points, rien n’est mesuré. Ici, plusieurs valeurs changent encore au
+dernier point ; la phrase qui nomme le dernier changement suit les petits
+multiples, plus bas, hors de l’image. Rouvert plus tard, l’événement garde
+la course, et la durée devient « inconnue » : elle ne valait que pour la
+séance.*
+
+
+
+*Le bas de l’en-tête chiffré, sur la petite démonstration générée au compte
+d’arrêt par défaut : la diversité d’appartenance, aucun manque, et « minimum
+atteint ». Plus haut, hors de l’image, les collisions cumulées et les
+rencontres répétées valent 0, et la ligne des ancrés écrit « — » : la
+démonstration n’a aucune réservation, et une population vide n’a pas de
+minimum.*
+
+#### Quand il n’y a rien à dessiner
+
+La page ne dessine jamais d’axes vides : un cas qui n’a rien à montrer le
+dit par une phrase. Chacun des sept écrans suivants vient de sa propre
+configuration : la variante « conflit inévitable », ou une courte soirée
+construite à la main.
+
+
+
+*Aucun placement : la variante « conflit inévitable », avant toute
+génération. La page dit qu’il n’y a rien à mesurer, et montre le diagnostic
+préalable : au moins 4 collisions cumulées pour l’appartenance de cinq
+personnes, à quatre tables.*
+
+
+
+*Une seule table de six places, six personnes, trois tours : chacun y
+rencontre tous les autres. Le profil, les collisions, les appartenances à
+chaque table et les paires cèdent chacun la place à sa phrase.*
+
+
+
+*Un seul tour, douze personnes à trois tables de quatre : le profil et les
+collisions se dessinent plus haut, hors de l’image ; la vue des tables, son
+sélecteur sur « appartenances par siège », n’a qu’une colonne, et aucune
+paire ne peut se revoir.*
+
+
+
+*Douze personnes d’une même appartenance : le profil n’a qu’une série, les
+rencontres, sans borne de diversité, et sa phrase le dit. Les collisions et
+la grille des tables restent, plus bas.*
+
+
+
+*Neuf personnes de neuf appartenances, trois tables de trois, deux tours :
+aucune collision, et la phrase le dit. La grille, sous « appartenances par
+siège », écrit 0 dans chaque case.*
+
+
+
+*La variante, sa première proposition retenue, puis une personne retirée du
+tour 2 sur le plan : le carré la marque, dans les deux graphiques du
+profil, en réserve à un tour au moins. Plus bas, hors de l’image, les
+collisions n’ont plus qu’un segment : le plancher du diagnostic ne vaut que
+pour un plan qui assoit chacun à chaque tour, et une phrase le dit.*
+
+
+
+*Cinq personnes, une table de quatre et une de deux, deux tours ; quatre
+sont réservées à la table de quatre. La cinquième, assise seule à la table
+de deux, ne peut rencontrer personne : son plafond réalisé est nul. Au
+premier rang du profil, son infobulle écrit le plafond réalisé 0 et le
+pourcentage « — » ; au second graphique, plus bas, ce rang n’a pas de
+point.*
+
## Étape 11 — Ajuster à la main
Sur le placement retenu, le geste de l’étape 7 déplace maintenant une personne
@@ -496,7 +668,10 @@ même plan diffèrent, et pourquoi relancer aide parfois, et parfois jamais.
Asseoir chacun, à chaque tour, de sorte que la personne la plus mal servie
rencontre le plus de monde possible. C’est l’objectif de l’ordre par défaut ;
vous pouvez en ranger d’autres devant, dans l’ordre des priorités de la
-section « Génération ».
+section « Génération ». Le profil trié de la page « Qualité » range les
+personnes de la moins servie à la mieux servie
+([le profil trié](doc/captures/12-qualite-profil.png)) : la plus mal servie
+est au premier rang.
### Pourquoi il n’a pas de réponse évidente
@@ -522,6 +697,16 @@ n’est « le bon ». La même graine, sur la même configuration et les mêmes
réglages, redonne exactement les mêmes propositions ; une autre graine en donne
d’autres. Cette phrase est vérifiée par une épreuve du logiciel.
+La page « Qualité » montre la course d’une recherche
+([la performance du calcul](doc/captures/15c-qualite-performance.png)) :
+chaque valeur de la proposition, mesurée sur le meilleur placement trouvé
+après un, dix, cent, mille mouvements, et ainsi de suite, puis au dernier.
+Quand plus rien ne change pendant les derniers relevés, la recherche est sur
+un plateau, et relancer plus longtemps la même graine a peu de chances
+d’aider ; quand une valeur change encore au dernier point, comme sur cet
+écran, un compte d’arrêt plus grand peut faire mieux. La page ne dit rien
+des mouvements que la recherche n’a pas essayés.
+
### Ce que font les contraintes
« Séparer les appartenances », « Nouveaux voisins à chaque tour », « Nouvelle
@@ -553,6 +738,10 @@ jamais : son diagnostic prouve, avant toute recherche, que des personnes
finiront sous leur plafond a priori — c’est le plancher de l’écart
d’itinéraire.
+La page « Qualité » l’écrit sous son en-tête chiffré
+([« minimum atteint » sur la petite démonstration](doc/captures/16-minimum-atteint.png)),
+avec les compteurs mesurés de la proposition.
+
Son absence ne dit pas qu’un meilleur placement existe. « Atteignabilité
inconnue » dit que le logiciel ne sait pas si mieux est possible.
@@ -593,7 +782,8 @@ atteignent le même minimum, c’est le plus souvent qu’une borne le tient, et
relancer n’y changera rien. C’est **un indice, pas une preuve**. Le plafond a
priori, que le diagnostic affiche, le dit d’un coup d’œil : quand le minimum
d’une proposition l’égale, c’est la borne qui le tient, et aucune relance ne
-fera mieux.
+fera mieux. Sur la page « Qualité », la tuile du minimum porte ce plafond à
+côté du minimum, pour la personne au premier rang du profil.
## Annexe A — Les réglages et leurs valeurs par défaut
diff --git a/README.md b/README.md
index faa8e90..339eebb 100644
--- a/README.md
+++ b/README.md
@@ -81,10 +81,11 @@ sur les captures.
| Jeton | Rôle | Seuil | Thème clair | Capture | Thème sombre | Capture |
|---|---|---|---|---|---|---|
+| `--couleur-action-encre` | texte | 4,5 | 8,29 | 14-qualite-paires | 9,62 | 14-qualite-paires |
| `--couleur-action-texte` | texte | 4,5 | — | — | 8,45 | 01-premier-ecran |
| `--couleur-avis` | texte | 4,5 | 6,58 | 03-import-rapport | 8,93 | 03-import-rapport |
| `--couleur-bandeau-fond` | texte | 4,5 | 15,94 | 01-premier-ecran | 12,84 | 01-premier-ecran |
-| `--couleur-bandeau-texte` | texte | 4,5 | 6,09 | 01-premier-ecran | 12,84 | 01-premier-ecran |
+| `--couleur-bandeau-texte` | texte | 4,5 | 5,85 | 13a-qualite-tables | 12,84 | 01-premier-ecran |
| `--couleur-bandeau-texte-secondaire` | texte | 4,5 | 9,05 | 01-premier-ecran | 7,60 | 01-premier-ecran |
| `--couleur-chaise-pleine` | marque | 3 | 15,09 | 07a-cibles-sieges | 14,94 | 07a-cibles-sieges |
| `--couleur-chaise-trait` | marque | 3 | 7,44 | 07-plan-tables | 8,13 | 22-plan-brouillon |
@@ -93,12 +94,25 @@ sur les captures.
| `--couleur-echelle` | marque | 3 | 14,82 | 07-plan-tables | 14,62 | 07-plan-tables |
| `--couleur-fantome` | marque | 3 | 4,34 | 19-ajustement | 4,10 | 19-ajustement |
| `--couleur-filigrane` | marque | 3 | 5,10 | 22-plan-brouillon | 5,10 | 22-plan-brouillon |
+| `--couleur-graphique-axe` | marque | 3 | 5,64 | 12-qualite-profil | 5,38 | 12-qualite-profil |
+| `--couleur-graphique-bordure-case` | marque | 3 | 4,78 | 12c-qualite-un-tour | 5,38 | 12c-qualite-un-tour |
+| `--couleur-graphique-borne` | marque | 3 | 3,93 | 12g-qualite-plafond-nul | 4,96 | 12g-qualite-plafond-nul |
+| `--couleur-graphique-encre-claire` | texte | 4,5 | — | — | 6,03 | 13a-qualite-tables |
+| `--couleur-graphique-encre-foncee` | texte | 4,5 | 5,43 | 12c-qualite-un-tour | — | — |
+| `--couleur-graphique-marque` | marque | 3 | 9,67 | 12-qualite-profil | 10,64 | 12-qualite-profil |
+| `--couleur-graphique-niveau-1` | marque | 3 | 3,46 | 12c-qualite-un-tour | 3,31 | 12c-qualite-un-tour |
+| `--couleur-graphique-niveau-2` | marque | 3 | 5,85 | 13a-qualite-tables | 5,35 | 13a-qualite-tables |
+| `--couleur-graphique-prouve` | marque | 3 | 4,23 | 13-qualite-collisions | 5,12 | 13-qualite-collisions |
+| `--couleur-graphique-repere` | marque | 3 | 6,15 | 12-qualite-profil | 7,01 | 12-qualite-profil |
+| `--couleur-graphique-reste` | marque | 3 | 5,10 | 13-qualite-collisions | 6,89 | 13-qualite-collisions |
+| `--couleur-graphique-serie-1` | marque | 3 | 5,10 | 12-qualite-profil | 6,89 | 12-qualite-profil |
+| `--couleur-graphique-serie-2` | marque | 3 | 4,53 | 12g-qualite-plafond-nul | 6,29 | 12g-qualite-plafond-nul |
| `--couleur-hachure` | marque | 3 | 16,48 | 08-animateurs-designes | 15,21 | 08-animateurs-designes |
| `--couleur-liste-texte` | texte | 4,5 | 14,82 | 07-plan-tables | — | — |
| `--couleur-marque` | marque | 3 | 3,63 | 07a-cibles-sieges | 3,50 | 07a-cibles-sieges |
| `--couleur-page-texte` | texte | 4,5 | 13,78 | 01b-passer-en-ecriture | 11,02 | 11-propositions |
| `--couleur-page-texte-secondaire` | texte | 4,5 | 5,57 | 01-premier-ecran | 6,72 | 01b-passer-en-ecriture |
-| `--couleur-papier` | texte | 4,5 | — | — | 13,44 | 22-plan-brouillon |
+| `--couleur-papier` | texte | 4,5 | — | — | 5,00 | 12c-qualite-un-tour |
| `--couleur-pastille-fond` | marque | 3 | 13,44 | 19-ajustement | 11,62 | 19-ajustement |
| `--couleur-pastille-texte` | texte | 4,5 | — | — | 14,51 | 19-ajustement |
| `--couleur-poignee` | marque | 3 | 7,44 | 07-plan-tables | 11,32 | 07-plan-tables |
@@ -139,9 +153,9 @@ l'exécution elle-même —, son statut et la façon de le relever. Une valeur a
| `MARGE_PAGE_MM` | marge de chaque bord d'une page imprimée par l'aperçu | 10 mm | défaut de travail | manuel | marge non imprimable mesurée sur chaque imprimante visée (une page de filets à 1 mm d'écart, lue à la règle) ; la plus grande, écrite dans ce registre | — | imprimantes visées, chaque papier des sorties |
| `HAUTEUR_BANDE_IMPRESSION` | hauteur de ce que porte une feuille imprimée hors de sa zone de contenu : pied, mentions, barre, cartouche | relevée à l’exécution | mesurée | exécution | mesurée à l'ouverture de l'aperçu : tout ce qu'une feuille porte hors de [data-contenu] ; aucune valeur n'est écrite dans ce registre | — | rendu de l'aperçu, relevé à chaque ouverture |
| `TOLERANCE_CHAINE_TEMOIN` | écart relatif admis entre la longueur rendue de la chaîne témoin et celle que donnent les avances de la police | 0,011 rapport | mesurée | banc | banc de mesure : le quart de l'écart relatif entre la police embarquée et une famille de repli forcée, et au moins trois fois la gigue de dix mesures, chaîne témoin à 16 px, crénage et ligatures coupés ; arrondi par excès à deux chiffres significatifs, écrit dans ce registre | 0,011 rapport | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur non ralenti, police Noto Sans |
-| `RALENTISSEMENT_PLEINE_CHARGE` | ralentissement d'une génération quand tous les processeurs logiques travaillent, t(L) / t(1) | 2 × | défaut de travail | banc | banc de mesure : durée d'une même génération sur un travailleur, puis sur L travailleurs ; le rapport ρ des médianes, écrit dans ce registre | 2,79 × | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur non ralenti, police Noto Sans |
-| `SEUIL_MATRICE_PARTICIPANTS` | nombre de participants au-delà duquel une case de la matrice « qui a rencontré qui » tombe sous la cible de 24 px dans la largeur de la carte, au cadre fixé | 40 participants | défaut de travail | banc | banc de mesure, cadre de 1 366 × 700 px : le plus grand nombre de participants dont la case de la matrice tient 24 px dans la largeur de la carte de la vue, noms en tête compris, relevé sur le rendu ; la valeur proposée, adoptée à la main dans ce registre | non relevée | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur ralenti ×4, police Noto Sans |
-| `LARGEUR_TRONCATURE_NOM_PX` | largeur à laquelle un nom se tronque dans une étiquette de graphique | 180 px | défaut de travail | banc | banc de mesure, police Noto Sans : la largeur rendue d'un nom de 14 caractères, chacun le glyphe le plus large de l'alphabet visé, au corps des étiquettes de graphique, dans la marge gauche d'une vue à barres — jamais un nom de démonstration ; arrondie au pixel supérieur, adoptée à la main dans ce registre | non relevée | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur ralenti ×4, police Noto Sans |
+| `RALENTISSEMENT_PLEINE_CHARGE` | ralentissement d'une génération quand tous les processeurs logiques travaillent, t(L) / t(1) | 2 × | défaut de travail | banc | banc de mesure : durée d'une même génération sur un travailleur, puis sur L travailleurs ; le rapport ρ des médianes, écrit dans ce registre | 2,98 × | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur non ralenti, police Noto Sans |
+| `SEUIL_MATRICE_PARTICIPANTS` | nombre de participants au-delà duquel une case de la matrice « qui a rencontré qui » tombe sous la cible de 24 px dans la largeur de la carte, au cadre fixé | 40 participants | défaut de travail | banc | banc de mesure, cadre de 1 366 × 700 px : le plus grand nombre de participants dont la case de la matrice tient 24 px dans la largeur de la carte de la vue, noms en tête compris, relevé sur le rendu ; la valeur proposée, adoptée à la main dans ce registre | 44 participants | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur non ralenti, police Noto Sans |
+| `LARGEUR_TRONCATURE_NOM_PX` | largeur à laquelle un nom se tronque dans une étiquette de graphique | 180 px | défaut de travail | banc | banc de mesure, police Noto Sans : la largeur rendue d'un nom de 14 caractères, chacun le glyphe le plus large de l'alphabet visé, au corps des étiquettes de graphique, dans la marge gauche d'une vue à barres — jamais un nom de démonstration ; arrondie au pixel supérieur, adoptée à la main dans ce registre | 168 px | cadre de 1 366 × 700 px, facteur 1, Chromium 153.0.8010.12, Node v26.10.0, 16 processeurs logiques, processeur non ralenti, police Noto Sans |
diff --git a/doc/captures/12-qualite-profil.png b/doc/captures/12-qualite-profil.png
new file mode 100644
index 0000000..76e5f77
Binary files /dev/null and b/doc/captures/12-qualite-profil.png differ
diff --git a/doc/captures/12a-qualite-sans-placement.png b/doc/captures/12a-qualite-sans-placement.png
new file mode 100644
index 0000000..b68cb0e
Binary files /dev/null and b/doc/captures/12a-qualite-sans-placement.png differ
diff --git a/doc/captures/12b-qualite-une-table.png b/doc/captures/12b-qualite-une-table.png
new file mode 100644
index 0000000..bb33901
Binary files /dev/null and b/doc/captures/12b-qualite-une-table.png differ
diff --git a/doc/captures/12c-qualite-un-tour.png b/doc/captures/12c-qualite-un-tour.png
new file mode 100644
index 0000000..047a820
Binary files /dev/null and b/doc/captures/12c-qualite-un-tour.png differ
diff --git a/doc/captures/12d-qualite-une-appartenance.png b/doc/captures/12d-qualite-une-appartenance.png
new file mode 100644
index 0000000..01c9cd8
Binary files /dev/null and b/doc/captures/12d-qualite-une-appartenance.png differ
diff --git a/doc/captures/12e-qualite-sans-collision.png b/doc/captures/12e-qualite-sans-collision.png
new file mode 100644
index 0000000..0a66193
Binary files /dev/null and b/doc/captures/12e-qualite-sans-collision.png differ
diff --git a/doc/captures/12f-qualite-reserve.png b/doc/captures/12f-qualite-reserve.png
new file mode 100644
index 0000000..dfa465f
Binary files /dev/null and b/doc/captures/12f-qualite-reserve.png differ
diff --git a/doc/captures/12g-qualite-plafond-nul.png b/doc/captures/12g-qualite-plafond-nul.png
new file mode 100644
index 0000000..ecaf7ec
Binary files /dev/null and b/doc/captures/12g-qualite-plafond-nul.png differ
diff --git a/doc/captures/13-qualite-collisions.png b/doc/captures/13-qualite-collisions.png
new file mode 100644
index 0000000..c366477
Binary files /dev/null and b/doc/captures/13-qualite-collisions.png differ
diff --git a/doc/captures/13a-qualite-tables.png b/doc/captures/13a-qualite-tables.png
new file mode 100644
index 0000000..2b3e81f
Binary files /dev/null and b/doc/captures/13a-qualite-tables.png differ
diff --git a/doc/captures/14-qualite-paires.png b/doc/captures/14-qualite-paires.png
new file mode 100644
index 0000000..46c21fa
Binary files /dev/null and b/doc/captures/14-qualite-paires.png differ
diff --git a/doc/captures/14a-fiche-rencontres.png b/doc/captures/14a-fiche-rencontres.png
new file mode 100644
index 0000000..922bfc1
Binary files /dev/null and b/doc/captures/14a-fiche-rencontres.png differ
diff --git a/doc/captures/15-pas-de-matrice.png b/doc/captures/15-pas-de-matrice.png
new file mode 100644
index 0000000..5302f34
Binary files /dev/null and b/doc/captures/15-pas-de-matrice.png differ
diff --git a/doc/captures/15a-qualite-objectifs.png b/doc/captures/15a-qualite-objectifs.png
new file mode 100644
index 0000000..efd5c79
Binary files /dev/null and b/doc/captures/15a-qualite-objectifs.png differ
diff --git a/doc/captures/15b-qualite-animateurs.png b/doc/captures/15b-qualite-animateurs.png
new file mode 100644
index 0000000..a2ce746
Binary files /dev/null and b/doc/captures/15b-qualite-animateurs.png differ
diff --git a/doc/captures/15c-qualite-performance.png b/doc/captures/15c-qualite-performance.png
new file mode 100644
index 0000000..8f32763
Binary files /dev/null and b/doc/captures/15c-qualite-performance.png differ
diff --git a/doc/captures/16-minimum-atteint.png b/doc/captures/16-minimum-atteint.png
new file mode 100644
index 0000000..35b281a
Binary files /dev/null and b/doc/captures/16-minimum-atteint.png differ
diff --git a/doc/captures/manifeste.json b/doc/captures/manifeste.json
index fefd4cc..d65fabd 100644
--- a/doc/captures/manifeste.json
+++ b/doc/captures/manifeste.json
@@ -19,6 +19,23 @@
{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"5109fd63a112340134205ad495233ed17d9d2de83b790b1eae38f974a97e85c6","etape":"8","etat":"4d37d30748068354162752743c26aa7e0ab00d6e9b2aa1996b6f9fb410848280","facteurEchelle":1,"fichier":"10-diagnostic","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"633949b83c1d50135c859dad6dfd1815d54d0121963d86c7ff25c26a44904d2f"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Diagnostic","Tout l'événement","écart d'itinéraire maximal : plancher 1, au moins 24 mobiles finissent sous leur plafond a priori","aucune relance ne le réduit : il tient aux tables pleines dont les capacités ou les ancrages diffèrent","plafond a priori 24 rencontres pour 4 ancrés","seules les capacités et les réservations le changent : aucune relance ne le dépasse","plafond a priori 28 rencontres pour 29 ancrés et 227 mobiles","seules les capacités et les réservations le changent : aucune relance ne le dépasse","99 retours imposés par 33 ancrages","les réservations les imposent : ils ne comptent pas parmi les retours que choisit le moteur"],"theme":"clair","versionReelle":"2026.10.05.01"},
{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"910ac5d3639d7c9ea4b52cfef4e402b5277fdf38379c9a0d196494f43727c5b5","etape":"9","etat":"1025fe8c346e3a503f00abcaf78cf004f33fe2c01a46bebd87da1bbf4d0b3f53","facteurEchelle":1,"fichier":"10a-ordre-priorites","graine":null,"image":{"hauteur":700,"largeur":1366,"sha256":"bb31be5ff2aee95f48210375982ec1594f4f2d73aabd8f6afb17dbb928b76618"},"instant":"2026-10-06T19:00:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Génération","Meilleure proposition du classement","Aucune proposition classée : sans proposition comparable, le classement n'en désigne aucune.","Réglages de la génération","Graine (nombre entier, de 0 à 4 294 967 295)","Propositions par génération (nombre de propositions)","Compte d'arrêt (mouvements évalués par proposition)","Historique d'acceptation (longueur, en mouvements)","Contraintes de la génération","Séparer les appartenances","Nouveaux voisins à chaque tour","Nouvelle table à chaque tour","Varier les appartenances rencontrées","Respecter les objectifs des tables","Objectifs des tables : chercher d'abord","le plus de places servies","Le plus grand total de tours servis : le critère compare les tours hors objectif.","chacun au moins une fois","D'abord le plus de personnes servies à un tour au moins, puis le plus grand total : le critère compare les personnes jamais servies, puis les tours hors objectif.","l'équité d'abord","Le minimum d'abord, puis le total : d'abord la personne la plus mal servie, mesurée contre ses propres tours possibles, puis le plus grand total. Le critère compare le plus de tours hors objectif d'une personne, puis les tours hors objectif.","Rencontrer le plus d'animateurs différents","Attribuer les sièges","Ordre des priorités","Deux propositions se comparent palier par palier : un palier ne départage que des propositions égales sur ceux qui le précèdent. Dans un palier de plusieurs critères, chacun compte selon son poids.","Ordre réglé pour l'événement.","Palier 1 sur 6","écart au plafond a priori","Descendre « écart au plafond a priori » d'un palier","Palier 2 sur 6","excédent de collisions","Poids de « excédent de collisions » (nombre entier)","Monter le palier de « excédent de collisions »","Descendre le palier de « excédent de collisions »","Séparer « excédent de collisions » en palier propre","tours hors objectif","Poids de « tours hors objectif » (nombre entier)","Monter le palier de « tours hors objectif »","Descendre le palier de « tours hors objectif »","Séparer « tours hors objectif » en palier propre","Palier 3 sur 6","collisions cumulées","Monter « collisions cumulées » d'un palier","Descendre « collisions cumulées » d'un palier","Joindre « collisions cumulées » au palier du dessus","Palier 4 sur 6","rencontres répétées et retours","Monter « rencontres répétées et retours » d'un palier","Descendre « rencontres répétées et retours » d'un palier","Palier 5 sur 6","animateurs non rencontrés","décoché","Monter « animateurs non rencontrés » d'un palier","Descendre « animateurs non rencontrés » d'un palier","Palier 6 sur 6","redondance d'appartenance","Monter « redondance d'appartenance » d'un palier","Joindre « redondance d'appartenance » au palier du dessus","« tours hors objectif » est au palier 2 sur 6, avec « excédent de collisions ».","Rétablir l'ordre par défaut","Cœurs de calcul","Cœurs automatiques (un par processeur logique du poste)","Valeur automatique sur ce poste : 4 cœurs, un par processeur logique, hyperthreads compris.","Une génération n'emploie jamais plus de cœurs que de propositions demandées. Ce réglage vaut pour cette séance du logiciel sur ce poste : il ne s'enregistre pas dans l'événement.","Aucun calcul n'est encore mesuré sur ce poste pendant cette séance : la durée d'une génération est inconnue.","Générer"],"theme":"clair","versionReelle":"2026.10.05.01"},
{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"e27a55ff9a61913431bd646b12105d3478fb061b6ab63a7ff0ea6d5f26a7eb5b","etape":"9","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"11-propositions","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"e1bc8ec4b87315960282b99459649f66b90ee4f839c2fd31303ef28ff5ba11d7"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Propositions","Propositions classées","Effacer les propositions","Ordre du classement, chaque critère au plus faible d'abord :","écart au plafond a priori",", puis","ensemble,","excédent de collisions","(poids 1)",",","tours hors objectif","(poids 3)",", puis","collisions cumulées",", puis","rencontres répétées",", puis","redondance d'appartenance",", puis","l'identifiant croissant",".","Personnes rencontrées","Collisions d'appartenance","Rencontres répétées et retours","Diversité d'appartenance","Manque et plafond a priori","Objectifs des tables et animateurs","Rang","Proposition","Personnes distinctes rencontrées, minimum : tous","Personnes distinctes rencontrées, minimum : mobiles","Personnes distinctes rencontrées, minimum : ancrés","Collisions cumulées (paire et tour)","Paires distinctes de même appartenance","Excédent de collisions (retrouvailles au-delà de la première)","Rencontres répétées choisies (paires)","Rencontres d'une même paire, au plus","Retours choisis à une table déjà occupée","Appartenances rencontrées A(p), minimum","Redondance d'appartenance, somme Σ r(p)","Taux de diversité d(p), minimum","Plus grand manque (personnes)","Personnes à qui il en manque","Écart d'itinéraire maximal (personnes)","Écart au plafond a priori maximal (personnes)","Tours hors objectif (personne et tour)","Tours selon l'objectif s(p), minimum","Certificat","Imposé par les réservations","Commandes","Placement retenu","3","Tel que la proposition n° 3.","11","11","11","26","15","11","30","3","11","3","85","0,27","0","0","0","0","1","1","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Qualité","1","3","retenue","11","11","11","26","15","11","30","3","11","3","85","0,27","0","0","0","0","1","1","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Qualité","Retenir","2","2","11","11","11","33","15","18","54","3","16","3","85","0,27","0","0","0","0","2","1","minimum atteint","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Qualité","Retenir","3","5","10","10","10","20","15","5","22","3","12","3","83","0,27","1","1","1","1","1","1","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Qualité","Retenir","4","1","10","10","11","29","15","14","46","3","13","3","82","0,30","1","4","0","1","0","2","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Qualité","Retenir","5","4","10","10","11","31","14","17","46","3","17","3","82","0,30","1","4","0","1","0","2","atteignabilité inconnue","2 retours imposés par 1 ancrage.","Aucune rencontre répétée imposée.","Voir sur le plan","Qualité","Retenir","Cible de la somme de redondance","La liste des événements montre, pour le placement retenu, la différence sans signe entre cette cible et la somme Σ r(p) de la colonne « Redondance d'appartenance ». Un nombre entier, 0 ou plus."],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"42ee6a983039ac4365b18a2f1302ff57f3527b14d5854735636ae5355fb6c6e6","etape":"10","etat":"15fb09087464cf5b429c79e33325a0cd64579f1c650d7fd7aeabf6c3cbf977c0","facteurEchelle":1,"fichier":"12-qualite-profil","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"bf3ddc675d33f81c2a5d3d2f13fef4a1a837d9839996d71ebdce9b5d4930b0bb"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":4.83,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-marque","ratio":9.67,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":6.15,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-2","ratio":5.57,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":6.17,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-marque","ratio":10.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":7.01,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":6.89,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-2","ratio":7.83,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 5 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 260 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","23","95 %","minimum 23 sur 24","chez François Ivrivet","plafond réalisé 24","plafond a priori 24","Personnes distinctes rencontrées, minimum : mobiles","24","Personnes distinctes rencontrées, minimum : ancrés","23","Collisions d'appartenance","Collisions cumulées (paire et tour)","52","Paires distinctes de même appartenance","52","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","103","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","29","99 imposés, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","17","chez François Ivrivet","borne de diversité 24","Redondance d'appartenance, somme Σ r(p)","1 288","Taux de diversité d(p), minimum","0,64","Manque et plafond a priori","Plus grand manque (personnes)","3","chez Marc Luskouze","131 personnes au manque maximal","plafond réalisé 27","Personnes à qui il en manque","131","Écart d'itinéraire maximal (personnes)","4","Écart au plafond a priori maximal (personnes)","4","Objectifs des tables et animateurs","Animateurs rencontrés, minimum","3","ne classe pas","chez Zoé WAMMERWOLM-MAWWEMMEL","borne des animateurs 4","Animateurs non rencontrés","29","ne classe pas","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","10","20","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","ancré","Minimum 23 personnes rencontrées, 3 personnes au minimum, 131 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","ancré","La personne au rang 1, François Ivrivet, rencontre","95 %","minimum 23 sur 24","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","8","Imprimerie Yzorne","effectif 12, 9 paires distinctes, excédent 0","Fabrique Sorbagne","effectif 11, 7 paires distinctes, excédent 0","Ateliers Falvigne","effectif 8, 3 paires distinctes, excédent 0","Ateliers Rossolde","effectif 11, 3 paires distinctes, excédent 0","Fonderie Estrolle","effectif 9, 3 paires distinctes, excédent 0","Verrerie Vaubrenne","effectif 10, 3 paires distinctes, excédent 0","Ateliers Tavrenne","effectif 8, 2 paires distinctes, excédent 0","Fonderie Xandrelle","effectif 6, 2 paires distinctes, excédent 0","Menuiserie Estrolle","effectif 9, 2 paires distinctes, excédent 0","Tannerie Nervanche","effectif 6, 2 paires distinctes, excédent 0","Ateliers Aubrenc","effectif 3, 1 paire distincte, excédent 0","Ateliers Cassorgue","effectif 3, 1 paire distincte, excédent 0","Brasserie Xandrelle","effectif 2, 1 paire distincte, excédent 0","Comptoir Gravelune","effectif 3, 1 paire distincte, excédent 0","Coopérative Jolvane","effectif 4, 1 paire distincte, excédent 0","Fabrique Kalvenne","effectif 3, 1 paire distincte, excédent 0","Filature Zelvaine","effectif 4, 1 paire distincte, excédent 0","Fonderie Sorbagne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Gravelune","effectif 3, 1 paire distincte, excédent 0","Menuiserie Hostrenne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Quimvaux","effectif 3, 1 paire distincte, excédent 0","Menuiserie Sorbagne","effectif 3, 1 paire distincte, excédent 0","Papeterie Hostrenne","effectif 2, 1 paire distincte, excédent 0","Papeterie Ulvardes","effectif 4, 1 paire distincte, excédent 0","Tannerie Belvarre","effectif 5, 1 paire distincte, excédent 0","Verrerie Aubrenc","effectif 2, 1 paire distincte, excédent 0","Ateliers Estrolle","effectif 3, 0 paire distincte, excédent 0","Ateliers Ivoranche","effectif 4, 0 paire distincte, excédent 0","Brasserie Belvarre","effectif 9, 0 paire distincte, excédent 0","Brasserie Dravenne","effectif 1, 0 paire distincte, excédent 0","Brasserie Lavorneau","effectif 2, 0 paire distincte, excédent 0","Brasserie Morvalle","effectif 2, 0 paire distincte, excédent 0","Brasserie Sorbagne","effectif 4, 0 paire distincte, excédent 0","Brasserie Wassorel","effectif 2, 0 paire distincte, excédent 0","Comptoir Ivoranche","effectif 1, 0 paire distincte, excédent 0","Comptoir Jolvane","effectif 3, 0 paire distincte, excédent 0","Comptoir Lavorneau","effectif 1, 0 paire distincte, excédent 0","Comptoir Sorbagne","effectif 4, 0 paire distincte, excédent 0","Comptoir Xandrelle","effectif 3, 0 paire distincte, excédent 0","Comptoir Yzorne","effectif 2, 0 paire distincte, excédent 0","Coopérative Dravenne","effectif 3, 0 paire distincte, excédent 0","Coopérative Gravelune","effectif 3, 0 paire distincte, excédent 0","Coopérative Morvalle","effectif 3, 0 paire distincte, excédent 0","Coopérative Rossolde","effectif 4, 0 paire distincte, excédent 0","Fabrique Ivoranche","effectif 3, 0 paire distincte, excédent 0","Fabrique Morvalle","effectif 1, 0 paire distincte, excédent 0","Fabrique Ulvardes","effectif 3, 0 paire distincte, excédent 0","Filature Dravenne","effectif 1, 0 paire distincte, excédent 0","Filature Olbrecq","effectif 2, 0 paire distincte, excédent 0","Filature Wassorel","effectif 3, 0 paire distincte, excédent 0","Fonderie Aubrenc","effectif 2, 0 paire distincte, excédent 0","Fonderie Ivoranche","effectif 2, 0 paire distincte, excédent 0","Fonderie Kalvenne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Falvigne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Hostrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Aubrenc","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ivoranche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Jolvane","effectif 1, 0 paire distincte, excédent 0","Menuiserie Nervanche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Olbrecq","effectif 4, 0 paire distincte, excédent 0","Menuiserie Tavrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ulvardes","effectif 6, 0 paire distincte, excédent 0","Menuiserie Wassorel","effectif 1, 0 paire distincte, excédent 0","Papeterie Estrolle","effectif 3, 0 paire distincte, excédent 0","Papeterie Wassorel","effectif 1, 0 paire distincte, excédent 0","Tannerie Aubrenc","effectif 3, 0 paire distincte, excédent 0","Tannerie Falvigne","effectif 1, 0 paire distincte, excédent 0","Tannerie Olbrecq","effectif 1, 0 paire distincte, excédent 0","Tannerie Quimvaux","effectif 1, 0 paire distincte, excédent 0","Verrerie Gravelune","effectif 1, 0 paire distincte, excédent 0","Verrerie Ivoranche","effectif 6, 0 paire distincte, excédent 0","Verrerie Nervanche","effectif 1, 0 paire distincte, excédent 0","Verrerie Olbrecq","effectif 2, 0 paire distincte, excédent 0","Verrerie Pravette","effectif 2, 0 paire distincte, excédent 0","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Imprimerie Yzorne » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 4","Table 12","Table 16","Table 20","Table 26","Table 33","Table 9","Table 10","Table 15","Table 24","Table 25","Table 29","Table 31","Table 32","Table 1","Table 2","Table 5","Table 6","Table 7","Table 8","Table 13","Table 14","Table 17","Table 18","Table 19","Table 21","Table 22","Table 23","Table 27","Table 28","Table 30","Table 3","Table 11","Tour 1","Tour 2","Tour 3","Tour 4","2","1","0","0","1","2","0","0","0","0","2","1","0","0","1","2","0","2","0","1","0","1","0","2","0","0","2","0","0","1","0","1","1","1","0","0","0","1","1","0","0","1","1","0","1","0","1","0","0","1","0","1","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","0","0","0","0","1","0","0","0","0","0","1","0","1","0","0","0","0","0","1","0","0","0","1","1","0","0","0","1","0","0","0","0","0","1","0","0","1","0","0","0","0","0","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","La table 4 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 100 sur 103","Suivantes","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Samuel Cloveval","Menuiserie Ulvardes","Hélène Bralmeval","Brasserie Dravenne","3 fois","Voir au tour 3","Tour 1, table 23","Tour 3, table 15","Tour 4, table 32","Hugo Fralvançon","Brasserie Wassorel","Léa Fralvault","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 11","Tour 3, table 2","Hugo Fralvançon","Brasserie Wassorel","Louise Quilmançon","Menuiserie Estrolle","2 fois","Voir au tour 3","Tour 1, table 13","Tour 3, table 2","Zoé WAMMERWOLM-MAWWEMMEL","Menuiserie Ulvardes","Catherine Hulveron","Coopérative Rossolde","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 15","Catherine Urvesson","Fabrique Ulvardes","Olivier Bralmançon","Comptoir Lavorneau","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 6","Karim Hulvivet","Fonderie Xandrelle","Guillaume Luskichon","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 2","Léa Fralvault","Fonderie Sorbagne","Lucie Tolvesson","Filature Zelvaine","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 11","Léa Fralvault","Fonderie Sorbagne","Samuel Abrevard","Filature Dravenne","2 fois","Voir au tour 4","Tour 2, table 11","Tour 4, table 4","Fatima Obrivet","Fabrique Sorbagne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 29","Philippe Voskeval","Menuiserie Estrolle","Émilie Korvard","Verrerie Vaubrenne","2 fois","Voir au tour 3","Tour 2, table 6","Tour 3, table 6","Zoé Dulveval","Menuiserie Quimvaux","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 13","Paul Korveux","Filature Olbrecq","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 1, table 15","Tour 3, table 5","Paul Korveux","Filature Olbrecq","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 3","Thomas Rozvotte","Verrerie Ivoranche","Antoine Quilmeron","Fabrique Kalvenne","2 fois","Voir au tour 4","Tour 3, table 33","Tour 4, table 26","Isabelle Bralmumet","Verrerie Aubrenc","Félix Korveval","Tannerie Nervanche","2 fois","Voir au tour 2","Tour 1, table 19","Tour 2, table 28","Isabelle Bralmumet","Verrerie Aubrenc","Louis Mirveron","Filature Wassorel","2 fois","Voir au tour 4","Tour 3, table 22","Tour 4, table 16","Simon Mirvivet","Ateliers Ivoranche","Hélène Gorzumet","Fonderie Aubrenc","2 fois","Voir au tour 3","Tour 1, table 9","Tour 3, table 18","Lucie Voskeux","Coopérative Morvalle","Samuel Cloveval","Menuiserie Ulvardes","2 fois","Voir au tour 3","Tour 2, table 14","Tour 3, table 15","Fatima Korvouze","Ateliers Tavrenne","Olivier Jusvançon","Brasserie Morvalle","2 fois","Voir au tour 3","Tour 2, table 3","Tour 3, table 3","Étienne Fralvichon","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 1, table 21","Tour 4, table 33","Louise Quilmançon","Menuiserie Estrolle","Paul Obrichon","Ateliers Rossolde","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 21","Louise Quilmançon","Menuiserie Estrolle","Étienne Eskesson","Menuiserie Ulvardes","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 7","Pierre Abreveron","Ateliers Rossolde","Manon Tolveron","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 5","Tour 3, table 5","Léa Tolvande","Ateliers Rossolde","Anne Abrevesson","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 2","Tour 3, table 14","Antoine Quilmeron","Fabrique Kalvenne","Samuel Bralmeux","Ateliers Rossolde","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 33","Michel Eskeux","Papeterie Wassorel","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 21","Louise Hulvault","Coopérative Jolvane","Karim Fralveval","Coopérative Gravelune","2 fois","Voir au tour 4","Tour 3, table 24","Tour 4, table 4","Catherine Hulveron","Coopérative Rossolde","Alexandre Korvotte","Menuiserie Nervanche","2 fois","Voir au tour 4","Tour 3, table 15","Tour 4, table 15","François Ivrivet","Menuiserie Sorbagne","François Gorzichon","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 32","Tour 4, table 32","Claire Fralvivet","Imprimerie Yzorne","Étienne Selvouze","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 14","Tour 3, table 27","Karim Gorzesson","Papeterie Ulvardes","Sophie Clovard","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 1, table 20","Tour 4, table 12","Manon Urvançon","Ateliers Tavrenne","Guillaume Tolvignac","Menuiserie Sorbagne","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 1","Sylvie Quilmande","Imprimerie Yzorne","Antoine Bralmault","Fabrique Sorbagne","2 fois","Voir au tour 4","Tour 1, table 4","Tour 4, table 4","Sylvie Quilmande","Imprimerie Yzorne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 14","Sylvie Quilmande","Imprimerie Yzorne","Hélène Rozveval","Comptoir Ivoranche","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 4","Amina Pruvesson","Fonderie Sorbagne","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 1, table 18","Tour 4, table 16","Amina Pruvesson","Fonderie Sorbagne","Léa Obrard","Comptoir Sorbagne","2 fois","Voir au tour 2","Tour 1, table 18","Tour 2, table 31","Lucie Quilmière","Fabrique Ivoranche","Anne Urvivet","Fonderie Kalvenne","2 fois","Voir au tour 2","Tour 1, table 21","Tour 2, table 9","Louis Selvivet","Menuiserie Hostrenne","Guillaume Hulvotte","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 2, table 25","Tour 4, table 25","Lucie Tolvesson","Filature Zelvaine","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 4","Tour 1, table 15","Tour 4, table 25","Olivier Quilmesson","Comptoir Gravelune","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 9","Gabriel Neskault","Menuiserie Tavrenne","Geneviève Abrevignac","Brasserie Morvalle","2 fois","Voir au tour 4","Tour 2, table 20","Tour 4, table 18","Gabriel Neskault","Menuiserie Tavrenne","François Clovotte","Coopérative Rossolde","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Gabriel Neskault","Menuiserie Tavrenne","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Olivier Jusvançon","Brasserie Morvalle","Hélène Selveux","Brasserie Lavorneau","2 fois","Voir au tour 4","Tour 1, table 24","Tour 4, table 25","Gabriel Pruveux","Papeterie Estrolle","Guillaume Obrançon","Papeterie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 31","Tour 4, table 27","Manon Clovière","Ateliers Ivoranche","Marc Vandergrolcquesmirtavelle-Ostrovaubelindigues","Tannerie Aubrenc","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 10","François Obrouze","Tannerie Olbrecq","Camille Tolvumet","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 31","Tour 3, table 31","Claire Gorzeron","Menuiserie Hostrenne","Guillaume Gorzivet","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 32","Tour 4, table 8","Hélène Luskumet","Brasserie Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 8","Louis Fralvande","Ateliers Rossolde","Philippe Ivroubre","Ateliers Tavrenne","2 fois","Voir au tour 4","Tour 1, table 19","Tour 4, table 19","Isabelle Korvichon","Menuiserie Ulvardes","Marie Dulvesson","Ateliers Cassorgue","2 fois","Voir au tour 4","Tour 1, table 7","Tour 4, table 10","Isabelle Korvichon","Menuiserie Ulvardes","Karim Clovivet","Fonderie Kalvenne","2 fois","Voir au tour 3","Tour 2, table 18","Tour 3, table 23","Fatima Tolvoubre","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 33","Zoé Gorzière","Menuiserie Olbrecq","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 2, table 7","Tour 3, table 25","Antoine Obreval","Ateliers Cassorgue","Alexandre Ivreux","Tannerie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 25","Tour 2, table 6","Antoine Obreval","Ateliers Cassorgue","Hugo Bralmouze","Tannerie Falvigne","2 fois","Voir au tour 4","Tour 3, table 23","Tour 4, table 23","Michel Korveron","Fonderie Sorbagne","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 8","Marie Dulvesson","Ateliers Cassorgue","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 3","Tour 2, table 16","Tour 3, table 17","Youssef Jusvard","Tannerie Aubrenc","Simon Hulvumet","Ateliers Ivoranche","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 21","Gabriel Mirvotte","Tannerie Belvarre","Paul Neskivet","Comptoir Jolvane","2 fois","Voir au tour 4","Tour 3, table 21","Tour 4, table 7","Marc Luskouze","Ateliers Rossolde","Isabelle Selvichon","Tannerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 21","Tour 3, table 8","Louis Hulvichon","Ateliers Falvigne","Nicolas Ivrichon","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 17","Tour 2, table 24","Pierre Pruveval","Comptoir Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 1, table 10","Tour 3, table 8","Geneviève Abrevignac","Brasserie Morvalle","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 7","Olivier Bralmançon","Comptoir Lavorneau","Véronique Jusvouze","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 6","Marc Luskoubre","Verrerie Vaubrenne","Thomas Quilmichon","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 33","Tour 4, table 5","Camille Jusvumet","Fonderie Estrolle","Guillaume Eskotte","Verrerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 27","Tour 3, table 11","Antoine Selvière","Coopérative Dravenne","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 1, table 11","Tour 3, table 9","Antoine Bralmault","Fabrique Sorbagne","Amina Rozvichon","Verrerie Olbrecq","2 fois","Voir au tour 3","Tour 2, table 4","Tour 3, table 4","Antoine Bralmault","Fabrique Sorbagne","Antoine Pruvouze","Imprimerie Yzorne","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 4","Émilie Abrevière","Imprimerie Yzorne","Fatima Hulvard","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 29","Émilie Abrevière","Imprimerie Yzorne","Geneviève Obresson","Coopérative Gravelune","2 fois","Voir au tour 3","Tour 1, table 29","Tour 3, table 29","Émilie Abrevière","Imprimerie Yzorne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 4","Tour 3, table 29","Tour 4, table 29","Olivier Tolvichon","Fonderie Xandrelle","Étienne Gorzeval","Papeterie Ulvardes","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 6","Félix Korveval","Tannerie Nervanche","Thomas Selvignac","Brasserie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 28","Tour 3, table 28","Émilie Dulvichon","Menuiserie Ulvardes","Lucie Voskeron","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Émilie Dulvichon","Menuiserie Ulvardes","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Claire Jusvivet","Imprimerie Yzorne","Hugo Voskumet","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 20","Tour 3, table 20","Amina Quilmault","Coopérative Jolvane","Philippe Abreveval","Ateliers Falvigne","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 4","Hélène Gorzumet","Fonderie Aubrenc","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 4","Tour 1, table 9","Tour 4, table 21","Sophie Ivrault","Coopérative Morvalle","Philippe Fralvignac","Menuiserie Estrolle","2 fois","Voir au tour 4","Tour 3, table 13","Tour 4, table 26","Nicolas Korvande","Comptoir Sorbagne","Chantal Obrignac","Imprimerie Yzorne","2 fois","Voir au tour 3","Tour 2, table 27","Tour 3, table 22","Fatima Urvignac","Ateliers Aubrenc","Claire Bralmotte","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 21","François Clovotte","Coopérative Rossolde","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Philippe Dulvoubre","Brasserie Belvarre","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 2","Tour 1, table 9","Tour 2, table 10","Chantal Mirvumet","Menuiserie Gravelune","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 29","Camille Neskard","Menuiserie Gravelune","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 2, table 16","Tour 4, table 16","Sophie Pruvière","Ateliers Rossolde","Raphaël Jusvault","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 16","Tour 2, table 2","Fatima Abrevançon","Tannerie Nervanche","Caroline Jusvoubre","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 13","Fatima Abrevançon","Tannerie Nervanche","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 13","Tour 4, table 13","Karim Clovançon","Fabrique Sorbagne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 17","Félix Eskouze","Filature Zelvaine","Sylvie Abreveux","Comptoir Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 19","Olivier Korvière","Ateliers Falvigne","Manon Pruvivet","Menuiserie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 20","Tour 2, table 10","Félix Voskande","Ateliers Falvigne","Guillaume Mirvoubre","Comptoir Sorbagne","2 fois","Voir au tour 4","Tour 2, table 7","Tour 4, table 7","Lucie Voskeron","Verrerie Ivoranche","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Thomas Selvignac","Brasserie Sorbagne","Étienne Voskançon","Menuiserie Olbrecq","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 28","Jean Neskeron","Filature Zelvaine","Zoé Mirveval","Fabrique Kalvenne","2 fois","Voir au tour 2","Tour 1, table 11","Tour 2, table 33","Sophie Clovard","Brasserie Belvarre","Marc Rozvouze","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 12","Alexandre Eskançon","Menuiserie Hostrenne","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 1, table 17","Tour 3, table 25","Qui a rencontré qui","La matrice n'est pas dessinée : 260 personnes dépassent le seuil de 40. La fiche de chaque personne porte ses rencontres.","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Animateurs rencontrés, de la personne la moins servie à la mieux servie","0","1","2","3","4","50","100","150","200","rang","animateurs rencontrés","borne des animateurs","animateurs rencontrés","borne des animateurs","Minimum 3 animateurs rencontrés, 29 personnes au minimum.","Voir le tableau","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucune personne présente ne porte d'étiquette : seule la colonne des appartenances se dessine.","Appartenances rencontrées en animant","le moins varié","17","le plus varié","27","au minimum","1","Diversité rencontrée en animant, sur la soirée","0","10","20","François Ivrivet","4 tours animés, 23 personnes rencontrées en animant","Samuel Bralmeux","4 tours animés, 23 personnes rencontrées en animant","Geneviève Dulvumet","4 tours animés, 24 personnes rencontrées en animant","François Obrouze","4 tours animés, 23 personnes rencontrées en animant","Antoine Bralmault","4 tours animés, 25 personnes rencontrées en animant","Catherine Hulveron","4 tours animés, 26 personnes rencontrées en animant","Camille Neskard","4 tours animés, 27 personnes rencontrées en animant","Guillaume Luskichon","4 tours animés, 27 personnes rencontrées en animant","Philippe Ivroubre","4 tours animés, 27 personnes rencontrées en animant","Marie Urvard","4 tours animés, 28 personnes rencontrées en animant","Sophie Pruvotte","4 tours animés, 28 personnes rencontrées en animant","Thomas Selvignac","4 tours animés, 26 personnes rencontrées en animant","Philippe Voskeval","4 tours animés, 27 personnes rencontrées en animant","Manon Urvançon","4 tours animés, 27 personnes rencontrées en animant","Marc Vandergrolcquesmirta…","4 tours animés, 27 personnes rencontrées en animant","Fatima Abrevançon","4 tours animés, 26 personnes rencontrées en animant","Claire Jusvivet","4 tours animés, 27 personnes rencontrées en animant","Félix Voskande","4 tours animés, 27 personnes rencontrées en animant","Louise Neskichon","4 tours animés, 28 personnes rencontrées en animant","Gabriel Abrevault","4 tours animés, 28 personnes rencontrées en animant","Émilie Abrevière","4 tours animés, 25 personnes rencontrées en animant","Youssef Jusvard","4 tours animés, 27 personnes rencontrées en animant","Manon Tolveron","4 tours animés, 27 personnes rencontrées en animant","Hugo Bralmouze","4 tours animés, 27 personnes rencontrées en animant","Marie Bralmesson","4 tours animés, 28 personnes rencontrées en animant","Louis Selvivet","4 tours animés, 27 personnes rencontrées en animant","Michel Korveron","4 tours animés, 27 personnes rencontrées en animant","Youssef Neskière","4 tours animés, 28 personnes rencontrées en animant","Jean Fralvumet","4 tours animés, 28 personnes rencontrées en animant","Fatima Korvouze","4 tours animés, 27 personnes rencontrées en animant","Gabriel Ivreval","4 tours animés, 28 personnes rencontrées en animant","Guillaume Dulvivet","4 tours animés, 28 personnes rencontrées en animant","Étienne Tolvançon","4 tours animés, 28 personnes rencontrées en animant","Appartenances rencontrées en animant","Appartenances rencontrées en animant","Le moins varié rencontre 17 appartenances en animant ; 1 animateur au minimum.","Voir le tableau","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","2 000 mouvements évalués sur 2 000","durée observée 2,5 s","1 cœur de calcul","cadence 4 000 mouvements par seconde","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","5","10","15","20","1","10","100","2 000","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 21 ; au dernier : 23.","écart au plafond a priori, aux points de relevé","0","2","4","6","1","10","100","2 000","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 6 ; au dernier : 4.","excédent de collisions, aux points de relevé","0","1","2","3","4","1","10","100","2 000","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 3 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","20","40","60","1","10","100","2 000","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 67 ; au dernier : 52.","rencontres répétées, aux points de relevé","0","50","100","1","10","100","2 000","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 145 ; au dernier : 103.","redondance d'appartenance, aux points de relevé","0","500","1 000","1","10","100","2 000","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 1 298 ; au dernier : 1 288.","Une valeur a changé au dernier point de relevé, à 2 000 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"50901b9842d7ba6d4c1c13ae79f45b2944cb96836bd589f86b6be8ce12366524","etape":"10","etat":"b0cdfdc39ba1cb940f71e0266e14706cc8bb2e7808ad0d42f907e320498349cb","facteurEchelle":1,"fichier":"12a-qualite-sans-placement","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"c7ffdaed472307316ce517e76de6e8953aefe859b0b9a499f5a8528a062d49a8"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.57,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.07,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Petite démonstration, conflit inévitable 1","12 participants","4 tables · 12 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Réservations","Aucun placement à mesurer : ni proposition ni placement retenu. Le diagnostic dit ce que la configuration rend inévitable.","Diagnostic","Ateliers Jolvane","5 personnes : au moins 4 collisions cumulées sur les 4 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 5 appartenances recroisées par personne","plafond a priori 8 rencontres pour 12 mobiles"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"cafc252586729f60f60c55ced6b2ec6b361e163b19eb5d92ded67361c48990a3","etape":"10","etat":"5d6ecc1054a87ebe7527e876248fd7169cfac07500c8468e939c6e7e85b28e45","facteurEchelle":1,"fichier":"12b-qualite-une-table","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"d1cf850094562fae5cbf13105c239509d70a4715893ace6ed4640e8616fca387"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Une seule table","6 participants","1 table · 6 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 1 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 6 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","5","100 %","minimum 5 sur 5","chez Iris Ombrelle","plafond réalisé 5","plafond a priori 5","Personnes distinctes rencontrées, minimum : mobiles","5","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","9","Paires distinctes de même appartenance","3","Excédent de collisions (retrouvailles au-delà de la première)","6","Rencontres répétées et retours","Rencontres répétées choisies (paires)","15","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","12","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","3","chez Iris Ombrelle","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","12","Taux de diversité d(p), minimum","0,60","Manque et plafond a priori","Plus grand manque (personnes)","0","chez Iris Ombrelle","0 personne au manque maximal","plafond réalisé 5","Personnes à qui il en manque","0","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","0","minimum atteint","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Une seule table : chacun y rencontre tous les autres, et le profil dirait la même chose de chacun.","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Une seule table : chacun y retrouve chaque membre de son appartenance, à chaque tour.","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Une seule table : elle réunit toutes les appartenances à chaque tour.","Paires répétées","Qui revoit trop souvent la même personne ?","Une seule table : chaque paire se revoit à chaque tour.","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 5 ; au dernier : 5.","écart au plafond a priori, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 0 ; au dernier : 0.","excédent de collisions, aux points de relevé","0","2","4","6","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 6 ; au dernier : 6.","collisions cumulées, aux points de relevé","0","2","4","6","8","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 9 ; au dernier : 9.","rencontres répétées, aux points de relevé","0","5","10","15","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 15 ; au dernier : 15.","redondance d'appartenance, aux points de relevé","0","5","10","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 12 ; au dernier : 12.","Aucune valeur n'a changé entre 1 et 300 mouvements ; une autre graine est l'autre façon de chercher.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"2e09aa866e2974f2349e0641e1e2eb6da612ad476f9d84abbdf3e86207ab310b","etape":"10","etat":"5601fee6fd9ed94a29a1473c87f74cead072f85f9de73d326578f7a3b6a818d0","facteurEchelle":1,"fichier":"12c-qualite-un-tour","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"548fe6f4ce7a52d6fd68a3e99a234aa42034bb583f49116c8821aa5f995e52b8"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-bordure-case","ratio":4.78,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-encre-foncee","ratio":5.43,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-niveau-1","ratio":3.46,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-bordure-case","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-niveau-1","ratio":3.31,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-papier","ratio":5,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Un seul tour","12 participants","3 tables · 12 sièges","1 tour","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 1 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","3","100 %","minimum 3 sur 3","chez Iris Ombrelle","plafond réalisé 3","plafond a priori 3","Personnes distinctes rencontrées, minimum : mobiles","3","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","3","Paires distinctes de même appartenance","3","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","0","0 imposée, à part","Rencontres d'une même paire, au plus","1","Retours choisis à une table déjà occupée","0","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","2","chez Théo Pervenche","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","6","Taux de diversité d(p), minimum","0,67","Manque et plafond a priori","Plus grand manque (personnes)","0","chez Iris Ombrelle","0 personne au manque maximal","plafond réalisé 3","Personnes à qui il en manque","0","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","0","minimum atteint","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","1","2","3","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","Minimum 3 personnes rencontrées, 12 personnes au minimum, 0 personne sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Iris Ombrelle, rencontre","100 %","minimum 3 sur 3","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","1","Atelier Ressac","effectif 4, 1 paire distincte, excédent 0","Chantier Grève","effectif 4, 1 paire distincte, excédent 0","Coopérative Aubier","effectif 4, 1 paire distincte, excédent 0","prouvé inévitable","prouvé inévitable","reste","L'excédent le plus grand est celui de « Atelier Ressac » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 2","Table 3","Tour 1","1","1","1","La table 1 porte la case la plus haute : 1.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Un seul tour : aucune paire ne peut se revoir.","Qui a rencontré qui","Qui a rencontré qui","1. Iris Ombrelle","2. Théo Pervenche","3. Ondine Lacasse","4. Basile Tourteau","5. Maëlle Quenouille","6. Sidonie Varech","7. Lucien Aubépin","8. Aglaé Bruyère","9. Félix Cormier","10. Ysé Dorine","11. Paulin Escourgeon","12. Rosalie Fenouil","1","2","3","4","5","6","7","8","9","10","11","12","0","1","0","1","0","1","0","0","0","0","0","0","0","0","0","1","0","0","1","1","0","0","1","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","1","1","0","1","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","1","1","0","0","1","0","1","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","1","0","1","0","0","0","1","0","0","1","0","0","0","1","0","0","0","1","0","0","1","0","0","0","0","0","1","0","0","0","1","0","0","1","0","0","0","1","0","0","0","1","0","0","1","Chaque case porte le nombre de rencontres de la paire. Aucune paire ne se revoit.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","1","2","3","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 3 ; au dernier : 3.","écart au plafond a priori, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 0 ; au dernier : 0.","excédent de collisions, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 0 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","2","4","6","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 6 ; au dernier : 3.","rencontres répétées, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 0 ; au dernier : 0.","redondance d'appartenance, aux points de relevé","0","5","10","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 11 ; au dernier : 6.","Aucune valeur n'a changé entre 10 et 300 mouvements ; une autre graine est l'autre façon de chercher.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"8e29df8958b5d82180105388196616db386ce8491378c560f12b23c477083114","etape":"10","etat":"57fb9415b50911428c461e0e555b9d0f85a6a6a2b95641d22d567db3fcd37c27","facteurEchelle":1,"fichier":"12d-qualite-une-appartenance","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"a68e9f5b4213c63af61f9ee8895b8492ef126953604e3c149143a92daab54e54"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":6.15,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":6.27,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":7.01,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":8.57,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Une seule appartenance","12 participants","3 tables · 12 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 1 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","7","77 %","minimum 7 sur 9","chez Iris Ombrelle","plafond réalisé 9","plafond a priori 9","Personnes distinctes rencontrées, minimum : mobiles","7","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","54","Paires distinctes de même appartenance","46","Excédent de collisions (retrouvailles au-delà de la première)","8","Rencontres répétées et retours","Rencontres répétées choisies (paires)","7","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","12","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","1","chez Iris Ombrelle","borne de diversité 1","Redondance d'appartenance, somme Σ r(p)","80","Taux de diversité d(p), minimum","0,11","Manque et plafond a priori","Plus grand manque (personnes)","2","chez Iris Ombrelle","10 personnes au manque maximal","plafond réalisé 9","Personnes à qui il en manque","10","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","2","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Une seule appartenance : le profil n'a qu'une série, les rencontres, et pas de borne de diversité tracée.","Profil trié des rencontres, en comptes de personnes","0","2","4","6","8","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","plafond réalisé","rencontres","plafond réalisé","Minimum 7 personnes rencontrées, 6 personnes au minimum, 10 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Iris Ombrelle, rencontre","77 %","minimum 7 sur 9","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","20","40","Coopérative Aubier","effectif 12, 46 paires distinctes, excédent 8","prouvé inévitable","prouvé inévitable","reste","L'excédent le plus grand est celui de « Coopérative Aubier » : 8 collisions.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 2","Table 3","Tour 1","Tour 2","Tour 3","3","3","3","3","3","3","3","3","3","La table 1 porte la case la plus haute : 3.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 7 sur 7","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Basile Tourteau","Coopérative Aubier","Félix Cormier","Coopérative Aubier","3 fois","Voir au tour 2","Tour 1, table 3","Tour 2, table 3","Tour 3, table 1","Iris Ombrelle","Coopérative Aubier","Maëlle Quenouille","Coopérative Aubier","2 fois","Voir au tour 3","Tour 2, table 2","Tour 3, table 3","Iris Ombrelle","Coopérative Aubier","Ysé Dorine","Coopérative Aubier","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 3","Théo Pervenche","Coopérative Aubier","Rosalie Fenouil","Coopérative Aubier","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 2","Ondine Lacasse","Coopérative Aubier","Maëlle Quenouille","Coopérative Aubier","2 fois","Voir au tour 2","Tour 1, table 2","Tour 2, table 2","Lucien Aubépin","Coopérative Aubier","Paulin Escourgeon","Coopérative Aubier","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Lucien Aubépin","Coopérative Aubier","Rosalie Fenouil","Coopérative Aubier","2 fois","Voir au tour 3","Tour 2, table 1","Tour 3, table 2","Qui a rencontré qui","Qui a rencontré qui","1. Iris Ombrelle","2. Basile Tourteau","3. Maëlle Quenouille","4. Lucien Aubépin","5. Félix Cormier","6. Rosalie Fenouil","7. Théo Pervenche","8. Ondine Lacasse","9. Ysé Dorine","10. Paulin Escourgeon","11. Sidonie Varech","12. Aglaé Bruyère","1","2","3","4","5","6","7","8","9","10","11","12","0","2","1","0","0","0","1","2","1","1","1","0","0","0","3","0","1","1","1","1","1","1","2","0","0","0","1","1","2","1","0","1","1","1","0","0","0","2","1","0","1","2","1","1","0","3","0","0","0","1","1","1","1","1","1","0","0","1","2","0","2","1","0","1","1","1","0","1","1","1","1","2","1","1","0","1","0","1","1","2","0","1","1","1","0","1","1","0","2","1","1","1","1","0","1","0","1","0","1","1","1","0","2","1","1","0","1","1","0","1","1","1","1","1","1","1","1","1","0","0","1","1","1","1","1","1","1","0","0","1","1","1","Chaque case porte le nombre de rencontres de la paire. 7 paires choisies se revoient, la plus revue 3 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","6","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 5 ; au dernier : 7.","écart au plafond a priori, aux points de relevé","0","1","2","3","4","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 4 ; au dernier : 2.","excédent de collisions, aux points de relevé","0","5","10","15","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 15 ; au dernier : 8.","collisions cumulées, aux points de relevé","0","20","40","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 54 ; au dernier : 54.","rencontres répétées, aux points de relevé","0","5","10","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 13 ; au dernier : 7.","redondance d'appartenance, aux points de relevé","0","20","40","60","80","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 66 ; au dernier : 80.","Une valeur a changé au dernier point de relevé, à 300 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"8c57abfd117a68ddb9f0cd7f0fd4b3f98a1e407418612857c48066243e705bae","etape":"10","etat":"b1f1cf667eee922a43cf928892b29e923da9ff418abff4b35c786e5bf2634f99","facteurEchelle":1,"fichier":"12e-qualite-sans-collision","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"71afa679039e5f6f386755a681484e56f7f428fe1bf9e665d8603160a7d72167"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-bordure-case","ratio":4.78,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-encre-foncee","ratio":15.28,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-bordure-case","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-papier","ratio":14.29,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Sans collision","9 participants","3 tables · 9 sièges","2 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 1 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 9 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","4","100 %","minimum 4 sur 4","chez Iris Ombrelle","plafond réalisé 4","plafond a priori 4","Personnes distinctes rencontrées, minimum : mobiles","4","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","0","Paires distinctes de même appartenance","0","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","0","0 imposée, à part","Rencontres d'une même paire, au plus","1","Retours choisis à une table déjà occupée","3","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","4","chez Iris Ombrelle","borne de diversité 4","Redondance d'appartenance, somme Σ r(p)","0","Taux de diversité d(p), minimum","1,00","Manque et plafond a priori","Plus grand manque (personnes)","0","chez Iris Ombrelle","0 personne au manque maximal","plafond réalisé 4","Personnes à qui il en manque","0","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","0","minimum atteint","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","1","2","3","4","2","4","6","8","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","Minimum 4 personnes rencontrées, 9 personnes au minimum, 0 personne sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Iris Ombrelle, rencontre","100 %","minimum 4 sur 4","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Aucune collision d'appartenance : à chaque tour, chaque table réunit des appartenances distinctes.","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 2","Table 3","Tour 1","Tour 2","0","0","0","0","0","0","La table 1 porte la case la plus haute : 0.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Aucune paire ne se revoit : chaque rencontre est unique.","Qui a rencontré qui","Qui a rencontré qui","1. Iris Ombrelle","2. Théo Pervenche","3. Ondine Lacasse","4. Basile Tourteau","5. Maëlle Quenouille","6. Sidonie Varech","7. Lucien Aubépin","8. Aglaé Bruyère","9. Félix Cormier","1","2","3","4","5","6","7","8","9","1","0","0","1","0","1","1","0","1","0","1","0","1","0","1","0","0","0","1","0","0","1","1","1","0","1","1","0","1","1","0","0","1","0","0","0","1","1","0","1","0","1","0","1","1","0","0","1","1","0","1","1","1","0","0","0","1","1","1","0","0","0","0","1","0","0","1","0","1","1","0","1","Chaque case porte le nombre de rencontres de la paire. Aucune paire ne se revoit.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","1","2","3","4","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 3 ; au dernier : 4.","écart au plafond a priori, aux points de relevé","0","1","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 1 ; au dernier : 0.","excédent de collisions, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 0 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 0 ; au dernier : 0.","rencontres répétées, aux points de relevé","0","1","2","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 2 ; au dernier : 0.","redondance d'appartenance, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 0 ; au dernier : 0.","Aucune valeur n'a changé entre 10 et 300 mouvements ; une autre graine est l'autre façon de chercher.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"eec3f475c32802f48c3c143fc38a57cb412828a900063188943d1987f4185a89","etape":"10","etat":"db2ac82a7d0189c959eadd2540c41f34c547c9efff64cfbb3d5872def0ffebba","facteurEchelle":1,"fichier":"12f-qualite-reserve","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"5f2b77dbca23971e1acfadd46db77904b63c327f27f9e91af9112748b0b8cc37"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":4.83,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-marque","ratio":9.67,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":6.15,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":6.27,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-2","ratio":5.57,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":6.17,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-marque","ratio":10.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":7.01,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":8.57,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-2","ratio":7.83,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Petite démonstration, conflit inévitable 1","12 participants","4 tables · 12 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Placement retenu","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","5","83 %","minimum 5 sur 6","chez Hugo Neskault","plafond réalisé 6","plafond a priori 8","Personnes distinctes rencontrées, minimum : mobiles","5","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","9","Paires distinctes de même appartenance","9","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","4","0 imposée, à part","Rencontres d'une même paire, au plus","2","Retours choisis à une table déjà occupée","13","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","2","chez Hugo Neskault","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","50","Taux de diversité d(p), minimum","0,29","Manque et plafond a priori","Plus grand manque (personnes)","1","chez Hugo Neskault","8 personnes au manque maximal","plafond réalisé 6","Personnes à qui il en manque","8","Écart d'itinéraire maximal (personnes)","2","Écart au plafond a priori maximal (personnes)","3","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","2","4","6","8","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","en réserve à un tour au moins","Minimum 5 personnes rencontrées, 1 personne au minimum, 8 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","en réserve à un tour au moins","La personne au rang 1, Hugo Neskault, rencontre","83 %","minimum 5 sur 6","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Ce placement laisse quelqu'un en réserve ou n'honore pas une réservation : le plancher du diagnostic ne s'y applique pas, et chaque barre n'a qu'un segment, les collisions cumulées.","Collisions d'appartenance, par appartenance","0","2","4","6","Ateliers Jolvane","effectif 5, 6 paires distinctes, excédent 0","Tannerie Cassorgue","effectif 4, 2 paires distinctes, excédent 0","Verrerie Ulvardes","effectif 3, 1 paire distincte, excédent 0","Collisions cumulées (paire et tour)","Collisions cumulées (paire et tour)","L'excédent le plus grand est celui de « Ateliers Jolvane » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 2","Table 3","Table 4","Table 1","Tour 1","Tour 2","Tour 3","Tour 4","1","2","0","0","1","0","1","1","1","1","0","0","0","1","0","0","La table 2 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 4 sur 4","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Hugo Neskault","Tannerie Cassorgue","Zoé Tolveval","Ateliers Jolvane","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 1","Louis Selvière","Tannerie Cassorgue","Youssef Selvançon","Ateliers Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 2","Amina Quilmoubre","Verrerie Ulvardes","Luc Urvard","Tannerie Cassorgue","2 fois","Voir au tour 4","Tour 2, table 4","Tour 4, table 4","Paul Neskivet","Ateliers Jolvane","Michel Bralmignac","Tannerie Cassorgue","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 3","Qui a rencontré qui","Qui a rencontré qui","1. Hugo Neskault","2. Paul Neskivet","3. Louis Selvière","4. Youssef Selvançon","5. Amina Quilmoubre","6. Michel Bralmignac","7. Zoé Tolveval","8. Luc Urvard","9. Youssef Ivrotte","10. Caroline Bralmumet","11. Julie Voskotte","12. Véronique Mirveval","1","2","3","4","5","6","7","8","9","10","11","12","0","0","0","1","0","2","0","0","1","1","1","0","0","0","1","2","0","1","1","1","0","1","0","0","2","1","0","1","1","1","0","1","1","0","0","2","1","1","1","1","0","1","1","0","1","1","1","1","1","1","2","0","0","0","0","0","2","0","1","1","0","1","0","1","1","1","2","0","1","1","1","0","0","1","1","1","0","0","1","1","1","2","1","0","1","0","0","1","0","1","1","0","0","0","1","1","1","1","1","1","1","0","1","0","1","1","0","1","1","1","1","0","1","1","0","1","1","0","1","1","1","1","1","1","0","0","1","0","1","1","1","1","Chaque case porte le nombre de rencontres de la paire. 4 paires choisies se revoient, la plus revue 2 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","La vue mesure une proposition : le placement retenu a été ajusté, ou sa proposition effacée, et n'a pas de course."],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"9584a190f61c71fd722fff9508eb9a1c353e77f2f2cb68dd0dd2ccf9c3a654b6","etape":"10","etat":"fccc66e41578f9a5554a566432289f37cc924cb0c394080e55e38b6ddba577a5","facteurEchelle":1,"fichier":"12g-qualite-plafond-nul","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"204e2535c462669188dfdc99775bbba6694de369a35bf2f6ced2213484d4449c"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":3.93,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-marque","ratio":9.67,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":6.15,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-2","ratio":4.53,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":4.96,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-marque","ratio":10.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-repere","ratio":7.01,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":6.89,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-2","ratio":6.29,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Plafond nul","5 participants","2 tables · 6 sièges","2 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 1 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 5 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","0","—","minimum 0 sur 0","chez Maëlle Quenouille","plafond réalisé 0","plafond a priori 0","Personnes distinctes rencontrées, minimum : mobiles","0","Personnes distinctes rencontrées, minimum : ancrés","3","Collisions d'appartenance","Collisions cumulées (paire et tour)","4","Paires distinctes de même appartenance","2","Excédent de collisions (retrouvailles au-delà de la première)","2","Rencontres répétées et retours","Rencontres répétées choisies (paires)","0","6 imposées, à part","Rencontres d'une même paire, au plus","2","Retours choisis à une table déjà occupée","1","4 imposés, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","0","chez Maëlle Quenouille","borne de diversité 0","Redondance d'appartenance, somme Σ r(p)","4","Taux de diversité d(p), minimum","0,67","Manque et plafond a priori","Plus grand manque (personnes)","0","chez Maëlle Quenouille","0 personne au manque maximal","plafond réalisé 0","Personnes à qui il en manque","0","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","0","minimum atteint","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","1","2","3","1","2","3","4","5","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","ancré","plafond réalisé nul","Minimum 0 personne rencontrée, 1 personne au minimum, 0 personne sous leur plafond réalisé.","Rang","1","Personne","Maëlle Quenouille","Appartenance","Coopérative Aubier","Personnes distinctes rencontrées","0","Plafond réalisé","0","Rencontres sur le plafond réalisé","—","0 sur 0","Plafond a priori","0","Appartenances rencontrées","0","Borne de diversité","0","Tours non assis","0","Place marquée","plafond réalisé nul","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","1","2","3","4","5","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","ancré","plafond réalisé nul","La personne au rang 1, Maëlle Quenouille, a un plafond réalisé nul : elle ne rencontre personne, et son rang n’a pas de point en pourcentage.","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","1","2","Atelier Ressac","effectif 2, 1 paire distincte, excédent 1","Coopérative Aubier","effectif 3, 1 paire distincte, excédent 1","prouvé inévitable","prouvé inévitable","reste","L'excédent le plus grand est celui de « Atelier Ressac » : 1 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 2","Tour 1","Tour 2","2","2","1","1","La table 1 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 6 sur 6","Paires que les réservations imposent","Paire","Rencontres de la paire","Tours","Iris Ombrelle","Coopérative Aubier","Théo Pervenche","Atelier Ressac","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Iris Ombrelle","Coopérative Aubier","Ondine Lacasse","Coopérative Aubier","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Iris Ombrelle","Coopérative Aubier","Basile Tourteau","Atelier Ressac","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Théo Pervenche","Atelier Ressac","Ondine Lacasse","Coopérative Aubier","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Théo Pervenche","Atelier Ressac","Basile Tourteau","Atelier Ressac","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Ondine Lacasse","Coopérative Aubier","Basile Tourteau","Atelier Ressac","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Qui a rencontré qui","Qui a rencontré qui","1. Maëlle Quenouille","2. Iris Ombrelle","3. Théo Pervenche","4. Ondine Lacasse","5. Basile Tourteau","1","2","3","4","5","0","0","0","0","0","2","2","2","0","2","2","2","0","2","2","2","0","2","2","2","Chaque case porte le nombre de rencontres de la paire. 6 paires imposées se revoient, la plus revue 2 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 0 ; au dernier : 0.","écart au plafond a priori, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 0 ; au dernier : 0.","excédent de collisions, aux points de relevé","0","1","2","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 2 ; au dernier : 2.","collisions cumulées, aux points de relevé","0","1","2","3","4","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 4 ; au dernier : 4.","rencontres répétées, aux points de relevé","0","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 0 ; au dernier : 0.","redondance d'appartenance, aux points de relevé","0","1","2","3","4","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 4 ; au dernier : 4.","Aucune valeur n'a changé entre 1 et 300 mouvements ; une autre graine est l'autre façon de chercher.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"fabcd121b2e9445d41163199172cf05375990e3d87fa3cfb9aa100221792d06c","etape":"10","etat":"61d4b4bf919776450966168757d227df6e89ab788f8c62b0286899433ca37b88","facteurEchelle":1,"fichier":"13-qualite-collisions","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"10851c1440fcace8b3baeb8253d9fb2692ab77389d8939b2f11477ece2fa2cf3"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-prouve","ratio":4.23,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-reste","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-prouve","ratio":5.12,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-reste","ratio":6.89,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Petite démonstration, conflit inévitable 1","12 participants","4 tables · 12 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 5 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","7","87 %","minimum 7 sur 8","chez Hugo Neskault","plafond réalisé 8","plafond a priori 8","Personnes distinctes rencontrées, minimum : mobiles","7","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","9","Paires distinctes de même appartenance","9","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","4","0 imposée, à part","Rencontres d'une même paire, au plus","2","Retours choisis à une table déjà occupée","14","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","2","chez Hugo Neskault","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","54","Taux de diversité d(p), minimum","0,29","Manque et plafond a priori","Plus grand manque (personnes)","1","chez Hugo Neskault","8 personnes au manque maximal","plafond réalisé 8","Personnes à qui il en manque","8","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","1","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","2","4","6","8","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","Minimum 7 personnes rencontrées, 8 personnes au minimum, 8 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Hugo Neskault, rencontre","87 %","minimum 7 sur 8","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","Ateliers Jolvane","effectif 5, 6 paires distinctes, excédent 0","Tannerie Cassorgue","effectif 4, 2 paires distinctes, excédent 0","Verrerie Ulvardes","effectif 3, 1 paire distincte, excédent 0","prouvé inévitable","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Ateliers Jolvane » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 2","Table 3","Table 4","Table 1","Tour 1","Tour 2","Tour 3","Tour 4","1","2","0","0","1","0","1","1","1","1","0","0","0","0","0","0","La table 2 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 4 sur 4","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Hugo Neskault","Tannerie Cassorgue","Zoé Tolveval","Ateliers Jolvane","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 1","Louis Selvière","Tannerie Cassorgue","Youssef Selvançon","Ateliers Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 2","Amina Quilmoubre","Verrerie Ulvardes","Luc Urvard","Tannerie Cassorgue","2 fois","Voir au tour 4","Tour 2, table 4","Tour 4, table 4","Paul Neskivet","Ateliers Jolvane","Michel Bralmignac","Tannerie Cassorgue","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 3","Qui a rencontré qui","Qui a rencontré qui","1. Hugo Neskault","2. Louis Selvière","3. Youssef Selvançon","4. Amina Quilmoubre","5. Paul Neskivet","6. Michel Bralmignac","7. Zoé Tolveval","8. Luc Urvard","9. Caroline Bralmumet","10. Youssef Ivrotte","11. Julie Voskotte","12. Véronique Mirveval","1","2","3","4","5","6","7","8","9","10","11","12","0","0","1","1","0","2","0","1","1","1","1","0","2","1","0","0","1","1","0","1","1","1","0","2","1","0","1","1","1","1","0","1","0","1","1","1","1","1","1","2","0","0","0","0","1","0","0","1","2","0","1","1","1","0","1","0","0","1","1","2","0","1","1","0","1","1","2","1","1","1","0","0","0","1","1","1","0","0","1","1","2","1","1","0","0","1","0","1","1","0","1","0","1","1","1","0","1","1","1","1","1","0","0","1","0","1","1","1","1","1","1","1","1","0","0","1","1","0","1","1","1","1","1","0","0","1","1","0","1","1","1","1","Chaque case porte le nombre de rencontres de la paire. 4 paires choisies se revoient, la plus revue 2 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","6","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 6 ; au dernier : 7.","écart au plafond a priori, aux points de relevé","0","1","2","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 2 ; au dernier : 1.","excédent de collisions, aux points de relevé","0","1","2","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 2 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","5","10","15","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 15 ; au dernier : 9.","rencontres répétées, aux points de relevé","0","2","4","6","8","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 7 ; au dernier : 4.","redondance d'appartenance, aux points de relevé","0","20","40","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 45 ; au dernier : 54.","Une valeur a changé au dernier point de relevé, à 300 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"247dd050fe930be7c239881b5091847027a3a73c6455cdc1b0d854a99868962d","etape":"10","etat":"61d4b4bf919776450966168757d227df6e89ab788f8c62b0286899433ca37b88","facteurEchelle":1,"fichier":"13a-qualite-tables","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"1ce9bbdca48d75ac865e9456c7b0d2d65ecfad81411c25e45e158f305c6e2e48"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":5.85,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-bordure-case","ratio":4.78,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-encre-foncee","ratio":5.43,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-niveau-1","ratio":3.46,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-niveau-2","ratio":5.85,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-bordure-case","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-encre-claire","ratio":6.03,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-niveau-1","ratio":3.31,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-niveau-2","ratio":5.35,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-papier","ratio":5,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Petite démonstration, conflit inévitable 1","12 participants","4 tables · 12 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 5 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","7","87 %","minimum 7 sur 8","chez Hugo Neskault","plafond réalisé 8","plafond a priori 8","Personnes distinctes rencontrées, minimum : mobiles","7","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","9","Paires distinctes de même appartenance","9","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","4","0 imposée, à part","Rencontres d'une même paire, au plus","2","Retours choisis à une table déjà occupée","14","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","2","chez Hugo Neskault","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","54","Taux de diversité d(p), minimum","0,29","Manque et plafond a priori","Plus grand manque (personnes)","1","chez Hugo Neskault","8 personnes au manque maximal","plafond réalisé 8","Personnes à qui il en manque","8","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","1","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","2","4","6","8","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","Minimum 7 personnes rencontrées, 8 personnes au minimum, 8 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Hugo Neskault, rencontre","87 %","minimum 7 sur 8","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","Ateliers Jolvane","effectif 5, 6 paires distinctes, excédent 0","Tannerie Cassorgue","effectif 4, 2 paires distinctes, excédent 0","Verrerie Ulvardes","effectif 3, 1 paire distincte, excédent 0","prouvé inévitable","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Ateliers Jolvane » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 2","Table 3","Table 4","Table 1","Tour 1","Tour 2","Tour 3","Tour 4","1","2","0","0","1","0","1","1","1","1","0","0","0","0","0","0","La table 2 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 4 sur 4","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Hugo Neskault","Tannerie Cassorgue","Zoé Tolveval","Ateliers Jolvane","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 1","Louis Selvière","Tannerie Cassorgue","Youssef Selvançon","Ateliers Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 2","Amina Quilmoubre","Verrerie Ulvardes","Luc Urvard","Tannerie Cassorgue","2 fois","Voir au tour 4","Tour 2, table 4","Tour 4, table 4","Paul Neskivet","Ateliers Jolvane","Michel Bralmignac","Tannerie Cassorgue","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 3","Qui a rencontré qui","Qui a rencontré qui","1. Hugo Neskault","2. Louis Selvière","3. Youssef Selvançon","4. Amina Quilmoubre","5. Paul Neskivet","6. Michel Bralmignac","7. Zoé Tolveval","8. Luc Urvard","9. Caroline Bralmumet","10. Youssef Ivrotte","11. Julie Voskotte","12. Véronique Mirveval","1","2","3","4","5","6","7","8","9","10","11","12","0","0","1","1","0","2","0","1","1","1","1","0","2","1","0","0","1","1","0","1","1","1","0","2","1","0","1","1","1","1","0","1","0","1","1","1","1","1","1","2","0","0","0","0","1","0","0","1","2","0","1","1","1","0","1","0","0","1","1","2","0","1","1","0","1","1","2","1","1","1","0","0","0","1","1","1","0","0","1","1","2","1","1","0","0","1","0","1","1","0","1","0","1","1","1","0","1","1","1","1","1","0","0","1","0","1","1","1","1","1","1","1","1","0","0","1","1","0","1","1","1","1","1","0","0","1","1","0","1","1","1","1","Chaque case porte le nombre de rencontres de la paire. 4 paires choisies se revoient, la plus revue 2 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","6","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 6 ; au dernier : 7.","écart au plafond a priori, aux points de relevé","0","1","2","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 2 ; au dernier : 1.","excédent de collisions, aux points de relevé","0","1","2","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 2 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","5","10","15","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 15 ; au dernier : 9.","rencontres répétées, aux points de relevé","0","2","4","6","8","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 7 ; au dernier : 4.","redondance d'appartenance, aux points de relevé","0","20","40","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 45 ; au dernier : 54.","Une valeur a changé au dernier point de relevé, à 300 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"3373550d33a1fc2795097ad57cdca9082b7de97c1326e06b2d9692cc8e0c44d8","etape":"10","etat":"52b64156932020426f7f872ad4f0362f3f489acf8c5f58c704df8d52835bbf95","facteurEchelle":1,"fichier":"14-qualite-paires","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"3792ba3ee24c63a2bffff2482ee01a23bc6c26d699ef05f7e582335d03075d40"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-action-encre","ratio":8.29,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-encre","ratio":9.62,"role":"texte","seuil":4.5},{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Paires répétées","12 participants","4 tables · 12 sièges","6 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 2 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","8","72 %","minimum 8 sur 11","chez Maëlle Quenouille","plafond réalisé 11","plafond a priori 11","Personnes distinctes rencontrées, minimum : mobiles","8","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","21","Paires distinctes de même appartenance","17","Excédent de collisions (retrouvailles au-delà de la première)","4","Rencontres répétées et retours","Rencontres répétées choisies (paires)","15","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","36","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","3","chez Iris Ombrelle","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","74","Taux de diversité d(p), minimum","0,30","Manque et plafond a priori","Plus grand manque (personnes)","3","chez Maëlle Quenouille","12 personnes au manque maximal","plafond réalisé 11","Personnes à qui il en manque","12","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","3","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","5","10","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","Minimum 8 personnes rencontrées, 3 personnes au minimum, 12 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Maëlle Quenouille, rencontre","72 %","minimum 8 sur 11","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","8","Atelier Ressac","effectif 4, 6 paires distinctes, excédent 2","Coopérative Aubier","effectif 4, 6 paires distinctes, excédent 1","Chantier Grève","effectif 4, 5 paires distinctes, excédent 1","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Atelier Ressac » : 2 collisions.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 4","Table 2","Table 3","Tour 1","Tour 2","Tour 3","Tour 4","Tour 5","Tour 6","1","0","1","1","1","2","1","1","1","1","1","1","0","1","1","1","1","1","0","1","1","0","1","0","La table 1 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 15 sur 15","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Ondine Lacasse","Chantier Grève","Lucien Aubépin","Coopérative Aubier","3 fois","Voir au tour 3","Tour 2, table 4","Tour 3, table 2","Tour 5, table 2","Basile Tourteau","Coopérative Aubier","Félix Cormier","Chantier Grève","3 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Tour 4, table 4","Iris Ombrelle","Coopérative Aubier","Maëlle Quenouille","Atelier Ressac","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 3","Iris Ombrelle","Coopérative Aubier","Rosalie Fenouil","Chantier Grève","2 fois","Voir au tour 4","Tour 1, table 3","Tour 4, table 3","Théo Pervenche","Atelier Ressac","Sidonie Varech","Chantier Grève","2 fois","Voir au tour 6","Tour 2, table 2","Tour 6, table 4","Théo Pervenche","Atelier Ressac","Félix Cormier","Chantier Grève","2 fois","Voir au tour 6","Tour 3, table 4","Tour 6, table 4","Théo Pervenche","Atelier Ressac","Rosalie Fenouil","Chantier Grève","2 fois","Voir au tour 2","Tour 1, table 3","Tour 2, table 2","Basile Tourteau","Coopérative Aubier","Ysé Dorine","Coopérative Aubier","2 fois","Voir au tour 6","Tour 3, table 1","Tour 6, table 1","Maëlle Quenouille","Atelier Ressac","Aglaé Bruyère","Atelier Ressac","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 3","Maëlle Quenouille","Atelier Ressac","Ysé Dorine","Coopérative Aubier","2 fois","Voir au tour 5","Tour 1, table 4","Tour 5, table 1","Maëlle Quenouille","Atelier Ressac","Paulin Escourgeon","Atelier Ressac","2 fois","Voir au tour 6","Tour 5, table 1","Tour 6, table 2","Sidonie Varech","Chantier Grève","Félix Cormier","Chantier Grève","2 fois","Voir au tour 6","Tour 5, table 3","Tour 6, table 4","Lucien Aubépin","Coopérative Aubier","Rosalie Fenouil","Chantier Grève","2 fois","Voir au tour 6","Tour 5, table 2","Tour 6, table 3","Aglaé Bruyère","Atelier Ressac","Rosalie Fenouil","Chantier Grève","2 fois","Voir au tour 6","Tour 3, table 3","Tour 6, table 3","Ysé Dorine","Coopérative Aubier","Paulin Escourgeon","Atelier Ressac","2 fois","Voir au tour 5","Tour 4, table 2","Tour 5, table 1","Qui a rencontré qui","Qui a rencontré qui","1. Maëlle Quenouille","2. Félix Cormier","3. Rosalie Fenouil","4. Théo Pervenche","5. Basile Tourteau","6. Lucien Aubépin","7. Ysé Dorine","8. Iris Ombrelle","9. Ondine Lacasse","10. Sidonie Varech","11. Aglaé Bruyère","12. Paulin Escourgeon","1","2","3","4","5","6","7","8","9","10","11","12","1","1","1","0","0","2","2","1","0","2","2","1","0","2","3","1","0","1","1","2","0","1","1","0","2","0","2","0","2","1","1","2","1","1","2","2","1","0","1","1","0","2","1","1","0","3","0","1","1","2","1","1","1","1","1","0","1","2","0","1","1","1","3","1","1","1","2","0","0","1","2","1","1","1","1","1","2","2","1","2","1","1","1","1","1","1","1","0","1","1","1","0","1","3","1","1","1","1","1","0","2","1","2","1","1","1","1","1","1","1","2","0","2","1","1","1","1","1","1","1","1","2","1","1","1","1","1","2","0","1","1","1","Chaque case porte le nombre de rencontres de la paire. 15 paires choisies se revoient, la plus revue 3 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","6","8","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 7 ; au dernier : 8.","écart au plafond a priori, aux points de relevé","0","1","2","3","4","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 4 ; au dernier : 3.","excédent de collisions, aux points de relevé","0","2","4","6","8","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 8 ; au dernier : 4.","collisions cumulées, aux points de relevé","0","5","10","15","20","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 21 ; au dernier : 21.","rencontres répétées, aux points de relevé","0","5","10","15","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 18 ; au dernier : 15.","redondance d'appartenance, aux points de relevé","0","20","40","60","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 62 ; au dernier : 74.","Une valeur a changé au dernier point de relevé, à 300 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"c16646e9e0074091dd7e4e591b95648d8e99d90eb2542437096a3cdb6391388f","etape":"10","etat":"52b64156932020426f7f872ad4f0362f3f489acf8c5f58c704df8d52835bbf95","facteurEchelle":1,"fichier":"14a-fiche-rencontres","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"7008ab655dbca5290dfd541cef0390cdfbc8b5d4920971643665c2da8fa21b75"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Paires répétées","12 participants","4 tables · 12 sièges","6 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Participants","12 personnes · 12 à placer · 0 exclue · 3 appartenances","Exporter la liste","Ajouter une personne","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Notes","Ajouter","Filtrer","Grouper par","Aucun groupement","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Exclusion","Notes","Statut","12 participants","Atelier Ressac · 4","Chantier Grève · 4","Coopérative Aubier · 4","Nom","Prénom","Appartenance","Courriel","Titre pressenti","Exclusion","Notes","Actions","Ombrelle","Iris","Coopérative Aubier","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Pervenche","Théo","Atelier Ressac","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Lacasse","Ondine","Chantier Grève","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Tourteau","Basile","Coopérative Aubier","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Quenouille","Maëlle","Atelier Ressac","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Varech","Sidonie","Chantier Grève","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Aubépin","Lucien","Coopérative Aubier","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Bruyère","Aglaé","Atelier Ressac","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Cormier","Félix","Chantier Grève","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Dorine","Ysé","Coopérative Aubier","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Escourgeon","Paulin","Atelier Ressac","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Fenouil","Rosalie","Chantier Grève","présente","Fiche","Voir sur le plan","Exclure","Supprimer","Ondine Lacasse","Fermer la fiche","Nom","Lacasse","Prénom","Ondine","Appartenance","Chantier Grève","Courriel","—","Titre pressenti","—","Notes","—","Statut","mobile","Étiquettes","Aucune étiquette.","Ajouter des étiquettes, séparées par une virgule","Ajouter","Réservations","Aucune réservation.","Aucun placement retenu ne la nomme.","Rencontres","Placement mesuré :","Proposition n° 2","Personne rencontrée","Fois","Tours","Lucien Aubépin","Coopérative Aubier","3","tour 2, table 4 ; tour 3, table 2 ; tour 5, table 2","Iris Ombrelle","Coopérative Aubier","1","tour 3, table 2","Basile Tourteau","Coopérative Aubier","1","tour 1, table 1","Maëlle Quenouille","Atelier Ressac","1","tour 6, table 2","Sidonie Varech","Chantier Grève","1","tour 4, table 1","Aglaé Bruyère","Atelier Ressac","1","tour 4, table 1","Félix Cormier","Chantier Grève","1","tour 1, table 1","Ysé Dorine","Coopérative Aubier","1","tour 2, table 4","Paulin Escourgeon","Atelier Ressac","1","tour 6, table 2","Rosalie Fenouil","Chantier Grève","1","tour 5, table 2"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"3d5f81decd5609e36836cf8fc0ad7f4dc29f0f6e38b75f694cc8662f267aa00b","etape":"10","etat":"15fb09087464cf5b429c79e33325a0cd64579f1c650d7fd7aeabf6c3cbf977c0","facteurEchelle":1,"fichier":"15-pas-de-matrice","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"33ef9a780f4d0dd4191ee5a2b3918e21bc11631b941d5faee45bc407eb7c38a7"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-action-encre","ratio":8.29,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-encre","ratio":9.62,"role":"texte","seuil":4.5},{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 5 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 260 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","23","95 %","minimum 23 sur 24","chez François Ivrivet","plafond réalisé 24","plafond a priori 24","Personnes distinctes rencontrées, minimum : mobiles","24","Personnes distinctes rencontrées, minimum : ancrés","23","Collisions d'appartenance","Collisions cumulées (paire et tour)","52","Paires distinctes de même appartenance","52","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","103","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","29","99 imposés, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","17","chez François Ivrivet","borne de diversité 24","Redondance d'appartenance, somme Σ r(p)","1 288","Taux de diversité d(p), minimum","0,64","Manque et plafond a priori","Plus grand manque (personnes)","3","chez Marc Luskouze","131 personnes au manque maximal","plafond réalisé 27","Personnes à qui il en manque","131","Écart d'itinéraire maximal (personnes)","4","Écart au plafond a priori maximal (personnes)","4","Objectifs des tables et animateurs","Animateurs rencontrés, minimum","3","ne classe pas","chez Zoé WAMMERWOLM-MAWWEMMEL","borne des animateurs 4","Animateurs non rencontrés","29","ne classe pas","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","10","20","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","ancré","Minimum 23 personnes rencontrées, 3 personnes au minimum, 131 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","ancré","La personne au rang 1, François Ivrivet, rencontre","95 %","minimum 23 sur 24","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","8","Imprimerie Yzorne","effectif 12, 9 paires distinctes, excédent 0","Fabrique Sorbagne","effectif 11, 7 paires distinctes, excédent 0","Ateliers Falvigne","effectif 8, 3 paires distinctes, excédent 0","Ateliers Rossolde","effectif 11, 3 paires distinctes, excédent 0","Fonderie Estrolle","effectif 9, 3 paires distinctes, excédent 0","Verrerie Vaubrenne","effectif 10, 3 paires distinctes, excédent 0","Ateliers Tavrenne","effectif 8, 2 paires distinctes, excédent 0","Fonderie Xandrelle","effectif 6, 2 paires distinctes, excédent 0","Menuiserie Estrolle","effectif 9, 2 paires distinctes, excédent 0","Tannerie Nervanche","effectif 6, 2 paires distinctes, excédent 0","Ateliers Aubrenc","effectif 3, 1 paire distincte, excédent 0","Ateliers Cassorgue","effectif 3, 1 paire distincte, excédent 0","Brasserie Xandrelle","effectif 2, 1 paire distincte, excédent 0","Comptoir Gravelune","effectif 3, 1 paire distincte, excédent 0","Coopérative Jolvane","effectif 4, 1 paire distincte, excédent 0","Fabrique Kalvenne","effectif 3, 1 paire distincte, excédent 0","Filature Zelvaine","effectif 4, 1 paire distincte, excédent 0","Fonderie Sorbagne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Gravelune","effectif 3, 1 paire distincte, excédent 0","Menuiserie Hostrenne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Quimvaux","effectif 3, 1 paire distincte, excédent 0","Menuiserie Sorbagne","effectif 3, 1 paire distincte, excédent 0","Papeterie Hostrenne","effectif 2, 1 paire distincte, excédent 0","Papeterie Ulvardes","effectif 4, 1 paire distincte, excédent 0","Tannerie Belvarre","effectif 5, 1 paire distincte, excédent 0","Verrerie Aubrenc","effectif 2, 1 paire distincte, excédent 0","Ateliers Estrolle","effectif 3, 0 paire distincte, excédent 0","Ateliers Ivoranche","effectif 4, 0 paire distincte, excédent 0","Brasserie Belvarre","effectif 9, 0 paire distincte, excédent 0","Brasserie Dravenne","effectif 1, 0 paire distincte, excédent 0","Brasserie Lavorneau","effectif 2, 0 paire distincte, excédent 0","Brasserie Morvalle","effectif 2, 0 paire distincte, excédent 0","Brasserie Sorbagne","effectif 4, 0 paire distincte, excédent 0","Brasserie Wassorel","effectif 2, 0 paire distincte, excédent 0","Comptoir Ivoranche","effectif 1, 0 paire distincte, excédent 0","Comptoir Jolvane","effectif 3, 0 paire distincte, excédent 0","Comptoir Lavorneau","effectif 1, 0 paire distincte, excédent 0","Comptoir Sorbagne","effectif 4, 0 paire distincte, excédent 0","Comptoir Xandrelle","effectif 3, 0 paire distincte, excédent 0","Comptoir Yzorne","effectif 2, 0 paire distincte, excédent 0","Coopérative Dravenne","effectif 3, 0 paire distincte, excédent 0","Coopérative Gravelune","effectif 3, 0 paire distincte, excédent 0","Coopérative Morvalle","effectif 3, 0 paire distincte, excédent 0","Coopérative Rossolde","effectif 4, 0 paire distincte, excédent 0","Fabrique Ivoranche","effectif 3, 0 paire distincte, excédent 0","Fabrique Morvalle","effectif 1, 0 paire distincte, excédent 0","Fabrique Ulvardes","effectif 3, 0 paire distincte, excédent 0","Filature Dravenne","effectif 1, 0 paire distincte, excédent 0","Filature Olbrecq","effectif 2, 0 paire distincte, excédent 0","Filature Wassorel","effectif 3, 0 paire distincte, excédent 0","Fonderie Aubrenc","effectif 2, 0 paire distincte, excédent 0","Fonderie Ivoranche","effectif 2, 0 paire distincte, excédent 0","Fonderie Kalvenne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Falvigne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Hostrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Aubrenc","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ivoranche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Jolvane","effectif 1, 0 paire distincte, excédent 0","Menuiserie Nervanche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Olbrecq","effectif 4, 0 paire distincte, excédent 0","Menuiserie Tavrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ulvardes","effectif 6, 0 paire distincte, excédent 0","Menuiserie Wassorel","effectif 1, 0 paire distincte, excédent 0","Papeterie Estrolle","effectif 3, 0 paire distincte, excédent 0","Papeterie Wassorel","effectif 1, 0 paire distincte, excédent 0","Tannerie Aubrenc","effectif 3, 0 paire distincte, excédent 0","Tannerie Falvigne","effectif 1, 0 paire distincte, excédent 0","Tannerie Olbrecq","effectif 1, 0 paire distincte, excédent 0","Tannerie Quimvaux","effectif 1, 0 paire distincte, excédent 0","Verrerie Gravelune","effectif 1, 0 paire distincte, excédent 0","Verrerie Ivoranche","effectif 6, 0 paire distincte, excédent 0","Verrerie Nervanche","effectif 1, 0 paire distincte, excédent 0","Verrerie Olbrecq","effectif 2, 0 paire distincte, excédent 0","Verrerie Pravette","effectif 2, 0 paire distincte, excédent 0","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Imprimerie Yzorne » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 4","Table 12","Table 16","Table 20","Table 26","Table 33","Table 9","Table 10","Table 15","Table 24","Table 25","Table 29","Table 31","Table 32","Table 1","Table 2","Table 5","Table 6","Table 7","Table 8","Table 13","Table 14","Table 17","Table 18","Table 19","Table 21","Table 22","Table 23","Table 27","Table 28","Table 30","Table 3","Table 11","Tour 1","Tour 2","Tour 3","Tour 4","2","1","0","0","1","2","0","0","0","0","2","1","0","0","1","2","0","2","0","1","0","1","0","2","0","0","2","0","0","1","0","1","1","1","0","0","0","1","1","0","0","1","1","0","1","0","1","0","0","1","0","1","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","0","0","0","0","1","0","0","0","0","0","1","0","1","0","0","0","0","0","1","0","0","0","1","1","0","0","0","1","0","0","0","0","0","1","0","0","1","0","0","0","0","0","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","La table 4 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 100 sur 103","Suivantes","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Samuel Cloveval","Menuiserie Ulvardes","Hélène Bralmeval","Brasserie Dravenne","3 fois","Voir au tour 3","Tour 1, table 23","Tour 3, table 15","Tour 4, table 32","Hugo Fralvançon","Brasserie Wassorel","Léa Fralvault","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 11","Tour 3, table 2","Hugo Fralvançon","Brasserie Wassorel","Louise Quilmançon","Menuiserie Estrolle","2 fois","Voir au tour 3","Tour 1, table 13","Tour 3, table 2","Zoé WAMMERWOLM-MAWWEMMEL","Menuiserie Ulvardes","Catherine Hulveron","Coopérative Rossolde","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 15","Catherine Urvesson","Fabrique Ulvardes","Olivier Bralmançon","Comptoir Lavorneau","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 6","Karim Hulvivet","Fonderie Xandrelle","Guillaume Luskichon","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 2","Léa Fralvault","Fonderie Sorbagne","Lucie Tolvesson","Filature Zelvaine","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 11","Léa Fralvault","Fonderie Sorbagne","Samuel Abrevard","Filature Dravenne","2 fois","Voir au tour 4","Tour 2, table 11","Tour 4, table 4","Fatima Obrivet","Fabrique Sorbagne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 29","Philippe Voskeval","Menuiserie Estrolle","Émilie Korvard","Verrerie Vaubrenne","2 fois","Voir au tour 3","Tour 2, table 6","Tour 3, table 6","Zoé Dulveval","Menuiserie Quimvaux","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 13","Paul Korveux","Filature Olbrecq","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 1, table 15","Tour 3, table 5","Paul Korveux","Filature Olbrecq","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 3","Thomas Rozvotte","Verrerie Ivoranche","Antoine Quilmeron","Fabrique Kalvenne","2 fois","Voir au tour 4","Tour 3, table 33","Tour 4, table 26","Isabelle Bralmumet","Verrerie Aubrenc","Félix Korveval","Tannerie Nervanche","2 fois","Voir au tour 2","Tour 1, table 19","Tour 2, table 28","Isabelle Bralmumet","Verrerie Aubrenc","Louis Mirveron","Filature Wassorel","2 fois","Voir au tour 4","Tour 3, table 22","Tour 4, table 16","Simon Mirvivet","Ateliers Ivoranche","Hélène Gorzumet","Fonderie Aubrenc","2 fois","Voir au tour 3","Tour 1, table 9","Tour 3, table 18","Lucie Voskeux","Coopérative Morvalle","Samuel Cloveval","Menuiserie Ulvardes","2 fois","Voir au tour 3","Tour 2, table 14","Tour 3, table 15","Fatima Korvouze","Ateliers Tavrenne","Olivier Jusvançon","Brasserie Morvalle","2 fois","Voir au tour 3","Tour 2, table 3","Tour 3, table 3","Étienne Fralvichon","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 1, table 21","Tour 4, table 33","Louise Quilmançon","Menuiserie Estrolle","Paul Obrichon","Ateliers Rossolde","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 21","Louise Quilmançon","Menuiserie Estrolle","Étienne Eskesson","Menuiserie Ulvardes","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 7","Pierre Abreveron","Ateliers Rossolde","Manon Tolveron","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 5","Tour 3, table 5","Léa Tolvande","Ateliers Rossolde","Anne Abrevesson","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 2","Tour 3, table 14","Antoine Quilmeron","Fabrique Kalvenne","Samuel Bralmeux","Ateliers Rossolde","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 33","Michel Eskeux","Papeterie Wassorel","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 21","Louise Hulvault","Coopérative Jolvane","Karim Fralveval","Coopérative Gravelune","2 fois","Voir au tour 4","Tour 3, table 24","Tour 4, table 4","Catherine Hulveron","Coopérative Rossolde","Alexandre Korvotte","Menuiserie Nervanche","2 fois","Voir au tour 4","Tour 3, table 15","Tour 4, table 15","François Ivrivet","Menuiserie Sorbagne","François Gorzichon","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 32","Tour 4, table 32","Claire Fralvivet","Imprimerie Yzorne","Étienne Selvouze","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 14","Tour 3, table 27","Karim Gorzesson","Papeterie Ulvardes","Sophie Clovard","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 1, table 20","Tour 4, table 12","Manon Urvançon","Ateliers Tavrenne","Guillaume Tolvignac","Menuiserie Sorbagne","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 1","Sylvie Quilmande","Imprimerie Yzorne","Antoine Bralmault","Fabrique Sorbagne","2 fois","Voir au tour 4","Tour 1, table 4","Tour 4, table 4","Sylvie Quilmande","Imprimerie Yzorne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 14","Sylvie Quilmande","Imprimerie Yzorne","Hélène Rozveval","Comptoir Ivoranche","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 4","Amina Pruvesson","Fonderie Sorbagne","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 1, table 18","Tour 4, table 16","Amina Pruvesson","Fonderie Sorbagne","Léa Obrard","Comptoir Sorbagne","2 fois","Voir au tour 2","Tour 1, table 18","Tour 2, table 31","Lucie Quilmière","Fabrique Ivoranche","Anne Urvivet","Fonderie Kalvenne","2 fois","Voir au tour 2","Tour 1, table 21","Tour 2, table 9","Louis Selvivet","Menuiserie Hostrenne","Guillaume Hulvotte","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 2, table 25","Tour 4, table 25","Lucie Tolvesson","Filature Zelvaine","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 4","Tour 1, table 15","Tour 4, table 25","Olivier Quilmesson","Comptoir Gravelune","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 9","Gabriel Neskault","Menuiserie Tavrenne","Geneviève Abrevignac","Brasserie Morvalle","2 fois","Voir au tour 4","Tour 2, table 20","Tour 4, table 18","Gabriel Neskault","Menuiserie Tavrenne","François Clovotte","Coopérative Rossolde","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Gabriel Neskault","Menuiserie Tavrenne","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Olivier Jusvançon","Brasserie Morvalle","Hélène Selveux","Brasserie Lavorneau","2 fois","Voir au tour 4","Tour 1, table 24","Tour 4, table 25","Gabriel Pruveux","Papeterie Estrolle","Guillaume Obrançon","Papeterie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 31","Tour 4, table 27","Manon Clovière","Ateliers Ivoranche","Marc Vandergrolcquesmirtavelle-Ostrovaubelindigues","Tannerie Aubrenc","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 10","François Obrouze","Tannerie Olbrecq","Camille Tolvumet","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 31","Tour 3, table 31","Claire Gorzeron","Menuiserie Hostrenne","Guillaume Gorzivet","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 32","Tour 4, table 8","Hélène Luskumet","Brasserie Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 8","Louis Fralvande","Ateliers Rossolde","Philippe Ivroubre","Ateliers Tavrenne","2 fois","Voir au tour 4","Tour 1, table 19","Tour 4, table 19","Isabelle Korvichon","Menuiserie Ulvardes","Marie Dulvesson","Ateliers Cassorgue","2 fois","Voir au tour 4","Tour 1, table 7","Tour 4, table 10","Isabelle Korvichon","Menuiserie Ulvardes","Karim Clovivet","Fonderie Kalvenne","2 fois","Voir au tour 3","Tour 2, table 18","Tour 3, table 23","Fatima Tolvoubre","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 33","Zoé Gorzière","Menuiserie Olbrecq","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 2, table 7","Tour 3, table 25","Antoine Obreval","Ateliers Cassorgue","Alexandre Ivreux","Tannerie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 25","Tour 2, table 6","Antoine Obreval","Ateliers Cassorgue","Hugo Bralmouze","Tannerie Falvigne","2 fois","Voir au tour 4","Tour 3, table 23","Tour 4, table 23","Michel Korveron","Fonderie Sorbagne","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 8","Marie Dulvesson","Ateliers Cassorgue","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 3","Tour 2, table 16","Tour 3, table 17","Youssef Jusvard","Tannerie Aubrenc","Simon Hulvumet","Ateliers Ivoranche","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 21","Gabriel Mirvotte","Tannerie Belvarre","Paul Neskivet","Comptoir Jolvane","2 fois","Voir au tour 4","Tour 3, table 21","Tour 4, table 7","Marc Luskouze","Ateliers Rossolde","Isabelle Selvichon","Tannerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 21","Tour 3, table 8","Louis Hulvichon","Ateliers Falvigne","Nicolas Ivrichon","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 17","Tour 2, table 24","Pierre Pruveval","Comptoir Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 1, table 10","Tour 3, table 8","Geneviève Abrevignac","Brasserie Morvalle","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 7","Olivier Bralmançon","Comptoir Lavorneau","Véronique Jusvouze","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 6","Marc Luskoubre","Verrerie Vaubrenne","Thomas Quilmichon","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 33","Tour 4, table 5","Camille Jusvumet","Fonderie Estrolle","Guillaume Eskotte","Verrerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 27","Tour 3, table 11","Antoine Selvière","Coopérative Dravenne","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 1, table 11","Tour 3, table 9","Antoine Bralmault","Fabrique Sorbagne","Amina Rozvichon","Verrerie Olbrecq","2 fois","Voir au tour 3","Tour 2, table 4","Tour 3, table 4","Antoine Bralmault","Fabrique Sorbagne","Antoine Pruvouze","Imprimerie Yzorne","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 4","Émilie Abrevière","Imprimerie Yzorne","Fatima Hulvard","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 29","Émilie Abrevière","Imprimerie Yzorne","Geneviève Obresson","Coopérative Gravelune","2 fois","Voir au tour 3","Tour 1, table 29","Tour 3, table 29","Émilie Abrevière","Imprimerie Yzorne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 4","Tour 3, table 29","Tour 4, table 29","Olivier Tolvichon","Fonderie Xandrelle","Étienne Gorzeval","Papeterie Ulvardes","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 6","Félix Korveval","Tannerie Nervanche","Thomas Selvignac","Brasserie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 28","Tour 3, table 28","Émilie Dulvichon","Menuiserie Ulvardes","Lucie Voskeron","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Émilie Dulvichon","Menuiserie Ulvardes","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Claire Jusvivet","Imprimerie Yzorne","Hugo Voskumet","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 20","Tour 3, table 20","Amina Quilmault","Coopérative Jolvane","Philippe Abreveval","Ateliers Falvigne","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 4","Hélène Gorzumet","Fonderie Aubrenc","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 4","Tour 1, table 9","Tour 4, table 21","Sophie Ivrault","Coopérative Morvalle","Philippe Fralvignac","Menuiserie Estrolle","2 fois","Voir au tour 4","Tour 3, table 13","Tour 4, table 26","Nicolas Korvande","Comptoir Sorbagne","Chantal Obrignac","Imprimerie Yzorne","2 fois","Voir au tour 3","Tour 2, table 27","Tour 3, table 22","Fatima Urvignac","Ateliers Aubrenc","Claire Bralmotte","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 21","François Clovotte","Coopérative Rossolde","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Philippe Dulvoubre","Brasserie Belvarre","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 2","Tour 1, table 9","Tour 2, table 10","Chantal Mirvumet","Menuiserie Gravelune","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 29","Camille Neskard","Menuiserie Gravelune","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 2, table 16","Tour 4, table 16","Sophie Pruvière","Ateliers Rossolde","Raphaël Jusvault","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 16","Tour 2, table 2","Fatima Abrevançon","Tannerie Nervanche","Caroline Jusvoubre","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 13","Fatima Abrevançon","Tannerie Nervanche","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 13","Tour 4, table 13","Karim Clovançon","Fabrique Sorbagne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 17","Félix Eskouze","Filature Zelvaine","Sylvie Abreveux","Comptoir Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 19","Olivier Korvière","Ateliers Falvigne","Manon Pruvivet","Menuiserie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 20","Tour 2, table 10","Félix Voskande","Ateliers Falvigne","Guillaume Mirvoubre","Comptoir Sorbagne","2 fois","Voir au tour 4","Tour 2, table 7","Tour 4, table 7","Lucie Voskeron","Verrerie Ivoranche","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Thomas Selvignac","Brasserie Sorbagne","Étienne Voskançon","Menuiserie Olbrecq","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 28","Jean Neskeron","Filature Zelvaine","Zoé Mirveval","Fabrique Kalvenne","2 fois","Voir au tour 2","Tour 1, table 11","Tour 2, table 33","Sophie Clovard","Brasserie Belvarre","Marc Rozvouze","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 12","Alexandre Eskançon","Menuiserie Hostrenne","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 1, table 17","Tour 3, table 25","Qui a rencontré qui","La matrice n'est pas dessinée : 260 personnes dépassent le seuil de 40. La fiche de chaque personne porte ses rencontres.","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Animateurs rencontrés, de la personne la moins servie à la mieux servie","0","1","2","3","4","50","100","150","200","rang","animateurs rencontrés","borne des animateurs","animateurs rencontrés","borne des animateurs","Minimum 3 animateurs rencontrés, 29 personnes au minimum.","Voir le tableau","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucune personne présente ne porte d'étiquette : seule la colonne des appartenances se dessine.","Appartenances rencontrées en animant","le moins varié","17","le plus varié","27","au minimum","1","Diversité rencontrée en animant, sur la soirée","0","10","20","François Ivrivet","4 tours animés, 23 personnes rencontrées en animant","Samuel Bralmeux","4 tours animés, 23 personnes rencontrées en animant","Geneviève Dulvumet","4 tours animés, 24 personnes rencontrées en animant","François Obrouze","4 tours animés, 23 personnes rencontrées en animant","Antoine Bralmault","4 tours animés, 25 personnes rencontrées en animant","Catherine Hulveron","4 tours animés, 26 personnes rencontrées en animant","Camille Neskard","4 tours animés, 27 personnes rencontrées en animant","Guillaume Luskichon","4 tours animés, 27 personnes rencontrées en animant","Philippe Ivroubre","4 tours animés, 27 personnes rencontrées en animant","Marie Urvard","4 tours animés, 28 personnes rencontrées en animant","Sophie Pruvotte","4 tours animés, 28 personnes rencontrées en animant","Thomas Selvignac","4 tours animés, 26 personnes rencontrées en animant","Philippe Voskeval","4 tours animés, 27 personnes rencontrées en animant","Manon Urvançon","4 tours animés, 27 personnes rencontrées en animant","Marc Vandergrolcquesmirta…","4 tours animés, 27 personnes rencontrées en animant","Fatima Abrevançon","4 tours animés, 26 personnes rencontrées en animant","Claire Jusvivet","4 tours animés, 27 personnes rencontrées en animant","Félix Voskande","4 tours animés, 27 personnes rencontrées en animant","Louise Neskichon","4 tours animés, 28 personnes rencontrées en animant","Gabriel Abrevault","4 tours animés, 28 personnes rencontrées en animant","Émilie Abrevière","4 tours animés, 25 personnes rencontrées en animant","Youssef Jusvard","4 tours animés, 27 personnes rencontrées en animant","Manon Tolveron","4 tours animés, 27 personnes rencontrées en animant","Hugo Bralmouze","4 tours animés, 27 personnes rencontrées en animant","Marie Bralmesson","4 tours animés, 28 personnes rencontrées en animant","Louis Selvivet","4 tours animés, 27 personnes rencontrées en animant","Michel Korveron","4 tours animés, 27 personnes rencontrées en animant","Youssef Neskière","4 tours animés, 28 personnes rencontrées en animant","Jean Fralvumet","4 tours animés, 28 personnes rencontrées en animant","Fatima Korvouze","4 tours animés, 27 personnes rencontrées en animant","Gabriel Ivreval","4 tours animés, 28 personnes rencontrées en animant","Guillaume Dulvivet","4 tours animés, 28 personnes rencontrées en animant","Étienne Tolvançon","4 tours animés, 28 personnes rencontrées en animant","Appartenances rencontrées en animant","Appartenances rencontrées en animant","Le moins varié rencontre 17 appartenances en animant ; 1 animateur au minimum.","Voir le tableau","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","2 000 mouvements évalués sur 2 000","durée observée 2,5 s","1 cœur de calcul","cadence 4 000 mouvements par seconde","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","5","10","15","20","1","10","100","2 000","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 21 ; au dernier : 23.","écart au plafond a priori, aux points de relevé","0","2","4","6","1","10","100","2 000","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 6 ; au dernier : 4.","excédent de collisions, aux points de relevé","0","1","2","3","4","1","10","100","2 000","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 3 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","20","40","60","1","10","100","2 000","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 67 ; au dernier : 52.","rencontres répétées, aux points de relevé","0","50","100","1","10","100","2 000","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 145 ; au dernier : 103.","redondance d'appartenance, aux points de relevé","0","500","1 000","1","10","100","2 000","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 1 298 ; au dernier : 1 288.","Une valeur a changé au dernier point de relevé, à 2 000 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"b82822b5a3a215dabc05deba4456ee91e4265ed108ccf3eb69b49bd5a0bddfd9","etape":"10","etat":"998f656fb722cc8b40bfb0a1e0202acb706637ef24a0b775dce60f72fb74cdd6","facteurEchelle":1,"fichier":"15a-qualite-objectifs","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"bdb8012f5ab0c11dfc32a9f6d9703ff95b2c0f9e578b370360f26b9f697677cc"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-avis","ratio":6.58,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-reste","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-avis","ratio":8.93,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-reste","ratio":6.89,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","14 participants","3 tables · 28 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Le placement retenu et les propositions n° 1, 2, 3, 4 et 5 ne décrivent plus la liste ou les tables actuelles : ils sont gardés, et rien n'est effacé.","Ouvrir les propositions","Placement retenu","Iris Ombrelle, ajoutée ou réintégrée depuis, n'y est pas placée.","Le nombre de tours est passé de 3 à 4.","Proposition n°","1","Iris Ombrelle, ajoutée ou réintégrée depuis, n'y est pas placée.","La table 3 a été ajoutée depuis.","Le nombre de tours est passé de 3 à 4.","Proposition n°","2","Iris Ombrelle, ajoutée ou réintégrée depuis, n'y est pas placée.","La table 3 a été ajoutée depuis.","Le nombre de tours est passé de 3 à 4.","Proposition n°","3","Iris Ombrelle, ajoutée ou réintégrée depuis, n'y est pas placée.","La table 3 a été ajoutée depuis.","Le nombre de tours est passé de 3 à 4.","Proposition n°","4","Iris Ombrelle, ajoutée ou réintégrée depuis, n'y est pas placée.","La table 3 a été ajoutée depuis.","Le nombre de tours est passé de 3 à 4.","Proposition n°","5","Iris Ombrelle, ajoutée ou réintégrée depuis, n'y est pas placée.","La table 3 a été ajoutée depuis.","Le nombre de tours est passé de 3 à 4.","Le placement retenu, issu de la proposition n° 3, enfreint 3 règles que la dérive ne dit pas. Le placement retenu n'honore pas la réservation de la personne n° 4 à la table d'identifiant 3 au tour 1 : il la place ailleurs. Le placement retenu n'honore pas la réservation de la personne n° 4 à la table d'identifiant 3 au tour 2 : il la place ailleurs. Le placement retenu n'honore pas la réservation de la personne n° 4 à la table d'identifiant 3 au tour 3 : il la place ailleurs.","Qualité","Placement mesuré :","Proposition n° 9, vue seule","Revenir au placement retenu","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 13 personnes, 1 exclue à part.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","9","81 %","minimum 9 sur 11","chez Ysaline Sablonnet","plafond réalisé 11","plafond a priori 11","Personnes distinctes rencontrées, minimum : mobiles","9","Personnes distinctes rencontrées, minimum : ancrés","9","Collisions d'appartenance","Collisions cumulées (paire et tour)","19","Paires distinctes de même appartenance","13","Excédent de collisions (retrouvailles au-delà de la première)","6","Rencontres répétées et retours","Rencontres répétées choisies (paires)","33","0 imposée, à part","Rencontres d'une même paire, au plus","4","Retours choisis à une table déjà occupée","16","6 imposés, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","3","chez Basile Lanterneau","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","75","Taux de diversité d(p), minimum","0,30","Manque et plafond a priori","Plus grand manque (personnes)","2","chez Ysaline Sablonnet","11 personnes au manque maximal","plafond réalisé 11","Personnes à qui il en manque","11","Écart d'itinéraire maximal (personnes)","1","Écart au plafond a priori maximal (personnes)","3","Objectifs des tables et animateurs","Personnes jamais servies","0","ne classe pas","Plus de tours hors objectif d'une personne","2","ne classe pas","Tours hors objectif (personne et tour)","3","75 % des tours possibles servis","0 personne jamais servie","Tours selon l'objectif s(p), minimum","2","50 %","minimum 2 sur 4","chez Gaspard Marbrelle","4 tours possibles","Animateurs rencontrés, minimum","1","ne classe pas","chez Bertille Cressonnier","borne des animateurs 2","Animateurs non rencontrés","2","ne classe pas","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","5","10","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","ancré","partiellement fixé","Minimum 9 personnes rencontrées, 2 personnes au minimum, 11 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","ancré","partiellement fixé","La personne au rang 1, Ysaline Sablonnet, rencontre","81 %","minimum 9 sur 11","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","8","Chœur de l’Anse","effectif 4, 5 paires distinctes, excédent 3","Société des Hérons","effectif 4, 5 paires distinctes, excédent 2","Cercle des Saules","effectif 3, 3 paires distinctes, excédent 1","prouvé inévitable","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Chœur de l’Anse » : 3 collisions.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 3","Table 2","Tour 1","Tour 2","Tour 3","Tour 4","7","7","7","8","8","7","7","7","7","6","6","7","La table 1 porte la case la plus haute : 8.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 33 sur 33","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Anselme Givrecœur","Apolline Coudraie","Chœur de l’Anse","4 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 3","Tour 3, table 2","Tour 4, table 1","Basile Lanterneau","n° 9","Chœur de l’Anse","Brunœil","Cercle des Saules","4 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Tour 3, table 3","Tour 4, table 3","Basile Lanterneau","n° 1","Chœur de l’Anse","Côme Fenouillet","Société des Hérons","3 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Tour 4, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Iris Ombrelle","3 fois","Voir au tour 3","Tour 2, table 1","Tour 3, table 1","Tour 4, table 1","Capucine Pommerel","Société des Hérons","Iris Ombrelle","3 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 1","Tour 4, table 1","Gaspard Marbrelle","Cercle des Saules","Anselme Givrecœur","3 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 3","Tour 3, table 2","Gaspard Marbrelle","Cercle des Saules","Apolline Coudraie","Chœur de l’Anse","3 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 3","Tour 3, table 2","Côme Fenouillet","Société des Hérons","Basile Lanterneau","n° 9","Chœur de l’Anse","3 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Tour 3, table 3","Côme Fenouillet","Société des Hérons","Brunœil","Cercle des Saules","3 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Tour 3, table 3","Faustine Ormelin","Société des Hérons","Iris Ombrelle","3 fois","Voir au tour 2","Tour 1, table 2","Tour 2, table 1","Tour 3, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Capucine Pommerel","Société des Hérons","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Anselme Givrecœur","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Apolline Coudraie","Chœur de l’Anse","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Basile Lanterneau","n° 9","Chœur de l’Anse","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Brunœil","Cercle des Saules","2 fois","Voir au tour 2","Tour 1, table 1","Tour 2, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Faustine Ormelin","Société des Hérons","2 fois","Voir au tour 3","Tour 2, table 1","Tour 3, table 1","Basile Lanterneau","n° 1","Chœur de l’Anse","Bertille Cressonnier","Cercle des Saules","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 1","Capucine Pommerel","Société des Hérons","Anselme Givrecœur","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 1","Capucine Pommerel","Société des Hérons","Apolline Coudraie","Chœur de l’Anse","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 1","Capucine Pommerel","Société des Hérons","Faustine Ormelin","Société des Hérons","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 1","Gaspard Marbrelle","Cercle des Saules","Ysaline Sablonnet","Chœur de l’Anse","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 3","Gaspard Marbrelle","Cercle des Saules","Basile Lanterneau","n° 9","Chœur de l’Anse","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 3","Gaspard Marbrelle","Cercle des Saules","Brunœil","Cercle des Saules","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 3","Ysaline Sablonnet","Chœur de l’Anse","Basile Lanterneau","n° 9","Chœur de l’Anse","2 fois","Voir au tour 4","Tour 3, table 3","Tour 4, table 3","Ysaline Sablonnet","Chœur de l’Anse","Brunœil","Cercle des Saules","2 fois","Voir au tour 4","Tour 3, table 3","Tour 4, table 3","Ysaline Sablonnet","Chœur de l’Anse","Edgar Ardoisier","Société des Hérons","2 fois","Voir au tour 4","Tour 1, table 3","Tour 4, table 3","Anselme Givrecœur","Côme Fenouillet","Société des Hérons","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 1","Côme Fenouillet","Société des Hérons","Apolline Coudraie","Chœur de l’Anse","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 1","Côme Fenouillet","Société des Hérons","Iris Ombrelle","2 fois","Voir au tour 4","Tour 2, table 1","Tour 4, table 1","Basile Lanterneau","n° 9","Chœur de l’Anse","Faustine Ormelin","Société des Hérons","2 fois","Voir au tour 4","Tour 2, table 1","Tour 4, table 3","Brunœil","Cercle des Saules","Faustine Ormelin","Société des Hérons","2 fois","Voir au tour 4","Tour 2, table 1","Tour 4, table 3","Faustine Ormelin","Société des Hérons","Edgar Ardoisier","Société des Hérons","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 3","Edgar Ardoisier","Société des Hérons","Bertille Cressonnier","Cercle des Saules","2 fois","Voir au tour 3","Tour 2, table 2","Tour 3, table 1","Qui a rencontré qui","Qui a rencontré qui","1. Ysaline Sablonnet","2. Edgar Ardoisier","3. Capucine Pommerel","4. Anselme Givrecœur","5. Apolline Coudraie","6. Faustine Ormelin","7. Iris Ombrelle","8. Gaspard Marbrelle","9. Côme Fenouillet","10. Basile Lanterneau (n° 9)","11. Brunœil","12. Basile Lanterneau (n° 1)","13. Bertille Cressonnier","1","2","3","4","5","6","7","8","9","10","11","12","13","2","1","1","1","1","0","2","1","2","2","0","0","2","1","0","0","2","1","1","0","1","1","1","2","1","1","2","2","2","3","1","1","0","0","2","1","1","0","2","4","0","1","3","2","1","1","2","1","1","0","2","4","0","1","3","2","1","1","2","1","1","2","2","0","0","3","1","1","2","2","2","1","0","1","3","1","1","3","0","2","1","1","3","1","2","1","1","3","3","1","0","1","2","2","1","1","1","0","1","2","2","1","2","1","3","3","3","1","2","1","0","1","1","2","1","2","3","4","2","1","2","1","0","1","1","2","1","2","3","4","2","1","0","1","2","2","2","2","3","1","3","2","2","2","0","2","1","1","1","1","1","1","1","1","1","2","Chaque case porte le nombre de rencontres de la paire. 33 paires choisies se revoient, la plus revue 4 fois.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Personnes jamais servies","Chaque personne concernée est servie à un tour au moins.","75 % des tours possibles servis","0 personne jamais servie","9 servis sur 12 possibles","3 tours hors objectif, plancher 0","Tours hors objectif, tour par tour","0","1","2","Tour 2","10 assis sans table possible","Tour 1","10 assis sans table possible","Tour 3","10 assis sans table possible","Tour 4","10 assis sans table possible","reste","prouvé inévitable","reste","En tête, le tour 2, au plus grand reste : 2 au-delà de son plancher, sur 2 tours hors objectif.","Tour 2","33 %","1 servi sur 3 possibles","Tour 1","100 %","3 servis sur 3 possibles","Tour 3","100 %","3 servis sur 3 possibles","Tour 4","66 %","2 servis sur 3 possibles","Voir le tableau","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Animateurs rencontrés, de la personne la moins servie à la mieux servie","0","1","2","2","4","6","8","10","rang","animateurs rencontrés","borne des animateurs","animateurs rencontrés","borne des animateurs","Minimum 1 animateur rencontré, 2 personnes au minimum.","Voir le tableau","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Appartenances rencontrées en animant","le moins varié","3","le plus varié","3","au minimum","2","Étiquettes rencontrées en animant","le moins varié","3","le plus varié","3","au minimum","2","Diversité rencontrée en animant, sur la soirée","Appartenances rencontrées en animant","0","1","2","3","Étiquettes rencontrées en animant","0","1","2","3","Ysaline Sablonnet","4 tours animés, 9 personnes rencontrées en animant","Basile Lanterneau","4 tours animés, 11 personnes rencontrées en animant","Le moins varié rencontre 3 appartenances en animant ; 2 animateurs au minimum. Le moins varié rencontre 3 étiquettes en animant ; 2 animateurs au minimum.","Voir le tableau","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","300 mouvements évalués sur 300","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","6","8","1","10","100","300","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 0 ; au dernier : 9.","écart au plafond a priori, aux points de relevé","0","5","10","1","10","100","300","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 11 ; au dernier : 3.","excédent de collisions, aux points de relevé","0","5","10","15","1","10","100","300","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 19 ; au dernier : 6.","collisions cumulées, aux points de relevé","0","10","20","30","1","10","100","300","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 30 ; au dernier : 19.","tours hors objectif, aux points de relevé","0","1","2","3","1","10","100","300","Mouvements évalués, échelle logarithmique","tours hors objectif","tours hors objectif","Au premier point de relevé, tours hors objectif : 1 ; au dernier : 3.","rencontres répétées, aux points de relevé","0","20","40","1","10","100","300","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 55 ; au dernier : 33.","redondance d'appartenance, aux points de relevé","0","20","40","60","1","10","100","300","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 64 ; au dernier : 75.","Aucune valeur n'a changé entre 100 et 300 mouvements ; une autre graine est l'autre façon de chercher.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"414ed36ad23327f811f3243209a21a0ddea95ae2703fc5f9a657a7aee3d43c0b","etape":"10","etat":"15fb09087464cf5b429c79e33325a0cd64579f1c650d7fd7aeabf6c3cbf977c0","facteurEchelle":1,"fichier":"15b-qualite-animateurs","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"d12cd172d65a5bcd6fa1c6d0b120e44fe1d41483528f08c25c7acd4bf79f396a"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":3.93,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-borne","ratio":4.96,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":6.89,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 5 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 260 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","23","95 %","minimum 23 sur 24","chez François Ivrivet","plafond réalisé 24","plafond a priori 24","Personnes distinctes rencontrées, minimum : mobiles","24","Personnes distinctes rencontrées, minimum : ancrés","23","Collisions d'appartenance","Collisions cumulées (paire et tour)","52","Paires distinctes de même appartenance","52","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","103","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","29","99 imposés, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","17","chez François Ivrivet","borne de diversité 24","Redondance d'appartenance, somme Σ r(p)","1 288","Taux de diversité d(p), minimum","0,64","Manque et plafond a priori","Plus grand manque (personnes)","3","chez Marc Luskouze","131 personnes au manque maximal","plafond réalisé 27","Personnes à qui il en manque","131","Écart d'itinéraire maximal (personnes)","4","Écart au plafond a priori maximal (personnes)","4","Objectifs des tables et animateurs","Animateurs rencontrés, minimum","3","ne classe pas","chez Zoé WAMMERWOLM-MAWWEMMEL","borne des animateurs 4","Animateurs non rencontrés","29","ne classe pas","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","10","20","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","ancré","Minimum 23 personnes rencontrées, 3 personnes au minimum, 131 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","ancré","La personne au rang 1, François Ivrivet, rencontre","95 %","minimum 23 sur 24","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","8","Imprimerie Yzorne","effectif 12, 9 paires distinctes, excédent 0","Fabrique Sorbagne","effectif 11, 7 paires distinctes, excédent 0","Ateliers Falvigne","effectif 8, 3 paires distinctes, excédent 0","Ateliers Rossolde","effectif 11, 3 paires distinctes, excédent 0","Fonderie Estrolle","effectif 9, 3 paires distinctes, excédent 0","Verrerie Vaubrenne","effectif 10, 3 paires distinctes, excédent 0","Ateliers Tavrenne","effectif 8, 2 paires distinctes, excédent 0","Fonderie Xandrelle","effectif 6, 2 paires distinctes, excédent 0","Menuiserie Estrolle","effectif 9, 2 paires distinctes, excédent 0","Tannerie Nervanche","effectif 6, 2 paires distinctes, excédent 0","Ateliers Aubrenc","effectif 3, 1 paire distincte, excédent 0","Ateliers Cassorgue","effectif 3, 1 paire distincte, excédent 0","Brasserie Xandrelle","effectif 2, 1 paire distincte, excédent 0","Comptoir Gravelune","effectif 3, 1 paire distincte, excédent 0","Coopérative Jolvane","effectif 4, 1 paire distincte, excédent 0","Fabrique Kalvenne","effectif 3, 1 paire distincte, excédent 0","Filature Zelvaine","effectif 4, 1 paire distincte, excédent 0","Fonderie Sorbagne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Gravelune","effectif 3, 1 paire distincte, excédent 0","Menuiserie Hostrenne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Quimvaux","effectif 3, 1 paire distincte, excédent 0","Menuiserie Sorbagne","effectif 3, 1 paire distincte, excédent 0","Papeterie Hostrenne","effectif 2, 1 paire distincte, excédent 0","Papeterie Ulvardes","effectif 4, 1 paire distincte, excédent 0","Tannerie Belvarre","effectif 5, 1 paire distincte, excédent 0","Verrerie Aubrenc","effectif 2, 1 paire distincte, excédent 0","Ateliers Estrolle","effectif 3, 0 paire distincte, excédent 0","Ateliers Ivoranche","effectif 4, 0 paire distincte, excédent 0","Brasserie Belvarre","effectif 9, 0 paire distincte, excédent 0","Brasserie Dravenne","effectif 1, 0 paire distincte, excédent 0","Brasserie Lavorneau","effectif 2, 0 paire distincte, excédent 0","Brasserie Morvalle","effectif 2, 0 paire distincte, excédent 0","Brasserie Sorbagne","effectif 4, 0 paire distincte, excédent 0","Brasserie Wassorel","effectif 2, 0 paire distincte, excédent 0","Comptoir Ivoranche","effectif 1, 0 paire distincte, excédent 0","Comptoir Jolvane","effectif 3, 0 paire distincte, excédent 0","Comptoir Lavorneau","effectif 1, 0 paire distincte, excédent 0","Comptoir Sorbagne","effectif 4, 0 paire distincte, excédent 0","Comptoir Xandrelle","effectif 3, 0 paire distincte, excédent 0","Comptoir Yzorne","effectif 2, 0 paire distincte, excédent 0","Coopérative Dravenne","effectif 3, 0 paire distincte, excédent 0","Coopérative Gravelune","effectif 3, 0 paire distincte, excédent 0","Coopérative Morvalle","effectif 3, 0 paire distincte, excédent 0","Coopérative Rossolde","effectif 4, 0 paire distincte, excédent 0","Fabrique Ivoranche","effectif 3, 0 paire distincte, excédent 0","Fabrique Morvalle","effectif 1, 0 paire distincte, excédent 0","Fabrique Ulvardes","effectif 3, 0 paire distincte, excédent 0","Filature Dravenne","effectif 1, 0 paire distincte, excédent 0","Filature Olbrecq","effectif 2, 0 paire distincte, excédent 0","Filature Wassorel","effectif 3, 0 paire distincte, excédent 0","Fonderie Aubrenc","effectif 2, 0 paire distincte, excédent 0","Fonderie Ivoranche","effectif 2, 0 paire distincte, excédent 0","Fonderie Kalvenne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Falvigne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Hostrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Aubrenc","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ivoranche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Jolvane","effectif 1, 0 paire distincte, excédent 0","Menuiserie Nervanche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Olbrecq","effectif 4, 0 paire distincte, excédent 0","Menuiserie Tavrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ulvardes","effectif 6, 0 paire distincte, excédent 0","Menuiserie Wassorel","effectif 1, 0 paire distincte, excédent 0","Papeterie Estrolle","effectif 3, 0 paire distincte, excédent 0","Papeterie Wassorel","effectif 1, 0 paire distincte, excédent 0","Tannerie Aubrenc","effectif 3, 0 paire distincte, excédent 0","Tannerie Falvigne","effectif 1, 0 paire distincte, excédent 0","Tannerie Olbrecq","effectif 1, 0 paire distincte, excédent 0","Tannerie Quimvaux","effectif 1, 0 paire distincte, excédent 0","Verrerie Gravelune","effectif 1, 0 paire distincte, excédent 0","Verrerie Ivoranche","effectif 6, 0 paire distincte, excédent 0","Verrerie Nervanche","effectif 1, 0 paire distincte, excédent 0","Verrerie Olbrecq","effectif 2, 0 paire distincte, excédent 0","Verrerie Pravette","effectif 2, 0 paire distincte, excédent 0","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Imprimerie Yzorne » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 4","Table 12","Table 16","Table 20","Table 26","Table 33","Table 9","Table 10","Table 15","Table 24","Table 25","Table 29","Table 31","Table 32","Table 1","Table 2","Table 5","Table 6","Table 7","Table 8","Table 13","Table 14","Table 17","Table 18","Table 19","Table 21","Table 22","Table 23","Table 27","Table 28","Table 30","Table 3","Table 11","Tour 1","Tour 2","Tour 3","Tour 4","2","1","0","0","1","2","0","0","0","0","2","1","0","0","1","2","0","2","0","1","0","1","0","2","0","0","2","0","0","1","0","1","1","1","0","0","0","1","1","0","0","1","1","0","1","0","1","0","0","1","0","1","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","0","0","0","0","1","0","0","0","0","0","1","0","1","0","0","0","0","0","1","0","0","0","1","1","0","0","0","1","0","0","0","0","0","1","0","0","1","0","0","0","0","0","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","La table 4 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 100 sur 103","Suivantes","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Samuel Cloveval","Menuiserie Ulvardes","Hélène Bralmeval","Brasserie Dravenne","3 fois","Voir au tour 3","Tour 1, table 23","Tour 3, table 15","Tour 4, table 32","Hugo Fralvançon","Brasserie Wassorel","Léa Fralvault","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 11","Tour 3, table 2","Hugo Fralvançon","Brasserie Wassorel","Louise Quilmançon","Menuiserie Estrolle","2 fois","Voir au tour 3","Tour 1, table 13","Tour 3, table 2","Zoé WAMMERWOLM-MAWWEMMEL","Menuiserie Ulvardes","Catherine Hulveron","Coopérative Rossolde","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 15","Catherine Urvesson","Fabrique Ulvardes","Olivier Bralmançon","Comptoir Lavorneau","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 6","Karim Hulvivet","Fonderie Xandrelle","Guillaume Luskichon","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 2","Léa Fralvault","Fonderie Sorbagne","Lucie Tolvesson","Filature Zelvaine","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 11","Léa Fralvault","Fonderie Sorbagne","Samuel Abrevard","Filature Dravenne","2 fois","Voir au tour 4","Tour 2, table 11","Tour 4, table 4","Fatima Obrivet","Fabrique Sorbagne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 29","Philippe Voskeval","Menuiserie Estrolle","Émilie Korvard","Verrerie Vaubrenne","2 fois","Voir au tour 3","Tour 2, table 6","Tour 3, table 6","Zoé Dulveval","Menuiserie Quimvaux","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 13","Paul Korveux","Filature Olbrecq","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 1, table 15","Tour 3, table 5","Paul Korveux","Filature Olbrecq","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 3","Thomas Rozvotte","Verrerie Ivoranche","Antoine Quilmeron","Fabrique Kalvenne","2 fois","Voir au tour 4","Tour 3, table 33","Tour 4, table 26","Isabelle Bralmumet","Verrerie Aubrenc","Félix Korveval","Tannerie Nervanche","2 fois","Voir au tour 2","Tour 1, table 19","Tour 2, table 28","Isabelle Bralmumet","Verrerie Aubrenc","Louis Mirveron","Filature Wassorel","2 fois","Voir au tour 4","Tour 3, table 22","Tour 4, table 16","Simon Mirvivet","Ateliers Ivoranche","Hélène Gorzumet","Fonderie Aubrenc","2 fois","Voir au tour 3","Tour 1, table 9","Tour 3, table 18","Lucie Voskeux","Coopérative Morvalle","Samuel Cloveval","Menuiserie Ulvardes","2 fois","Voir au tour 3","Tour 2, table 14","Tour 3, table 15","Fatima Korvouze","Ateliers Tavrenne","Olivier Jusvançon","Brasserie Morvalle","2 fois","Voir au tour 3","Tour 2, table 3","Tour 3, table 3","Étienne Fralvichon","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 1, table 21","Tour 4, table 33","Louise Quilmançon","Menuiserie Estrolle","Paul Obrichon","Ateliers Rossolde","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 21","Louise Quilmançon","Menuiserie Estrolle","Étienne Eskesson","Menuiserie Ulvardes","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 7","Pierre Abreveron","Ateliers Rossolde","Manon Tolveron","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 5","Tour 3, table 5","Léa Tolvande","Ateliers Rossolde","Anne Abrevesson","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 2","Tour 3, table 14","Antoine Quilmeron","Fabrique Kalvenne","Samuel Bralmeux","Ateliers Rossolde","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 33","Michel Eskeux","Papeterie Wassorel","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 21","Louise Hulvault","Coopérative Jolvane","Karim Fralveval","Coopérative Gravelune","2 fois","Voir au tour 4","Tour 3, table 24","Tour 4, table 4","Catherine Hulveron","Coopérative Rossolde","Alexandre Korvotte","Menuiserie Nervanche","2 fois","Voir au tour 4","Tour 3, table 15","Tour 4, table 15","François Ivrivet","Menuiserie Sorbagne","François Gorzichon","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 32","Tour 4, table 32","Claire Fralvivet","Imprimerie Yzorne","Étienne Selvouze","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 14","Tour 3, table 27","Karim Gorzesson","Papeterie Ulvardes","Sophie Clovard","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 1, table 20","Tour 4, table 12","Manon Urvançon","Ateliers Tavrenne","Guillaume Tolvignac","Menuiserie Sorbagne","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 1","Sylvie Quilmande","Imprimerie Yzorne","Antoine Bralmault","Fabrique Sorbagne","2 fois","Voir au tour 4","Tour 1, table 4","Tour 4, table 4","Sylvie Quilmande","Imprimerie Yzorne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 14","Sylvie Quilmande","Imprimerie Yzorne","Hélène Rozveval","Comptoir Ivoranche","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 4","Amina Pruvesson","Fonderie Sorbagne","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 1, table 18","Tour 4, table 16","Amina Pruvesson","Fonderie Sorbagne","Léa Obrard","Comptoir Sorbagne","2 fois","Voir au tour 2","Tour 1, table 18","Tour 2, table 31","Lucie Quilmière","Fabrique Ivoranche","Anne Urvivet","Fonderie Kalvenne","2 fois","Voir au tour 2","Tour 1, table 21","Tour 2, table 9","Louis Selvivet","Menuiserie Hostrenne","Guillaume Hulvotte","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 2, table 25","Tour 4, table 25","Lucie Tolvesson","Filature Zelvaine","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 4","Tour 1, table 15","Tour 4, table 25","Olivier Quilmesson","Comptoir Gravelune","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 9","Gabriel Neskault","Menuiserie Tavrenne","Geneviève Abrevignac","Brasserie Morvalle","2 fois","Voir au tour 4","Tour 2, table 20","Tour 4, table 18","Gabriel Neskault","Menuiserie Tavrenne","François Clovotte","Coopérative Rossolde","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Gabriel Neskault","Menuiserie Tavrenne","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Olivier Jusvançon","Brasserie Morvalle","Hélène Selveux","Brasserie Lavorneau","2 fois","Voir au tour 4","Tour 1, table 24","Tour 4, table 25","Gabriel Pruveux","Papeterie Estrolle","Guillaume Obrançon","Papeterie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 31","Tour 4, table 27","Manon Clovière","Ateliers Ivoranche","Marc Vandergrolcquesmirtavelle-Ostrovaubelindigues","Tannerie Aubrenc","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 10","François Obrouze","Tannerie Olbrecq","Camille Tolvumet","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 31","Tour 3, table 31","Claire Gorzeron","Menuiserie Hostrenne","Guillaume Gorzivet","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 32","Tour 4, table 8","Hélène Luskumet","Brasserie Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 8","Louis Fralvande","Ateliers Rossolde","Philippe Ivroubre","Ateliers Tavrenne","2 fois","Voir au tour 4","Tour 1, table 19","Tour 4, table 19","Isabelle Korvichon","Menuiserie Ulvardes","Marie Dulvesson","Ateliers Cassorgue","2 fois","Voir au tour 4","Tour 1, table 7","Tour 4, table 10","Isabelle Korvichon","Menuiserie Ulvardes","Karim Clovivet","Fonderie Kalvenne","2 fois","Voir au tour 3","Tour 2, table 18","Tour 3, table 23","Fatima Tolvoubre","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 33","Zoé Gorzière","Menuiserie Olbrecq","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 2, table 7","Tour 3, table 25","Antoine Obreval","Ateliers Cassorgue","Alexandre Ivreux","Tannerie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 25","Tour 2, table 6","Antoine Obreval","Ateliers Cassorgue","Hugo Bralmouze","Tannerie Falvigne","2 fois","Voir au tour 4","Tour 3, table 23","Tour 4, table 23","Michel Korveron","Fonderie Sorbagne","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 8","Marie Dulvesson","Ateliers Cassorgue","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 3","Tour 2, table 16","Tour 3, table 17","Youssef Jusvard","Tannerie Aubrenc","Simon Hulvumet","Ateliers Ivoranche","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 21","Gabriel Mirvotte","Tannerie Belvarre","Paul Neskivet","Comptoir Jolvane","2 fois","Voir au tour 4","Tour 3, table 21","Tour 4, table 7","Marc Luskouze","Ateliers Rossolde","Isabelle Selvichon","Tannerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 21","Tour 3, table 8","Louis Hulvichon","Ateliers Falvigne","Nicolas Ivrichon","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 17","Tour 2, table 24","Pierre Pruveval","Comptoir Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 1, table 10","Tour 3, table 8","Geneviève Abrevignac","Brasserie Morvalle","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 7","Olivier Bralmançon","Comptoir Lavorneau","Véronique Jusvouze","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 6","Marc Luskoubre","Verrerie Vaubrenne","Thomas Quilmichon","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 33","Tour 4, table 5","Camille Jusvumet","Fonderie Estrolle","Guillaume Eskotte","Verrerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 27","Tour 3, table 11","Antoine Selvière","Coopérative Dravenne","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 1, table 11","Tour 3, table 9","Antoine Bralmault","Fabrique Sorbagne","Amina Rozvichon","Verrerie Olbrecq","2 fois","Voir au tour 3","Tour 2, table 4","Tour 3, table 4","Antoine Bralmault","Fabrique Sorbagne","Antoine Pruvouze","Imprimerie Yzorne","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 4","Émilie Abrevière","Imprimerie Yzorne","Fatima Hulvard","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 29","Émilie Abrevière","Imprimerie Yzorne","Geneviève Obresson","Coopérative Gravelune","2 fois","Voir au tour 3","Tour 1, table 29","Tour 3, table 29","Émilie Abrevière","Imprimerie Yzorne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 4","Tour 3, table 29","Tour 4, table 29","Olivier Tolvichon","Fonderie Xandrelle","Étienne Gorzeval","Papeterie Ulvardes","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 6","Félix Korveval","Tannerie Nervanche","Thomas Selvignac","Brasserie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 28","Tour 3, table 28","Émilie Dulvichon","Menuiserie Ulvardes","Lucie Voskeron","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Émilie Dulvichon","Menuiserie Ulvardes","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Claire Jusvivet","Imprimerie Yzorne","Hugo Voskumet","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 20","Tour 3, table 20","Amina Quilmault","Coopérative Jolvane","Philippe Abreveval","Ateliers Falvigne","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 4","Hélène Gorzumet","Fonderie Aubrenc","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 4","Tour 1, table 9","Tour 4, table 21","Sophie Ivrault","Coopérative Morvalle","Philippe Fralvignac","Menuiserie Estrolle","2 fois","Voir au tour 4","Tour 3, table 13","Tour 4, table 26","Nicolas Korvande","Comptoir Sorbagne","Chantal Obrignac","Imprimerie Yzorne","2 fois","Voir au tour 3","Tour 2, table 27","Tour 3, table 22","Fatima Urvignac","Ateliers Aubrenc","Claire Bralmotte","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 21","François Clovotte","Coopérative Rossolde","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Philippe Dulvoubre","Brasserie Belvarre","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 2","Tour 1, table 9","Tour 2, table 10","Chantal Mirvumet","Menuiserie Gravelune","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 29","Camille Neskard","Menuiserie Gravelune","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 2, table 16","Tour 4, table 16","Sophie Pruvière","Ateliers Rossolde","Raphaël Jusvault","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 16","Tour 2, table 2","Fatima Abrevançon","Tannerie Nervanche","Caroline Jusvoubre","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 13","Fatima Abrevançon","Tannerie Nervanche","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 13","Tour 4, table 13","Karim Clovançon","Fabrique Sorbagne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 17","Félix Eskouze","Filature Zelvaine","Sylvie Abreveux","Comptoir Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 19","Olivier Korvière","Ateliers Falvigne","Manon Pruvivet","Menuiserie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 20","Tour 2, table 10","Félix Voskande","Ateliers Falvigne","Guillaume Mirvoubre","Comptoir Sorbagne","2 fois","Voir au tour 4","Tour 2, table 7","Tour 4, table 7","Lucie Voskeron","Verrerie Ivoranche","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Thomas Selvignac","Brasserie Sorbagne","Étienne Voskançon","Menuiserie Olbrecq","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 28","Jean Neskeron","Filature Zelvaine","Zoé Mirveval","Fabrique Kalvenne","2 fois","Voir au tour 2","Tour 1, table 11","Tour 2, table 33","Sophie Clovard","Brasserie Belvarre","Marc Rozvouze","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 12","Alexandre Eskançon","Menuiserie Hostrenne","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 1, table 17","Tour 3, table 25","Qui a rencontré qui","La matrice n'est pas dessinée : 260 personnes dépassent le seuil de 40. La fiche de chaque personne porte ses rencontres.","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Animateurs rencontrés, de la personne la moins servie à la mieux servie","0","1","2","3","4","50","100","150","200","rang","animateurs rencontrés","borne des animateurs","animateurs rencontrés","borne des animateurs","Minimum 3 animateurs rencontrés, 29 personnes au minimum.","Voir le tableau","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucune personne présente ne porte d'étiquette : seule la colonne des appartenances se dessine.","Appartenances rencontrées en animant","le moins varié","17","le plus varié","27","au minimum","1","Diversité rencontrée en animant, sur la soirée","0","10","20","François Ivrivet","4 tours animés, 23 personnes rencontrées en animant","Samuel Bralmeux","4 tours animés, 23 personnes rencontrées en animant","Geneviève Dulvumet","4 tours animés, 24 personnes rencontrées en animant","François Obrouze","4 tours animés, 23 personnes rencontrées en animant","Antoine Bralmault","4 tours animés, 25 personnes rencontrées en animant","Catherine Hulveron","4 tours animés, 26 personnes rencontrées en animant","Camille Neskard","4 tours animés, 27 personnes rencontrées en animant","Guillaume Luskichon","4 tours animés, 27 personnes rencontrées en animant","Philippe Ivroubre","4 tours animés, 27 personnes rencontrées en animant","Marie Urvard","4 tours animés, 28 personnes rencontrées en animant","Sophie Pruvotte","4 tours animés, 28 personnes rencontrées en animant","Thomas Selvignac","4 tours animés, 26 personnes rencontrées en animant","Philippe Voskeval","4 tours animés, 27 personnes rencontrées en animant","Manon Urvançon","4 tours animés, 27 personnes rencontrées en animant","Marc Vandergrolcquesmirta…","4 tours animés, 27 personnes rencontrées en animant","Fatima Abrevançon","4 tours animés, 26 personnes rencontrées en animant","Claire Jusvivet","4 tours animés, 27 personnes rencontrées en animant","Félix Voskande","4 tours animés, 27 personnes rencontrées en animant","Louise Neskichon","4 tours animés, 28 personnes rencontrées en animant","Gabriel Abrevault","4 tours animés, 28 personnes rencontrées en animant","Émilie Abrevière","4 tours animés, 25 personnes rencontrées en animant","Youssef Jusvard","4 tours animés, 27 personnes rencontrées en animant","Manon Tolveron","4 tours animés, 27 personnes rencontrées en animant","Hugo Bralmouze","4 tours animés, 27 personnes rencontrées en animant","Marie Bralmesson","4 tours animés, 28 personnes rencontrées en animant","Louis Selvivet","4 tours animés, 27 personnes rencontrées en animant","Michel Korveron","4 tours animés, 27 personnes rencontrées en animant","Youssef Neskière","4 tours animés, 28 personnes rencontrées en animant","Jean Fralvumet","4 tours animés, 28 personnes rencontrées en animant","Fatima Korvouze","4 tours animés, 27 personnes rencontrées en animant","Gabriel Ivreval","4 tours animés, 28 personnes rencontrées en animant","Guillaume Dulvivet","4 tours animés, 28 personnes rencontrées en animant","Étienne Tolvançon","4 tours animés, 28 personnes rencontrées en animant","Appartenances rencontrées en animant","Appartenances rencontrées en animant","Le moins varié rencontre 17 appartenances en animant ; 1 animateur au minimum.","Voir le tableau","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","2 000 mouvements évalués sur 2 000","durée observée 2,5 s","1 cœur de calcul","cadence 4 000 mouvements par seconde","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","5","10","15","20","1","10","100","2 000","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 21 ; au dernier : 23.","écart au plafond a priori, aux points de relevé","0","2","4","6","1","10","100","2 000","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 6 ; au dernier : 4.","excédent de collisions, aux points de relevé","0","1","2","3","4","1","10","100","2 000","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 3 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","20","40","60","1","10","100","2 000","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 67 ; au dernier : 52.","rencontres répétées, aux points de relevé","0","50","100","1","10","100","2 000","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 145 ; au dernier : 103.","redondance d'appartenance, aux points de relevé","0","500","1 000","1","10","100","2 000","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 1 298 ; au dernier : 1 288.","Une valeur a changé au dernier point de relevé, à 2 000 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"acdf7948686aa453b158db6ef257244fd3eed8b3d74d4941fec20687aa01d937","etape":"10","etat":"15fb09087464cf5b429c79e33325a0cd64579f1c650d7fd7aeabf6c3cbf977c0","facteurEchelle":1,"fichier":"15c-qualite-performance","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"c419e952b0f10f763016b96657372c3f427ca6446883c15892b3626ea279ce7c"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.64,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-graphique-axe","ratio":5.38,"role":"marque","seuil":3},{"jeton":"--couleur-graphique-serie-1","ratio":6.89,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Grande démonstration 1","260 participants","33 tables · 260 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 5 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 260 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","23","95 %","minimum 23 sur 24","chez François Ivrivet","plafond réalisé 24","plafond a priori 24","Personnes distinctes rencontrées, minimum : mobiles","24","Personnes distinctes rencontrées, minimum : ancrés","23","Collisions d'appartenance","Collisions cumulées (paire et tour)","52","Paires distinctes de même appartenance","52","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","103","0 imposée, à part","Rencontres d'une même paire, au plus","3","Retours choisis à une table déjà occupée","29","99 imposés, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","17","chez François Ivrivet","borne de diversité 24","Redondance d'appartenance, somme Σ r(p)","1 288","Taux de diversité d(p), minimum","0,64","Manque et plafond a priori","Plus grand manque (personnes)","3","chez Marc Luskouze","131 personnes au manque maximal","plafond réalisé 27","Personnes à qui il en manque","131","Écart d'itinéraire maximal (personnes)","4","Écart au plafond a priori maximal (personnes)","4","Objectifs des tables et animateurs","Animateurs rencontrés, minimum","3","ne classe pas","chez Zoé WAMMERWOLM-MAWWEMMEL","borne des animateurs 4","Animateurs non rencontrés","29","ne classe pas","atteignabilité inconnue","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","10","20","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","ancré","Minimum 23 personnes rencontrées, 3 personnes au minimum, 131 personnes sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","50","100","150","200","250","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","ancré","La personne au rang 1, François Ivrivet, rencontre","95 %","minimum 23 sur 24","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Collisions d'appartenance, par appartenance","0","2","4","6","8","Imprimerie Yzorne","effectif 12, 9 paires distinctes, excédent 0","Fabrique Sorbagne","effectif 11, 7 paires distinctes, excédent 0","Ateliers Falvigne","effectif 8, 3 paires distinctes, excédent 0","Ateliers Rossolde","effectif 11, 3 paires distinctes, excédent 0","Fonderie Estrolle","effectif 9, 3 paires distinctes, excédent 0","Verrerie Vaubrenne","effectif 10, 3 paires distinctes, excédent 0","Ateliers Tavrenne","effectif 8, 2 paires distinctes, excédent 0","Fonderie Xandrelle","effectif 6, 2 paires distinctes, excédent 0","Menuiserie Estrolle","effectif 9, 2 paires distinctes, excédent 0","Tannerie Nervanche","effectif 6, 2 paires distinctes, excédent 0","Ateliers Aubrenc","effectif 3, 1 paire distincte, excédent 0","Ateliers Cassorgue","effectif 3, 1 paire distincte, excédent 0","Brasserie Xandrelle","effectif 2, 1 paire distincte, excédent 0","Comptoir Gravelune","effectif 3, 1 paire distincte, excédent 0","Coopérative Jolvane","effectif 4, 1 paire distincte, excédent 0","Fabrique Kalvenne","effectif 3, 1 paire distincte, excédent 0","Filature Zelvaine","effectif 4, 1 paire distincte, excédent 0","Fonderie Sorbagne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Gravelune","effectif 3, 1 paire distincte, excédent 0","Menuiserie Hostrenne","effectif 5, 1 paire distincte, excédent 0","Menuiserie Quimvaux","effectif 3, 1 paire distincte, excédent 0","Menuiserie Sorbagne","effectif 3, 1 paire distincte, excédent 0","Papeterie Hostrenne","effectif 2, 1 paire distincte, excédent 0","Papeterie Ulvardes","effectif 4, 1 paire distincte, excédent 0","Tannerie Belvarre","effectif 5, 1 paire distincte, excédent 0","Verrerie Aubrenc","effectif 2, 1 paire distincte, excédent 0","Ateliers Estrolle","effectif 3, 0 paire distincte, excédent 0","Ateliers Ivoranche","effectif 4, 0 paire distincte, excédent 0","Brasserie Belvarre","effectif 9, 0 paire distincte, excédent 0","Brasserie Dravenne","effectif 1, 0 paire distincte, excédent 0","Brasserie Lavorneau","effectif 2, 0 paire distincte, excédent 0","Brasserie Morvalle","effectif 2, 0 paire distincte, excédent 0","Brasserie Sorbagne","effectif 4, 0 paire distincte, excédent 0","Brasserie Wassorel","effectif 2, 0 paire distincte, excédent 0","Comptoir Ivoranche","effectif 1, 0 paire distincte, excédent 0","Comptoir Jolvane","effectif 3, 0 paire distincte, excédent 0","Comptoir Lavorneau","effectif 1, 0 paire distincte, excédent 0","Comptoir Sorbagne","effectif 4, 0 paire distincte, excédent 0","Comptoir Xandrelle","effectif 3, 0 paire distincte, excédent 0","Comptoir Yzorne","effectif 2, 0 paire distincte, excédent 0","Coopérative Dravenne","effectif 3, 0 paire distincte, excédent 0","Coopérative Gravelune","effectif 3, 0 paire distincte, excédent 0","Coopérative Morvalle","effectif 3, 0 paire distincte, excédent 0","Coopérative Rossolde","effectif 4, 0 paire distincte, excédent 0","Fabrique Ivoranche","effectif 3, 0 paire distincte, excédent 0","Fabrique Morvalle","effectif 1, 0 paire distincte, excédent 0","Fabrique Ulvardes","effectif 3, 0 paire distincte, excédent 0","Filature Dravenne","effectif 1, 0 paire distincte, excédent 0","Filature Olbrecq","effectif 2, 0 paire distincte, excédent 0","Filature Wassorel","effectif 3, 0 paire distincte, excédent 0","Fonderie Aubrenc","effectif 2, 0 paire distincte, excédent 0","Fonderie Ivoranche","effectif 2, 0 paire distincte, excédent 0","Fonderie Kalvenne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Falvigne","effectif 3, 0 paire distincte, excédent 0","Imprimerie Hostrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Aubrenc","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ivoranche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Jolvane","effectif 1, 0 paire distincte, excédent 0","Menuiserie Nervanche","effectif 1, 0 paire distincte, excédent 0","Menuiserie Olbrecq","effectif 4, 0 paire distincte, excédent 0","Menuiserie Tavrenne","effectif 1, 0 paire distincte, excédent 0","Menuiserie Ulvardes","effectif 6, 0 paire distincte, excédent 0","Menuiserie Wassorel","effectif 1, 0 paire distincte, excédent 0","Papeterie Estrolle","effectif 3, 0 paire distincte, excédent 0","Papeterie Wassorel","effectif 1, 0 paire distincte, excédent 0","Tannerie Aubrenc","effectif 3, 0 paire distincte, excédent 0","Tannerie Falvigne","effectif 1, 0 paire distincte, excédent 0","Tannerie Olbrecq","effectif 1, 0 paire distincte, excédent 0","Tannerie Quimvaux","effectif 1, 0 paire distincte, excédent 0","Verrerie Gravelune","effectif 1, 0 paire distincte, excédent 0","Verrerie Ivoranche","effectif 6, 0 paire distincte, excédent 0","Verrerie Nervanche","effectif 1, 0 paire distincte, excédent 0","Verrerie Olbrecq","effectif 2, 0 paire distincte, excédent 0","Verrerie Pravette","effectif 2, 0 paire distincte, excédent 0","reste","prouvé inévitable","reste","L'excédent le plus grand est celui de « Imprimerie Yzorne » : 0 collision.","Voir le tableau","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 4","Table 12","Table 16","Table 20","Table 26","Table 33","Table 9","Table 10","Table 15","Table 24","Table 25","Table 29","Table 31","Table 32","Table 1","Table 2","Table 5","Table 6","Table 7","Table 8","Table 13","Table 14","Table 17","Table 18","Table 19","Table 21","Table 22","Table 23","Table 27","Table 28","Table 30","Table 3","Table 11","Tour 1","Tour 2","Tour 3","Tour 4","2","1","0","0","1","2","0","0","0","0","2","1","0","0","1","2","0","2","0","1","0","1","0","2","0","0","2","0","0","1","0","1","1","1","0","0","0","1","1","0","0","1","1","0","1","0","1","0","0","1","0","1","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","0","0","0","0","1","0","0","0","0","0","1","0","1","0","0","0","0","0","1","0","0","0","1","1","0","0","0","1","0","0","0","0","0","1","0","0","1","0","0","0","0","0","1","0","1","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","La table 4 porte la case la plus haute : 2.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Paires 1 à 100 sur 103","Suivantes","Paires que la recherche réunit plus d'une fois","Paire","Rencontres de la paire","Tours","Samuel Cloveval","Menuiserie Ulvardes","Hélène Bralmeval","Brasserie Dravenne","3 fois","Voir au tour 3","Tour 1, table 23","Tour 3, table 15","Tour 4, table 32","Hugo Fralvançon","Brasserie Wassorel","Léa Fralvault","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 11","Tour 3, table 2","Hugo Fralvançon","Brasserie Wassorel","Louise Quilmançon","Menuiserie Estrolle","2 fois","Voir au tour 3","Tour 1, table 13","Tour 3, table 2","Zoé WAMMERWOLM-MAWWEMMEL","Menuiserie Ulvardes","Catherine Hulveron","Coopérative Rossolde","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 15","Catherine Urvesson","Fabrique Ulvardes","Olivier Bralmançon","Comptoir Lavorneau","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 6","Karim Hulvivet","Fonderie Xandrelle","Guillaume Luskichon","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 2","Tour 3, table 2","Léa Fralvault","Fonderie Sorbagne","Lucie Tolvesson","Filature Zelvaine","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 11","Léa Fralvault","Fonderie Sorbagne","Samuel Abrevard","Filature Dravenne","2 fois","Voir au tour 4","Tour 2, table 11","Tour 4, table 4","Fatima Obrivet","Fabrique Sorbagne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 29","Philippe Voskeval","Menuiserie Estrolle","Émilie Korvard","Verrerie Vaubrenne","2 fois","Voir au tour 3","Tour 2, table 6","Tour 3, table 6","Zoé Dulveval","Menuiserie Quimvaux","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 2, table 15","Tour 4, table 13","Paul Korveux","Filature Olbrecq","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 3","Tour 1, table 15","Tour 3, table 5","Paul Korveux","Filature Olbrecq","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 15","Tour 2, table 3","Thomas Rozvotte","Verrerie Ivoranche","Antoine Quilmeron","Fabrique Kalvenne","2 fois","Voir au tour 4","Tour 3, table 33","Tour 4, table 26","Isabelle Bralmumet","Verrerie Aubrenc","Félix Korveval","Tannerie Nervanche","2 fois","Voir au tour 2","Tour 1, table 19","Tour 2, table 28","Isabelle Bralmumet","Verrerie Aubrenc","Louis Mirveron","Filature Wassorel","2 fois","Voir au tour 4","Tour 3, table 22","Tour 4, table 16","Simon Mirvivet","Ateliers Ivoranche","Hélène Gorzumet","Fonderie Aubrenc","2 fois","Voir au tour 3","Tour 1, table 9","Tour 3, table 18","Lucie Voskeux","Coopérative Morvalle","Samuel Cloveval","Menuiserie Ulvardes","2 fois","Voir au tour 3","Tour 2, table 14","Tour 3, table 15","Fatima Korvouze","Ateliers Tavrenne","Olivier Jusvançon","Brasserie Morvalle","2 fois","Voir au tour 3","Tour 2, table 3","Tour 3, table 3","Étienne Fralvichon","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 1, table 21","Tour 4, table 33","Louise Quilmançon","Menuiserie Estrolle","Paul Obrichon","Ateliers Rossolde","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 21","Louise Quilmançon","Menuiserie Estrolle","Étienne Eskesson","Menuiserie Ulvardes","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 7","Pierre Abreveron","Ateliers Rossolde","Manon Tolveron","Brasserie Belvarre","2 fois","Voir au tour 3","Tour 1, table 5","Tour 3, table 5","Léa Tolvande","Ateliers Rossolde","Anne Abrevesson","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 2","Tour 3, table 14","Antoine Quilmeron","Fabrique Kalvenne","Samuel Bralmeux","Ateliers Rossolde","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 33","Michel Eskeux","Papeterie Wassorel","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 1, table 1","Tour 4, table 21","Louise Hulvault","Coopérative Jolvane","Karim Fralveval","Coopérative Gravelune","2 fois","Voir au tour 4","Tour 3, table 24","Tour 4, table 4","Catherine Hulveron","Coopérative Rossolde","Alexandre Korvotte","Menuiserie Nervanche","2 fois","Voir au tour 4","Tour 3, table 15","Tour 4, table 15","François Ivrivet","Menuiserie Sorbagne","François Gorzichon","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 32","Tour 4, table 32","Claire Fralvivet","Imprimerie Yzorne","Étienne Selvouze","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 14","Tour 3, table 27","Karim Gorzesson","Papeterie Ulvardes","Sophie Clovard","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 1, table 20","Tour 4, table 12","Manon Urvançon","Ateliers Tavrenne","Guillaume Tolvignac","Menuiserie Sorbagne","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 1","Sylvie Quilmande","Imprimerie Yzorne","Antoine Bralmault","Fabrique Sorbagne","2 fois","Voir au tour 4","Tour 1, table 4","Tour 4, table 4","Sylvie Quilmande","Imprimerie Yzorne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 14","Sylvie Quilmande","Imprimerie Yzorne","Hélène Rozveval","Comptoir Ivoranche","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 4","Amina Pruvesson","Fonderie Sorbagne","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 1, table 18","Tour 4, table 16","Amina Pruvesson","Fonderie Sorbagne","Léa Obrard","Comptoir Sorbagne","2 fois","Voir au tour 2","Tour 1, table 18","Tour 2, table 31","Lucie Quilmière","Fabrique Ivoranche","Anne Urvivet","Fonderie Kalvenne","2 fois","Voir au tour 2","Tour 1, table 21","Tour 2, table 9","Louis Selvivet","Menuiserie Hostrenne","Guillaume Hulvotte","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 2, table 25","Tour 4, table 25","Lucie Tolvesson","Filature Zelvaine","Manon Quilmumet","Fonderie Sorbagne","2 fois","Voir au tour 4","Tour 1, table 15","Tour 4, table 25","Olivier Quilmesson","Comptoir Gravelune","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 2, table 33","Tour 3, table 9","Gabriel Neskault","Menuiserie Tavrenne","Geneviève Abrevignac","Brasserie Morvalle","2 fois","Voir au tour 4","Tour 2, table 20","Tour 4, table 18","Gabriel Neskault","Menuiserie Tavrenne","François Clovotte","Coopérative Rossolde","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Gabriel Neskault","Menuiserie Tavrenne","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Olivier Jusvançon","Brasserie Morvalle","Hélène Selveux","Brasserie Lavorneau","2 fois","Voir au tour 4","Tour 1, table 24","Tour 4, table 25","Gabriel Pruveux","Papeterie Estrolle","Guillaume Obrançon","Papeterie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 31","Tour 4, table 27","Manon Clovière","Ateliers Ivoranche","Marc Vandergrolcquesmirtavelle-Ostrovaubelindigues","Tannerie Aubrenc","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 10","François Obrouze","Tannerie Olbrecq","Camille Tolvumet","Fonderie Estrolle","2 fois","Voir au tour 3","Tour 2, table 31","Tour 3, table 31","Claire Gorzeron","Menuiserie Hostrenne","Guillaume Gorzivet","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 32","Tour 4, table 8","Hélène Luskumet","Brasserie Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 8","Louis Fralvande","Ateliers Rossolde","Philippe Ivroubre","Ateliers Tavrenne","2 fois","Voir au tour 4","Tour 1, table 19","Tour 4, table 19","Isabelle Korvichon","Menuiserie Ulvardes","Marie Dulvesson","Ateliers Cassorgue","2 fois","Voir au tour 4","Tour 1, table 7","Tour 4, table 10","Isabelle Korvichon","Menuiserie Ulvardes","Karim Clovivet","Fonderie Kalvenne","2 fois","Voir au tour 3","Tour 2, table 18","Tour 3, table 23","Fatima Tolvoubre","Papeterie Ulvardes","Marc Luskouze","Ateliers Rossolde","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 33","Zoé Gorzière","Menuiserie Olbrecq","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 2, table 7","Tour 3, table 25","Antoine Obreval","Ateliers Cassorgue","Alexandre Ivreux","Tannerie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 25","Tour 2, table 6","Antoine Obreval","Ateliers Cassorgue","Hugo Bralmouze","Tannerie Falvigne","2 fois","Voir au tour 4","Tour 3, table 23","Tour 4, table 23","Michel Korveron","Fonderie Sorbagne","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 4","Tour 3, table 8","Tour 4, table 8","Marie Dulvesson","Ateliers Cassorgue","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 3","Tour 2, table 16","Tour 3, table 17","Youssef Jusvard","Tannerie Aubrenc","Simon Hulvumet","Ateliers Ivoranche","2 fois","Voir au tour 4","Tour 2, table 21","Tour 4, table 21","Gabriel Mirvotte","Tannerie Belvarre","Paul Neskivet","Comptoir Jolvane","2 fois","Voir au tour 4","Tour 3, table 21","Tour 4, table 7","Marc Luskouze","Ateliers Rossolde","Isabelle Selvichon","Tannerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 21","Tour 3, table 8","Louis Hulvichon","Ateliers Falvigne","Nicolas Ivrichon","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 17","Tour 2, table 24","Pierre Pruveval","Comptoir Xandrelle","Julie Quilmignac","Menuiserie Jolvane","2 fois","Voir au tour 3","Tour 1, table 10","Tour 3, table 8","Geneviève Abrevignac","Brasserie Morvalle","Pierre Mirvard","Verrerie Ivoranche","2 fois","Voir au tour 3","Tour 1, table 1","Tour 3, table 7","Olivier Bralmançon","Comptoir Lavorneau","Véronique Jusvouze","Verrerie Vaubrenne","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 6","Marc Luskoubre","Verrerie Vaubrenne","Thomas Quilmichon","Fonderie Estrolle","2 fois","Voir au tour 4","Tour 1, table 33","Tour 4, table 5","Camille Jusvumet","Fonderie Estrolle","Guillaume Eskotte","Verrerie Nervanche","2 fois","Voir au tour 3","Tour 1, table 27","Tour 3, table 11","Antoine Selvière","Coopérative Dravenne","Jean Neskeron","Filature Zelvaine","2 fois","Voir au tour 3","Tour 1, table 11","Tour 3, table 9","Antoine Bralmault","Fabrique Sorbagne","Amina Rozvichon","Verrerie Olbrecq","2 fois","Voir au tour 3","Tour 2, table 4","Tour 3, table 4","Antoine Bralmault","Fabrique Sorbagne","Antoine Pruvouze","Imprimerie Yzorne","2 fois","Voir au tour 2","Tour 1, table 4","Tour 2, table 4","Émilie Abrevière","Imprimerie Yzorne","Fatima Hulvard","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 2, table 29","Tour 4, table 29","Émilie Abrevière","Imprimerie Yzorne","Geneviève Obresson","Coopérative Gravelune","2 fois","Voir au tour 3","Tour 1, table 29","Tour 3, table 29","Émilie Abrevière","Imprimerie Yzorne","Chantal Mirvumet","Menuiserie Gravelune","2 fois","Voir au tour 4","Tour 3, table 29","Tour 4, table 29","Olivier Tolvichon","Fonderie Xandrelle","Étienne Gorzeval","Papeterie Ulvardes","2 fois","Voir au tour 3","Tour 1, table 33","Tour 3, table 6","Félix Korveval","Tannerie Nervanche","Thomas Selvignac","Brasserie Sorbagne","2 fois","Voir au tour 3","Tour 2, table 28","Tour 3, table 28","Émilie Dulvichon","Menuiserie Ulvardes","Lucie Voskeron","Verrerie Ivoranche","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Émilie Dulvichon","Menuiserie Ulvardes","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Claire Jusvivet","Imprimerie Yzorne","Hugo Voskumet","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 1, table 20","Tour 3, table 20","Amina Quilmault","Coopérative Jolvane","Philippe Abreveval","Ateliers Falvigne","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 4","Hélène Gorzumet","Fonderie Aubrenc","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 4","Tour 1, table 9","Tour 4, table 21","Sophie Ivrault","Coopérative Morvalle","Philippe Fralvignac","Menuiserie Estrolle","2 fois","Voir au tour 4","Tour 3, table 13","Tour 4, table 26","Nicolas Korvande","Comptoir Sorbagne","Chantal Obrignac","Imprimerie Yzorne","2 fois","Voir au tour 3","Tour 2, table 27","Tour 3, table 22","Fatima Urvignac","Ateliers Aubrenc","Claire Bralmotte","Ateliers Tavrenne","2 fois","Voir au tour 3","Tour 2, table 23","Tour 3, table 21","François Clovotte","Coopérative Rossolde","Chantal Abrevotte","Ateliers Ivoranche","2 fois","Voir au tour 3","Tour 2, table 20","Tour 3, table 25","Philippe Dulvoubre","Brasserie Belvarre","Émilie Quilmeux","Ateliers Falvigne","2 fois","Voir au tour 2","Tour 1, table 9","Tour 2, table 10","Chantal Mirvumet","Menuiserie Gravelune","Geneviève Mirvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 3","Tour 4, table 29","Camille Neskard","Menuiserie Gravelune","Amina Hulvouze","Coopérative Dravenne","2 fois","Voir au tour 4","Tour 2, table 16","Tour 4, table 16","Sophie Pruvière","Ateliers Rossolde","Raphaël Jusvault","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 16","Tour 2, table 2","Fatima Abrevançon","Tannerie Nervanche","Caroline Jusvoubre","Fabrique Sorbagne","2 fois","Voir au tour 2","Tour 1, table 13","Tour 2, table 13","Fatima Abrevançon","Tannerie Nervanche","Fatima Rozvumet","Menuiserie Hostrenne","2 fois","Voir au tour 4","Tour 1, table 13","Tour 4, table 13","Karim Clovançon","Fabrique Sorbagne","Caroline Rozvançon","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 2, table 14","Tour 4, table 17","Félix Eskouze","Filature Zelvaine","Sylvie Abreveux","Comptoir Jolvane","2 fois","Voir au tour 3","Tour 1, table 3","Tour 3, table 19","Olivier Korvière","Ateliers Falvigne","Manon Pruvivet","Menuiserie Aubrenc","2 fois","Voir au tour 2","Tour 1, table 20","Tour 2, table 10","Félix Voskande","Ateliers Falvigne","Guillaume Mirvoubre","Comptoir Sorbagne","2 fois","Voir au tour 4","Tour 2, table 7","Tour 4, table 7","Lucie Voskeron","Verrerie Ivoranche","Julie Voskesson","Brasserie Belvarre","2 fois","Voir au tour 4","Tour 3, table 10","Tour 4, table 20","Thomas Selvignac","Brasserie Sorbagne","Étienne Voskançon","Menuiserie Olbrecq","2 fois","Voir au tour 4","Tour 1, table 28","Tour 4, table 28","Jean Neskeron","Filature Zelvaine","Zoé Mirveval","Fabrique Kalvenne","2 fois","Voir au tour 2","Tour 1, table 11","Tour 2, table 33","Sophie Clovard","Brasserie Belvarre","Marc Rozvouze","Ateliers Estrolle","2 fois","Voir au tour 4","Tour 3, table 1","Tour 4, table 12","Alexandre Eskançon","Menuiserie Hostrenne","François Eskard","Fonderie Xandrelle","2 fois","Voir au tour 3","Tour 1, table 17","Tour 3, table 25","Qui a rencontré qui","La matrice n'est pas dessinée : 260 personnes dépassent le seuil de 40. La fiche de chaque personne porte ses rencontres.","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Animateurs rencontrés, de la personne la moins servie à la mieux servie","0","1","2","3","4","50","100","150","200","rang","animateurs rencontrés","borne des animateurs","animateurs rencontrés","borne des animateurs","Minimum 3 animateurs rencontrés, 29 personnes au minimum.","Voir le tableau","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucune personne présente ne porte d'étiquette : seule la colonne des appartenances se dessine.","Appartenances rencontrées en animant","le moins varié","17","le plus varié","27","au minimum","1","Diversité rencontrée en animant, sur la soirée","0","10","20","François Ivrivet","4 tours animés, 23 personnes rencontrées en animant","Samuel Bralmeux","4 tours animés, 23 personnes rencontrées en animant","Geneviève Dulvumet","4 tours animés, 24 personnes rencontrées en animant","François Obrouze","4 tours animés, 23 personnes rencontrées en animant","Antoine Bralmault","4 tours animés, 25 personnes rencontrées en animant","Catherine Hulveron","4 tours animés, 26 personnes rencontrées en animant","Camille Neskard","4 tours animés, 27 personnes rencontrées en animant","Guillaume Luskichon","4 tours animés, 27 personnes rencontrées en animant","Philippe Ivroubre","4 tours animés, 27 personnes rencontrées en animant","Marie Urvard","4 tours animés, 28 personnes rencontrées en animant","Sophie Pruvotte","4 tours animés, 28 personnes rencontrées en animant","Thomas Selvignac","4 tours animés, 26 personnes rencontrées en animant","Philippe Voskeval","4 tours animés, 27 personnes rencontrées en animant","Manon Urvançon","4 tours animés, 27 personnes rencontrées en animant","Marc Vandergrolcquesmirta…","4 tours animés, 27 personnes rencontrées en animant","Fatima Abrevançon","4 tours animés, 26 personnes rencontrées en animant","Claire Jusvivet","4 tours animés, 27 personnes rencontrées en animant","Félix Voskande","4 tours animés, 27 personnes rencontrées en animant","Louise Neskichon","4 tours animés, 28 personnes rencontrées en animant","Gabriel Abrevault","4 tours animés, 28 personnes rencontrées en animant","Émilie Abrevière","4 tours animés, 25 personnes rencontrées en animant","Youssef Jusvard","4 tours animés, 27 personnes rencontrées en animant","Manon Tolveron","4 tours animés, 27 personnes rencontrées en animant","Hugo Bralmouze","4 tours animés, 27 personnes rencontrées en animant","Marie Bralmesson","4 tours animés, 28 personnes rencontrées en animant","Louis Selvivet","4 tours animés, 27 personnes rencontrées en animant","Michel Korveron","4 tours animés, 27 personnes rencontrées en animant","Youssef Neskière","4 tours animés, 28 personnes rencontrées en animant","Jean Fralvumet","4 tours animés, 28 personnes rencontrées en animant","Fatima Korvouze","4 tours animés, 27 personnes rencontrées en animant","Gabriel Ivreval","4 tours animés, 28 personnes rencontrées en animant","Guillaume Dulvivet","4 tours animés, 28 personnes rencontrées en animant","Étienne Tolvançon","4 tours animés, 28 personnes rencontrées en animant","Appartenances rencontrées en animant","Appartenances rencontrées en animant","Le moins varié rencontre 17 appartenances en animant ; 1 animateur au minimum.","Voir le tableau","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","2 000 mouvements évalués sur 2 000","durée observée 2,5 s","1 cœur de calcul","cadence 4 000 mouvements par seconde","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","5","10","15","20","1","10","100","2 000","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 21 ; au dernier : 23.","écart au plafond a priori, aux points de relevé","0","2","4","6","1","10","100","2 000","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 6 ; au dernier : 4.","excédent de collisions, aux points de relevé","0","1","2","3","4","1","10","100","2 000","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 3 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","20","40","60","1","10","100","2 000","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 67 ; au dernier : 52.","rencontres répétées, aux points de relevé","0","50","100","1","10","100","2 000","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 145 ; au dernier : 103.","redondance d'appartenance, aux points de relevé","0","500","1 000","1","10","100","2 000","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 1 298 ; au dernier : 1 288.","Une valeur a changé au dernier point de relevé, à 2 000 mouvements.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
+{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"dd2e4823fb2f13cf80668bc6288b70b68a04eba74f7e1e8c908bfadd90d71fab","etape":"10","etat":"f9d1a54d55528927a5669c38fc3e8561c3565d4643ad129f3e15a25291b1b90a","facteurEchelle":1,"fichier":"16-minimum-atteint","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"b1335181328308a7446cc1481f81796528efe43c985032f1209b6777e658f667"},"instant":"2026-10-06T19:03:02-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":14.16,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte","ratio":11.23,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Petite démonstration 1","12 participants","4 tables · 12 sièges","4 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Qualité","Placement mesuré :","Proposition n° 1 : un geste y pose une réservation","Revenir aux réservations","En-tête chiffré","Profil trié des rencontres","Collisions d'appartenance","Appartenances à chaque table","Paires répétées","Objectifs des tables","Animateurs rencontrés","Diversité par animateur","Performance du calcul","En-tête chiffré","Ce placement est-il bon, et qui s'y trouve mal servi ?","Population mesurée : 12 personnes.","Personnes rencontrées","Personnes distinctes rencontrées, minimum : tous","8","100 %","minimum 8 sur 8","chez Caroline Bralmumet","plafond réalisé 8","plafond a priori 8","Personnes distinctes rencontrées, minimum : mobiles","8","Personnes distinctes rencontrées, minimum : ancrés","—","Collisions d'appartenance","Collisions cumulées (paire et tour)","0","Paires distinctes de même appartenance","0","Excédent de collisions (retrouvailles au-delà de la première)","0","Rencontres répétées et retours","Rencontres répétées choisies (paires)","0","0 imposée, à part","Rencontres d'une même paire, au plus","1","Retours choisis à une table déjà occupée","0","0 imposé, à part","Diversité d'appartenance","Appartenances rencontrées A(p), minimum","2","chez Caroline Bralmumet","borne de diversité 3","Redondance d'appartenance, somme Σ r(p)","72","Taux de diversité d(p), minimum","0,25","Manque et plafond a priori","Plus grand manque (personnes)","0","chez Caroline Bralmumet","0 personne au manque maximal","plafond réalisé 8","Personnes à qui il en manque","0","Écart d'itinéraire maximal (personnes)","0","Écart au plafond a priori maximal (personnes)","0","minimum atteint","Profil trié des rencontres","Qui est le plus mal servi, de combien, et combien sont-ils ?","Profil trié des rencontres, en comptes de personnes","0","2","4","6","8","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","rencontres","appartenances rencontrées","plafond réalisé","borne de diversité","Minimum 8 personnes rencontrées, 12 personnes au minimum, 0 personne sous leur plafond réalisé.","Profil trié des rencontres, en pourcentage du plafond réalisé","0 %","50 %","100 %","2","4","6","8","10","12","Personnes, de la moins servie à la mieux servie","rencontres","100 %","rencontres","100 %","La personne au rang 1, Caroline Bralmumet, rencontre","100 %","minimum 8 sur 8","Voir le tableau","Collisions d'appartenance","D'où vient le problème, et relancer peut-il y changer quelque chose ?","Aucune collision d'appartenance : à chaque tour, chaque table réunit des appartenances distinctes.","Appartenances à chaque table","Où les mêmes cercles se retrouvent-ils à une même table ?","Ce que la grille compte","appartenances par siège","appartenances par personne assise","doublons parmi les affiliés","Appartenances à chaque table, tables par tours","Table 1","Table 2","Table 3","Table 4","Tour 1","Tour 2","Tour 3","Tour 4","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","La table 1 porte la case la plus haute : 0.","Voir le tableau","Paires répétées","Qui revoit trop souvent la même personne ?","Aucune paire ne se revoit : chaque rencontre est unique.","Qui a rencontré qui","Qui a rencontré qui","1. Caroline Bralmumet","2. Hugo Neskault","3. Youssef Ivrotte","4. Louis Selvière","5. Youssef Selvançon","6. Amina Quilmoubre","7. Julie Voskotte","8. Paul Neskivet","9. Michel Bralmignac","10. Zoé Tolveval","11. Luc Urvard","12. Véronique Mirveval","1","2","3","4","5","6","7","8","9","10","11","12","1","1","1","0","1","1","0","1","1","1","0","1","1","0","1","1","1","1","0","1","0","1","1","1","1","1","0","0","1","1","0","1","1","1","0","1","1","1","1","1","0","1","0","1","0","1","1","1","1","1","0","1","1","1","0","1","1","0","1","1","0","1","1","0","1","1","1","1","0","1","1","0","1","1","0","1","1","0","1","1","1","0","1","1","1","1","1","0","1","0","1","0","1","1","1","1","1","0","1","1","1","0","1","1","0","0","1","1","1","1","1","0","1","0","1","1","1","1","0","1","1","0","1","1","1","0","1","1","0","1","1","1","Chaque case porte le nombre de rencontres de la paire. Aucune paire ne se revoit.","Voir le tableau","Objectifs des tables","Qui n'est jamais assis à une table qui lui correspond, et à quel tour l'objectif perd-il ?","Aucune personne n'est concernée par les objectifs des tables : la vue n'a rien à montrer.","Animateurs rencontrés","Qui a rencontré le moins d'animateurs ?","Aucune personne n'est concernée par les animateurs, ou aucun animateur n'est désigné : la vue n'a rien à montrer.","Diversité par animateur","Quel animateur voit le moins de diversité à sa table ?","Aucun animateur n'est désigné : la vue n'a rien à montrer.","Performance du calcul","Relancer plus longtemps aurait-il donné mieux ?","200 000 mouvements évalués sur 200 000","durée inconnue","1 cœur de calcul","génération de 5 propositions","Valeurs mesurées aux seuls points de relevé, sous les réglages courants, reliées par un trait : entre deux points, rien n'est mesuré.","minimum brut, aux points de relevé","0","2","4","6","8","1","10","100","1 000","10 000","200 000","Mouvements évalués, échelle logarithmique","minimum brut","minimum brut","Au premier point de relevé, minimum brut : 5 ; au dernier : 8.","écart au plafond a priori, aux points de relevé","0","1","2","3","1","10","100","1 000","10 000","200 000","Mouvements évalués, échelle logarithmique","écart au plafond a priori","écart au plafond a priori","Au premier point de relevé, écart au plafond a priori : 3 ; au dernier : 0.","excédent de collisions, aux points de relevé","0","1","2","3","1","10","100","1 000","10 000","200 000","Mouvements évalués, échelle logarithmique","excédent de collisions","excédent de collisions","Au premier point de relevé, excédent de collisions : 3 ; au dernier : 0.","collisions cumulées, aux points de relevé","0","5","10","15","1","10","100","1 000","10 000","200 000","Mouvements évalués, échelle logarithmique","collisions cumulées","collisions cumulées","Au premier point de relevé, collisions cumulées : 14 ; au dernier : 0.","rencontres répétées, aux points de relevé","0","5","10","1","10","100","1 000","10 000","200 000","Mouvements évalués, échelle logarithmique","rencontres répétées","rencontres répétées","Au premier point de relevé, rencontres répétées : 11 ; au dernier : 0.","redondance d'appartenance, aux points de relevé","0","20","40","60","1","10","100","1 000","10 000","200 000","Mouvements évalués, échelle logarithmique","redondance d'appartenance","redondance d'appartenance","Au premier point de relevé, redondance d'appartenance : 36 ; au dernier : 72.","Aucune valeur n'a changé entre 100 000 et 200 000 mouvements ; une autre graine est l'autre façon de chercher.","Voir le tableau"],"theme":"clair","versionReelle":"2026.10.05.01"},
{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"282726fd0366451d1bd0deaed7772ce16b81c1388e87e8b0c7b086a8abc994ab","etape":"11","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"19-ajustement","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"d9f19ebe1086411d4198a430bf07a74d058f19ffc0da0144593b763f0cce3721"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-fantome","ratio":4.34,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-fantome","ratio":4.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-pastille-texte","ratio":14.51,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Écriture","Chaque geste s’enregistre aussitôt ; « Revenir en lecture » arrête l’écriture.","Revenir en lecture","Écriture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Plan","Placement retenu","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","9","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Côme Fenouillet","6.","Apolline Coudraie","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Basile Lanterneau","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Gaspard Marbrelle","déplace dans le placement retenu","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Personne en attente à ce tour."],"theme":"clair","versionReelle":"2026.10.05.01"},
{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"f0a3386a3abb8f4c35d8ca8522c2cb3eccba7f40ac7028f88fd33327cdb1dfe6","etape":"11","etat":"e60a6d4dbb76287b287857b2175d4a784996dcdb3cf6df8e8e30cc9d4d01c14d","facteurEchelle":1,"fichier":"20-mode-lecture","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"d6880d68355f4944b4c9d3a8827f8873c74bc88740f6aa5320139d255162a63f"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":6.09,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":15.09,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":8.92,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":12.3,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.82,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":14.82,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":13.78,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":5.81,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-poignee","ratio":7.44,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.34,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.57,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":7.44,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-action-texte","ratio":8.45,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":14.94,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.89,"role":"marque","seuil":3},{"jeton":"--couleur-conflit-appartenance","ratio":6.81,"role":"marque","seuil":3},{"jeton":"--couleur-contour-fort","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":14.62,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":15.21,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.5,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":11.02,"role":"texte","seuil":4.5},{"jeton":"--couleur-page-texte-secondaire","ratio":6.72,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":11.62,"role":"marque","seuil":3},{"jeton":"--couleur-pastille-texte","ratio":14.51,"role":"texte","seuil":4.5},{"jeton":"--couleur-poignee","ratio":11.32,"role":"marque","seuil":3},{"jeton":"--couleur-refus","ratio":8.14,"role":"texte","seuil":4.5},{"jeton":"--couleur-selection","ratio":4.18,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":5.59,"role":"marque","seuil":3}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Lecture","Liste des événements","Clair","Sombre","À propos","Lecture","Rien ne change ; « Modifier » passe en écriture.","Modifier","Lecture","Défaire","État du plan","Brouillon","Proposé","Retenu","Bloqué","Imprimer…","Soirée d’essai","13 participants","2 tables · 18 sièges","3 tours","Préparer","Import","Participants","Tables et tours","Placer","Plan","Diagnostic","Génération","Propositions","Qualité","Produire","Badges","Plan","Placement retenu","Tour affiché","1","2","3","Zoom +","Zoom −","Ajuster","Listes de noms","Légende","Plein écran","7","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Ysaline Sablonnet","3.","Anselme Givrecœur","4.","Côme Fenouillet","5.","Apolline Coudraie","6.","Brunœil","7.","Faustine Ormelin","8.","Edgar Ardoisier","9.","Bertille Cressonnier","10. (libre)","1.","Gaspard Marbrelle","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3.","Basile Lanterneau","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Table 2, siège 4","L'événement est ouvert en lecture : « Modifier » permet de le changer.","Modifier","Fermer","1","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","Diagnostic","Chœur de l’Anse","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Société des Hérons","4 personnes : au moins 6 collisions cumulées sur les 3 tours, portées par au moins 2 paires distinctes","Cercle des Saules","3 personnes : au moins 3 collisions cumulées sur les 3 tours, portées par au moins 1 paire distincte","Tout l'événement","au moins 8 appartenances recroisées par personne","plafond a priori 11 rencontres pour 1 ancré et 11 mobiles","2 retours imposés par 1 ancrage","Listes de travail","Titres de place non pourvus","table 2 : titre","animation","non pourvu","Titres pressentis sans réservation","Gaspard Marbrelle","— titre pressenti","animation","Réserve","Personnes en attente au tour 1","Personne en attente à ce tour.","Table 2, siège 4","4. (libre)","Choisissez d'abord une personne : dans la réserve, dans la liste des pressentis, ou par « Déplacer » dans son menu.","Portée","Tour 1","Tous les tours","Libellé du titre","Assigner","Réserver","Donner un titre","Désigner"],"theme":"clair","versionReelle":"2026.10.05.01"},
{"cadre":{"hauteur":700,"largeur":1366},"empreinte":"7fc4ff24d0e38bac9ebc42cb6f38942b97e13a2aca9eb9b20e169cbdf0b87343","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"22-plan-brouillon","graine":4242,"image":{"hauteur":700,"largeur":1366,"sha256":"d9be4f1916a5d0a6ed71358292fb6b92727e4cb04f422f4cff7a853f1e441d31"},"instant":"2026-10-06T19:02:00-04:00","mode":"chromium-headless-shell","pdf":null,"source":"navigateur","styles":{"clair":[{"jeton":"--couleur-bandeau-fond","ratio":15.94,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":9.05,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-filigrane","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-liste-texte","ratio":16.18,"role":"texte","seuil":4.5},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-page-texte","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3}],"sombre":[{"jeton":"--couleur-bandeau-fond","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte","ratio":12.84,"role":"texte","seuil":4.5},{"jeton":"--couleur-bandeau-texte-secondaire","ratio":7.6,"role":"texte","seuil":4.5},{"jeton":"--couleur-chaise-pleine","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-chaise-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"--couleur-echelle","ratio":16.18,"role":"marque","seuil":3},{"jeton":"--couleur-filigrane","ratio":5.1,"role":"marque","seuil":3},{"jeton":"--couleur-hachure","ratio":16.48,"role":"marque","seuil":3},{"jeton":"--couleur-marque","ratio":3.63,"role":"marque","seuil":3},{"jeton":"--couleur-papier","ratio":13.44,"role":"texte","seuil":4.5},{"jeton":"--couleur-pastille-fond","ratio":13.44,"role":"marque","seuil":3},{"jeton":"--couleur-table-trait","ratio":8.13,"role":"marque","seuil":3},{"jeton":"rgb(24, 33, 47)","ratio":16.19,"role":"texte","seuil":4.5},{"jeton":"rgb(28, 33, 40)","ratio":16.18,"role":"texte","seuil":4.5}]},"texte":["Gestion table tournante Libre","construction de documentation","documentation","Écriture","Liste des événements","Clair","Sombre","À propos","Aperçu avant impression","Écriture","Plan de salle","Liste d'accueil","Feuilles par table","Tour imprimé","Tour 1","Tour 2","Tour 3","Listes de noms","Pages du plan","Découpage proposé","Tout sur une page","Découper en pages","Papier :","A4","Changer","Imprimer","Fermer l'aperçu","Page 888 sur 888 — colonne WW, rangée 888","au-dessus : page 888","à droite : page 888","au-dessous : page 888","à gauche : page 888","500","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 00","Version","construction de documentation","10","1","1. (réservée, tous les tours)","Basile Lanterneau","—","animation","2.","Gaspard Marbrelle","3.","Ysaline Sablonnet","4.","Anselme Givrecœur","5.","Apolline Coudraie","6.","Basile Lanterneau","7.","Brunœil","8.","Faustine Ormelin","9.","Edgar Ardoisier","10.","Bertille Cressonnier","1.","Côme Fenouillet","— titre","animation","non pourvu","2. (réservée, tour 1)","Capucine Pommerel","3. (libre)","4. (libre)","5. (libre)","6. (libre)","7. (libre)","8. (libre)","Page 1 sur 1 — colonne A, rangée 1","2","m","disposition relative — l'encombrement dans la salle n'est pas vérifié","listes de noms hors d'échelle — le plan à l'échelle du bâtiment s'imprime listes masquées","Soirée d’essai","Date non fixée","Tour 1","Placement du","6 octobre 2026, 19 h 00","Version","construction de documentation","BROUILLON"],"theme":"clair","versionReelle":"2026.10.05.01"},
@@ -26,11 +43,6 @@
{"cadre":{"hauteur":1123,"largeur":794},"empreinte":"8bf456355f4a90884fcbb65192bba98a0c23a564d8789d6466a63ddab96f1ea9","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"24-badges-controle","graine":4242,"image":{"hauteur":1123,"largeur":794,"sha256":"4731d411c33a6fa9a889acbfe92d1460a988c6f202f96578286b7d0e02109eb9"},"instant":"2026-10-06T19:03:00-04:00","mode":"pdfjs-dist-96ppp","pdf":"2f0f58fece0ba41d5a0825c83f30dea7931bc9b665e3890b4fe4f371d90559f4","source":"pdf","styles":{"clair":[],"sombre":[]},"texte":["0","50","100","Badge : 105 × 148 mm (A6)","Papier : A4, 210 × 297 mm","Imposition : feuille par feuille","Planches : 3","12 badges pour 13 participants, 1 exclu","Événement : Soirée d’essai","Source : le placement retenu","Placement du 6 octobre 2026 à 19:02:00","Version : construction de documentation","Imprimer en recto seul, à 100 %"],"theme":"clair","versionReelle":"2026.10.05.01"},
{"cadre":{"hauteur":1123,"largeur":794},"empreinte":"2a1281d94e7f8f7668ce80db098778050eac40976f0319d98c25b975889a3d48","etape":"12","etat":"b42451443701c80d433d632788edaab7dd1afea7a57add55a37fcedfdaee98ff","facteurEchelle":1,"fichier":"25-badges-planche","graine":4242,"image":{"hauteur":1123,"largeur":794,"sha256":"5375de3104896af92144a7b455746f989fc802cc320b8b6f52e1351c7718bf43"},"instant":"2026-10-06T19:03:00-04:00","mode":"pdfjs-dist-96ppp","pdf":"2f0f58fece0ba41d5a0825c83f30dea7931bc9b665e3890b4fe4f371d90559f4","source":"pdf","styles":{"clair":[],"sombre":[]},"texte":["Edgar Ardoisier","Société des Hérons","Tour 1 — table 1","Tour 2 — table 1","Tour 3 — table 2","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Brunœil","Cercle des Saules","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Apolline Coudraie","Chœur de l’Anse","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00","Bertille Cressonnier","Cercle des Saules","Tour 1 — table 1","Tour 2 — table 2","Tour 3 — table 1","Soirée d’essai","Placement du 6 octobre 2026 à 19:02:00"],"theme":"clair","versionReelle":"2026.10.05.01"}
],"format":1,"pilote":{"cadre":{"hauteur":700,"largeur":1366},"facteurEchelle":1,"mode":"chromium-headless-shell","navigateur":"chromium","versionNavigateur":"153.0.8010.12"},"reportees":[
-{"etape":"10","fichier":"12-qualite-profil","raison":"iteration5"},
-{"etape":"10","fichier":"13-qualite-collisions","raison":"iteration5"},
-{"etape":"10","fichier":"14-qualite-paires","raison":"iteration5"},
-{"etape":"10","fichier":"15-pas-de-matrice","raison":"iteration5"},
-{"etape":"10","fichier":"16-minimum-atteint","raison":"iteration5"},
{"etape":"10","fichier":"17-comparaison-manque","raison":"iteration5"},
{"etape":"10","fichier":"18-comparaison-escalier","raison":"iteration5"},
{"etape":"11","fichier":"21-historique","raison":"iteration5"}
diff --git a/scripts/banc/lancer.js b/scripts/banc/lancer.js
index 4b15573..07ca506 100644
--- a/scripts/banc/lancer.js
+++ b/scripts/banc/lancer.js
@@ -65,8 +65,15 @@ export const ATTENDUES = Object.freeze([...CONSTANTES.filter((c) => c.proprietai
/** La police embarquée, sous laquelle se prend toute mesure de texte. */
export const FAMILLE_EMBARQUEE = 'Noto Sans';
-// Les mesures qui lisent le rendu du texte, et nomment donc leur police.
-const MESURES_DE_TEXTE = Object.freeze(['SEUIL_SIEGES_LISIBLES', 'TOLERANCE_CHAINE_TEMOIN']);
+// Les mesures qui lisent le rendu du texte, et nomment donc leur police :
+// le seuil de la matrice en est, sa colonne de noms prenant la largeur
+// rendue du nom de référence.
+const MESURES_DE_TEXTE = Object.freeze([
+ 'SEUIL_SIEGES_LISIBLES',
+ 'TOLERANCE_CHAINE_TEMOIN',
+ 'SEUIL_MATRICE_PARTICIPANTS',
+ 'LARGEUR_TRONCATURE_NOM_PX',
+]);
// La machine de référence du banc : le poste, son processeur ralenti ×4 par
// le navigateur. C'est le ralentissement de la configuration du relevé ;
diff --git a/scripts/banc/lancer.test.js b/scripts/banc/lancer.test.js
index fa3e8de..2b513c2 100644
--- a/scripts/banc/lancer.test.js
+++ b/scripts/banc/lancer.test.js
@@ -95,7 +95,7 @@ const sorties = () =>
format: 1,
mesures: [
{ nom: 'LARGEUR_TRONCATURE_NOM_PX', unite: 'px', valeurProposee: 190, critere: 'nom de référence', police: 'Noto Sans', ralentissementCpu: 1 },
- { nom: 'SEUIL_MATRICE_PARTICIPANTS', unite: 'participants', valeurProposee: 38, critere: 'case de 24 px', ralentissementCpu: 1 },
+ { nom: 'SEUIL_MATRICE_PARTICIPANTS', unite: 'participants', valeurProposee: 38, critere: 'case de 24 px', police: 'Noto Sans', ralentissementCpu: 1 },
],
},
],
@@ -252,6 +252,16 @@ describe('lancer : le jugement qui rend la sortie non nulle', () => {
]);
});
+ test('les deux seuils de la page de qualité sont des mesures de texte : sans police nommée ou sous une autre, motif bloquant', () => {
+ const r = releve();
+ delete r.mesures.find(({ nom }) => nom === 'SEUIL_MATRICE_PARTICIPANTS').police;
+ r.mesures.find(({ nom }) => nom === 'LARGEUR_TRONCATURE_NOM_PX').police = 'DejaVu Sans';
+ assert.deepEqual(jugement(r).bloquants, [
+ 'SEUIL_MATRICE_PARTICIPANTS mesurée sous la police « inconnue », et non sous Noto Sans',
+ 'LARGEUR_TRONCATURE_NOM_PX mesurée sous la police « DejaVu Sans », et non sous Noto Sans',
+ ]);
+ });
+
test('un verdict non tenu : motif non bloquant, qui nomme la mesure et son critère', () => {
const r = releve();
r.mesures.find(({ nom }) => nom === 'TEMPS_IMAGE_LISTES').verdict = 'nonTenu';
diff --git a/scripts/banc/qualite.banc.js b/scripts/banc/qualite.banc.js
new file mode 100644
index 0000000..12d0ddb
--- /dev/null
+++ b/scripts/banc/qualite.banc.js
@@ -0,0 +1,330 @@
+// © 2026 TechnoLibre (http://www.technolibre.ca)
+// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
+
+// Les deux seuils de la page de qualité (§ 12.5, § 12.6, § 14.1, § 19.10),
+// relevés par le banc au cadre de 1 366 × 700, sur le rendu.
+//
+// LARGEUR_TRONCATURE_NOM_PX : la largeur rendue du nom de référence, fait de
+// LONGUEUR_NOM_REFERENCE fois le glyphe le plus large de l'alphabet visé,
+// au corps des étiquettes de graphique. App s'ouvre sur la page de qualité
+// d'un événement de deux tables dont une appartenance porte ce nom ; la vue
+// des collisions l'écrit en intitulé d'une ligne de barres. Les glyphes se
+// mesurent un à un par le mesureur des graphiques (creerMesureur) sur
+// l'intitulé rendu d'une première ouverture, et nomDeReference (seuils.js)
+// compose le nom ; une seconde ouverture le rend entier, à la largeur
+// mesurée, dans la marge gauche, avant l'axe. La valeur proposée est cette
+// largeur arrondie au pixel supérieur. L'alphabet visé : les lettres
+// latines de base, celles du supplément Latin-1 — « × » et « ÷ » exclus —,
+// et Œ, œ, Ÿ ; jamais un nom de démonstration, que sa régénération change.
+//
+// SEUIL_MATRICE_PARTICIPANTS : le plus grand nombre n de participants dont
+// la matrice « qui a rencontré qui » se dessine, chaque case d'au moins
+// CIBLE_MIN_PX de côté, la dernière colonne dans la largeur de la carte de
+// la vue des paires, noms en tête compris. L'événement de n personnes a
+// ⌈n / 4⌉ tables de quatre places et trois tours ; une génération courte le
+// place, puis App s'ouvre sur la page de qualité, sa proposition montrée.
+// Une personne porte le nom de référence, les autres un nom court : la
+// colonne des intitulés de ligne a la largeur que le registre suppose au
+// plus long. Le côté d'une case se lit sur le rendu, de la gauche d'une
+// case à celle de sa voisine. plusGrandTenant (seuils.js) tire le seuil par
+// dichotomie sur [MIN, MAX], monotonie relue aux voisins ; deux contrôles
+// disent que la mesure bascule : MIN tient, MAX non.
+//
+// Le registre est remplacé pour ce fichier (vi.mock), toute autre constante
+// inchangée : SEUIL_MATRICE_PARTICIPANTS à MAX, pour que le détail porte la
+// matrice au-delà du seuil de travail, et LARGEUR_TRONCATURE_NOM_PX à une
+// largeur qu'aucun nom n'atteint, pour que l'intitulé ne se tronque pas
+// avant d'être mesuré.
+//
+// Chaque texte mesuré doit être rendu en Noto Sans, sa face chargée : sinon
+// la mesure se refuse, valeur proposée null et refus nommé, et l'épreuve
+// échoue. Les deux mesures sont des géométries : elles se prennent sans
+// ralentissement du processeur.
+import { flushSync } from 'svelte';
+import { beforeAll, describe, expect, test, vi } from 'vitest';
+import { commands } from 'vitest/browser';
+import { appliquerCommande } from '../../src/application/commandes.js';
+import { CONSTANTES, LONGUEUR_NOM_REFERENCE, constante } from '../../src/geometrie/constantes.js';
+import { CIBLE_MIN_PX } from '../../src/geometrie/designation.js';
+import { creerMesureur } from '../../src/interface/plan/mesure_texte.js';
+import { rechercher } from '../../src/moteur/recherche.js';
+import { configurationDepuisCharge, creerCharge } from '../../src/stockage/document.js';
+import { VERSION } from '../../src/version.genere.js';
+import { attendre, creerContexte, ouvrirEvenement } from '../../test/navigateur/ecrans.js';
+import { controlerCadre, ecrireSortie } from './navigateur.js';
+import { verifierReleve } from './releve.js';
+import { nomDeReference, plusGrandTenant } from './seuils.js';
+
+// Les bornes de la dichotomie du seuil de la matrice : deux tables au
+// moins, puis bien au-delà de ce qu'une carte de 1 366 px tient.
+const MIN = 8;
+const MAX = 120;
+
+// Une largeur d'intitulé qu'aucun nom n'atteint, en px.
+const SANS_TRONCATURE_PX = 100_000;
+
+vi.mock('../../src/geometrie/constantes.js', async (importOriginal) => {
+ const original = await importOriginal();
+ const remplacees = new Map([
+ ['SEUIL_MATRICE_PARTICIPANTS', 120],
+ ['LARGEUR_TRONCATURE_NOM_PX', 100_000],
+ ]);
+ return { ...original, constante: (nom) => (remplacees.has(nom) ? remplacees.get(nom) : original.constante(nom)) };
+});
+
+const FAMILLE = 'Noto Sans';
+
+// Les points de code de de à a, en texte.
+const lettres = (de, a) => String.fromCodePoint(...Array.from({ length: a - de + 1 }, (_, i) => de + i));
+
+/** L'alphabet visé : A–Z, a–z, les lettres du supplément Latin-1 hors
+ * U+00D7 et U+00F7, puis Œ, œ, Ÿ. */
+const ALPHABET =
+ lettres(0x41, 0x5a) + lettres(0x61, 0x7a) + lettres(0xc0, 0xd6) + lettres(0xd8, 0xf6) + lettres(0xf8, 0xff) + '\u{152}\u{153}\u{178}';
+
+// Les noms courts des autres personnes de la matrice, inventés ; un numéro
+// les rend distincts, sans homonyme.
+const PRENOMS = Object.freeze(['Iris', 'Théo', 'Ondine', 'Basile', 'Maëlle']);
+const APPARTENANCES = Object.freeze(['Coopérative Aubier', 'Atelier Ressac']);
+
+const sansGuillemets = (texte) => texte.trim().replace(/^(["'])(.*)\1$/, '$2');
+
+/**
+ * Un événement de n personnes, ⌈n / 4⌉ tables de quatre places, tours
+ * tours, placé par une génération courte enregistrée par la commande.
+ * nomDe(i) donne le nom de la personne d'indice i, sans prénom ;
+ * appartenanceDe(i), son appartenance.
+ */
+function evenementPlace({ id, n, tours, nomDe, appartenanceDe }) {
+ const charge = creerCharge({ id, nom: 'Club des Merles', siegesParDefaut: 4, tours });
+ charge.participants = Array.from({ length: n }, (_, i) => ({
+ id: i + 1,
+ nom: nomDe(i),
+ prenom: null,
+ appartenance: appartenanceDe(i),
+ courriel: null,
+ titrePressenti: null,
+ notes: null,
+ exclu: false,
+ }));
+ const tables = Math.ceil(n / 4);
+ charge.tables = Array.from({ length: tables }, (_, i) => ({
+ id: i + 1,
+ numero: i + 1,
+ sieges: null,
+ forme: 'ronde',
+ position: { x: 300 * i, y: 0 },
+ }));
+ charge.prochainsIds = { participant: n + 1, table: tables + 1, proposition: 1 };
+ const configuration = configurationDepuisCharge(charge);
+ const propositions = rechercher(configuration, { graine: 3, arret: 20, nombre: 1 });
+ return appliquerCommande('enregistrerGeneration', charge, { propositions, configuration, produitVersion: VERSION.affichee }).charge;
+}
+
+// Huit personnes, deux tables, deux tours : six de l'appartenance nommée,
+// qui se rencontrent forcément, et deux d'une autre.
+const evenementCollisions = (appartenance) =>
+ evenementPlace({
+ id: 'banc-troncature',
+ n: 8,
+ tours: 2,
+ nomDe: (i) => `${PRENOMS[i % PRENOMS.length]} ${i + 1}`,
+ appartenanceDe: (i) => (i < 6 ? appartenance : APPARTENANCES[0]),
+ });
+
+// n personnes, la première au nom de référence.
+const evenementMatrice = (n, nomReference) =>
+ evenementPlace({
+ id: `banc-matrice-${n}`,
+ n,
+ tours: 3,
+ nomDe: (i) => (i === 0 ? nomReference : `${PRENOMS[i % PRENOMS.length]} ${i + 1}`),
+ appartenanceDe: (i) => APPARTENANCES[i % APPARTENANCES.length],
+ });
+
+// La police d'un texte rendu : la première famille calculée, et la face
+// 400 de Noto Sans chargée dans le document.
+function policeDe(texte) {
+ const premiere = sansGuillemets(getComputedStyle(texte).fontFamily.split(',')[0]);
+ const chargee = [...document.fonts].some((face) => sansGuillemets(face.family) === FAMILLE && face.weight === '400' && face.status === 'loaded');
+ return { premiere, chargee };
+}
+
+// L'intitulé rendu de la ligne de barres de l'appartenance donnée, dans la
+// vue des collisions ; le graphique et son axe avec lui.
+const intituleDe = (m, appartenance) =>
+ attendre(`l’intitulé de « ${appartenance} »`, () => {
+ const graphique = m.racine.querySelector('[data-vue-qualite="collisions"] [data-graphique="collisions"]');
+ const ligne = [...(graphique?.querySelectorAll('[data-ligne-graphique]') ?? [])].find((l) => l.dataset.ligneGraphique === appartenance);
+ const texte = ligne?.querySelector(':scope > text') ?? null;
+ const axe = graphique?.querySelector('[data-marque="graphiqueAxe"]') ?? null;
+ return texte !== null && texte.textContent !== '' && axe !== null ? { texte, axe } : null;
+ });
+
+// Les polices de chaque texte mesuré, dans l'ordre des mesures.
+const polices = [];
+// Les relevés de chaque appel du prédicat de la matrice, dans l'ordre.
+const sondes = [];
+
+let reference = null;
+let troncature = null;
+let seuilMatrice = null;
+
+/**
+ * Le prédicat de la matrice : pour n personnes, la grille se dessine-t-elle,
+ * chaque case d'au moins CIBLE_MIN_PX, la dernière colonne et l'intitulé du
+ * nom de référence dans la carte de la vue ? Monte, mesure, défait. Lève si
+ * la vue montre la phrase du seuil : le remplacement du registre n'aurait
+ * pas pris.
+ */
+async function tient(n) {
+ const contexte = creerContexte();
+ try {
+ const m = await ouvrirEvenement(contexte, evenementMatrice(n, reference.nom), { section: 'qualite' });
+ const rendu = await attendre(`la matrice de ${n} personnes ou sa phrase`, () => {
+ const vue = m.racine.querySelector('[data-vue-qualite="paires"]');
+ if (vue === null) return null;
+ if (vue.querySelector('[data-phrase-qualite="matriceSeuil"]') !== null) throw new Error('phrase du seuil : le registre de ce fichier n’a pas pris');
+ if (vue.querySelector('[data-phrase-qualite="matriceEtroite"]') !== null) return { vue, grille: null };
+ const grille = vue.querySelector('[data-graphique="matrice"]');
+ return grille !== null && grille.querySelectorAll('[data-case]').length === n * n ? { vue, grille } : null;
+ });
+ flushSync();
+ const carte = rendu.vue.getBoundingClientRect();
+ if (rendu.grille === null) {
+ sondes.push({ participants: n, dessinee: false, cotePx: null, largeurCartePx: carte.width, tient: false });
+ return false;
+ }
+ // La bordure d'une case de la première ligne : un trait d'un pixel posé
+ // au même retrait dans chaque case, si bien que deux bordures voisines
+ // sont distantes d'un côté de case.
+ const bordure = (colonne) =>
+ rendu.grille.querySelector(`[data-case="0:${colonne}"] [data-marque="graphiqueBordureCase"]`).getBoundingClientRect();
+ const cote = bordure(1).left - bordure(0).left;
+ const droite = bordure(n - 1).right;
+ const intitule = [...rendu.grille.querySelectorAll('text')].find((texte) => texte.textContent.endsWith(`. ${reference.nom}`));
+ if (intitule === undefined) throw new Error(`matrice de ${n} personnes : l’intitulé du nom de référence n’est pas rendu`);
+ polices.push(policeDe(intitule));
+ const gauche = intitule.getBoundingClientRect().left;
+ const resultat = cote >= CIBLE_MIN_PX && droite <= carte.right && gauche >= carte.left;
+ sondes.push({ participants: n, dessinee: true, cotePx: cote, largeurCartePx: carte.width, tient: resultat });
+ return resultat;
+ } finally {
+ await contexte.defaire();
+ }
+}
+
+beforeAll(async () => {
+ await controlerCadre();
+});
+
+describe('les deux seuils de la page de qualité (§ 12.5, § 12.6, § 14.1)', () => {
+ test('le registre de ce fichier porte les deux seuils remplacés, les autres constantes inchangées', () => {
+ expect(constante('SEUIL_MATRICE_PARTICIPANTS')).toBe(MAX);
+ expect(constante('LARGEUR_TRONCATURE_NOM_PX')).toBe(SANS_TRONCATURE_PX);
+ expect(constante('SEUIL_SIEGES_LISIBLES')).toBe(CONSTANTES.find(({ nom }) => nom === 'SEUIL_SIEGES_LISIBLES').valeur);
+ });
+
+ test(`le nom de référence : ${LONGUEUR_NOM_REFERENCE} fois le glyphe le plus large de l’alphabet visé, au corps des étiquettes de graphique`, async () => {
+ const contexte = creerContexte();
+ try {
+ const m = await ouvrirEvenement(contexte, evenementCollisions(APPARTENANCES[1]), { section: 'qualite' });
+ const { texte } = await intituleDe(m, APPARTENANCES[1]);
+ polices.push(policeDe(texte));
+ reference = nomDeReference(ALPHABET, LONGUEUR_NOM_REFERENCE, creerMesureur(texte));
+ } finally {
+ await contexte.defaire();
+ }
+ expect([...reference.nom]).toHaveLength(LONGUEUR_NOM_REFERENCE);
+ expect(ALPHABET).toContain(reference.glyphe);
+ });
+
+ test('le nom de référence s’écrit entier dans la marge gauche d’une vue à barres, à la largeur mesurée', async () => {
+ expect(reference).not.toBeNull();
+ const contexte = creerContexte();
+ try {
+ const m = await ouvrirEvenement(contexte, evenementCollisions(reference.nom), { section: 'qualite' });
+ const { texte, axe } = await intituleDe(m, reference.nom);
+ polices.push(policeDe(texte));
+ const boite = texte.getBBox();
+ const marge = Number(axe.getAttribute('x1'));
+ const rendue = texte.getComputedTextLength();
+ troncature = { rendue, droite: boite.x + boite.width, marge };
+ expect(texte.textContent).toBe(reference.nom);
+ expect(Math.abs(rendue - reference.largeur)).toBeLessThan(0.5);
+ expect(troncature.droite).toBeLessThanOrEqual(marge);
+ } finally {
+ await contexte.defaire();
+ }
+ });
+
+ test(`la matrice : ${MIN} personnes tiennent, ${MAX} non — la mesure bascule`, async () => {
+ expect(reference).not.toBeNull();
+ expect(await tient(MIN)).toBe(true);
+ expect(await tient(MAX)).toBe(false);
+ });
+
+ test(`la matrice : le plus grand nombre de personnes dont les cases tiennent ${CIBLE_MIN_PX} px dans la carte, par dichotomie sur [${MIN}, ${MAX}]`, async () => {
+ seuilMatrice = await plusGrandTenant(tient, MIN, MAX);
+ expect(seuilMatrice).toBeGreaterThanOrEqual(MIN);
+ expect(seuilMatrice).toBeLessThan(MAX);
+ });
+
+ test('les mesures s’écrivent dans scripts/banc/sorties/qualite.json, relues telles quelles, et se rangent dans un relevé', async () => {
+ expect(polices.length).toBeGreaterThan(0);
+ const fautive = polices.find(({ premiere, chargee }) => premiere !== FAMILLE || !chargee);
+ const police = fautive === undefined ? FAMILLE : null;
+ const refus = police === null ? `police des étiquettes ${fautive.premiere}${fautive.chargee ? '' : ', non chargée'} : la mesure se prend sur ${FAMILLE}` : null;
+ const matrice = {
+ nom: 'SEUIL_MATRICE_PARTICIPANTS',
+ unite: 'participants',
+ valeurProposee: refus === null && Number.isInteger(seuilMatrice) ? seuilMatrice : null,
+ critere:
+ `le plus grand nombre de participants dont la matrice se dessine, chaque case d’au moins ${CIBLE_MIN_PX} px, la dernière ` +
+ `colonne et les intitulés dans la carte de la vue des paires, un nom de référence en tête ; ` +
+ `⌈n / 4⌉ tables de quatre places, trois tours ; dichotomie sur [${MIN}, ${MAX}]`,
+ police,
+ ralentissementCpu: 1,
+ sondes: sondes.map((sonde) => ({ ...sonde })),
+ refus,
+ };
+ const largeur = {
+ nom: 'LARGEUR_TRONCATURE_NOM_PX',
+ unite: 'px',
+ valeurProposee: refus === null && reference !== null && troncature !== null ? reference.valeur : null,
+ critere:
+ `la largeur rendue de ${LONGUEUR_NOM_REFERENCE} fois le glyphe le plus large de l’alphabet visé — lettres latines de base, ` +
+ 'supplément Latin-1, Œ, œ, Ÿ —, intitulé entier d’une ligne de la vue des collisions, arrondie au pixel supérieur',
+ police,
+ ralentissementCpu: 1,
+ glyphe: reference?.glyphe ?? null,
+ largeurGlyphePx: reference?.largeurGlyphe ?? null,
+ nomReference: reference?.nom ?? null,
+ largeurNomPx: reference?.largeur ?? null,
+ largeurRenduePx: troncature?.rendue ?? null,
+ droiteIntitulePx: troncature?.droite ?? null,
+ axePx: troncature?.marge ?? null,
+ refus,
+ };
+ const objet = { format: 1, mesures: [matrice, largeur] };
+ const releve = {
+ format: 1,
+ configuration: {
+ cadre: { largeur: innerWidth, hauteur: innerHeight },
+ facteurEchelle: devicePixelRatio,
+ navigateur: null,
+ node: null,
+ processeursLogiques: null,
+ ralentissementCpu: 1,
+ police,
+ },
+ mesures: objet.mesures,
+ };
+ expect(verifierReleve(releve, CONSTANTES)).toEqual([]);
+ await ecrireSortie('qualite', objet);
+ expect(JSON.parse(await commands.readFile('scripts/banc/sorties/qualite.json'))).toEqual(objet);
+ expect(refus).toBeNull();
+ expect(matrice.valeurProposee).not.toBeNull();
+ expect(largeur.valeurProposee).not.toBeNull();
+ });
+});
diff --git a/scripts/banc/qualite.test.js b/scripts/banc/qualite.test.js
new file mode 100644
index 0000000..828f6f3
--- /dev/null
+++ b/scripts/banc/qualite.test.js
@@ -0,0 +1,163 @@
+// © 2026 TechnoLibre (http://www.technolibre.ca)
+// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
+
+// Épreuves du banc des deux seuils de la page de qualité (§ 14.1, § 19.10),
+// sous node : le nom de référence que le banc compose pour la largeur de
+// troncature (nomDeReference, seuils.js), sur des largeurs écrites, dont le
+// glyphe le plus large se lit à la main ; puis la sortie que le banc écrit
+// (qualite.banc.js), rangée dans un relevé, que la garde du relevé accepte
+// telle quelle et refuse dès qu'une valeur y nomme la machine. Le nom d'hôte
+// et le chemin de compte de ces épreuves sont inventés.
+import assert from 'node:assert/strict';
+import { CONSTANTES } from '../../src/geometrie/constantes.js';
+import { describe, test } from '../../test/lanceur.js';
+import { verifierReleve } from './releve.js';
+import { nomDeReference } from './seuils.js';
+
+// Des largeurs écrites, en px, par glyphe ; un texte de plusieurs glyphes
+// mesure la somme des siens. Chaque appel est noté.
+const LARGEURS = new Map([
+ ['a', 7],
+ ['W', 12.5],
+ ['M', 11],
+ ['\u{152}', 12.5],
+ ['i', 3],
+ ['Q', 12.1],
+]);
+function mesureur() {
+ const appels = [];
+ const mesurer = (texte) => {
+ appels.push(texte);
+ return [...texte].reduce((somme, glyphe) => somme + LARGEURS.get(glyphe), 0);
+ };
+ return { mesurer, appels };
+}
+
+describe('nomDeReference : le glyphe le plus large, répété (§ 14.1)', () => {
+ test('le glyphe le plus large de l’alphabet, répété longueur fois ; sa largeur mesurée, arrondie au pixel supérieur', () => {
+ const { mesurer, appels } = mesureur();
+ assert.deepEqual(nomDeReference('aMWi', 3, mesurer), {
+ glyphe: 'W',
+ largeurGlyphe: 12.5,
+ nom: 'WWW',
+ largeur: 37.5,
+ valeur: 38,
+ });
+ // Chaque glyphe se mesure une fois, puis le nom composé, entier.
+ assert.deepEqual(appels, ['a', 'M', 'W', 'i', 'WWW']);
+ });
+
+ test('une partie fractionnaire sous le demi-pixel s’arrondit aussi au pixel supérieur', () => {
+ const { mesurer } = mesureur();
+ assert.deepEqual(nomDeReference('aQ', 2, mesurer), { glyphe: 'Q', largeurGlyphe: 12.1, nom: 'QQ', largeur: 24.2, valeur: 25 });
+ });
+
+ test('à égalité, le premier glyphe de l’alphabet ; une largeur entière reste entière', () => {
+ const { mesurer } = mesureur();
+ assert.equal(nomDeReference('ia\u{152}W', 2, mesurer).glyphe, '\u{152}');
+ assert.equal(nomDeReference('iaW\u{152}', 2, mesurer).glyphe, 'W');
+ assert.deepEqual(nomDeReference('aM', 4, mesurer), { glyphe: 'M', largeurGlyphe: 11, nom: 'MMMM', largeur: 44, valeur: 44 });
+ });
+
+ test('l’alphabet se parcourt par points de code : un glyphe hors du plan de base compte pour un', () => {
+ const largeurs = new Map([
+ ['a', 7],
+ ['\u{1D400}', 15],
+ ]);
+ const mesurer = (texte) => [...texte].reduce((somme, glyphe) => somme + largeurs.get(glyphe), 0);
+ assert.deepEqual(nomDeReference('a\u{1D400}', 2, mesurer), {
+ glyphe: '\u{1D400}',
+ largeurGlyphe: 15,
+ nom: '\u{1D400}\u{1D400}',
+ largeur: 30,
+ valeur: 30,
+ });
+ });
+
+ test('refuse un alphabet vide, une longueur qui n’est pas un entier ≥ 1, un mesureur absent', () => {
+ const { mesurer } = mesureur();
+ assert.throws(() => nomDeReference('', 3, mesurer), RangeError);
+ assert.throws(() => nomDeReference(['a'], 3, mesurer), TypeError);
+ for (const longueur of [0, -1, 2.5, Number.NaN, '3']) {
+ assert.throws(() => nomDeReference('aW', longueur, mesurer), RangeError, String(longueur));
+ }
+ assert.throws(() => nomDeReference('aW', 3, null), TypeError);
+ });
+
+ test('refuse une largeur nulle ou non finie — un texte qui n’est pas rendu ne mesure rien — en nommant le texte', () => {
+ assert.throws(() => nomDeReference('aW', 2, (texte) => (texte === 'W' ? 0 : 7)), /« W »/);
+ assert.throws(() => nomDeReference('aW', 2, (texte) => (texte === 'W' ? Number.NaN : 7)), /« W »/);
+ assert.throws(() => nomDeReference('aW', 2, (texte) => (texte.length > 1 ? 0 : 7)), /« aa »/);
+ });
+});
+
+// La sortie du banc de la page de qualité, de valeurs inventées, à la forme
+// que qualite.banc.js écrit : les deux mesures, puis leurs sondes.
+const sortie = () => ({
+ format: 1,
+ mesures: [
+ {
+ nom: 'SEUIL_MATRICE_PARTICIPANTS',
+ unite: 'participants',
+ valeurProposee: 37,
+ critere: 'case de 24 px dans la largeur de la carte, noms en tête compris',
+ police: 'Noto Sans',
+ ralentissementCpu: 1,
+ sondes: [{ participants: 37, dessinee: true, cotePx: 24, largeurCartePx: 1100, tient: true }],
+ refus: null,
+ },
+ {
+ nom: 'LARGEUR_TRONCATURE_NOM_PX',
+ unite: 'px',
+ valeurProposee: 190,
+ critere: 'nom de référence de 14 glyphes',
+ police: 'Noto Sans',
+ ralentissementCpu: 1,
+ glyphe: '\u{152}',
+ largeurGlyphePx: 13.5,
+ nomReference: '\u{152}'.repeat(14),
+ largeurNomPx: 189.1,
+ refus: null,
+ },
+ ],
+});
+
+// La sortie rangée dans un relevé, comme le banc le vérifie avant de
+// l'écrire.
+const releveDe = (s) => ({
+ format: 1,
+ configuration: {
+ cadre: { largeur: 1366, hauteur: 700 },
+ facteurEchelle: 1,
+ navigateur: null,
+ node: null,
+ processeursLogiques: null,
+ ralentissementCpu: 1,
+ police: 'Noto Sans',
+ },
+ mesures: s.mesures,
+});
+
+describe('la sortie du banc de la page de qualité, rangée dans un relevé (§ 19.10)', () => {
+ test('conforme : les deux constantes du banc, à l’unité du registre', () => {
+ assert.deepEqual(verifierReleve(releveDe(sortie()), CONSTANTES), []);
+ });
+
+ test('un nom d’hôte inventé dans une sonde est refusé, par son chemin', () => {
+ const s = sortie();
+ s.mesures[0].sondes[0].hote = 'poste-grebiche-07';
+ assert.deepEqual(verifierReleve(releveDe(s), CONSTANTES), [
+ { chemin: 'mesures[0].sondes[0].hote', faute: 'un relevé ne nomme pas sa machine : ni hôte, ni utilisateur, ni date' },
+ ]);
+ });
+
+ test('un nom de machine inventé au sommet d’une mesure, et un chemin de compte inventé dans son critère, sont refusés', () => {
+ const s = sortie();
+ s.mesures[1].nomMachine = 'poste-grebiche-07';
+ s.mesures[1].critere = 'mesuré depuis /home/grebiche/banc';
+ assert.deepEqual(
+ verifierReleve(releveDe(s), CONSTANTES).map(({ chemin }) => chemin),
+ ['mesures[1].critere', 'mesures[1].nomMachine'],
+ );
+ });
+});
diff --git a/scripts/banc/releve.json b/scripts/banc/releve.json
index fd59c18..9cdf640 100644
--- a/scripts/banc/releve.json
+++ b/scripts/banc/releve.json
@@ -23,7 +23,7 @@
"formes": [
{
"forme": "ronde",
- "seuil": 58
+ "seuil": 60
},
{
"forme": "carree",
@@ -34,211 +34,204 @@
{
"forme": "ronde",
"places": 2,
- "basListePx": 473.6078796386719,
- "basPlanPx": 620.21875,
+ "basListePx": 489.5,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "ronde",
"places": 200,
- "basListePx": 629.3965454101562,
- "basPlanPx": 620.21875,
+ "basListePx": 643.0318603515625,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "ronde",
"places": 2,
- "basListePx": 473.6078796386719,
- "basPlanPx": 620.21875,
+ "basListePx": 489.5,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "ronde",
"places": 200,
- "basListePx": 629.3965454101562,
- "basPlanPx": 620.21875,
+ "basListePx": 643.0318603515625,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "ronde",
"places": 101,
- "basListePx": 625.5232543945312,
- "basPlanPx": 620.21875,
+ "basListePx": 639.2146606445312,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "ronde",
"places": 51,
- "basListePx": 618.4696044921875,
- "basPlanPx": 620.21875,
+ "basListePx": 632.26318359375,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "ronde",
"places": 76,
- "basListePx": 622.934326171875,
- "basPlanPx": 620.21875,
+ "basListePx": 636.6631469726562,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "ronde",
"places": 63,
- "basListePx": 621.0859375,
- "basPlanPx": 620.21875,
+ "basListePx": 634.8416137695312,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "ronde",
"places": 57,
- "basListePx": 619.9010009765625,
- "basPlanPx": 620.21875,
+ "basListePx": 633.673828125,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "ronde",
"places": 60,
- "basListePx": 620.316650390625,
- "basPlanPx": 620.21875,
+ "basListePx": 634.08349609375,
+ "basPlanPx": 634.21875,
+ "tient": true
+ },
+ {
+ "forme": "ronde",
+ "places": 61,
+ "basListePx": 634.475341796875,
+ "basPlanPx": 634.21875,
"tient": false
},
- {
- "forme": "ronde",
- "places": 58,
- "basListePx": 619.8966674804688,
- "basPlanPx": 620.21875,
- "tient": true
- },
{
"forme": "ronde",
"places": 59,
- "basListePx": 620.3200073242188,
- "basPlanPx": 620.21875,
- "tient": false
- },
- {
- "forme": "ronde",
- "places": 57,
- "basListePx": 619.9010009765625,
- "basPlanPx": 620.21875,
+ "basListePx": 634.0867919921875,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "ronde",
- "places": 58,
- "basListePx": 619.8966674804688,
- "basPlanPx": 620.21875,
+ "places": 60,
+ "basListePx": 634.08349609375,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "ronde",
- "places": 59,
- "basListePx": 620.3200073242188,
- "basPlanPx": 620.21875,
+ "places": 61,
+ "basListePx": 634.475341796875,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 2,
- "basListePx": 462.1051330566406,
- "basPlanPx": 620.21875,
+ "basListePx": 478.16387939453125,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 200,
- "basListePx": 711.0751342773438,
- "basPlanPx": 620.21875,
+ "basListePx": 723.527099609375,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 2,
- "basListePx": 462.1051330566406,
- "basPlanPx": 620.21875,
+ "basListePx": 478.16387939453125,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 200,
- "basListePx": 711.0751342773438,
- "basPlanPx": 620.21875,
+ "basListePx": 723.527099609375,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 101,
- "basListePx": 690.3484497070312,
- "basPlanPx": 620.21875,
+ "basListePx": 703.1007690429688,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 51,
- "basListePx": 676.447021484375,
- "basPlanPx": 620.21875,
+ "basListePx": 689.400634765625,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 26,
- "basListePx": 634.857421875,
- "basPlanPx": 620.21875,
+ "basListePx": 648.41357421875,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 14,
- "basListePx": 591.9364624023438,
- "basPlanPx": 620.21875,
+ "basListePx": 606.1143798828125,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 20,
- "basListePx": 639.3123779296875,
- "basPlanPx": 620.21875,
+ "basListePx": 652.8040161132812,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 17,
- "basListePx": 595.736328125,
- "basPlanPx": 620.21875,
+ "basListePx": 609.8591918945312,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 18,
- "basListePx": 610.2616577148438,
- "basPlanPx": 620.21875,
+ "basListePx": 624.1741333007812,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 19,
- "basListePx": 624.7869873046875,
- "basPlanPx": 620.21875,
+ "basListePx": 638.4890747070312,
+ "basPlanPx": 634.21875,
"tient": false
},
{
"forme": "carree",
"places": 17,
- "basListePx": 595.736328125,
- "basPlanPx": 620.21875,
+ "basListePx": 609.8591918945312,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 18,
- "basListePx": 610.2616577148438,
- "basPlanPx": 620.21875,
+ "basListePx": 624.1741333007812,
+ "basPlanPx": 634.21875,
"tient": true
},
{
"forme": "carree",
"places": 19,
- "basListePx": 624.7869873046875,
- "basPlanPx": 620.21875,
+ "basListePx": 638.4890747070312,
+ "basPlanPx": 634.21875,
"tient": false
}
],
@@ -285,63 +278,63 @@
{
"nom": "RALENTISSEMENT_PLEINE_CHARGE",
"unite": "×",
- "valeurProposee": 2.79,
+ "valeurProposee": 2.98,
"critere": "t(L) / t(1), médianes de 3 répétitions ou plus : une génération de W propositions sur W travailleurs, grande démonstration, arret 200000, graine 1",
"courbe": [
{
"coeurs": 1,
"dureesMs": [
- 407.8,
- 444.9,
- 420
+ 430.1,
+ 447.4,
+ 433.2
],
- "medianeMs": 420,
+ "medianeMs": 433.2,
"ralentissement": 1,
"modele": 1
},
{
"coeurs": 2,
"dureesMs": [
- 458.7,
- 472.7,
- 468.6
+ 477.4,
+ 484.9,
+ 476.1
],
- "medianeMs": 468.6,
- "ralentissement": 1.116,
- "modele": 1.119
+ "medianeMs": 477.4,
+ "ralentissement": 1.102,
+ "modele": 1.132
},
{
"coeurs": 4,
"dureesMs": [
- 578.1,
- 580.4,
- 559.4
+ 591.1,
+ 592.2,
+ 576.8
],
- "medianeMs": 578.1,
- "ralentissement": 1.376,
- "modele": 1.358
+ "medianeMs": 591.1,
+ "ralentissement": 1.364,
+ "modele": 1.396
},
{
"coeurs": 8,
"dureesMs": [
- 780.2,
- 785.2,
- 791.9
+ 803.9,
+ 829.3,
+ 807.6
],
- "medianeMs": 785.2,
- "ralentissement": 1.87,
- "modele": 1.836
+ "medianeMs": 807.6,
+ "ralentissement": 1.864,
+ "modele": 1.924
},
{
"coeurs": 16,
"dureesMs": [
- 1186.9,
- 1169.7,
- 1172
+ 1290.6,
+ 1277.1,
+ 1302.7
],
- "medianeMs": 1172,
- "ralentissement": 2.79,
- "modele": 2.79
+ "medianeMs": 1290.6,
+ "ralentissement": 2.979,
+ "modele": 2.979
}
],
"bruite": false,
@@ -350,31 +343,142 @@
{
"nom": "SEUIL_MATRICE_PARTICIPANTS",
"unite": "participants",
- "valeurProposee": null,
- "critere": "non relevée : la case de la matrice dans la largeur de la carte",
- "ralentissementCpu": 4
+ "valeurProposee": 44,
+ "critere": "le plus grand nombre de participants dont la matrice se dessine, chaque case d’au moins 24 px, la dernière colonne et les intitulés dans la carte de la vue des paires, un nom de référence en tête ; ⌈n / 4⌉ tables de quatre places, trois tours ; dichotomie sur [8, 120]",
+ "police": "Noto Sans",
+ "ralentissementCpu": 1,
+ "sondes": [
+ {
+ "participants": 8,
+ "dessinee": true,
+ "cotePx": 134,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 120,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ },
+ {
+ "participants": 8,
+ "dessinee": true,
+ "cotePx": 134,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 120,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ },
+ {
+ "participants": 64,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ },
+ {
+ "participants": 36,
+ "dessinee": true,
+ "cotePx": 29,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 50,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ },
+ {
+ "participants": 43,
+ "dessinee": true,
+ "cotePx": 24,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 46,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ },
+ {
+ "participants": 44,
+ "dessinee": true,
+ "cotePx": 24,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 45,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ },
+ {
+ "participants": 43,
+ "dessinee": true,
+ "cotePx": 24,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 44,
+ "dessinee": true,
+ "cotePx": 24,
+ "largeurCartePx": 1310,
+ "tient": true
+ },
+ {
+ "participants": 45,
+ "dessinee": false,
+ "cotePx": null,
+ "largeurCartePx": 1310,
+ "tient": false
+ }
+ ],
+ "refus": null
},
{
"nom": "LARGEUR_TRONCATURE_NOM_PX",
"unite": "px",
- "valeurProposee": null,
- "critere": "non relevée : la largeur du nom de référence",
- "ralentissementCpu": 4
+ "valeurProposee": 168,
+ "critere": "la largeur rendue de 14 fois le glyphe le plus large de l’alphabet visé — lettres latines de base, supplément Latin-1, Œ, œ, Ÿ —, intitulé entier d’une ligne de la vue des collisions, arrondie au pixel supérieur",
+ "police": "Noto Sans",
+ "ralentissementCpu": 1,
+ "glyphe": "M",
+ "largeurGlyphePx": 12,
+ "nomReference": "MMMMMMMMMMMMMM",
+ "largeurNomPx": 168,
+ "largeurRenduePx": 168,
+ "droiteIntitulePx": 188,
+ "axePx": 198,
+ "refus": null
},
{
"nom": "DUREE_GENERATION_PAR_DEFAUT",
"unite": "ms",
- "valeurProposee": 615.2,
+ "valeurProposee": 676.5,
"critere": "médiane de 3 générations au réglage par défaut, 5 × 200000 mouvements sur 5 travailleurs, grande démonstration",
"courbe": [
{
"coeurs": 5,
"dureesMs": [
- 619.9,
- 615.2,
- 611.2
+ 676.5,
+ 678.3,
+ 658.1
],
- "medianeMs": 615.2
+ "medianeMs": 676.5
}
],
"ralentissementCpu": 1
@@ -387,1009 +491,1009 @@
"critereMs": 33,
"ralentissementCpu": 4,
"seuil": {
- "k": 0.16991981765756428,
+ "k": 0.16745825320593202,
"tenuPartout": true,
"jamaisTenu": false
},
- "pireP95Ms": 21.20000000001164,
+ "pireP95Ms": 20.80000000000291,
"courbe": [
{
- "k": 0.16991981765756428,
+ "k": 0.16745825320593202,
"ralentissementCpu": 1,
- "p95Ms": 12.199999999999818,
- "glissements": [
- {
- "images": 65,
- "medianeMs": 9.099999999999909,
- "p95Ms": 12.600000000000136,
- "maxMs": 13.5
- },
- {
- "images": 63,
- "medianeMs": 7.5,
- "p95Ms": 12.199999999999818,
- "maxMs": 13.799999999999727
- },
- {
- "images": 64,
- "medianeMs": 7.4500000000000455,
- "p95Ms": 11.5,
- "maxMs": 12.599999999999909
- }
- ]
- },
- {
- "k": 0.16991981765756428,
- "ralentissementCpu": 4,
- "p95Ms": 20.5,
- "glissements": [
- {
- "images": 261,
- "medianeMs": 6.899999999999636,
- "p95Ms": 20.399999999999636,
- "maxMs": 37.70000000000027
- },
- {
- "images": 253,
- "medianeMs": 7,
- "p95Ms": 20.5,
- "maxMs": 71.40000000000146
- },
- {
- "images": 251,
- "medianeMs": 7,
- "p95Ms": 20.700000000000728,
- "maxMs": 52
- }
- ]
- },
- {
- "k": 0.18691179942332073,
- "ralentissementCpu": 1,
- "p95Ms": 12.099999999998545,
- "glissements": [
- {
- "images": 64,
- "medianeMs": 8.5,
- "p95Ms": 12.699999999998909,
- "maxMs": 16.100000000000364
- },
- {
- "images": 74,
- "medianeMs": 8.650000000000546,
- "p95Ms": 11.799999999999272,
- "maxMs": 14.600000000000364
- },
- {
- "images": 63,
- "medianeMs": 9,
- "p95Ms": 12.099999999998545,
- "maxMs": 14.600000000000364
- }
- ]
- },
- {
- "k": 0.18691179942332073,
- "ralentissementCpu": 4,
- "p95Ms": 20.5,
- "glissements": [
- {
- "images": 240,
- "medianeMs": 7.949999999999818,
- "p95Ms": 20.5,
- "maxMs": 71.69999999999891
- },
- {
- "images": 258,
- "medianeMs": 7,
- "p95Ms": 20.299999999999272,
- "maxMs": 71.40000000000146
- },
- {
- "images": 237,
- "medianeMs": 7.700000000000728,
- "p95Ms": 20.700000000000728,
- "maxMs": 54.20000000000073
- }
- ]
- },
- {
- "k": 0.2056029793656528,
- "ralentissementCpu": 1,
- "p95Ms": 12.200000000000728,
+ "p95Ms": 11.600000000000364,
"glissements": [
{
"images": 66,
- "medianeMs": 8.599999999998545,
- "p95Ms": 10.599999999998545,
- "maxMs": 16.5
+ "medianeMs": 9.25,
+ "p95Ms": 11,
+ "maxMs": 12.100000000000136
},
{
- "images": 68,
- "medianeMs": 8.600000000002183,
- "p95Ms": 12.599999999998545,
- "maxMs": 15.400000000001455
+ "images": 67,
+ "medianeMs": 8,
+ "p95Ms": 12.5,
+ "maxMs": 15.899999999999864
},
{
- "images": 70,
- "medianeMs": 8.600000000000364,
- "p95Ms": 12.200000000000728,
- "maxMs": 17.399999999997817
+ "images": 63,
+ "medianeMs": 7.2999999999999545,
+ "p95Ms": 11.600000000000364,
+ "maxMs": 13.200000000000273
}
]
},
{
- "k": 0.2056029793656528,
+ "k": 0.16745825320593202,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.199999999999818,
+ "glissements": [
+ {
+ "images": 361,
+ "medianeMs": 2,
+ "p95Ms": 20.199999999999818,
+ "maxMs": 34.100000000000364
+ },
+ {
+ "images": 329,
+ "medianeMs": 2.199999999999818,
+ "p95Ms": 20.199999999999818,
+ "maxMs": 71.19999999999982
+ },
+ {
+ "images": 331,
+ "medianeMs": 2.2000000000007276,
+ "p95Ms": 20.19999999999891,
+ "maxMs": 54.399999999999636
+ }
+ ]
+ },
+ {
+ "k": 0.18420407852652523,
+ "ralentissementCpu": 1,
+ "p95Ms": 11.599999999998545,
+ "glissements": [
+ {
+ "images": 64,
+ "medianeMs": 8.899999999999636,
+ "p95Ms": 11.599999999998545,
+ "maxMs": 14.699999999998909
+ },
+ {
+ "images": 66,
+ "medianeMs": 8.850000000000364,
+ "p95Ms": 12.199999999998909,
+ "maxMs": 15.600000000000364
+ },
+ {
+ "images": 72,
+ "medianeMs": 8.600000000000364,
+ "p95Ms": 11.100000000000364,
+ "maxMs": 17.099999999998545
+ }
+ ]
+ },
+ {
+ "k": 0.18420407852652523,
"ralentissementCpu": 4,
"p95Ms": 20.299999999999272,
"glissements": [
{
- "images": 228,
- "medianeMs": 9.200000000000728,
- "p95Ms": 20.299999999999272,
- "maxMs": 52.79999999999927
+ "images": 337,
+ "medianeMs": 2.2000000000007276,
+ "p95Ms": 20.399999999999636,
+ "maxMs": 54.80000000000109
},
{
- "images": 246,
- "medianeMs": 7.75,
+ "images": 318,
+ "medianeMs": 2.25,
"p95Ms": 20.200000000000728,
- "maxMs": 55.20000000000073
+ "maxMs": 52.80000000000291
},
{
- "images": 248,
- "medianeMs": 7.599999999998545,
- "p95Ms": 20.399999999997817,
- "maxMs": 55.29999999999927
+ "images": 376,
+ "medianeMs": 2.2000000000007276,
+ "p95Ms": 20.299999999999272,
+ "maxMs": 53.70000000000073
}
]
},
{
- "k": 0.2261632773022181,
+ "k": 0.20262448637917777,
"ralentissementCpu": 1,
- "p95Ms": 11.299999999999272,
+ "p95Ms": 12.400000000001455,
"glissements": [
{
- "images": 67,
- "medianeMs": 8.700000000000728,
- "p95Ms": 11.299999999999272,
- "maxMs": 16.799999999999272
+ "images": 66,
+ "medianeMs": 8.650000000001455,
+ "p95Ms": 10.200000000000728,
+ "maxMs": 15.299999999999272
},
{
- "images": 144,
- "medianeMs": 1.1000000000003638,
- "p95Ms": 10,
- "maxMs": 15.799999999999272
- },
- {
- "images": 132,
- "medianeMs": 1.5,
- "p95Ms": 11.700000000000728,
- "maxMs": 15.799999999999272
- }
- ]
- },
- {
- "k": 0.2261632773022181,
- "ralentissementCpu": 4,
- "p95Ms": 20.30000000000291,
- "glissements": [
- {
- "images": 253,
- "medianeMs": 6.900000000001455,
- "p95Ms": 20.30000000000291,
- "maxMs": 54.900000000001455
- },
- {
- "images": 241,
- "medianeMs": 7.900000000001455,
- "p95Ms": 20.299999999995634,
- "maxMs": 54.5
- },
- {
- "images": 244,
- "medianeMs": 7.700000000000728,
- "p95Ms": 20.69999999999709,
- "maxMs": 53.5
- }
- ]
- },
- {
- "k": 0.24877960503243993,
- "ralentissementCpu": 1,
- "p95Ms": 10.200000000004366,
- "glissements": [
- {
- "images": 65,
- "medianeMs": 9.30000000000291,
- "p95Ms": 11.400000000001455,
- "maxMs": 16.900000000001455
- },
- {
- "images": 133,
- "medianeMs": 0.8000000000029104,
- "p95Ms": 10.200000000004366,
- "maxMs": 16.400000000001455
- },
- {
- "images": 146,
- "medianeMs": 0.75,
- "p95Ms": 10.19999999999709,
- "maxMs": 15.400000000001455
- }
- ]
- },
- {
- "k": 0.24877960503243993,
- "ralentissementCpu": 4,
- "p95Ms": 20.60000000000582,
- "glissements": [
- {
- "images": 257,
- "medianeMs": 6.5,
- "p95Ms": 21.5,
- "maxMs": 52.700000000004366
- },
- {
- "images": 238,
- "medianeMs": 8.400000000001455,
- "p95Ms": 20.599999999998545,
- "maxMs": 54.60000000000582
- },
- {
- "images": 233,
- "medianeMs": 8.900000000001455,
- "p95Ms": 20.60000000000582,
- "maxMs": 54.400000000001455
- }
- ]
- },
- {
- "k": 0.27365756553568393,
- "ralentissementCpu": 1,
- "p95Ms": 12.200000000004366,
- "glissements": [
- {
- "images": 65,
- "medianeMs": 8.700000000004366,
- "p95Ms": 12.900000000001455,
+ "images": 66,
+ "medianeMs": 8.450000000000728,
+ "p95Ms": 12.400000000001455,
"maxMs": 15.099999999998545
},
{
"images": 66,
- "medianeMs": 8.94999999999709,
- "p95Ms": 12.200000000004366,
- "maxMs": 17.299999999995634
- },
- {
- "images": 141,
- "medianeMs": 0.7000000000043656,
- "p95Ms": 10.30000000000291,
- "maxMs": 15.30000000000291
+ "medianeMs": 8.399999999997817,
+ "p95Ms": 14.399999999997817,
+ "maxMs": 15.299999999999272
}
]
},
{
- "k": 0.27365756553568393,
+ "k": 0.20262448637917777,
"ralentissementCpu": 4,
- "p95Ms": 20.5,
+ "p95Ms": 20.200000000000728,
"glissements": [
{
- "images": 236,
- "medianeMs": 8.05000000000291,
- "p95Ms": 20.599999999998545,
- "maxMs": 54.69999999999709
+ "images": 298,
+ "medianeMs": 2.2999999999992724,
+ "p95Ms": 20.200000000000728,
+ "maxMs": 53.20000000000073
},
{
- "images": 264,
- "medianeMs": 6.44999999999709,
- "p95Ms": 20.400000000001455,
- "maxMs": 54.39999999999418
+ "images": 342,
+ "medianeMs": 2.2999999999992724,
+ "p95Ms": 20.200000000000728,
+ "maxMs": 51.80000000000291
},
{
- "images": 239,
- "medianeMs": 8.30000000000291,
- "p95Ms": 20.5,
+ "images": 391,
+ "medianeMs": 2.2000000000007276,
+ "p95Ms": 20.399999999997817,
+ "maxMs": 53.70000000000073
+ }
+ ]
+ },
+ {
+ "k": 0.22288693501709556,
+ "ralentissementCpu": 1,
+ "p95Ms": 12,
+ "glissements": [
+ {
+ "images": 67,
+ "medianeMs": 9.100000000002183,
+ "p95Ms": 12,
+ "maxMs": 13
+ },
+ {
+ "images": 64,
+ "medianeMs": 8.299999999995634,
+ "p95Ms": 9.700000000004366,
+ "maxMs": 16.400000000001455
+ },
+ {
+ "images": 66,
+ "medianeMs": 8.750000000003638,
+ "p95Ms": 12.299999999995634,
+ "maxMs": 16.400000000001455
+ }
+ ]
+ },
+ {
+ "k": 0.22288693501709556,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.19999999999709,
+ "glissements": [
+ {
+ "images": 341,
+ "medianeMs": 2.099999999998545,
+ "p95Ms": 20.10000000000582,
+ "maxMs": 69.69999999999709
+ },
+ {
+ "images": 308,
+ "medianeMs": 2.400000000001455,
+ "p95Ms": 20.200000000004366,
+ "maxMs": 55.299999999995634
+ },
+ {
+ "images": 301,
+ "medianeMs": 2.5,
+ "p95Ms": 20.19999999999709,
+ "maxMs": 55.599999999998545
+ }
+ ]
+ },
+ {
+ "k": 0.24517562851880514,
+ "ralentissementCpu": 1,
+ "p95Ms": 12.599999999998545,
+ "glissements": [
+ {
+ "images": 66,
+ "medianeMs": 8.599999999998545,
+ "p95Ms": 12.700000000004366,
+ "maxMs": 15.39999999999418
+ },
+ {
+ "images": 64,
+ "medianeMs": 8.900000000001455,
+ "p95Ms": 12,
+ "maxMs": 14.099999999998545
+ },
+ {
+ "images": 65,
+ "medianeMs": 9.299999999995634,
+ "p95Ms": 12.599999999998545,
+ "maxMs": 13.299999999995634
+ }
+ ]
+ },
+ {
+ "k": 0.24517562851880514,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.099999999998545,
+ "glissements": [
+ {
+ "images": 300,
+ "medianeMs": 2.3000000000029104,
+ "p95Ms": 20.099999999998545,
+ "maxMs": 53.400000000001455
+ },
+ {
+ "images": 325,
+ "medianeMs": 2.3000000000029104,
+ "p95Ms": 20.099999999998545,
+ "maxMs": 54.10000000000582
+ },
+ {
+ "images": 335,
+ "medianeMs": 2.400000000001455,
+ "p95Ms": 20.099999999998545,
+ "maxMs": 54.80000000000291
+ }
+ ]
+ },
+ {
+ "k": 0.2696931913706857,
+ "ralentissementCpu": 1,
+ "p95Ms": 9.400000000001455,
+ "glissements": [
+ {
+ "images": 79,
+ "medianeMs": 8.299999999995634,
+ "p95Ms": 13.400000000001455,
+ "maxMs": 17.19999999999709
+ },
+ {
+ "images": 134,
+ "medianeMs": 0.75,
+ "p95Ms": 9.39999999999418,
+ "maxMs": 17.30000000000291
+ },
+ {
+ "images": 164,
+ "medianeMs": 0.4000000000014552,
+ "p95Ms": 9.400000000001455,
+ "maxMs": 14.19999999999709
+ }
+ ]
+ },
+ {
+ "k": 0.2696931913706857,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.299999999995634,
+ "glissements": [
+ {
+ "images": 318,
+ "medianeMs": 2.25,
+ "p95Ms": 20.299999999995634,
+ "maxMs": 54.19999999999709
+ },
+ {
+ "images": 311,
+ "medianeMs": 2.2999999999956344,
+ "p95Ms": 20.299999999995634,
+ "maxMs": 54.60000000000582
+ },
+ {
+ "images": 296,
+ "medianeMs": 2.2000000000043656,
+ "p95Ms": 20.099999999998545,
"maxMs": 53.599999999998545
}
]
},
{
- "k": 0.30102332208925237,
+ "k": 0.2966625105077543,
"ralentissementCpu": 1,
- "p95Ms": 11.099999999998545,
+ "p95Ms": 13.5,
"glissements": [
{
- "images": 66,
- "medianeMs": 8.400000000001455,
- "p95Ms": 11.30000000000291,
- "maxMs": 17.5
+ "images": 69,
+ "medianeMs": 8.80000000000291,
+ "p95Ms": 11.799999999995634,
+ "maxMs": 16.299999999995634
},
{
- "images": 134,
- "medianeMs": 0.5999999999985448,
- "p95Ms": 10.299999999995634,
- "maxMs": 13.900000000001455
+ "images": 69,
+ "medianeMs": 8.299999999995634,
+ "p95Ms": 13.5,
+ "maxMs": 15.69999999999709
},
{
- "images": 136,
- "medianeMs": 0.6999999999970896,
- "p95Ms": 11.099999999998545,
- "maxMs": 14.200000000004366
+ "images": 74,
+ "medianeMs": 8.69999999999709,
+ "p95Ms": 13.5,
+ "maxMs": 14.900000000001455
}
]
},
{
- "k": 0.30102332208925237,
+ "k": 0.2966625105077543,
"ralentissementCpu": 4,
- "p95Ms": 20.59999999999127,
+ "p95Ms": 20.10000000000582,
"glissements": [
{
- "images": 260,
- "medianeMs": 6.349999999998545,
- "p95Ms": 20.5,
- "maxMs": 55.299999999995634
+ "images": 309,
+ "medianeMs": 2.3999999999941792,
+ "p95Ms": 20.099999999998545,
+ "maxMs": 53.30000000000291
},
{
- "images": 239,
- "medianeMs": 7.69999999999709,
- "p95Ms": 20.60000000000582,
+ "images": 290,
+ "medianeMs": 2.5,
+ "p95Ms": 20.29999999998836,
+ "maxMs": 53.59999999999127
+ },
+ {
+ "images": 301,
+ "medianeMs": 3.599999999991269,
+ "p95Ms": 20.10000000000582,
+ "maxMs": 55
+ }
+ ]
+ },
+ {
+ "k": 0.32632876155852975,
+ "ralentissementCpu": 1,
+ "p95Ms": 11.89999999999418,
+ "glissements": [
+ {
+ "images": 69,
+ "medianeMs": 8.5,
+ "p95Ms": 12.200000000011642,
+ "maxMs": 16.09999999999127
+ },
+ {
+ "images": 69,
+ "medianeMs": 8.200000000011642,
+ "p95Ms": 11.89999999999418,
+ "maxMs": 15.89999999999418
+ },
+ {
+ "images": 72,
+ "medianeMs": 8.10000000000582,
+ "p95Ms": 11.60000000000582,
+ "maxMs": 15.39999999999418
+ }
+ ]
+ },
+ {
+ "k": 0.32632876155852975,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.19999999999709,
+ "glissements": [
+ {
+ "images": 303,
+ "medianeMs": 2.2999999999883585,
+ "p95Ms": 19.89999999999418,
+ "maxMs": 53
+ },
+ {
+ "images": 331,
+ "medianeMs": 2.1999999999970896,
+ "p95Ms": 20.19999999999709,
+ "maxMs": 54.59999999999127
+ },
+ {
+ "images": 330,
+ "medianeMs": 2.2000000000116415,
+ "p95Ms": 20.20000000001164,
+ "maxMs": 54.19999999999709
+ }
+ ]
+ },
+ {
+ "k": 0.3589616377143828,
+ "ralentissementCpu": 1,
+ "p95Ms": 11.60000000000582,
+ "glissements": [
+ {
+ "images": 71,
+ "medianeMs": 8.200000000011642,
+ "p95Ms": 12,
+ "maxMs": 14.900000000008731
+ },
+ {
+ "images": 69,
+ "medianeMs": 8.5,
+ "p95Ms": 9.900000000008731,
+ "maxMs": 14.5
+ },
+ {
+ "images": 75,
+ "medianeMs": 8.30000000000291,
+ "p95Ms": 11.60000000000582,
+ "maxMs": 15.10000000000582
+ }
+ ]
+ },
+ {
+ "k": 0.3589616377143828,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.09999999999127,
+ "glissements": [
+ {
+ "images": 275,
+ "medianeMs": 2.2000000000116415,
+ "p95Ms": 20.19999999999709,
+ "maxMs": 55.10000000000582
+ },
+ {
+ "images": 311,
+ "medianeMs": 2.400000000008731,
+ "p95Ms": 19.90000000000873,
"maxMs": 54.69999999999709
},
{
- "images": 248,
- "medianeMs": 7.049999999995634,
- "p95Ms": 20.59999999999127,
- "maxMs": 53.59999999999127
+ "images": 282,
+ "medianeMs": 2.400000000008731,
+ "p95Ms": 20.09999999999127,
+ "maxMs": 53.39999999999418
}
]
},
{
- "k": 0.33112565429817764,
+ "k": 0.39485780148582106,
"ralentissementCpu": 1,
"p95Ms": 11.69999999999709,
"glissements": [
{
- "images": 69,
- "medianeMs": 8.60000000000582,
- "p95Ms": 11.89999999999418,
- "maxMs": 15
+ "images": 70,
+ "medianeMs": 8.10000000000582,
+ "p95Ms": 11.60000000000582,
+ "maxMs": 15.10000000000582
},
{
- "images": 66,
- "medianeMs": 8.80000000000291,
+ "images": 79,
+ "medianeMs": 8.099999999991269,
"p95Ms": 11.69999999999709,
+ "maxMs": 15.5
+ },
+ {
+ "images": 72,
+ "medianeMs": 7.900000000008731,
+ "p95Ms": 12.39999999999418,
+ "maxMs": 15.19999999999709
+ }
+ ]
+ },
+ {
+ "k": 0.39485780148582106,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.10000000000582,
+ "glissements": [
+ {
+ "images": 298,
+ "medianeMs": 2.3000000000029104,
+ "p95Ms": 20.19999999999709,
+ "maxMs": 53.30000000000291
+ },
+ {
+ "images": 298,
+ "medianeMs": 2.5,
+ "p95Ms": 19.90000000000873,
+ "maxMs": 71.19999999999709
+ },
+ {
+ "images": 347,
+ "medianeMs": 2.1999999999970896,
+ "p95Ms": 20.10000000000582,
+ "maxMs": 53.69999999999709
+ }
+ ]
+ },
+ {
+ "k": 0.4343435816344032,
+ "ralentissementCpu": 1,
+ "p95Ms": 11.5,
+ "glissements": [
+ {
+ "images": 76,
+ "medianeMs": 8.69999999999709,
+ "p95Ms": 11.5,
+ "maxMs": 17.19999999999709
+ },
+ {
+ "images": 147,
+ "medianeMs": 0.8999999999941792,
+ "p95Ms": 11.19999999999709,
"maxMs": 15.400000000008731
},
{
- "images": 65,
- "medianeMs": 8.30000000000291,
- "p95Ms": 11.10000000000582,
- "maxMs": 17
+ "images": 137,
+ "medianeMs": 1.4000000000087311,
+ "p95Ms": 12.10000000000582,
+ "maxMs": 15.5
}
]
},
{
- "k": 0.33112565429817764,
+ "k": 0.4343435816344032,
"ralentissementCpu": 4,
- "p95Ms": 20.59999999999127,
+ "p95Ms": 20.40000000000873,
"glissements": [
{
- "images": 259,
- "medianeMs": 7.19999999999709,
- "p95Ms": 20.79999999998836,
- "maxMs": 52.89999999999418
+ "images": 268,
+ "medianeMs": 2.7000000000043656,
+ "p95Ms": 20.40000000000873,
+ "maxMs": 71.40000000000873
},
{
- "images": 259,
- "medianeMs": 6.69999999999709,
- "p95Ms": 20.59999999999127,
- "maxMs": 54.80000000000291
+ "images": 320,
+ "medianeMs": 2.750000000007276,
+ "p95Ms": 20.39999999999418,
+ "maxMs": 88.09999999999127
},
{
- "images": 261,
- "medianeMs": 6.599999999991269,
- "p95Ms": 20.5,
- "maxMs": 53.70000000001164
+ "images": 287,
+ "medianeMs": 2.6000000000058208,
+ "p95Ms": 20.60000000000582,
+ "maxMs": 88.39999999999418
}
]
},
{
- "k": 0.3642382197279954,
+ "k": 0.47777793979784355,
"ralentissementCpu": 1,
- "p95Ms": 12.30000000000291,
+ "p95Ms": 10.19999999999709,
"glissements": [
{
- "images": 65,
- "medianeMs": 8.60000000000582,
- "p95Ms": 12.30000000000291,
- "maxMs": 16.60000000000582
+ "images": 73,
+ "medianeMs": 8.80000000000291,
+ "p95Ms": 13.39999999999418,
+ "maxMs": 17.69999999999709
},
{
- "images": 68,
- "medianeMs": 9.400000000001455,
- "p95Ms": 12.19999999999709,
- "maxMs": 15.80000000000291
+ "images": 179,
+ "medianeMs": 1.5,
+ "p95Ms": 9.30000000000291,
+ "maxMs": 17
},
{
- "images": 66,
- "medianeMs": 8.5,
- "p95Ms": 12.400000000008731,
+ "images": 187,
+ "medianeMs": 1.5,
+ "p95Ms": 10.19999999999709,
+ "maxMs": 18.89999999999418
+ }
+ ]
+ },
+ {
+ "k": 0.47777793979784355,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.80000000000291,
+ "glissements": [
+ {
+ "images": 294,
+ "medianeMs": 2.6000000000058208,
+ "p95Ms": 20.80000000000291,
+ "maxMs": 107
+ },
+ {
+ "images": 341,
+ "medianeMs": 2.6999999999970896,
+ "p95Ms": 20.5,
+ "maxMs": 88.69999999999709
+ },
+ {
+ "images": 340,
+ "medianeMs": 2.4500000000043656,
+ "p95Ms": 20.80000000000291,
+ "maxMs": 89.39999999999418
+ }
+ ]
+ },
+ {
+ "k": 0.525555733777628,
+ "ralentissementCpu": 1,
+ "p95Ms": 11.19999999999709,
+ "glissements": [
+ {
+ "images": 94,
+ "medianeMs": 8.19999999999709,
+ "p95Ms": 13.10000000000582,
+ "maxMs": 17.30000000000291
+ },
+ {
+ "images": 162,
+ "medianeMs": 0.6999999999970896,
+ "p95Ms": 11.19999999999709,
+ "maxMs": 17.5
+ },
+ {
+ "images": 182,
+ "medianeMs": 1.5,
+ "p95Ms": 9.099999999991269,
"maxMs": 17.30000000000291
}
]
},
{
- "k": 0.3642382197279954,
+ "k": 0.525555733777628,
"ralentissementCpu": 4,
- "p95Ms": 20.69999999999709,
+ "p95Ms": 20.60000000000582,
"glissements": [
{
- "images": 253,
- "medianeMs": 7.30000000000291,
- "p95Ms": 20.69999999999709,
- "maxMs": 54.70000000001164
- },
- {
- "images": 244,
- "medianeMs": 7.450000000004366,
- "p95Ms": 20.69999999999709,
- "maxMs": 52
- },
- {
- "images": 230,
- "medianeMs": 9.69999999999709,
- "p95Ms": 20.39999999999418,
- "maxMs": 54.20000000001164
- }
- ]
- },
- {
- "k": 0.400662041700795,
- "ralentissementCpu": 1,
- "p95Ms": 11.599999999991269,
- "glissements": [
- {
- "images": 64,
- "medianeMs": 9.30000000000291,
- "p95Ms": 13.099999999991269,
- "maxMs": 17.5
- },
- {
- "images": 135,
- "medianeMs": 1,
- "p95Ms": 11.599999999991269,
- "maxMs": 17.60000000000582
- },
- {
- "images": 133,
- "medianeMs": 1,
- "p95Ms": 10.60000000000582,
- "maxMs": 16.30000000000291
- }
- ]
- },
- {
- "k": 0.400662041700795,
- "ralentissementCpu": 4,
- "p95Ms": 21.20000000001164,
- "glissements": [
- {
- "images": 221,
- "medianeMs": 11.799999999988358,
- "p95Ms": 21.20000000001164,
- "maxMs": 70.69999999999709
- },
- {
- "images": 242,
- "medianeMs": 8.05000000000291,
- "p95Ms": 21.19999999999709,
- "maxMs": 107
- },
- {
- "images": 245,
- "medianeMs": 8,
- "p95Ms": 21.30000000000291,
- "maxMs": 89.80000000000291
- }
- ]
- },
- {
- "k": 0.44072824587087456,
- "ralentissementCpu": 1,
- "p95Ms": 11.400000000008731,
- "glissements": [
- {
- "images": 74,
- "medianeMs": 9.349999999998545,
- "p95Ms": 12.69999999999709,
- "maxMs": 17.29999999998836
- },
- {
- "images": 142,
- "medianeMs": 0.9000000000087311,
- "p95Ms": 11.099999999991269,
- "maxMs": 17.69999999999709
- },
- {
- "images": 136,
- "medianeMs": 1.2999999999956344,
- "p95Ms": 11.400000000008731,
- "maxMs": 17.79999999998836
- }
- ]
- },
- {
- "k": 0.44072824587087456,
- "ralentissementCpu": 4,
- "p95Ms": 21.19999999999709,
- "glissements": [
- {
- "images": 234,
- "medianeMs": 9.000000000007276,
- "p95Ms": 21.10000000000582,
- "maxMs": 89.60000000000582
- },
- {
- "images": 249,
- "medianeMs": 6.099999999991269,
- "p95Ms": 27.60000000000582,
- "maxMs": 89
- },
- {
- "images": 240,
- "medianeMs": 7.400000000001455,
- "p95Ms": 21.19999999999709,
- "maxMs": 88.79999999998836
- }
- ]
- },
- {
- "k": 0.48480107045796206,
- "ralentissementCpu": 1,
- "p95Ms": 12.80000000000291,
- "glissements": [
- {
- "images": 68,
- "medianeMs": 9.39999999999418,
- "p95Ms": 12.80000000000291,
- "maxMs": 17.5
- },
- {
- "images": 137,
- "medianeMs": 0.9000000000087311,
- "p95Ms": 12.900000000008731,
- "maxMs": 17.5
- },
- {
- "images": 145,
- "medianeMs": 0.9000000000087311,
- "p95Ms": 12.39999999999418,
- "maxMs": 19.30000000000291
- }
- ]
- },
- {
- "k": 0.48480107045796206,
- "ralentissementCpu": 4,
- "p95Ms": 20.90000000000873,
- "glissements": [
- {
- "images": 256,
- "medianeMs": 7.150000000001455,
- "p95Ms": 20.90000000000873,
- "maxMs": 89.5
- },
- {
- "images": 262,
- "medianeMs": 7,
- "p95Ms": 21.19999999999709,
- "maxMs": 88.40000000000873
- },
- {
- "images": 261,
- "medianeMs": 7.599999999991269,
- "p95Ms": 20.90000000000873,
- "maxMs": 88.5
- }
- ]
- },
- {
- "k": 0.5332811775037583,
- "ralentissementCpu": 1,
- "p95Ms": 10.69999999999709,
- "glissements": [
- {
- "images": 89,
- "medianeMs": 8.599999999991269,
- "p95Ms": 10.89999999999418,
- "maxMs": 17.5
- },
- {
- "images": 142,
- "medianeMs": 0.9000000000087311,
- "p95Ms": 10.30000000000291,
- "maxMs": 17.70000000001164
- },
- {
- "images": 130,
- "medianeMs": 1.3999999999941792,
- "p95Ms": 10.69999999999709,
- "maxMs": 18.5
- }
- ]
- },
- {
- "k": 0.5332811775037583,
- "ralentissementCpu": 4,
- "p95Ms": 20.89999999999418,
- "glissements": [
- {
- "images": 258,
- "medianeMs": 7.19999999999709,
- "p95Ms": 20.89999999999418,
- "maxMs": 89.90000000000873
- },
- {
- "images": 263,
- "medianeMs": 6.400000000008731,
- "p95Ms": 20.80000000000291,
- "maxMs": 88.90000000000873
- },
- {
- "images": 251,
- "medianeMs": 7.7999999999883585,
- "p95Ms": 20.89999999999418,
- "maxMs": 88.40000000002328
- }
- ]
- },
- {
- "k": 0.5866092952541341,
- "ralentissementCpu": 1,
- "p95Ms": 12,
- "glissements": [
- {
- "images": 79,
- "medianeMs": 8.5,
- "p95Ms": 12,
- "maxMs": 17.39999999999418
- },
- {
- "images": 147,
- "medianeMs": 0.8999999999941792,
- "p95Ms": 10.599999999976717,
- "maxMs": 18
- },
- {
- "images": 142,
- "medianeMs": 0.9500000000116415,
- "p95Ms": 12.099999999976717,
- "maxMs": 17.89999999999418
- }
- ]
- },
- {
- "k": 0.5866092952541341,
- "ralentissementCpu": 4,
- "p95Ms": 20.900000000023283,
- "glissements": [
- {
- "images": 264,
- "medianeMs": 3.6000000000058208,
- "p95Ms": 21,
+ "images": 276,
+ "medianeMs": 2.5500000000029104,
+ "p95Ms": 20.59999999999127,
"maxMs": 89.39999999999418
},
{
- "images": 250,
- "medianeMs": 7.30000000000291,
- "p95Ms": 20.900000000023283,
- "maxMs": 88.69999999998254
+ "images": 309,
+ "medianeMs": 2.8999999999941792,
+ "p95Ms": 20.60000000000582,
+ "maxMs": 88.5
},
{
- "images": 254,
- "medianeMs": 7.399999999994179,
- "p95Ms": 20.89999999999418,
+ "images": 305,
+ "medianeMs": 2.3999999999941792,
+ "p95Ms": 20.60000000000582,
"maxMs": 90.10000000000582
}
]
},
{
- "k": 0.6452702247795475,
+ "k": 0.5781113071553908,
"ralentissementCpu": 1,
- "p95Ms": 11.89999999999418,
+ "p95Ms": 12.5,
"glissements": [
{
- "images": 76,
- "medianeMs": 8.5,
- "p95Ms": 12.800000000017462,
- "maxMs": 17.199999999982538
+ "images": 70,
+ "medianeMs": 9.80000000000291,
+ "p95Ms": 13.10000000000582,
+ "maxMs": 17.60000000000582
},
{
- "images": 146,
- "medianeMs": 1.1499999999941792,
- "p95Ms": 11.89999999999418,
- "maxMs": 18
+ "images": 147,
+ "medianeMs": 0.8000000000174623,
+ "p95Ms": 12.300000000017462,
+ "maxMs": 17.60000000000582
},
{
- "images": 141,
- "medianeMs": 0.8999999999941792,
- "p95Ms": 9.700000000011642,
- "maxMs": 17.20000000001164
- }
- ]
- },
- {
- "k": 0.6452702247795475,
- "ralentissementCpu": 4,
- "p95Ms": 20.89999999999418,
- "glissements": [
- {
- "images": 234,
- "medianeMs": 10.30000000000291,
- "p95Ms": 20.89999999999418,
- "maxMs": 88.80000000001746
- },
- {
- "images": 260,
- "medianeMs": 7.05000000000291,
- "p95Ms": 21,
- "maxMs": 87.5
- },
- {
- "images": 249,
- "medianeMs": 8,
- "p95Ms": 20.89999999999418,
- "maxMs": 88.80000000001746
- }
- ]
- },
- {
- "k": 0.7097972472575024,
- "ralentissementCpu": 1,
- "p95Ms": 11.89999999999418,
- "glissements": [
- {
- "images": 78,
- "medianeMs": 8.700000000011642,
+ "images": 140,
+ "medianeMs": 0.6999999999970896,
"p95Ms": 12.5,
- "maxMs": 17.5
- },
- {
- "images": 146,
- "medianeMs": 1.0500000000029104,
- "p95Ms": 11.89999999999418,
- "maxMs": 17.29999999998836
- },
- {
- "images": 137,
- "medianeMs": 1.2000000000116415,
- "p95Ms": 11,
- "maxMs": 17.39999999999418
+ "maxMs": 18
}
]
},
{
- "k": 0.7097972472575024,
+ "k": 0.5781113071553908,
"ralentissementCpu": 4,
- "p95Ms": 20.800000000017462,
+ "p95Ms": 20.5,
"glissements": [
{
- "images": 229,
- "medianeMs": 9.700000000011642,
- "p95Ms": 21.29999999998836,
- "maxMs": 90.89999999999418
+ "images": 284,
+ "medianeMs": 2.5,
+ "p95Ms": 20.29999999998836,
+ "maxMs": 88.80000000001746
},
{
- "images": 219,
- "medianeMs": 11.10000000000582,
- "p95Ms": 20.79999999998836,
- "maxMs": 89.80000000001746
- },
- {
- "images": 259,
- "medianeMs": 7.300000000017462,
- "p95Ms": 20.800000000017462,
- "maxMs": 89.59999999997672
- }
- ]
- },
- {
- "k": 0.7807769719832527,
- "ralentissementCpu": 1,
- "p95Ms": 9.900000000023283,
- "glissements": [
- {
- "images": 81,
- "medianeMs": 8.60000000000582,
- "p95Ms": 12.10000000000582,
- "maxMs": 17.5
- },
- {
- "images": 142,
- "medianeMs": 1.1000000000058208,
- "p95Ms": 9.900000000023283,
- "maxMs": 17.5
- },
- {
- "images": 141,
- "medianeMs": 0.8999999999941792,
- "p95Ms": 9.700000000011642,
- "maxMs": 18.699999999982538
- }
- ]
- },
- {
- "k": 0.7807769719832527,
- "ralentissementCpu": 4,
- "p95Ms": 20.800000000017462,
- "glissements": [
- {
- "images": 258,
- "medianeMs": 7.599999999991269,
- "p95Ms": 20.800000000017462,
+ "images": 357,
+ "medianeMs": 2.5,
+ "p95Ms": 20.5,
"maxMs": 88.69999999998254
},
{
- "images": 244,
- "medianeMs": 7.849999999991269,
- "p95Ms": 21.10000000000582,
- "maxMs": 89.5
- },
- {
- "images": 262,
- "medianeMs": 7.349999999991269,
- "p95Ms": 20.699999999982538,
- "maxMs": 88.5
+ "images": 315,
+ "medianeMs": 2.599999999976717,
+ "p95Ms": 20.70000000001164,
+ "maxMs": 105.80000000001746
}
]
},
{
- "k": 0.858854669181578,
+ "k": 0.63592243787093,
"ralentissementCpu": 1,
"p95Ms": 10.799999999988358,
"glissements": [
{
- "images": 83,
- "medianeMs": 8.300000000017462,
- "p95Ms": 12.800000000017462,
- "maxMs": 17.5
- },
- {
- "images": 138,
- "medianeMs": 1.1999999999970896,
- "p95Ms": 10.60000000000582,
+ "images": 68,
+ "medianeMs": 9.60000000000582,
+ "p95Ms": 14.89999999999418,
"maxMs": 17.60000000000582
},
{
- "images": 146,
- "medianeMs": 1.0499999999883585,
+ "images": 154,
+ "medianeMs": 1.0500000000029104,
"p95Ms": 10.799999999988358,
- "maxMs": 17.60000000000582
+ "maxMs": 17.20000000001164
+ },
+ {
+ "images": 217,
+ "medianeMs": 1.5,
+ "p95Ms": 8.799999999988358,
+ "maxMs": 19.39999999999418
}
]
},
{
- "k": 0.858854669181578,
+ "k": 0.63592243787093,
"ralentissementCpu": 4,
- "p95Ms": 21.10000000000582,
+ "p95Ms": 20.599999999976717,
"glissements": [
{
- "images": 241,
- "medianeMs": 6.7000000000116415,
- "p95Ms": 21.699999999982538,
- "maxMs": 87.89999999999418
+ "images": 340,
+ "medianeMs": 2.5,
+ "p95Ms": 20.599999999976717,
+ "maxMs": 88.70000000001164
},
{
- "images": 231,
- "medianeMs": 10.10000000000582,
- "p95Ms": 20.800000000017462,
- "maxMs": 88.80000000001746
- },
- {
- "images": 239,
- "medianeMs": 9.199999999982538,
- "p95Ms": 21.10000000000582,
- "maxMs": 88
- }
- ]
- },
- {
- "k": 0.944740136099736,
- "ralentissementCpu": 1,
- "p95Ms": 10.60000000000582,
- "glissements": [
- {
- "images": 78,
- "medianeMs": 8.599999999976717,
- "p95Ms": 13.5,
- "maxMs": 17.5
- },
- {
- "images": 140,
- "medianeMs": 0.8000000000174623,
- "p95Ms": 10.60000000000582,
- "maxMs": 17.5
- },
- {
- "images": 146,
- "medianeMs": 1,
- "p95Ms": 10.099999999976717,
- "maxMs": 17.70000000001164
- }
- ]
- },
- {
- "k": 0.944740136099736,
- "ralentissementCpu": 4,
- "p95Ms": 20.79999999998836,
- "glissements": [
- {
- "images": 269,
- "medianeMs": 5.2000000000116415,
- "p95Ms": 20.79999999998836,
- "maxMs": 88.29999999998836
- },
- {
- "images": 263,
- "medianeMs": 6.900000000023283,
+ "images": 326,
+ "medianeMs": 2.5,
"p95Ms": 20.60000000000582,
- "maxMs": 90
+ "maxMs": 89.29999999998836
},
{
- "images": 230,
- "medianeMs": 10.14999999999418,
- "p95Ms": 21,
- "maxMs": 88.5
+ "images": 352,
+ "medianeMs": 2.5,
+ "p95Ms": 20.5,
+ "maxMs": 88.10000000000582
}
]
},
{
- "k": 1.0392141497097096,
+ "k": 0.699514681658023,
"ralentissementCpu": 1,
- "p95Ms": 11.10000000000582,
+ "p95Ms": 10.200000000011642,
"glissements": [
{
"images": 77,
- "medianeMs": 8.5,
- "p95Ms": 12.299999999988358,
- "maxMs": 17.60000000000582
+ "medianeMs": 8.39999999999418,
+ "p95Ms": 13.5,
+ "maxMs": 17.29999999998836
},
{
- "images": 141,
+ "images": 191,
"medianeMs": 0.7999999999883585,
- "p95Ms": 10.89999999999418,
- "maxMs": 17.70000000001164
+ "p95Ms": 10.200000000011642,
+ "maxMs": 17.5
},
{
- "images": 146,
- "medianeMs": 0.8500000000058208,
- "p95Ms": 11.10000000000582,
- "maxMs": 17.20000000001164
+ "images": 179,
+ "medianeMs": 0.7999999999883585,
+ "p95Ms": 10,
+ "maxMs": 17.29999999998836
}
]
},
{
- "k": 1.0392141497097096,
+ "k": 0.699514681658023,
"ralentissementCpu": 4,
- "p95Ms": 20.79999999998836,
+ "p95Ms": 20.39999999999418,
"glissements": [
{
- "images": 263,
- "medianeMs": 7.2000000000116415,
- "p95Ms": 21.20000000001164,
- "maxMs": 105.60000000000582
+ "images": 344,
+ "medianeMs": 2.5499999999883585,
+ "p95Ms": 20.39999999999418,
+ "maxMs": 88.20000000001164
},
{
- "images": 223,
- "medianeMs": 10.700000000011642,
+ "images": 341,
+ "medianeMs": 2.5,
+ "p95Ms": 20.5,
+ "maxMs": 88.39999999999418
+ },
+ {
+ "images": 306,
+ "medianeMs": 2.5,
+ "p95Ms": 20.39999999999418,
+ "maxMs": 88.60000000000582
+ }
+ ]
+ },
+ {
+ "k": 0.7694661498238253,
+ "ralentissementCpu": 1,
+ "p95Ms": 10.199999999982538,
+ "glissements": [
+ {
+ "images": 71,
+ "medianeMs": 8.89999999999418,
+ "p95Ms": 13.400000000023283,
+ "maxMs": 16.89999999999418
+ },
+ {
+ "images": 206,
+ "medianeMs": 0.7000000000116415,
+ "p95Ms": 9.699999999982538,
+ "maxMs": 17.60000000000582
+ },
+ {
+ "images": 197,
+ "medianeMs": 0.6000000000058208,
+ "p95Ms": 10.199999999982538,
+ "maxMs": 18.20000000001164
+ }
+ ]
+ },
+ {
+ "k": 0.7694661498238253,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.300000000017462,
+ "glissements": [
+ {
+ "images": 338,
+ "medianeMs": 2.3999999999941792,
+ "p95Ms": 20.5,
+ "maxMs": 89.39999999999418
+ },
+ {
+ "images": 342,
+ "medianeMs": 2.3000000000029104,
+ "p95Ms": 20.300000000017462,
+ "maxMs": 88.89999999999418
+ },
+ {
+ "images": 325,
+ "medianeMs": 2.3000000000174623,
+ "p95Ms": 20.20000000001164,
+ "maxMs": 88.20000000001164
+ }
+ ]
+ },
+ {
+ "k": 0.846412764806208,
+ "ralentissementCpu": 1,
+ "p95Ms": 10.799999999988358,
+ "glissements": [
+ {
+ "images": 77,
+ "medianeMs": 8.39999999999418,
+ "p95Ms": 12.39999999999418,
+ "maxMs": 17.60000000000582
+ },
+ {
+ "images": 185,
+ "medianeMs": 0.7999999999883585,
+ "p95Ms": 10.799999999988358,
+ "maxMs": 18.5
+ },
+ {
+ "images": 181,
+ "medianeMs": 0.7999999999883585,
+ "p95Ms": 10,
+ "maxMs": 17.60000000000582
+ }
+ ]
+ },
+ {
+ "k": 0.846412764806208,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.5,
+ "glissements": [
+ {
+ "images": 292,
+ "medianeMs": 2.6000000000058208,
"p95Ms": 20.60000000000582,
- "maxMs": 88.69999999998254
+ "maxMs": 89.10000000000582
},
{
- "images": 225,
- "medianeMs": 10,
- "p95Ms": 20.79999999998836,
- "maxMs": 96.60000000000582
+ "images": 359,
+ "medianeMs": 2.3999999999941792,
+ "p95Ms": 20.5,
+ "maxMs": 88.60000000000582
+ },
+ {
+ "images": 327,
+ "medianeMs": 2.2999999999883585,
+ "p95Ms": 20.39999999999418,
+ "maxMs": 89.5
+ }
+ ]
+ },
+ {
+ "k": 0.9310540412868289,
+ "ralentissementCpu": 1,
+ "p95Ms": 10,
+ "glissements": [
+ {
+ "images": 72,
+ "medianeMs": 8.55000000000291,
+ "p95Ms": 12.199999999982538,
+ "maxMs": 17.599999999976717
+ },
+ {
+ "images": 187,
+ "medianeMs": 0.7000000000116415,
+ "p95Ms": 10,
+ "maxMs": 17.39999999999418
+ },
+ {
+ "images": 196,
+ "medianeMs": 0.5,
+ "p95Ms": 9.199999999982538,
+ "maxMs": 18.099999999976717
+ }
+ ]
+ },
+ {
+ "k": 0.9310540412868289,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.39999999999418,
+ "glissements": [
+ {
+ "images": 341,
+ "medianeMs": 2.5,
+ "p95Ms": 20.60000000000582,
+ "maxMs": 90.29999999998836
+ },
+ {
+ "images": 330,
+ "medianeMs": 2.5,
+ "p95Ms": 20.39999999999418,
+ "maxMs": 88.5
+ },
+ {
+ "images": 309,
+ "medianeMs": 2.5,
+ "p95Ms": 20.39999999999418,
+ "maxMs": 88.39999999999418
+ }
+ ]
+ },
+ {
+ "k": 1.0241594454155118,
+ "ralentissementCpu": 1,
+ "p95Ms": 10.10000000000582,
+ "glissements": [
+ {
+ "images": 72,
+ "medianeMs": 8.900000000008731,
+ "p95Ms": 13,
+ "maxMs": 17.5
+ },
+ {
+ "images": 206,
+ "medianeMs": 0.6999999999825377,
+ "p95Ms": 10.10000000000582,
+ "maxMs": 18.10000000000582
+ },
+ {
+ "images": 187,
+ "medianeMs": 0.7000000000116415,
+ "p95Ms": 9.699999999982538,
+ "maxMs": 17.89999999999418
+ }
+ ]
+ },
+ {
+ "k": 1.0241594454155118,
+ "ralentissementCpu": 4,
+ "p95Ms": 20.5,
+ "glissements": [
+ {
+ "images": 317,
+ "medianeMs": 2.2999999999883585,
+ "p95Ms": 20.5,
+ "maxMs": 87.60000000000582
+ },
+ {
+ "images": 322,
+ "medianeMs": 2.3999999999941792,
+ "p95Ms": 20.60000000000582,
+ "maxMs": 89
+ },
+ {
+ "images": 317,
+ "medianeMs": 2.400000000023283,
+ "p95Ms": 20.5,
+ "maxMs": 86.5
}
]
}
@@ -1403,81 +1507,81 @@
"N": 260,
"T": 33,
"R": 4,
- "msPlafonds": 0.107,
- "msDiagnostic": 0.95
+ "msPlafonds": 0.131,
+ "msDiagnostic": 1.33
},
{
"cle": "grande-sans-exception",
"N": 260,
"T": 33,
"R": 4,
- "msPlafonds": 0.042,
- "msDiagnostic": 0.402
+ "msPlafonds": 0.046,
+ "msDiagnostic": 0.479
},
{
"cle": "pessimiste",
"N": 260,
"T": 33,
"R": 10,
- "msPlafonds": 11.212,
- "msDiagnostic": 13.65
+ "msPlafonds": 11.862,
+ "msDiagnostic": 12.34
}
],
"parallele": [
{
"coeurs": 1,
"dureesMs": [
- 407.8,
- 444.9,
- 420
+ 430.1,
+ 447.4,
+ 433.2
],
- "medianeMs": 420,
+ "medianeMs": 433.2,
"ralentissement": 1,
"modele": 1
},
{
"coeurs": 2,
"dureesMs": [
- 458.7,
- 472.7,
- 468.6
+ 477.4,
+ 484.9,
+ 476.1
],
- "medianeMs": 468.6,
- "ralentissement": 1.116,
- "modele": 1.119
+ "medianeMs": 477.4,
+ "ralentissement": 1.102,
+ "modele": 1.132
},
{
"coeurs": 4,
"dureesMs": [
- 578.1,
- 580.4,
- 559.4
+ 591.1,
+ 592.2,
+ 576.8
],
- "medianeMs": 578.1,
- "ralentissement": 1.376,
- "modele": 1.358
+ "medianeMs": 591.1,
+ "ralentissement": 1.364,
+ "modele": 1.396
},
{
"coeurs": 8,
"dureesMs": [
- 780.2,
- 785.2,
- 791.9
+ 803.9,
+ 829.3,
+ 807.6
],
- "medianeMs": 785.2,
- "ralentissement": 1.87,
- "modele": 1.836
+ "medianeMs": 807.6,
+ "ralentissement": 1.864,
+ "modele": 1.924
},
{
"coeurs": 16,
"dureesMs": [
- 1186.9,
- 1169.7,
- 1172
+ 1290.6,
+ 1277.1,
+ 1302.7
],
- "medianeMs": 1172,
- "ralentissement": 2.79,
- "modele": 2.79
+ "medianeMs": 1290.6,
+ "ralentissement": 2.979,
+ "modele": 2.979
}
]
}
diff --git a/scripts/banc/seuils.js b/scripts/banc/seuils.js
index 9e0bbad..a90bcc1 100644
--- a/scripts/banc/seuils.js
+++ b/scripts/banc/seuils.js
@@ -3,10 +3,12 @@
// Les seuils du banc de mesure (§ 19.10, § 19.4, § 6.2), tirés de mesures
// déjà prises : le plus grand entier qui tient un prédicat, par dichotomie ;
-// le plus petit zoom au-delà duquel une courbe de temps par image tient son
-// critère ; la tolérance de la chaîne témoin. Module pur, sans import ni
-// horloge : il se charge sous node, où ses épreuves le jouent, comme dans la
-// page du banc, où les *.banc.js lui passent leurs mesures.
+// le nom de référence d'une largeur de troncature, fait du glyphe le plus
+// large (§ 14.1) ; le plus petit zoom au-delà duquel une courbe de temps par
+// image tient son critère ; la tolérance de la chaîne témoin. Module pur,
+// sans import ni horloge : il se charge sous node, où ses épreuves le
+// jouent, comme dans la page du banc, où les *.banc.js lui passent leurs
+// mesures.
/** Le temps par image qu'un glissement de la grande démonstration doit tenir,
* au p95, sur la machine de référence (Q13 b) : le choix de l'utilisateur.
@@ -85,6 +87,54 @@ export async function plusGrandTenant(predicat, min, max) {
const estPositifFini = (valeur) => typeof valeur === 'number' && Number.isFinite(valeur) && valeur > 0;
const estPositifOuNul = (valeur) => typeof valeur === 'number' && Number.isFinite(valeur) && valeur >= 0;
+// La largeur d'un texte par le mesureur reçu, qui doit être finie > 0 : un
+// texte qui n'est pas rendu mesure 0, et ne mesure alors rien.
+function largeurDe(mesurer, texte) {
+ const largeur = mesurer(texte);
+ if (!estPositifFini(largeur)) throw new RangeError(`nomDeReference : largeur finie > 0 attendue pour « ${texte} », reçu ${String(largeur)}`);
+ return largeur;
+}
+
+/**
+ * Le nom de référence d'une largeur de troncature (§ 14.1) : le glyphe le
+ * plus large de l'alphabet, répété longueur fois. Chaque glyphe se mesure
+ * une fois, dans l'ordre de l'alphabet, parcouru par points de code ; à
+ * égalité, le premier l'emporte. Le nom composé se mesure ensuite entier,
+ * et non comme longueur fois son glyphe : la mesure est celle du texte
+ * rendu. valeur est sa largeur arrondie au pixel supérieur, celle que le
+ * banc propose au registre.
+ *
+ * @param {string} alphabet au moins un glyphe
+ * @param {number} longueur entier ≥ 1, le nombre de glyphes du nom
+ * @param {(texte: string) => number} mesurer largeur rendue d'un texte, px
+ * @returns {{glyphe: string, largeurGlyphe: number, nom: string, largeur: number, valeur: number}}
+ * @throws {TypeError} un alphabet qui n'est pas un texte, un mesureur qui
+ * n'est pas une fonction
+ * @throws {RangeError} un alphabet vide, une longueur hors contrat, avant
+ * toute mesure ; une largeur mesurée qui n'est pas finie > 0, en nommant
+ * son texte
+ */
+export function nomDeReference(alphabet, longueur, mesurer) {
+ if (typeof alphabet !== 'string') throw new TypeError('nomDeReference : un alphabet en texte est attendu');
+ if (typeof mesurer !== 'function') throw new TypeError('nomDeReference : un mesureur est attendu');
+ if (alphabet.length === 0) throw new RangeError('nomDeReference : alphabet vide');
+ if (!Number.isSafeInteger(longueur) || longueur < 1) {
+ throw new RangeError(`nomDeReference : longueur entière ≥ 1 attendue, reçu ${String(longueur)}`);
+ }
+ let glyphe = null;
+ let largeurGlyphe = 0;
+ for (const candidat of alphabet) {
+ const largeur = largeurDe(mesurer, candidat);
+ if (largeur > largeurGlyphe) {
+ glyphe = candidat;
+ largeurGlyphe = largeur;
+ }
+ }
+ const nom = glyphe.repeat(longueur);
+ const largeur = largeurDe(mesurer, nom);
+ return { glyphe, largeurGlyphe, nom, largeur, valeur: Math.ceil(largeur) };
+}
+
/**
* Le plus petit k de la courbe au-delà duquel tout k de la courbe tient le
* critère : son p95 vaut au plus critereMs. Les points se rangent par k
diff --git a/scripts/documentation/manifeste.js b/scripts/documentation/manifeste.js
index 0ce3059..69dcd90 100644
--- a/scripts/documentation/manifeste.js
+++ b/scripts/documentation/manifeste.js
@@ -38,12 +38,21 @@ const capture = (fichier, etape, configuration, source = 'navigateur') => Object
// des étiquettes, des objectifs et de l'ordre des priorités : 04a, 05a, 05b,
// 10a (A22). « configuration » nomme ce que la capture exige : le répertoire
// neuf, le fichier d'import d'exemples/, l'identifiant de démonstration du
-// catalogue, ou l'événement que le parcours construit puis retient. L'étape
-// place une capture dans le guide, la configuration dit sur quoi elle se
-// prend : les deux 07a, à l'étape 4, se photographient sur la grande
-// démonstration que le parcours charge pour 10 ; 05b, sur l'exemple des
-// objectifs importé dans l'événement construit ; 10a, à l'étape 9 où l'ordre
-// des priorités se règle à côté de la génération (§ 2.1).
+// catalogue, l'événement que le parcours construit puis retient, ou, préfixée
+// de « construite- », une configuration qu'un scénario court du parcours
+// construit. L'étape place une capture dans le guide, la configuration dit
+// sur quoi elle se prend : les deux 07a, à l'étape 4, se photographient sur
+// la grande démonstration que le parcours charge pour 10 ; 05b, sur
+// l'exemple des objectifs importé dans l'événement construit ; 10a, à
+// l'étape 9 où l'ordre des priorités se règle à côté de la génération
+// (§ 2.1).
+//
+// Les captures de la page de qualité, 12 à 16 et leurs voisines en « a » à
+// « g » (B27), illustrent l'étape 10 et se prennent à la fin du parcours,
+// chacune sur sa charge : la grande démonstration, la petite, sa variante
+// « conflit inévitable », l'événement construit, ou l'une des six
+// configurations construites — les cinq cas limites 12b à 12e et 12g, et
+// les paires de 14 et 14a.
export const CAPTURES = Object.freeze([
capture('01-premier-ecran', '1', 'repertoire-neuf'),
capture('01b-passer-en-ecriture', '1b', 'repertoire-neuf'),
@@ -65,6 +74,23 @@ export const CAPTURES = Object.freeze([
capture('10-diagnostic', '8', 'grande'),
capture('10a-ordre-priorites', '9', 'evenement-construit'),
capture('11-propositions', '9', 'evenement-construit'),
+ capture('12-qualite-profil', '10', 'grande'),
+ capture('12a-qualite-sans-placement', '10', 'petite-conflit'),
+ capture('12b-qualite-une-table', '10', 'construite-une-table'),
+ capture('12c-qualite-un-tour', '10', 'construite-un-tour'),
+ capture('12d-qualite-une-appartenance', '10', 'construite-une-appartenance'),
+ capture('12e-qualite-sans-collision', '10', 'construite-sans-collision'),
+ capture('12f-qualite-reserve', '10', 'petite-conflit'),
+ capture('12g-qualite-plafond-nul', '10', 'construite-plafond-nul'),
+ capture('13-qualite-collisions', '10', 'petite-conflit'),
+ capture('13a-qualite-tables', '10', 'petite-conflit'),
+ capture('14-qualite-paires', '10', 'construite-paires'),
+ capture('14a-fiche-rencontres', '10', 'construite-paires'),
+ capture('15-pas-de-matrice', '10', 'grande'),
+ capture('15a-qualite-objectifs', '10', 'evenement-construit'),
+ capture('15b-qualite-animateurs', '10', 'grande'),
+ capture('15c-qualite-performance', '10', 'grande'),
+ capture('16-minimum-atteint', '10', 'petite'),
capture('19-ajustement', '11', 'evenement-retenu'),
capture('20-mode-lecture', '11', 'evenement-retenu'),
capture('22-plan-brouillon', '12', 'evenement-retenu'),
@@ -75,14 +101,10 @@ export const CAPTURES = Object.freeze([
const reportee = (fichier, etape) => Object.freeze({ fichier, etape, raison: 'iteration5' });
-// Les captures des écrans que l'itération 5 livre (Q8 a) : déclarées à leur
+// Les captures des écrans que le logiciel n'offre pas encore — la
+// comparaison de deux propositions et la vue d'historique : déclarées à leur
// étape, sans image ; le contrôle d'ordre les compte comme présentes.
export const REPORTEES = Object.freeze([
- reportee('12-qualite-profil', '10'),
- reportee('13-qualite-collisions', '10'),
- reportee('14-qualite-paires', '10'),
- reportee('15-pas-de-matrice', '10'),
- reportee('16-minimum-atteint', '10'),
reportee('17-comparaison-manque', '10'),
reportee('18-comparaison-escalier', '10'),
reportee('21-historique', '11'),
diff --git a/scripts/documentation/manifeste.test.js b/scripts/documentation/manifeste.test.js
index 036f022..7161152 100644
--- a/scripts/documentation/manifeste.test.js
+++ b/scripts/documentation/manifeste.test.js
@@ -79,7 +79,7 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => {
assert.ok(Object.isFrozen(ETAPES));
});
- test('CAPTURES égale la table du contrat : vingt-six entrées, leur étape et leur source', () => {
+ test('CAPTURES égale la table du contrat : quarante-trois entrées, leur étape et leur source', () => {
const table = CAPTURES.map((c) => [c.fichier, c.etape, c.source]);
assert.deepEqual(table, [
['01-premier-ecran', '1', 'navigateur'],
@@ -102,6 +102,23 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => {
['10-diagnostic', '8', 'navigateur'],
['10a-ordre-priorites', '9', 'navigateur'],
['11-propositions', '9', 'navigateur'],
+ ['12-qualite-profil', '10', 'navigateur'],
+ ['12a-qualite-sans-placement', '10', 'navigateur'],
+ ['12b-qualite-une-table', '10', 'navigateur'],
+ ['12c-qualite-un-tour', '10', 'navigateur'],
+ ['12d-qualite-une-appartenance', '10', 'navigateur'],
+ ['12e-qualite-sans-collision', '10', 'navigateur'],
+ ['12f-qualite-reserve', '10', 'navigateur'],
+ ['12g-qualite-plafond-nul', '10', 'navigateur'],
+ ['13-qualite-collisions', '10', 'navigateur'],
+ ['13a-qualite-tables', '10', 'navigateur'],
+ ['14-qualite-paires', '10', 'navigateur'],
+ ['14a-fiche-rencontres', '10', 'navigateur'],
+ ['15-pas-de-matrice', '10', 'navigateur'],
+ ['15a-qualite-objectifs', '10', 'navigateur'],
+ ['15b-qualite-animateurs', '10', 'navigateur'],
+ ['15c-qualite-performance', '10', 'navigateur'],
+ ['16-minimum-atteint', '10', 'navigateur'],
['19-ajustement', '11', 'navigateur'],
['20-mode-lecture', '11', 'navigateur'],
['22-plan-brouillon', '12', 'navigateur'],
@@ -134,24 +151,44 @@ describe('manifeste : la liste déclarée (§ 19.3, Q8 a)', () => {
// le parcours charge pour 10 (§ 19.3).
assert.equal(configuration.get('07a-cibles-sieges'), 'grande');
assert.equal(configuration.get('07a-cibles-tables'), 'grande');
+ // La page de qualité (B27) : chaque capture sur sa charge, la
+ // démonstration du catalogue qu'elle charge, l'événement que le parcours
+ // construit, ou une configuration qu'un scénario court construit.
+ const qualite = [
+ ['12-qualite-profil', 'grande'],
+ ['12a-qualite-sans-placement', 'petite-conflit'],
+ ['12b-qualite-une-table', 'construite-une-table'],
+ ['12c-qualite-un-tour', 'construite-un-tour'],
+ ['12d-qualite-une-appartenance', 'construite-une-appartenance'],
+ ['12e-qualite-sans-collision', 'construite-sans-collision'],
+ ['12f-qualite-reserve', 'petite-conflit'],
+ ['12g-qualite-plafond-nul', 'construite-plafond-nul'],
+ ['13-qualite-collisions', 'petite-conflit'],
+ ['13a-qualite-tables', 'petite-conflit'],
+ ['14-qualite-paires', 'construite-paires'],
+ ['14a-fiche-rencontres', 'construite-paires'],
+ ['15-pas-de-matrice', 'grande'],
+ ['15a-qualite-objectifs', 'evenement-construit'],
+ ['15b-qualite-animateurs', 'grande'],
+ ['15c-qualite-performance', 'grande'],
+ ['16-minimum-atteint', 'petite'],
+ ];
+ assert.deepEqual(qualite.map(([fichier]) => [fichier, configuration.get(fichier)]), qualite);
});
- test('REPORTEES : 12 à 18 à l’étape 10, 21 à l’étape 11, raison « iteration5 », rien d’autre', () => {
+ test('REPORTEES : 17 et 18 à l’étape 10, 21 à l’étape 11, raison « iteration5 », rien d’autre', () => {
assert.deepEqual(
REPORTEES.map((r) => [r.fichier, r.etape, r.raison]),
[
- ['12-qualite-profil', '10', 'iteration5'],
- ['13-qualite-collisions', '10', 'iteration5'],
- ['14-qualite-paires', '10', 'iteration5'],
- ['15-pas-de-matrice', '10', 'iteration5'],
- ['16-minimum-atteint', '10', 'iteration5'],
['17-comparaison-manque', '10', 'iteration5'],
['18-comparaison-escalier', '10', 'iteration5'],
['21-historique', '11', 'iteration5'],
],
);
- const rangs = REPORTEES.map((r) => Number(r.fichier.slice(0, 2)));
- for (const rang of rangs) assert.ok((rang >= 12 && rang <= 18) || rang === 21, String(rang));
+ // La page de qualité se photographie : aucune de ses captures n'est
+ // reportée, et aucune reportée n'est déclarée photographiée.
+ const declarees = new Set(CAPTURES.map((c) => c.fichier));
+ for (const reportee of REPORTEES) assert.ok(!declarees.has(reportee.fichier), reportee.fichier);
assert.ok(Object.isFrozen(REPORTEES));
for (const reportee of REPORTEES) assert.ok(Object.isFrozen(reportee), reportee.fichier);
});
@@ -351,8 +388,11 @@ describe('manifeste : l’ordre contre les étapes du § 2.1 (§ 19.3)', () => {
]);
});
- test('les reportées couvrent l’étape 10 ; sans elles, elle manque', () => {
- assert.deepEqual(verifierOrdre(manifesteDeclare({ reportees: [] })), [
+ test('les captures de la page de qualité couvrent l’étape 10 sans les reportées ; sans les unes ni les autres, elle manque', () => {
+ const etape10 = CAPTURES.filter((c) => c.etape === '10').map((c) => c.fichier);
+ assert.equal(etape10.length, 17);
+ assert.deepEqual(verifierOrdre(manifesteDeclare({ reportees: [] })), []);
+ assert.deepEqual(verifierOrdre(manifesteDeclare({ reportees: [], sans: etape10 })), [
{ chemin: CHEMIN_MANIFESTE, faute: 'étape 10 : aucune capture ni reportée' },
]);
});
diff --git a/src/interface/marques.js b/src/interface/marques.js
index b657ac5..de344d8 100644
--- a/src/interface/marques.js
+++ b/src/interface/marques.js
@@ -19,11 +19,12 @@
// fonds. Un signe ne porte jamais seul une information : un libellé
// l'accompagne toujours.
//
-// La famille « graphique » (§ 12.7, § 13.3) a ses listes à part :
-// MARQUES_GRAPHIQUE, TEXTES_GRAPHIQUE et FONDS_GRAPHIQUE, de même forme,
-// validées par calcul comme les autres. Elles restent hors de MARQUES et de
-// TEXTES tant qu'aucun écran ne les rend : la garde transversale exige que
-// chaque entrée de MARQUES soit rendue sur un écran.
+// La famille « graphique » (§ 12.7, § 13.3) a ses listes :
+// MARQUES_GRAPHIQUE et TEXTES_GRAPHIQUE, de même forme, versées à la fin de
+// MARQUES et de TEXTES — les écrans de la page de qualité les rendent, et la
+// garde transversale exige que chaque entrée de MARQUES soit rendue sur un
+// écran ; FONDS_GRAPHIQUE, la grille et le niveau 0, qui ne portent aucune
+// information et restent hors de toute mesure.
const c = (nom) => `--couleur-${nom}`;
@@ -122,93 +123,6 @@ export const SIGNES = Object.freeze([
marque('actionPrincipale', 'action-fond', SURFACES),
]);
-/** Les marques porteuses d'information (§ 14.5) : { nom, jeton, fonds, seuil: 3 } — nom, la
- * désignation data-marque ; jeton, celui qui la peint ; fonds, chaque jeton sur lequel elle
- * se peint, chaque remplissage d'une chaise pour une marque qui passe sur une chaise. */
-export const MARQUES = Object.freeze([
- // Sur la chaise (§ 7.6) : cadenas posés sur ses remplissages ; l'anneau
- // l'entoure, sur le sol et le bord du plateau qu'elle touche.
- marque('cadenasFerme', 'marque', REMPLISSAGES_CHAISE),
- marque('cadenasOuvert', 'marque', REMPLISSAGES_CHAISE),
- marque('anneau', 'marque', ['sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
- marque('hachure', 'hachure', ['chaise-fond']),
- marque('remplissagePlein', 'chaise-pleine', ['sol', 'table-fond']),
- // Le conflit (§ 7.5) : contour épaissi sur le sol, commun aux trois
- // règles et peint de l'encre forte du plan ; une trame par règle violée
- // sur le plateau, chacune de sa teinte, ses traits détachés par un halo
- // du fond du plateau ; pastille chiffrée près de la table.
- marque('contourConflit', 'contour-fort', ['sol', 'table-fond']),
- ...SORTES_CONFLIT.map(([, trame, jeton]) => marque(trame, jeton, ['table-fond'])),
- marque('pastille', 'pastille-fond', ['sol', 'table-fond']),
- marque('poignee', 'poignee', ['sol']),
- marque('gel', 'gel', ['sol', 'table-fond']),
- // La désignation se pose sur la page, le sol, le plateau et une chaise
- // vide, pourvue ou à pourvoir : chacun de ses remplissages est un fond.
- marque('miseEnEvidence', 'mise-en-evidence', ['page-fond', 'sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
- // La sélection marque aussi une colonne du tableau des propositions, sur la
- // carte, son fond sourd et la ligne du retenu.
- marque('selection', 'selection', ['page-fond', 'carte-fond', 'carte-fond-sourd', 'etat-retenu-fond', 'sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
- marque('focus', 'focus', ['page-fond', 'bandeau-fond', 'carte-fond', 'carte-fond-sourd', 'etat-retenu-fond', 'action-teinte', 'sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
- // Le mobilier sur le sol : le trait de la table, celui de la chaise, qui
- // touche aussi le plateau.
- marque('contourTable', 'table-trait', ['sol']),
- marque('contourChaise', 'chaise-trait', ['sol', 'table-fond']),
- // L'échelle graphique (§ 7.7) vit dans la surface du plan, sur le sol ou la
- // page ; le fantôme d'un glissement passe sur le sol, les tables et les
- // chaises.
- marque('echelle', 'echelle', ['sol', 'page-fond']),
- marque('fantome', 'fantome', ['sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
- // Le signe du chargement d'une valeur de la liste des événements (§ 8.1) :
- // un arc tracé de l'encre secondaire, dans une cellule du tableau, sur la
- // carte.
- marque('chargement', 'page-texte-secondaire', ['carte-fond']),
- // Le filigrane BROUILLON (§ 11.7) : un texte au trait, par-dessus le
- // contenu d'une feuille imprimée, mesuré sur le papier, clair dans les
- // deux thèmes.
- marque('filigrane', 'filigrane', ['papier']),
- // La croix cerclée d'un retrait, seul contenu de son bouton : sur la
- // carte, et sur son fond sourd, celui du survol.
- marque('retrait', 'retrait', ['carte-fond', 'carte-fond-sourd']),
-]);
-
-// Les fonds teintés d'une pastille : ceux de ses teintes, puis ceux des
-// messages, qu'un statut reprend, et la teinte de l'action.
-const FONDS_ETIQUETTE = [
- ...TEINTES_DE_PASTILLE.map(([, teinte]) => `${teinte}-fond`),
- 'avis-fond',
- 'refus-fond',
- 'information-fond',
- 'action-teinte',
-];
-
-/** Les textes et leurs fonds, même forme, seuil 4,5 : page, secondaire,
- * bandeau, refus, avis, listes du plan sur le sol, pastille du plan ; puis
- * l'encre de la page sur la carte, l'encre secondaire sur la carte, le
- * texte d'une étiquette — l'encre de la page sur chaque fond teinté de
- * pastille (§ 12.7) —, celui de la bande de mode, la version et la
- * provenance du bandeau, le thème retenu du bandeau, aux couleurs du
- * bandeau inversées, le texte de l'action principale, un lien ou un texte
- * mis en valeur de l'encre de l'action, et l'information. Le refus, l'avis
- * et l'information gardent l'encre de leur message, sur son fond. */
-export const TEXTES = Object.freeze([
- texte('page', 'page-texte', ['page-fond']),
- texte('secondaire', 'page-texte-secondaire', ['page-fond']),
- texte('bandeau', 'bandeau-texte', ['bandeau-fond']),
- texte('refus', 'refus', ['page-fond', 'refus-fond', 'carte-fond']),
- texte('avis', 'avis', ['page-fond', 'avis-fond', 'carte-fond']),
- texte('listes', 'liste-texte', ['sol']),
- texte('pastille', 'pastille-texte', ['pastille-fond']),
- texte('carte', 'page-texte', ['carte-fond', 'carte-fond-sourd']),
- texte('secondaireCarte', 'page-texte-secondaire', ['carte-fond', 'carte-fond-sourd']),
- texte('etiquette', 'page-texte', FONDS_ETIQUETTE),
- texte('bandeMode', 'page-texte', ['mode-ecriture-fond', 'mode-lecture-fond', 'mode-bloque-fond']),
- texte('bandeauSecondaire', 'bandeau-texte-secondaire', ['bandeau-fond']),
- texte('bandeauChoisi', 'bandeau-fond', ['bandeau-texte']),
- texte('action', 'action-texte', ['action-fond']),
- texte('lien', 'action-encre', ['page-fond', 'carte-fond', 'carte-fond-sourd', 'action-teinte']),
- texte('information', 'information', ['information-fond', 'page-fond', 'carte-fond']),
-]);
-
// --- La famille « graphique » (§ 12.7, § 13.3, D30, D43) ---------------------
const graphique = (nom) => `graphique-${nom}`;
@@ -288,3 +202,96 @@ export const FONDS_GRAPHIQUE = Object.freeze(
['graphiqueNiveau0', 'niveau-0'],
].map(([nom, jeton]) => Object.freeze({ nom, jeton: c(graphique(jeton)) })),
);
+
+/** Les marques porteuses d'information (§ 14.5) : { nom, jeton, fonds, seuil: 3 } — nom, la
+ * désignation data-marque ; jeton, celui qui la peint ; fonds, chaque jeton sur lequel elle
+ * se peint, chaque remplissage d'une chaise pour une marque qui passe sur une chaise. Celles
+ * du plan et des écrans, puis celles des graphiques (MARQUES_GRAPHIQUE), les mêmes entrées. */
+export const MARQUES = Object.freeze([
+ // Sur la chaise (§ 7.6) : cadenas posés sur ses remplissages ; l'anneau
+ // l'entoure, sur le sol et le bord du plateau qu'elle touche.
+ marque('cadenasFerme', 'marque', REMPLISSAGES_CHAISE),
+ marque('cadenasOuvert', 'marque', REMPLISSAGES_CHAISE),
+ marque('anneau', 'marque', ['sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
+ marque('hachure', 'hachure', ['chaise-fond']),
+ marque('remplissagePlein', 'chaise-pleine', ['sol', 'table-fond']),
+ // Le conflit (§ 7.5) : contour épaissi sur le sol, commun aux trois
+ // règles et peint de l'encre forte du plan ; une trame par règle violée
+ // sur le plateau, chacune de sa teinte, ses traits détachés par un halo
+ // du fond du plateau ; pastille chiffrée près de la table.
+ marque('contourConflit', 'contour-fort', ['sol', 'table-fond']),
+ ...SORTES_CONFLIT.map(([, trame, jeton]) => marque(trame, jeton, ['table-fond'])),
+ marque('pastille', 'pastille-fond', ['sol', 'table-fond']),
+ marque('poignee', 'poignee', ['sol']),
+ marque('gel', 'gel', ['sol', 'table-fond']),
+ // La désignation se pose sur la page, le sol, le plateau et une chaise
+ // vide, pourvue ou à pourvoir : chacun de ses remplissages est un fond.
+ marque('miseEnEvidence', 'mise-en-evidence', ['page-fond', 'sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
+ // La sélection marque aussi une colonne du tableau des propositions, sur la
+ // carte, son fond sourd et la ligne du retenu.
+ marque('selection', 'selection', ['page-fond', 'carte-fond', 'carte-fond-sourd', 'etat-retenu-fond', 'sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
+ marque('focus', 'focus', ['page-fond', 'bandeau-fond', 'carte-fond', 'carte-fond-sourd', 'etat-retenu-fond', 'action-teinte', 'sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
+ // Le mobilier sur le sol : le trait de la table, celui de la chaise, qui
+ // touche aussi le plateau.
+ marque('contourTable', 'table-trait', ['sol']),
+ marque('contourChaise', 'chaise-trait', ['sol', 'table-fond']),
+ // L'échelle graphique (§ 7.7) vit dans la surface du plan, sur le sol ou la
+ // page ; le fantôme d'un glissement passe sur le sol, les tables et les
+ // chaises.
+ marque('echelle', 'echelle', ['sol', 'page-fond']),
+ marque('fantome', 'fantome', ['sol', 'table-fond', ...REMPLISSAGES_CHAISE]),
+ // Le signe du chargement d'une valeur de la liste des événements (§ 8.1) :
+ // un arc tracé de l'encre secondaire, dans une cellule du tableau, sur la
+ // carte.
+ marque('chargement', 'page-texte-secondaire', ['carte-fond']),
+ // Le filigrane BROUILLON (§ 11.7) : un texte au trait, par-dessus le
+ // contenu d'une feuille imprimée, mesuré sur le papier, clair dans les
+ // deux thèmes.
+ marque('filigrane', 'filigrane', ['papier']),
+ // La croix cerclée d'un retrait, seul contenu de son bouton : sur la
+ // carte, et sur son fond sourd, celui du survol.
+ marque('retrait', 'retrait', ['carte-fond', 'carte-fond-sourd']),
+ // Les graphiques de la page de qualité (§ 12.7).
+ ...MARQUES_GRAPHIQUE,
+]);
+
+// Les fonds teintés d'une pastille : ceux de ses teintes, puis ceux des
+// messages, qu'un statut reprend, et la teinte de l'action.
+const FONDS_ETIQUETTE = [
+ ...TEINTES_DE_PASTILLE.map(([, teinte]) => `${teinte}-fond`),
+ 'avis-fond',
+ 'refus-fond',
+ 'information-fond',
+ 'action-teinte',
+];
+
+/** Les textes et leurs fonds, même forme, seuil 4,5 : page, secondaire,
+ * bandeau, refus, avis, listes du plan sur le sol, pastille du plan ; puis
+ * l'encre de la page sur la carte, l'encre secondaire sur la carte, le
+ * texte d'une étiquette — l'encre de la page sur chaque fond teinté de
+ * pastille (§ 12.7) —, celui de la bande de mode, la version et la
+ * provenance du bandeau, le thème retenu du bandeau, aux couleurs du
+ * bandeau inversées, le texte de l'action principale, un lien ou un texte
+ * mis en valeur de l'encre de l'action, et l'information. Le refus, l'avis
+ * et l'information gardent l'encre de leur message, sur son fond. Puis les
+ * deux encres des comptes d'une case de graphique (TEXTES_GRAPHIQUE), les
+ * mêmes entrées. */
+export const TEXTES = Object.freeze([
+ texte('page', 'page-texte', ['page-fond']),
+ texte('secondaire', 'page-texte-secondaire', ['page-fond']),
+ texte('bandeau', 'bandeau-texte', ['bandeau-fond']),
+ texte('refus', 'refus', ['page-fond', 'refus-fond', 'carte-fond']),
+ texte('avis', 'avis', ['page-fond', 'avis-fond', 'carte-fond']),
+ texte('listes', 'liste-texte', ['sol']),
+ texte('pastille', 'pastille-texte', ['pastille-fond']),
+ texte('carte', 'page-texte', ['carte-fond', 'carte-fond-sourd']),
+ texte('secondaireCarte', 'page-texte-secondaire', ['carte-fond', 'carte-fond-sourd']),
+ texte('etiquette', 'page-texte', FONDS_ETIQUETTE),
+ texte('bandeMode', 'page-texte', ['mode-ecriture-fond', 'mode-lecture-fond', 'mode-bloque-fond']),
+ texte('bandeauSecondaire', 'bandeau-texte-secondaire', ['bandeau-fond']),
+ texte('bandeauChoisi', 'bandeau-fond', ['bandeau-texte']),
+ texte('action', 'action-texte', ['action-fond']),
+ texte('lien', 'action-encre', ['page-fond', 'carte-fond', 'carte-fond-sourd', 'action-teinte']),
+ texte('information', 'information', ['information-fond', 'page-fond', 'carte-fond']),
+ ...TEXTES_GRAPHIQUE,
+]);
diff --git a/src/interface/marques.test.js b/src/interface/marques.test.js
index 038d89c..d9c4952 100644
--- a/src/interface/marques.test.js
+++ b/src/interface/marques.test.js
@@ -5,8 +5,9 @@
// § 7.5, § 7.6, § 7.7), et la palette de jetons.css validée par calcul sur
// lui (§ 12.7) : chaque entrée tient son seuil sur chacun de ses fonds, dans
// les deux thèmes, en couleurs d'origine puis sous les trois dichromaties.
-// La famille « graphique » (§ 12.7, § 13.3) a ses listes à part, hors de
-// MARQUES et de TEXTES, éprouvées de même.
+// La famille « graphique » (§ 12.7, § 13.3) a ses listes, versées à la fin
+// de MARQUES et de TEXTES, que les écrans de la qualité rendent ; ses fonds
+// restent hors de toute mesure.
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { describe, test } from '../../test/lanceur.js';
@@ -64,9 +65,10 @@ const FONDS_REQUIS = {
const parNom = (registre, nom) => registre.find((e) => e.nom === nom);
describe('registre des marques', () => {
- test('les vingt-deux marques du contrat, noms uniques, seuil 3, au moins un fond chacune', () => {
- assert.equal(MARQUES.length, NOMS_MARQUES.length);
- assert.deepEqual(MARQUES.map((m) => m.nom), NOMS_MARQUES);
+ test('les trente-quatre marques du contrat — les vingt-deux du plan et des écrans, puis les douze de la famille « graphique » —, noms uniques, seuil 3, au moins un fond chacune', () => {
+ const noms = [...NOMS_MARQUES, ...NOMS_MARQUES_GRAPHIQUE];
+ assert.equal(MARQUES.length, noms.length);
+ assert.deepEqual(MARQUES.map((m) => m.nom), noms);
assert.equal(new Set(MARQUES.map((m) => m.nom)).size, MARQUES.length);
for (const marque of MARQUES) {
assert.deepEqual(Object.keys(marque).sort(), ['fonds', 'jeton', 'nom', 'seuil'], marque.nom);
@@ -176,10 +178,11 @@ describe('les trois sortes de conflit (§ 7.5, § 12.7)', () => {
});
describe('registre des textes', () => {
- test('page, secondaire, bandeau, refus, avis, listes du plan, pastille, puis les textes des cartes, des étiquettes, de la bande de mode, du bandeau, de l’action et des messages ; seuil 4,5', () => {
+ test('page, secondaire, bandeau, refus, avis, listes du plan, pastille, puis les textes des cartes, des étiquettes, de la bande de mode, du bandeau, de l’action et des messages, puis les deux encres des cases de graphique ; seuil 4,5', () => {
assert.deepEqual(TEXTES.map((t) => t.nom), [
'page', 'secondaire', 'bandeau', 'refus', 'avis', 'listes', 'pastille',
'carte', 'secondaireCarte', 'etiquette', 'bandeMode', 'bandeauSecondaire', 'bandeauChoisi', 'action', 'lien', 'information',
+ 'graphiqueEncreFoncee', 'graphiqueEncreClaire',
]);
assert.ok(TEXTES.every((t) => t.seuil === 4.5 && t.fonds.length > 0));
assert.equal(new Set(TEXTES.map((t) => t.nom)).size, TEXTES.length);
@@ -345,7 +348,7 @@ const CARTE = '--couleur-carte-fond';
const PAGE = '--couleur-page-fond';
const SIMULATIONS_ET_ORIGINE = ['origine', 'protanopie', 'deuteranopie', 'tritanopie'];
-describe('la famille « graphique » : ses listes, hors de MARQUES et de TEXTES', () => {
+describe('la famille « graphique » : ses listes, versées dans MARQUES et TEXTES, ses fonds hors de toute mesure', () => {
test('les seize jetons du contrat existent dans les deux thèmes, et aucun autre jeton ne porte le préfixe de la famille', () => {
for (const theme of THEMES) {
const famille = [...lireJetons(JETONS, theme).keys()].filter((n) => n.startsWith('--couleur-graphique-'));
@@ -369,13 +372,24 @@ describe('la famille « graphique » : ses listes, hors de MARQUES et de TEXTES'
}
});
- test('les listes de la famille restent hors de MARQUES et de TEXTES : aucun nom ni aucun jeton partagé, MARQUES garde ses vingt-deux entrées', () => {
- assert.equal(MARQUES.length, NOMS_MARQUES.length);
+ test('MARQUES_GRAPHIQUE et TEXTES_GRAPHIQUE sont versées à la fin de MARQUES et de TEXTES, les mêmes entrées dans le même ordre ; aucune autre entrée des registres ne porte un jeton de la famille', () => {
+ assert.deepEqual(MARQUES.slice(NOMS_MARQUES.length), [...MARQUES_GRAPHIQUE]);
+ assert.ok(MARQUES.slice(NOMS_MARQUES.length).every((e, i) => e === MARQUES_GRAPHIQUE[i]));
+ assert.deepEqual(TEXTES.slice(-TEXTES_GRAPHIQUE.length), [...TEXTES_GRAPHIQUE]);
+ assert.ok(TEXTES.slice(-TEXTES_GRAPHIQUE.length).every((e, i) => e === TEXTES_GRAPHIQUE[i]));
const nomsGraphique = [...MARQUES_GRAPHIQUE, ...TEXTES_GRAPHIQUE, ...FONDS_GRAPHIQUE].map((e) => e.nom);
assert.equal(new Set(nomsGraphique).size, nomsGraphique.length);
+ const famille = new Set([...MARQUES_GRAPHIQUE, ...TEXTES_GRAPHIQUE]);
+ assert.deepEqual([...MARQUES, ...TEXTES, ...SIGNES].filter((e) => e.jeton.startsWith('--couleur-graphique-') && !famille.has(e)).map((e) => e.nom), []);
+ assert.deepEqual(SIGNES.filter((e) => nomsGraphique.includes(e.nom)).map((e) => e.nom), []);
+ });
+
+ test('les fonds de la famille — la grille et le niveau 0 — restent hors de MARQUES, de TEXTES et de SIGNES : ni leur nom, ni leur jeton comme jeton d’une entrée', () => {
const registres = [...MARQUES, ...TEXTES, ...SIGNES];
- assert.deepEqual(registres.filter((e) => nomsGraphique.includes(e.nom)).map((e) => e.nom), []);
- assert.deepEqual(registres.filter((e) => e.jeton.startsWith('--couleur-graphique-')).map((e) => e.nom), []);
+ for (const { nom, jeton } of FONDS_GRAPHIQUE) {
+ assert.deepEqual(registres.filter((e) => e.nom === nom).map((e) => e.nom), [], nom);
+ assert.deepEqual(registres.filter((e) => e.jeton === jeton).map((e) => e.nom), [], jeton);
+ }
});
test('l’échelle : quatre niveaux, 0 à 3, chacun son jeton et l’encre de son compte ; deux encres au plus ; figée', () => {
diff --git a/src/interface/parcours.navigateur.test.js b/src/interface/parcours.navigateur.test.js
index 2bc35a9..917d60a 100644
--- a/src/interface/parcours.navigateur.test.js
+++ b/src/interface/parcours.navigateur.test.js
@@ -24,11 +24,20 @@
// et reglages_locaux.json (§ 11.6), puis l'ordre de lecture du § 2.1 sur
// l'événement retenu, les fenêtres — aucune pendant un geste non
// destructeur, une qui nomme ce qui part pour chaque geste qui détruit —,
-// enfin chaque famille de geste modifiant en lecture puis sur un plan
-// bloqué. Les valeurs attendues viennent du moteur, du CSV et du stockage,
-// sollicités une seconde fois (§ 19.1), et le texte de la même traduction
-// que celle de l'application. Aucun délai fixe : chaque étape attend un
-// état du document (§ 19.3).
+// puis chaque famille de geste modifiant en lecture puis sur un plan
+// bloqué, enfin la page de qualité de l'étape 10 (B27). Ses captures se
+// prennent toutes après les familles, chacune sur sa charge, pour ne rien
+// changer de ce que 10a, 11, 19, 20 et les familles reçoivent : 12, 15, 15b
+// et 15c sur la grande démonstration rouverte et générée sous la graine
+// écrite, au compte réduit de la grande, la durée de 15c pilotée par le
+// relais de l'exécuteur ; 12a, 13, 13a puis 12f sur la variante « conflit
+// inévitable » ; 12b à 12e et 12g, chacune sur une configuration qu'un
+// scénario court construit et génère ; 14 et 14a sur celle des paires ;
+// 15a sur l'événement construit, rouvert, débloqué et généré de nouveau ;
+// 16 sur la petite démonstration. Les valeurs attendues viennent du
+// moteur, du CSV et du stockage, sollicités une seconde fois (§ 19.1), et
+// le texte de la même traduction que celle de l'application. Aucun délai
+// fixe : chaque étape attend un état du document (§ 19.3).
//
// Une épreuve qui porte une capture finit, ses conditions affirmées, par
// photographier (test/navigateur/captures.js), ou, pour une page du PDF de
@@ -60,8 +69,10 @@ import { apercevoir } from '../csv/apercu.js';
import { decoder } from '../csv/encodage.js';
import { decouper } from '../csv/lecture.js';
import { CATALOGUE } from '../demo/catalogue.js';
+import { constante } from '../geometrie/constantes.js';
import { regimeCibles } from '../geometrie/designation.js';
import { echelleGraphique } from '../geometrie/echelle.js';
+import { niveau } from '../geometrie/graphique.js';
import { diametre, geometrieTable } from '../geometrie/tables.js';
import { vueDepuisTransform } from '../geometrie/vue.js';
import { classer } from '../moteur/classement.js';
@@ -98,6 +109,7 @@ import { visible } from '../../test/navigateur/rendu.js';
import { ENCODAGES, SEPARATEURS } from './import/modele.js';
import { TABLES_INTERFACE } from './libelles.js';
import { LARGEUR_ECHELLE_PX } from './plan/modele.js';
+import { colonneDeValeur } from './propositions/modele.js';
const { t } = creerTraduction([...TABLES_APPLICATION, ...TABLES_INTERFACE]);
@@ -234,6 +246,36 @@ const epreuvesEnEchec = [];
// proposition retenue, la charge d'avant l'ajustement de 19.
const memoire = {};
+// Le pas dont le relais avance l'horloge pilotée à chaque avancement du
+// moteur, pendant la génération de la grande démonstration de la page de
+// qualité : la durée que 15c affiche vaut le nombre d'avancements multiplié
+// par ce pas, la même à chaque exécution (§ 19.3, § 19.4).
+const PAS_HORLOGE_GENERATION_MS = 250;
+
+// Le relais d'épreuve : armé, il compte chaque avancement que le moteur
+// publie et avance d'autant l'horloge pilotée du montage, dont le
+// contrôleur de génération lit la durée du calcul ; désarmé, il est inerte.
+const relais = { arme: false, avancements: 0 };
+
+// L'exécuteur enveloppé du relais : les mêmes cœurs annoncés, le même
+// calcul ; l'abonnement aux avancements se pose avant que le moteur ne
+// tourne, dans la tâche que lancer rend, et seulement sous le relais armé.
+function relayer(executeur) {
+ return {
+ coeursDisponibles: executeur.coeursDisponibles,
+ lancer(configuration, reglages, options) {
+ const execution = executeur.lancer(configuration, reglages, options);
+ if (relais.arme) {
+ execution.surAvancement(() => {
+ relais.avancements += 1;
+ m.horloge.avancer(PAS_HORLOGE_GENERATION_MS);
+ });
+ }
+ return execution;
+ },
+ };
+}
+
// En écriture, le dossier d'attente part vide : le dépôt d'un passage
// interrompu ne se publie jamais avec celui-ci.
beforeAll(async () => {
@@ -241,7 +283,7 @@ beforeAll(async () => {
retirerFeuille = poserFeuille();
await commands.requetesHorsBoucle();
if (modeFourni() === 'ecrire') await commands.viderAttente();
- m = await monterApp({ provenance: 'documentation', executeur: creerExecuteurDirect({ coeursDisponibles: 4 }) });
+ m = await monterApp({ provenance: 'documentation', executeur: relayer(creerExecuteurDirect({ coeursDisponibles: 4 })) });
});
// La capture d'un échec prend pour nom de fichier le titre de son groupe et
@@ -461,6 +503,24 @@ async function cadrerDansLaSurface(elements) {
await images(2);
}
+// Fait défiler le premier ancêtre défilant de l'élément jusqu'à poser son
+// haut ('haut') ou son bas ('bas') à 8 px du bord correspondant de la
+// hauteur visible de cette surface : l'image montre l'élément à ce bord, et
+// ce qui le suit ou le précède tant que la surface le laisse voir.
+async function cadrerAuBord(element, bord) {
+ let porteur = element.parentElement;
+ while (porteur !== null && !(porteur.scrollHeight > porteur.clientHeight && /auto|scroll/.test(getComputedStyle(porteur).overflowY))) {
+ porteur = porteur.parentElement;
+ }
+ expect(porteur, 'une surface qui défile').not.toBeNull();
+ const cadre = porteur.getBoundingClientRect();
+ const visibleHaut = Math.max(cadre.top + porteur.clientTop, 0);
+ const visibleBas = Math.min(cadre.top + porteur.clientTop + porteur.clientHeight, innerHeight);
+ const boite = element.getBoundingClientRect();
+ porteur.scrollTop += Math.round(bord === 'haut' ? boite.top - visibleHaut - 8 : boite.bottom - visibleBas + 8);
+ await images(2);
+}
+
// Fait défiler en largeur le premier ancêtre des éléments qui défile ainsi,
// jusqu'à centrer la réunion de leurs boîtes, qui doit tenir dans sa largeur
// visible : l'image les montre ensemble. Un tel ancêtre est exigé.
@@ -1602,6 +1662,8 @@ describe('le parcours par gestes, depuis un répertoire neuf', { timeout: DUREE
await attendre('le premier écran', () => dans('[data-ecran="accueil"] [data-demonstration="grande"]'));
await cliquer('[data-demonstration="grande"]');
await attendre('la grande démonstration ouverte', () => dans('[data-ecran="evenement"]') && etat().evenement !== null && etat().evenement.base !== memoire.base);
+ // La page de qualité la rouvre à la fin du parcours (12, 15, 15b, 15c).
+ memoire.baseGrande = base();
await ouvrirSection('diagnostic');
const diagnostic = diagnostiquer(configurationDepuisCharge(charge()));
expect(diagnostic.retoursImposes).toBe(99);
@@ -2763,6 +2825,876 @@ describe('lecture et bloqué : tout geste modifiant refusé, rien d’écrit', {
});
});
+// --- La page de qualité (§ 12, § 19.3, B27) ---------------------------------------------
+
+// Le compte d'arrêt de la génération de la grande démonstration : quatre
+// points de relevé avant le dernier, et dix avancements du moteur, que le
+// relais compte.
+const ARRET_GRANDE = 2_000;
+
+// La cadence des avancements que le moteur publie, en mouvements évalués :
+// le relais en compte un à chaque multiple, proposition par proposition.
+const CADENCE_AVANCEMENTS = 1_000;
+
+// Des personnes et des appartenances inventées (contrainte 48), pour les
+// configurations que la page de qualité photographie et qu'aucun catalogue
+// ne porte : chaque configuration en prend les premières.
+const PERSONNES_INVENTEES = Object.freeze([
+ ['Ombrelle', 'Iris'],
+ ['Pervenche', 'Théo'],
+ ['Lacasse', 'Ondine'],
+ ['Tourteau', 'Basile'],
+ ['Quenouille', 'Maëlle'],
+ ['Varech', 'Sidonie'],
+ ['Aubépin', 'Lucien'],
+ ['Bruyère', 'Aglaé'],
+ ['Cormier', 'Félix'],
+ ['Dorine', 'Ysé'],
+ ['Escourgeon', 'Paulin'],
+ ['Fenouil', 'Rosalie'],
+]);
+const APPARTENANCES_INVENTEES = Object.freeze([
+ 'Coopérative Aubier',
+ 'Atelier Ressac',
+ 'Chantier Grève',
+ 'Fanfare Ormeau',
+ 'Rucher Salicorne',
+ 'Cercle Varangue',
+ 'Jardin Pétrel',
+ 'Forge Brisant',
+ 'Collectif Ajonc',
+]);
+
+// Les configurations construites (§ 19.3, B27) : le nom de l'événement,
+// le nombre de personnes, l'appartenance de la personne de rang donné, les
+// places par défaut, le nombre de tables, les places surchargées par rang
+// de table, le nombre de tours, et le nombre de personnes réservées pour la
+// soirée, dans l'ordre de leurs rangs, aux premiers sièges de la table 1.
+const CONSTRUITES = Object.freeze({
+ uneTable: { nom: 'Une seule table', personnes: 6, appartenance: (rang) => APPARTENANCES_INVENTEES[rang % 3], sieges: 6, tables: 1, tours: 3 },
+ unTour: { nom: 'Un seul tour', personnes: 12, appartenance: (rang) => APPARTENANCES_INVENTEES[rang % 3], sieges: 4, tables: 3, tours: 1 },
+ uneAppartenance: { nom: 'Une seule appartenance', personnes: 12, appartenance: () => APPARTENANCES_INVENTEES[0], sieges: 4, tables: 3, tours: 3 },
+ sansCollision: { nom: 'Sans collision', personnes: 9, appartenance: (rang) => APPARTENANCES_INVENTEES[rang], sieges: 3, tables: 3, tours: 2 },
+ plafondNul: {
+ nom: 'Plafond nul',
+ personnes: 5,
+ appartenance: (rang) => APPARTENANCES_INVENTEES[rang % 2],
+ sieges: 4,
+ tables: 2,
+ surcharges: [[1, 2]],
+ tours: 2,
+ reservees: 4,
+ },
+ paires: { nom: 'Paires répétées', personnes: 12, appartenance: (rang) => APPARTENANCES_INVENTEES[rang % 3], sieges: 3, tables: 4, tours: 6 },
+});
+
+// Le CSV des participants d'une configuration construite, en UTF-8.
+function csvConstruite({ personnes, appartenance }) {
+ const lignes = PERSONNES_INVENTEES.slice(0, personnes).map(([nom, prenom], rang) => `${nom};${prenom};${appartenance(rang)}`);
+ return new TextEncoder().encode(`nom;prenom;appartenance\r\n${lignes.join('\r\n')}\r\n`);
+}
+
+// Revient à la liste des événements, quand un événement est ouvert.
+async function versLaListe() {
+ if (dans('[data-ecran="accueil"]') === null) await cliquer('[data-bandeau] [data-commande="liste"]');
+ await attendre('le premier écran', () => dans('[data-ecran="accueil"] [data-dossier-travail]'));
+}
+
+// Rouvre l'événement de base donnée depuis la liste.
+async function rouvrir(baseVisee) {
+ await versLaListe();
+ await cliquer(`[data-evenement="${baseVisee}"] [data-commande="ouvrir"]`);
+ await attendre('l’événement rouvert', () => dans('[data-ecran="evenement"]') && etat().evenement?.base === baseVisee);
+}
+
+// Charge la démonstration du catalogue de clé donnée, depuis la liste : un
+// événement neuf, sous une base qu'aucun événement de la liste ne porte.
+async function chargerDemonstration(cle) {
+ await versLaListe();
+ const connues = new Set(tous('[data-evenement]').map((element) => element.dataset.evenement));
+ await cliquer(`[data-demonstration="${cle}"]`);
+ await attendre(`la démonstration ${cle}`, () => dans('[data-ecran="evenement"]') && etat().evenement !== null && !connues.has(etat().evenement.base));
+}
+
+async function passerEnEcriture() {
+ if (etat().mode === 'ecriture') return;
+ await cliquer('[data-place-fixe] [data-commande="modifier"]');
+ await attendre('l’écriture', () => etat().mode === 'ecriture');
+}
+
+// Génère sous la graine écrite, au compte d'arrêt donné, ou au compte de
+// l'événement quand arret est null : une entrée, la question d'une
+// génération longue confirmée si elle vient.
+async function generer(arret = null) {
+ await ouvrirSection('generation');
+ await taper(dans('[data-section="generation"] input[data-champ="graine"]'), String(GRAINE));
+ if (arret !== null && charge().reglages.generation.arret !== arret) {
+ const r = revision();
+ await saisir(dans('[data-section="generation"] input[data-champ="generation.arret"]'), String(arret));
+ await uneEntree(r, 'le compte d’arrêt');
+ }
+ const r = revision();
+ await cliquer('[data-section="generation"] [data-commande="generer"]');
+ await attendre('la génération, ou sa question', () => revision() > r || dans('[data-question="longue"]'));
+ if (revision() === r) await cliquer('[data-commande="confirmerGeneration"]');
+ await uneEntree(r, 'générer');
+ expect(charge().propositions.length).toBeGreaterThan(0);
+}
+
+// La page de qualité de la première proposition du classement, ouverte par
+// la commande « Qualité » de sa ligne ; rend son identifiant.
+async function qualiteDeLaPremiere() {
+ await ouvrirSection('propositions');
+ const premiere = await attendre('le tableau classé', () => dans('[data-section="propositions"] [data-classement] tr[data-proposition]'));
+ const id = Number(premiere.dataset.proposition);
+ await appuyer(premiere.querySelector('[data-commande="qualite"]'), 'la commande « Qualité »');
+ await attendre('la page de qualité de la proposition', () => dans('[data-section="qualite"] [data-vue-qualite="performance"]') && m.ui.etat().proposition === id);
+ await images(3);
+ return id;
+}
+
+// Construit la configuration par les gestes de l'opérateur — créer
+// l'événement, l'écriture, importer ses participants, ses places par
+// défaut, ses tables, ses surcharges, ses tours, ses réservations pour la
+// soirée —, génère au compte réduit, puis ouvre la page de qualité de la
+// première proposition du classement ; rend son identifiant.
+async function construire(configuration) {
+ const { nom, personnes, sieges, tables, surcharges = [], tours, reservees = 0 } = configuration;
+ await versLaListe();
+ await taper(dans('[data-ecran="accueil"] input[data-champ="nom"]'), nom);
+ await cliquer('[data-ecran="accueil"] [data-commande="creer"]');
+ await attendre(`l’événement « ${nom} »`, () => dans('[data-ecran="evenement"]') && etat().evenement?.nom === nom);
+ await passerEnEcriture();
+
+ await ouvrirSection('import');
+ await ouvrirApercu('participants_qualite.csv', csvConstruite(configuration));
+ let r = revision();
+ await cliquer('[data-apercu] [data-commande="importer"]');
+ await attendre('le rapport', () => dans('[data-rapport]'));
+ await uneEntree(r, 'importer');
+ expect(charge().participants).toHaveLength(personnes);
+
+ await ouvrirSection('tables');
+ if (charge().evenement.siegesParDefaut !== sieges) {
+ r = revision();
+ await saisir(dans('[data-section="tables"] input[data-champ="siegesParDefaut"]'), String(sieges));
+ await cliquer('[data-enonce="defaut"] [data-commande="appliquer"]');
+ await uneEntree(r, 'les places par défaut');
+ }
+ for (let rang = 0; rang < tables; rang += 1) {
+ r = revision();
+ await cliquer('[data-section="tables"] [data-commande="creerTableRonde"]');
+ await uneEntree(r, 'créer une table');
+ }
+ for (const [rang, places] of surcharges) {
+ const { id } = charge().tables[rang];
+ r = revision();
+ await saisir(dans(`[data-section="tables"] [data-table="${id}"] input[data-champ="sieges-${id}"]`), String(places));
+ await uneEntree(r, 'surcharger');
+ }
+ if (charge().evenement.tours !== tours) {
+ r = revision();
+ await saisir(dans('[data-section="tables"] input[data-champ="tours"]'), String(tours));
+ await uneEntree(r, 'les tours');
+ }
+ expect(charge().tables.map(({ sieges: places }) => places ?? sieges)).toEqual(
+ Array.from({ length: tables }, (_, rang) => surcharges.find(([rangSurcharge]) => rangSurcharge === rang)?.[1] ?? sieges),
+ );
+ expect(charge().evenement.tours).toBe(tours);
+
+ if (reservees > 0) {
+ await ouvrirPlan();
+ await regimeSieges();
+ const [t1] = charge().tables.map(({ id }) => id);
+ for (let rang = 0; rang < reservees; rang += 1) {
+ const participant = charge().participants[rang].id;
+ r = revision();
+ await choisir('[data-reserve]', participant);
+ await cliquerPointeur(chaise(t1, rang + 1));
+ const portee = await attendre('le choix de la portée', () => dans('[data-panneau="place"] select[data-champ="portee"]'));
+ portee.value = 'tous';
+ portee.dispatchEvent(new Event('change', { bubbles: true }));
+ flushSync();
+ await appuyer(actionPlace('reserver'), 'réserver pour la soirée');
+ await uneEntree(r, 'réserver pour la soirée');
+ expect(charge().reservations.at(-1)).toMatchObject({ participant, table: t1, siege: rang + 1, portee: 'tous' });
+ }
+ await oublierChoix();
+ }
+
+ await generer(ARRET);
+ return qualiteDeLaPremiere();
+}
+
+// Les lectures de la page de qualité.
+const vueQualite = (nom) => dans(`[data-section="qualite"] [data-vue-qualite="${nom}"]`);
+const graphique = (nom) => dans(`[data-section="qualite"] svg[data-graphique="${nom}"]`);
+const phrasesQualite = () => tous('[data-section="qualite"] [data-phrase-qualite]').map((phrase) => phrase.dataset.phraseQualite);
+const motif = (trace) => getComputedStyle(trace).strokeDasharray;
+
+// Les axes verticaux d'un graphique : ses traits d'axe d'abscisse constante.
+const axesVerticaux = (svg) =>
+ [...svg.querySelectorAll('line[data-marque="graphiqueAxe"]')].filter((axe) => axe.getAttribute('x1') === axe.getAttribute('x2')).length;
+
+// Les graphiques de la page qui ne portent aucune marque de donnée — ni
+// série, ni segment, ni case, ni point de relevé — : des axes vides, que
+// la page ne dessine jamais (§ 12.6).
+const axesVides = () =>
+ tous('[data-section="qualite"] svg[data-graphique]')
+ .filter((svg) => svg.querySelector('path[data-serie], rect[data-segment], [data-case], circle[data-point-releve]') === null)
+ .map((svg) => svg.dataset.graphique);
+
+// Chaque [data-pourcentage] du porteur est suivi, son voisin immédiat, d'un
+// [data-compte-pire] non vide (contrainte 44) ; rend leur nombre.
+function exigerComptes(porteur) {
+ const pourcentages = [...porteur.querySelectorAll('[data-pourcentage]')];
+ for (const valeur of pourcentages) {
+ const compte = valeur.nextElementSibling;
+ expect(compte?.hasAttribute('data-compte-pire'), texteDe(valeur)).toBe(true);
+ expect(texteDe(compte)).not.toBe('');
+ }
+ return pourcentages.length;
+}
+
+// Le jumeau d'une vue, ouvert par sa commande, lu, puis refermé, sa
+// commande quittée par le focus — l'image ne porte pas son contour : par
+// tableau, chaque ligne, une Map colonne → texte de sa cellule.
+async function lireJumeau(vue) {
+ await appuyer(vue.querySelector('[data-commande="ouvrirJumeau"]'), 'ouvrir le jumeau');
+ await attendre('le jumeau', () => vue.querySelector('[data-jumeau="0"]'));
+ const tableaux = [...vue.querySelectorAll('[data-jumeau]')].map((table) =>
+ [...table.querySelectorAll('tbody tr')].map((tr) => new Map([...tr.querySelectorAll('[data-colonne]')].map((cellule) => [cellule.dataset.colonne, texteDe(cellule)]))),
+ );
+ await appuyer(vue.querySelector('[data-commande="fermerJumeau"]'), 'fermer le jumeau');
+ await attendre('le jumeau fermé', () => vue.querySelector('[data-jumeau]') === null);
+ document.activeElement?.blur();
+ await images(2);
+ return tableaux;
+}
+
+// Pointe le rang 1 d'un graphique en escalier, au bord gauche de sa surface
+// de pointage, puis rend l'infobulle ouverte : une Map libellé → texte.
+async function pointerLeRang1(svg) {
+ const surface = svg.querySelector(':scope > rect[pointer-events="all"]');
+ const boite = surface.getBoundingClientRect();
+ await pointer('bouger', boite.left + 2, boite.top + boite.height / 2);
+ flushSync();
+ await images(2);
+ const bulle = tous('[data-section="qualite"] [role="tooltip"]').find((element) => !element.hidden);
+ expect(bulle, 'l’infobulle du rang pointé').toBeDefined();
+ const cellules = new Map([...bulle.querySelectorAll('.cellule')].map((cellule) => [texteDe(cellule.querySelector('dt')), cellule.querySelector('dd')]));
+ return { bulle, cellule: (cle) => texteDe(cellules.get(plat(t(cle)))) };
+}
+
+// Écarte le pointeur des graphiques : en haut à gauche de la fenêtre.
+async function ecarterLePointeur() {
+ await pointer('bouger', 1, 1);
+ flushSync();
+ await images(2);
+}
+
+// Le compte et le plafond réalisé minimaux de la proposition id, mesurés par
+// le moteur sur son plan, sous la configuration de l'événement ouvert.
+function minimumDe(id) {
+ const instance = normaliser(configurationDepuisCharge(charge()));
+ const proposition = charge().propositions.find((p) => p.id === id);
+ return mesurer(instance, indexerPlan(instance, planDepuisFichier(proposition))).aggRencontres.tous.min;
+}
+
+// La ligne de la proposition id au tableau des propositions : une Map
+// colonne → texte de sa cellule.
+async function ligneAuTableau(id) {
+ await ouvrirSection('propositions');
+ const ligne = await attendre('la ligne de la proposition', () => dans(`[data-section="propositions"] tr[data-proposition="${id}"]`));
+ return new Map([...ligne.querySelectorAll('td[data-colonne]')].map((cellule) => [cellule.dataset.colonne, texteDe(cellule)]));
+}
+
+// La page de qualité d'une proposition déjà au plan, rouverte par la
+// navigation.
+async function revenirALaQualite(id) {
+ await ouvrirSection('qualite');
+ await attendre('la page de qualité', () => vueQualite('performance') && m.ui.etat().proposition === id);
+ await images(3);
+}
+
+// La page mesure la proposition id que la séance montre, avant toute
+// retenue : la ligne de source porte le libellé que la barre de vue du plan
+// donne à une proposition montrée sans placement retenu, et non celui du
+// retenu.
+function exigerLaPropositionMontree(id) {
+ expect(m.ui.etat().proposition, 'la proposition montrée').toBe(id);
+ expect(charge().retenu).toBeNull();
+ const placement = texteDe(dans('[data-section="qualite"] [data-source-qualite] .placement'));
+ expect(placement, 'la ligne de source').toBe(plat(t('plan.source.propositionReservations', { proposition: id })));
+}
+
+// La configuration construite des paires est celle de l'événement ouvert :
+// 12 personnes, 4 tables de 3 places, 6 tours.
+function exigerLaConstruiteDesPaires() {
+ const { nom, personnes, tables, sieges, tours } = CONSTRUITES.paires;
+ expect(charge().evenement.nom).toBe(nom);
+ expect(charge().participants).toHaveLength(personnes);
+ expect(charge().tables.map(({ sieges: places }) => places ?? charge().evenement.siegesParDefaut)).toEqual(Array.from({ length: tables }, () => sieges));
+ expect(charge().evenement.tours).toBe(tours);
+}
+
+describe('la page de qualité (§ 12, § 19.3, B27)', { timeout: DUREE }, () => {
+ // Le plan bloqué que les familles laissent n'est plus touché : chaque
+ // capture se prend sur sa charge, celle que le parcours charge ou
+ // construit ici, et rien ne revient aux captures précédentes.
+ test('12 la grande générée, durée pilotée : le profil en deux graphiques, un axe vertical chacun, le même rang 1', async () => {
+ await rouvrir(memoire.baseGrande);
+ await passerEnEcriture();
+ // Le relais est resté inerte pour chaque génération qui précède.
+ expect(relais.avancements, 'aucun avancement compté avant la grande').toBe(0);
+ relais.arme = true;
+ const debut = m.horloge.instant();
+ try {
+ await generer(ARRET_GRANDE);
+ } finally {
+ relais.arme = false;
+ }
+ memoire.grande = { avancements: relais.avancements, dureeMs: m.horloge.instant() - debut };
+ expect(relais.avancements).toBeGreaterThan(0);
+ const id = await qualiteDeLaPremiere();
+ memoire.grande.id = id;
+
+ // La page a dessiné plutôt que d'opposer son refus (§ 12.3).
+ const profil = await attendre('les deux graphiques du profil', () => graphique('profilPourcentages') && vueQualite('profil'));
+ expect(phrasesQualite()).not.toContain('refusDessin');
+ const comptes = graphique('profilComptes');
+ const pourcentages = graphique('profilPourcentages');
+ for (const svg of [comptes, pourcentages]) expect(axesVerticaux(svg), svg.dataset.graphique).toBe(1);
+ // Deux séries en comptes, une en pourcentages ; le plafond, la borne de
+ // diversité et la règle à 100 % en repères, aucun du motif d'une série.
+ expect(comptes.querySelectorAll('path[data-serie]')).toHaveLength(2);
+ expect(pourcentages.querySelectorAll('path[data-serie]')).toHaveLength(1);
+ for (const [svg, repere] of [[comptes, 'plafond'], [comptes, 'borne'], [pourcentages, 'cent']]) {
+ expect(svg.querySelector(`path[data-repere="${repere}"]`), repere).not.toBeNull();
+ }
+ const motifsDe = (attribut) => [comptes, pourcentages].flatMap((svg) => [...svg.querySelectorAll(`path[${attribut}]`)].map(motif));
+ const series = motifsDe('data-serie');
+ for (const repere of motifsDe('data-repere')) expect(series).not.toContain(repere);
+ expect(texteDe(comptes.querySelector('text[data-repere="borne"]'))).toBe(plat(t('qualite.profil.repere.borne')));
+ expect(exigerComptes(profil)).toBeGreaterThan(0);
+
+ // Le même rang 1 dans les deux graphiques : le pire cas, le minimum que
+ // le moteur mesure sur le plan de la proposition. Les graphiques se
+ // cadrent d'abord : le pointeur atteint ce que la fenêtre montre. Les
+ // deux ensemble sont plus hauts que la surface : le premier se pose en
+ // haut, et le second se montre jusqu'à sa règle à 100 %, ses
+ // pourcentages au-dessous de la règle, son axe des rangs hors de l'image.
+ await cadrerAuBord(comptes, 'haut');
+ const { cellule } = await pointerLeRang1(comptes);
+ expect(comptes.querySelector('[data-rang]')?.getAttribute('data-rang')).toBe('1');
+ expect(pourcentages.querySelector('[data-rang]')?.getAttribute('data-rang')).toBe('1');
+ expect(cellule('qualite.profil.colonne.rencontres')).toBe(String(minimumDe(id)));
+ await ecarterLePointeur();
+ expect(tous('[data-section="qualite"] [role="tooltip"]').every((bulle) => bulle.hidden)).toBe(true);
+ await photographier(m, '12-qualite-profil', {
+ condition: [
+ '[data-vue-qualite="profil"] svg[data-graphique="profilComptes"]',
+ '[data-vue-qualite="profil"] svg[data-graphique="profilPourcentages"] path[data-repere="cent"]',
+ '[data-vue-qualite="profil"] svg[data-graphique="profilPourcentages"] text[data-repere="cent"]',
+ ],
+ graine: GRAINE,
+ });
+ });
+
+ test('15 la grande, 260 participants : la phrase du seuil au lieu de la matrice', async () => {
+ const vue = vueQualite('paires');
+ const seuil = constante('SEUIL_MATRICE_PARTICIPANTS');
+ const presents = charge().participants.filter(({ exclu }) => !exclu).length;
+ expect(presents).toBe(260);
+ expect(presents).toBeGreaterThan(seuil);
+ expect(vue.querySelector('svg[data-graphique="matrice"]')).toBeNull();
+ const phrase = vue.querySelector('[data-phrase-qualite="matriceSeuil"]');
+ expect(texteDe(phrase)).toBe(plat(t('qualite.paires.matrice.seuil', { participants: format.nombre(presents), seuil: format.nombre(seuil) })));
+ await cadrerDansLaSurface([vue.querySelector('h4') ?? phrase, phrase]);
+ await photographier(m, '15-pas-de-matrice', { condition: ['[data-vue-qualite="paires"] [data-phrase-qualite="matriceSeuil"]'], graine: GRAINE });
+ });
+
+ test('15b la grande : les animateurs sous leur borne pointillée, sans « plafond » ; la diversité, le moins varié en tête', async () => {
+ const animateurs = vueQualite('animateurs');
+ const svg = animateurs.querySelector('svg[data-graphique="animateurs"]');
+ expect(svg).not.toBeNull();
+ expect(axesVerticaux(svg)).toBe(1);
+ const borne = svg.querySelector('path[data-repere="borne"]');
+ expect(borne).not.toBeNull();
+ expect(motif(borne)).not.toBe(motif(svg.querySelector('path[data-serie]')));
+ expect(texteDe(animateurs)).not.toMatch(/plafond/i);
+
+ // La première barre de la soirée porte le minimum annoncé : le moins
+ // varié de chaque colonne dessinée.
+ const diversite = vueQualite('diversite');
+ const colonnes = [...diversite.querySelectorAll('[data-equite]')];
+ expect(colonnes.length).toBeGreaterThan(0);
+ const [soirees] = await lireJumeau(diversite);
+ for (const colonne of colonnes) {
+ const moins = texteDe(colonne.querySelector('dd'));
+ expect(soirees[0].get(colonne.dataset.equite), colonne.dataset.equite).toBe(moins);
+ }
+ // Le profil des animateurs en haut de la surface, puis le haut de la
+ // diversité : son graphique, plus bas, ne tient pas avec lui.
+ await cadrerAuBord(svg, 'haut');
+ await photographier(m, '15b-qualite-animateurs', {
+ condition: ['[data-vue-qualite="animateurs"] svg[data-graphique="animateurs"]'],
+ graine: GRAINE,
+ });
+ });
+
+ test('15c la grande : la course, la durée pilotée ; le dernier point est la ligne de la proposition', async () => {
+ const { id, avancements, dureeMs } = memoire.grande;
+ // Le moteur sollicité une seconde fois : les mouvements évalués de
+ // chaque proposition, dont le relais a compté les avancements.
+ const { nombre, historique } = charge().reglages.generation;
+ const propositions = rechercher(configurationDepuisCharge(charge()), { graine: GRAINE, nombre, arret: ARRET_GRANDE, historique });
+ const evalues = propositions.reduce((somme, p) => somme + p.evalues, 0);
+ expect(avancements).toBe(propositions.reduce((somme, p) => somme + Math.floor(p.evalues / CADENCE_AVANCEMENTS), 0));
+ expect(dureeMs).toBe(avancements * PAS_HORLOGE_GENERATION_MS);
+ const montree = propositions.find(({ graine }) => graine === charge().propositions.find((p) => p.id === id).graine);
+ const vue = vueQualite('performance');
+ const tete = [...vue.querySelectorAll('[data-course] li')].map(texteDe);
+ expect(tete).toEqual([
+ plat(t('qualite.performance.mouvements', { evalues: format.nombre(montree.evalues), arret: format.nombre(ARRET_GRANDE) })),
+ plat(t('qualite.performance.duree', { duree: format.duree(dureeMs) })),
+ plat(t('qualite.performance.coeurs', { coeurs: 1 })),
+ plat(t('qualite.performance.cadence', { cadence: format.nombre(Math.round((evalues * 1000) / dureeMs)) })),
+ plat(t('qualite.performance.propositions', { nombre })),
+ ]);
+ expect(vue.querySelectorAll('svg[data-graphique]').length).toBeGreaterThan(0);
+ expect(vue.querySelector('[data-dernier-changement]')).not.toBeNull();
+
+ // Le dernier point de relevé est le plan de la proposition : ses
+ // mouvements, ses valeurs égales à sa ligne au tableau des propositions.
+ const [points] = await lireJumeau(vue);
+ memoire.grande.points = points;
+ const dernier = points.at(-1);
+ expect(dernier.get('mouvements')).toBe(plat(format.nombre(montree.evalues)));
+ const ligne = await ligneAuTableau(id);
+ const colonneAuTableau = (nom) => (nom === 'minimumBrut' ? 'rencontresTous' : colonneDeValeur(nom));
+ for (const [nom, valeur] of dernier) if (nom !== 'mouvements') expect(valeur, nom).toBe(ligne.get(colonneAuTableau(nom)));
+
+ await revenirALaQualite(id);
+ // La ligne de tête au haut de la surface, et sous elle les deux premiers
+ // rangs des petits multiples : la vue entière, la phrase du dernier
+ // changement comprise, est plus haute que la surface. Le bord haut tombe
+ // entre la question de la vue et la ligne de tête, le bas entre deux rangs.
+ const performance = vueQualite('performance');
+ const multiples = [...performance.querySelectorAll('svg[data-graphique]')];
+ const dernierMontre = multiples[Math.min(3, multiples.length - 1)];
+ await cadrerAuBord(performance.querySelector('[data-course]'), 'haut');
+ await photographier(m, '15c-qualite-performance', {
+ condition: ['[data-vue-qualite="performance"] [data-course]', `[data-vue-qualite="performance"] svg[data-graphique="${dernierMontre.dataset.graphique}"]`],
+ graine: GRAINE,
+ });
+ });
+
+ test('15c rouverte, sans capture : la même course, la durée « inconnue »', async () => {
+ const { id, points } = memoire.grande;
+ await rouvrir(memoire.baseGrande);
+ await ouvrirSection('propositions');
+ await cliquer(`[data-section="propositions"] tr[data-proposition="${id}"] [data-commande="qualite"]`);
+ await revenirALaQualite(id);
+ const vue = vueQualite('performance');
+ const tete = [...vue.querySelectorAll('[data-course] li')].map(texteDe);
+ expect(tete).toContain(plat(t('qualite.performance.dureeInconnue')));
+ // Le début du gabarit de la cadence, coupé à la place de sa valeur :
+ // aucun morceau de la ligne de tête ne l'écrit.
+ const [avantCadence] = plat(t('qualite.performance.cadence', { cadence: '\u{0}' })).split('\u{0}');
+ expect(avantCadence).not.toBe('');
+ expect(tete.filter((morceau) => morceau.startsWith(avantCadence))).toEqual([]);
+ const [relus] = await lireJumeau(vue);
+ expect(relus.map((ligne) => [...ligne])).toEqual(points.map((ligne) => [...ligne]));
+ });
+
+ test('12a la variante « conflit », sans placement : la phrase et le diagnostic, aucun graphique', async () => {
+ await chargerDemonstration('petite-conflit');
+ memoire.baseConflit = base();
+ await ouvrirSection('qualite');
+ const phrase = await attendre('la phrase d’aucun placement', () => dans('[data-section="qualite"] [data-phrase-qualite="aucunPlacement"]'));
+ expect(texteDe(phrase)).toBe(plat(t('qualite.phrase.aucunPlacement')));
+ expect(phrasesQualite()).toEqual(['aucunPlacement']);
+ expect(tous('[data-section="qualite"] svg[data-graphique]')).toEqual([]);
+ expect(dans('[data-section="qualite"] [data-source-qualite]')).not.toBeNull();
+ expect(tous('[data-section="qualite"] [data-phrase]').length, 'le diagnostic préalable').toBeGreaterThan(0);
+ await photographier(m, '12a-qualite-sans-placement', {
+ condition: ['[data-section="qualite"] [data-source-qualite]', '[data-section="qualite"] [data-phrase-qualite="aucunPlacement"]'],
+ graine: GRAINE,
+ });
+ });
+
+ test('13 la variante générée : deux segments, le prouvé égal au plancher, 4, triées sur l’excédent', async () => {
+ await passerEnEcriture();
+ await generer(ARRET);
+ memoire.conflit = { id: await qualiteDeLaPremiere() };
+ exigerLaPropositionMontree(memoire.conflit.id);
+ const vue = vueQualite('collisions');
+ const svg = vue.querySelector('svg[data-graphique="collisions"]');
+ expect(svg).not.toBeNull();
+ expect(svg.querySelectorAll('rect[data-segment="prouve"]').length).toBeGreaterThan(0);
+ const diagnostic = diagnostiquer(configurationDepuisCharge(charge()));
+ const plancherDe = new Map(diagnostic.collisions.map(({ groupe, plancherCumulees }) => [groupe, plancherCumulees]));
+ expect([...plancherDe.values()]).toContain(4);
+ const [lignes] = await lireJumeau(vue);
+ expect(lignes.length).toBeGreaterThan(0);
+ for (const ligne of lignes) {
+ expect(ligne.get('prouve'), ligne.get('appartenance')).toBe(String(plancherDe.get(ligne.get('appartenance')) ?? 0));
+ }
+ expect(lignes.map((ligne) => ligne.get('prouve'))).toContain('4');
+ const excedents = lignes.map((ligne) => Number(ligne.get('excedent')));
+ expect(excedents).toEqual([...excedents].sort((a, b) => b - a));
+ await cadrerDansLaSurface([svg]);
+ await photographier(m, '13-qualite-collisions', { condition: ['[data-vue-qualite="collisions"] svg[data-graphique="collisions"]'], graine: GRAINE });
+ });
+
+ test('13a les tables sous « sièges » : la pire en tête, chaque case écrit le compte que son niveau colore', async () => {
+ // La proposition générée, et non le retenu que 12f ajuste ensuite.
+ exigerLaPropositionMontree(memoire.conflit.id);
+ const vue = vueQualite('tables');
+ expect(vue.querySelector('input[data-position-tables="sieges"]').checked).toBe(true);
+ const svg = vue.querySelector('svg[data-graphique="tables"]');
+ expect(svg).not.toBeNull();
+ const cases = [...svg.querySelectorAll('[data-case]')];
+ expect(cases.length).toBe(charge().tables.length * charge().evenement.tours);
+ const comptes = new Map();
+ for (const c of cases) {
+ const [ligne] = c.dataset.case.split(':').map(Number);
+ const texte = texteDe(c.querySelector('text'));
+ if (texte === t('format.vide')) {
+ expect(c.querySelector('rect[data-marque^="graphiqueNiveau"]'), c.dataset.case).toBeNull();
+ continue;
+ }
+ const compte = Number(texte);
+ expect(Number.isInteger(compte), c.dataset.case).toBe(true);
+ const n = niveau(compte);
+ const fond = c.querySelector('rect:not(.bordure)');
+ expect(fond?.getAttribute('data-marque') ?? null, c.dataset.case).toBe(n > 0 ? `graphiqueNiveau${n}` : null);
+ expect(fond?.style.fill ?? '', c.dataset.case).toContain(`--couleur-graphique-niveau-${n}`);
+ comptes.set(ligne, Math.max(comptes.get(ligne) ?? 0, compte));
+ }
+ expect(comptes.get(0)).toBe(Math.max(...comptes.values()));
+ await cadrerDansLaSurface([vue.querySelector('fieldset'), svg]);
+ await photographier(m, '13a-qualite-tables', {
+ condition: ['[data-vue-qualite="tables"] input[data-position-tables="sieges"]', '[data-vue-qualite="tables"] svg[data-graphique="tables"]'],
+ graine: GRAINE,
+ });
+ });
+
+ test('12f une personne mobile en réserve au tour 2 : sa marque, les collisions d’un seul segment', async () => {
+ const { id } = memoire.conflit;
+ await ouvrirSection('propositions');
+ let r = revision();
+ await cliquer(`[data-section="propositions"] tr[data-proposition="${id}"] [data-commande="retenir"]`);
+ await uneEntree(r, 'retenir');
+ expect(charge().retenu.proposition).toBe(id);
+ await ouvrirPlan();
+ if (m.ui.etat().proposition !== null) {
+ await cliquer('[data-commande="quitterProposition"]');
+ await attendre('le retenu montré', () => m.ui.etat().proposition === null);
+ }
+ const selecteurTour = dans('[data-champ="tour"]');
+ selecteurTour.value = '2';
+ selecteurTour.dispatchEvent(new Event('change', { bubbles: true }));
+ await attendre('le tour 2 montré', () => m.ui.etat().tour === 2);
+ await images(2);
+ await regimeSieges();
+ // Une personne mobile : aucune réservation ne la tient, à aucun tour.
+ const tenues = new Set(charge().reservations.map(({ participant }) => participant));
+ const assise = chaiseVue((c) => c.occupant !== null && !tenues.has(c.occupant));
+ const mobile = assise.occupant;
+ r = revision();
+ await cliquerPointeur(chaise(assise.table, assise.siege));
+ await cliquer(`[data-panneau="place"] [data-menu="${mobile}"] [data-commande="retirerDuTour"]`);
+ await uneEntree(r, 'retirer du tour 2');
+ selecteurTour.value = '1';
+ selecteurTour.dispatchEvent(new Event('change', { bubbles: true }));
+ await attendre('le tour 1 montré', () => m.ui.etat().tour === 1);
+
+ await ouvrirSection('qualite');
+ await attendre('la page du retenu', () => vueQualite('profil')?.querySelector('svg[data-graphique="profilComptes"]'));
+ await images(3);
+ const nom = nomAffiche(charge().participants.find((p) => p.id === mobile));
+ const profil = vueQualite('profil');
+ expect(profil.querySelectorAll('svg[data-graphique="profilComptes"] [data-marque="graphiqueMarque"]').length).toBeGreaterThan(0);
+ const [rangs] = await lireJumeau(profil);
+ const sienne = rangs.find((ligne) => ligne.get('nom') === plat(nom));
+ expect(sienne?.get('marque'), nom).toBe(plat(t('qualite.profil.marque.reserve')));
+ // Hors du domaine des planchers, une barre d'un seul segment, et la
+ // phrase qui le dit (D31).
+ const collisions = vueQualite('collisions');
+ expect(collisions.querySelector('svg[data-graphique="collisions"]')).not.toBeNull();
+ expect(collisions.querySelector('rect[data-segment="prouve"]')).toBeNull();
+ const segments = [...collisions.querySelectorAll('svg[data-graphique="collisions"] rect[data-segment]')];
+ expect(segments.length).toBeGreaterThan(0);
+ expect([...new Set(segments.map((segment) => segment.dataset.segment))]).toEqual(['serie1']);
+ expect(axesVides()).toEqual([]);
+ const phrase = collisions.querySelector('[data-phrase-qualite="collisionsHorsDomaine"]');
+ expect(texteDe(phrase)).toBe(plat(t('qualite.collisions.horsDomaine')));
+ // Le premier graphique du profil en haut de la surface, son signe de la
+ // réserve : les barres des collisions, plus bas, ne tiennent pas avec
+ // lui, et s'affirment sans l'image.
+ await cadrerAuBord(profil.querySelector('svg[data-graphique="profilComptes"]'), 'haut');
+ await photographier(m, '12f-qualite-reserve', {
+ condition: [
+ '[data-vue-qualite="profil"] svg[data-graphique="profilComptes"]',
+ '[data-vue-qualite="profil"] svg[data-graphique="profilComptes"] [data-marque="graphiqueMarque"]',
+ ],
+ graine: GRAINE,
+ });
+ });
+
+ test('12b une seule table : sa phrase, ni profil, ni barre, ni grille, ni paires', async () => {
+ await construire(CONSTRUITES.uneTable);
+ for (const code of ['uneTable', 'collisionsUneTable', 'tablesUneTable', 'pairesUneTable']) expect(phrasesQualite(), code).toContain(code);
+ for (const nom of ['profilComptes', 'profilPourcentages', 'collisions', 'tables', 'matrice']) expect(graphique(nom), nom).toBeNull();
+ expect(dans('[data-section="qualite"] [data-paire]')).toBeNull();
+ expect(axesVides()).toEqual([]);
+ const phrase = vueQualite('profil').querySelector('[data-phrase-qualite="uneTable"]');
+ expect(texteDe(phrase)).toBe(plat(t('qualite.profil.uneTable')));
+ await cadrerDansLaSurface([phrase, vueQualite('paires').querySelector('[data-phrase-qualite="pairesUneTable"]')]);
+ await photographier(m, '12b-qualite-une-table', {
+ condition: ['[data-vue-qualite="profil"] [data-phrase-qualite="uneTable"]', '[data-vue-qualite="paires"] [data-phrase-qualite="pairesUneTable"]'],
+ graine: GRAINE,
+ });
+ });
+
+ test('12c un seul tour : le profil et les collisions dessinés, la phrase des paires', async () => {
+ await construire(CONSTRUITES.unTour);
+ expect(graphique('profilComptes')).not.toBeNull();
+ expect(graphique('collisions')).not.toBeNull();
+ expect(phrasesQualite()).toContain('pairesUnTour');
+ expect(dans('[data-section="qualite"] [data-vue-qualite="paires"] table')).toBeNull();
+ expect(axesVides()).toEqual([]);
+ const phrase = vueQualite('paires').querySelector('[data-phrase-qualite="pairesUnTour"]');
+ expect(texteDe(phrase)).toBe(plat(t('qualite.paires.unTour')));
+ // La vue des tables entière, sa grille d'un seul tour, et la phrase des
+ // paires : le profil et les collisions, plus haut, ne tiennent pas avec
+ // elles dans la surface, et s'affirment sans l'image.
+ await cadrerDansLaSurface([vueQualite('tables'), phrase]);
+ await photographier(m, '12c-qualite-un-tour', {
+ condition: [
+ '[data-vue-qualite="tables"]',
+ '[data-vue-qualite="tables"] svg[data-graphique="tables"]',
+ '[data-vue-qualite="paires"] [data-phrase-qualite="pairesUnTour"]',
+ ],
+ graine: GRAINE,
+ });
+ });
+
+ test('12d une seule appartenance : une série, sans borne, sa phrase ; les collisions et la grille restent', async () => {
+ await construire(CONSTRUITES.uneAppartenance);
+ const comptes = graphique('profilComptes');
+ expect(comptes.querySelectorAll('path[data-serie]')).toHaveLength(1);
+ expect(comptes.querySelector('[data-repere="borne"]')).toBeNull();
+ const phrase = vueQualite('profil').querySelector('[data-phrase-qualite="uneAppartenance"]');
+ expect(texteDe(phrase)).toBe(plat(t('qualite.profil.uneAppartenance')));
+ expect(graphique('collisions')?.querySelectorAll('rect[data-segment]').length).toBeGreaterThan(0);
+ expect(graphique('tables')).not.toBeNull();
+ expect(axesVides()).toEqual([]);
+ await cadrerDansLaSurface([phrase, comptes]);
+ await photographier(m, '12d-qualite-une-appartenance', {
+ condition: ['[data-vue-qualite="profil"] [data-phrase-qualite="uneAppartenance"]', '[data-vue-qualite="profil"] svg[data-graphique="profilComptes"]'],
+ graine: GRAINE,
+ });
+ });
+
+ test('12e aucune collision : la phrase ; la grille sous « sièges », chaque case 0', async () => {
+ await construire(CONSTRUITES.sansCollision);
+ expect(graphique('collisions')).toBeNull();
+ const phrase = vueQualite('collisions').querySelector('[data-phrase-qualite="collisionsAucune"]');
+ expect(texteDe(phrase)).toBe(plat(t('qualite.collisions.aucune')));
+ const tables = vueQualite('tables');
+ expect(tables.querySelector('input[data-position-tables="sieges"]').checked).toBe(true);
+ const cases = [...graphique('tables').querySelectorAll('[data-case]')];
+ expect(cases).toHaveLength(3 * 2);
+ for (const c of cases) expect(texteDe(c.querySelector('text')), c.dataset.case).toBe('0');
+ expect(axesVides()).toEqual([]);
+ await cadrerDansLaSurface([phrase, graphique('tables')]);
+ await photographier(m, '12e-qualite-sans-collision', {
+ condition: ['[data-vue-qualite="collisions"] [data-phrase-qualite="collisionsAucune"]', '[data-vue-qualite="tables"] svg[data-graphique="tables"]'],
+ graine: GRAINE,
+ });
+ });
+
+ test('12g la cinquième seule à la table de 2 : plafond réalisé nul au rang 1, son infobulle', async () => {
+ await construire(CONSTRUITES.plafondNul);
+ const seule = charge().participants[4];
+ const comptes = graphique('profilComptes');
+ const pourcentages = graphique('profilPourcentages');
+ // Le graphique au bas de la surface : l'infobulle du rang 1, plus haute
+ // que l'espace sous son point, se pose au-dessus de lui, dans l'image.
+ await cadrerAuBord(comptes, 'bas');
+ const { bulle, cellule } = await pointerLeRang1(comptes);
+ expect(cellule('qualite.profil.colonne.nom')).toBe(plat(nomAffiche(seule)));
+ expect(cellule('qualite.profil.colonne.plafondRealise')).toBe('0');
+ expect(cellule('qualite.profil.colonne.marque')).toBe(plat(t('qualite.profil.marque.plafondNul')));
+ expect(texteDe(bulle.querySelector('[data-pourcentage]'))).toBe(t('format.vide'));
+ // Au second graphique, aucun point au rang 1 : la série commence après
+ // son signe, posé au pied de l'axe.
+ const signes = [...pourcentages.querySelectorAll('[data-marque="graphiqueMarque"]')].map((signe) => signe.getBoundingClientRect());
+ const premierSigne = signes.reduce((a, b) => (b.left < a.left ? b : a));
+ const debutSerie = Number(/^M\s*([-\d.]+)/.exec(pourcentages.querySelector('path[data-serie]').getAttribute('d'))[1]);
+ const gaucheSvg = pourcentages.getBoundingClientRect().left;
+ expect(debutSerie + gaucheSvg).toBeGreaterThan(premierSigne.right);
+ expect(axesVides()).toEqual([]);
+ await photographier(m, '12g-qualite-plafond-nul', {
+ condition: ['[data-vue-qualite="profil"] svg[data-graphique="profilComptes"]', '[data-section="qualite"] [role="tooltip"]:not([hidden])'],
+ graine: GRAINE,
+ });
+ });
+
+ test('14 les paires répétées : le tableau, la première commande au premier tour revu', async () => {
+ await ecarterLePointeur();
+ memoire.paires = { id: await construire(CONSTRUITES.paires) };
+ exigerLaConstruiteDesPaires();
+ const vue = vueQualite('paires');
+ const lignes = [...vue.querySelectorAll('tr[data-paire]')];
+ expect(lignes.length).toBeGreaterThan(0);
+ const fois = lignes.map((ligne) => Number(/\d+/.exec(texteDe(ligne.querySelector('td.nombre')))[0]));
+ for (const ligne of lignes) {
+ const [premiere, ...tours] = [...ligne.querySelectorAll('[data-commande="allerAuTour"]')];
+ expect(tours.length).toBeGreaterThanOrEqual(2);
+ const numeros = tours.map((bouton) => Number(/\d+/.exec(texteDe(bouton))[0]));
+ expect(texteDe(premiere)).toBe(plat(t('qualite.paires.premierTour', { tour: numeros[1] })));
+ }
+ expect(fois[0]).toBe(Math.max(...fois));
+ memoire.paires.premiere = { cle: lignes[0].dataset.paire, tour: Number(/\d+/.exec(texteDe(lignes[0].querySelector('.premiere')))[0]) };
+ await cadrerDansLaSurface([vue.querySelector('thead'), lignes[Math.min(lignes.length, 5) - 1]]);
+ await photographier(m, '14-qualite-paires', { condition: ['[data-vue-qualite="paires"] tr[data-paire]'], graine: GRAINE });
+ });
+
+ test('14a la commande mène au tour revu ; la fiche, ses « Rencontres », égales au tableau des paires', async () => {
+ const { cle, tour } = memoire.paires.premiere;
+ exigerLaConstruiteDesPaires();
+ const [a] = cle.split(':').map(Number);
+ // Les paires de la personne au tableau : l'autre, ses fois, ses tours.
+ const deLaPersonne = tous('[data-section="qualite"] tr[data-paire]')
+ .filter((ligne) => ligne.dataset.paire.split(':').map(Number).includes(a))
+ .map((ligne) => {
+ const [x, y] = ligne.dataset.paire.split(':').map(Number);
+ const autre = x === a ? y : x;
+ const tours = [...ligne.querySelectorAll('[data-commande="allerAuTour"]:not(.premiere)')].map((bouton) => texteDe(bouton).match(/\d+/g).map(Number));
+ return [plat(nomAffiche(charge().participants.find((p) => p.id === autre))), Number(/\d+/.exec(texteDe(ligne.querySelector('td.nombre')))[0]), tours];
+ });
+ expect(deLaPersonne.length).toBeGreaterThan(0);
+ await cliquer(`[data-section="qualite"] tr[data-paire="${cle}"] .premiere`);
+ await attendre('le plan au premier tour revu', () => dans('[data-section="plan"]') && m.ui.etat().tour === tour);
+
+ await ouvrirSection('participants');
+ await cliquer(`[data-section="participants"] [data-participant="${a}"] [data-commande="fiche"]`);
+ const rubrique = await attendre('la rubrique « Rencontres »', () => dans(`[data-fiche="${a}"] [data-rubrique-rencontres]`));
+ const lignes = [...rubrique.querySelectorAll('tbody tr')].map((ligne) => [
+ texteDe(ligne.querySelector('.nom')),
+ Number(texteDe(ligne.querySelector('td.fois'))),
+ texteDe(ligne.querySelectorAll('td')[1]).split(' ; ').map((etape) => etape.match(/\d+/g).map(Number)),
+ ]);
+ // Les plus revues d'abord ; celles revues plus d'une fois sont les
+ // lignes de la personne au tableau des paires, une pour une.
+ const fois = lignes.map(([, f]) => f);
+ expect(fois).toEqual([...fois].sort((x, y) => y - x));
+ expect(lignes.filter(([, f]) => f > 1)).toEqual(deLaPersonne);
+ // La rubrique jusqu'à ses quatre premières rencontres, les plus revues
+ // d'abord : le haut de la fiche, son nom compris, ne tient pas avec
+ // elles dans la surface du panneau.
+ const rangees = [...rubrique.querySelectorAll('tbody tr')];
+ await cadrerDansLaSurface([rubrique.querySelector('h4'), rangees[Math.min(rangees.length, 4) - 1]]);
+ await photographier(m, '14a-fiche-rencontres', {
+ condition: [`[data-fiche="${a}"] [data-rubrique-rencontres] h4`, `[data-fiche="${a}"] [data-rubrique-rencontres] tbody tr`],
+ graine: GRAINE,
+ });
+ });
+
+ test('15a l’événement construit généré de nouveau : jamais servies, la soirée, chaque tour et ses assis sans table', async () => {
+ if (dans('[data-fiche]') !== null) {
+ await cliquer('[data-fiche] [data-commande="fermerFiche"]');
+ await attendre('la fiche fermée', () => dans('[data-fiche]') === null);
+ }
+ // Le plan bloqué que les familles laissent : « Débloquer », à place
+ // fixe, se confirme sur place, puis l'écriture.
+ await rouvrir(memoire.base);
+ expect(charge().evenement.etat).toBe('bloque');
+ const r = revision();
+ await cliquer('[data-place-fixe] [data-commande="debloquer"]');
+ await cliquer('[data-place-fixe] [data-commande="debloquer"]');
+ await uneEntree(r, 'débloquer');
+ await passerEnEcriture();
+ await generer();
+ const id = await qualiteDeLaPremiere();
+ const vue = vueQualite('objectifs');
+ expect(vue.querySelector('[data-jamais-servies]')).not.toBeNull();
+ const soiree = vue.querySelector('[data-soiree-objectifs]');
+ expect(soiree).not.toBeNull();
+ expect(soiree.querySelector('[data-pourcentage] + [data-compte-pire]')).not.toBeNull();
+ const tours = [...vue.querySelectorAll('ol.tours > li')];
+ expect(tours).toHaveLength(charge().evenement.tours);
+ for (const tour of tours) expect(tour.querySelector('[data-pourcentage] + [data-compte-pire]'), texteDe(tour)).not.toBeNull();
+ exigerComptes(vue);
+
+ const [parTour] = await lireJumeau(vue);
+ const lignesTours = parTour.slice(0, -1);
+ const laSoiree = parTour.at(-1);
+ expect(laSoiree.get('tour')).toBe(plat(t('qualite.objectifs.soiree')));
+ // Chaque barre de tour écrit ses assis sans table possible.
+ const barres = [...vue.querySelectorAll('svg[data-graphique="objectifs"] [data-ligne-graphique]')];
+ expect(barres).toHaveLength(lignesTours.length);
+ barres.forEach((barre, rang) => {
+ expect(texteDe(barre.querySelector('text.secondaire')), lignesTours[rang].get('tour')).toBe(
+ plat(t('qualite.objectifs.assisSansTable', { assis: Number(lignesTours[rang].get('assis')) })),
+ );
+ });
+ // La somme des planchers des tours égale le plancher du diagnostic ;
+ // possibles − servis de la soirée égale la colonne du tableau.
+ const diagnostic = diagnostiquer(configurationDepuisCharge(charge()));
+ const somme = lignesTours.reduce((total, ligne) => total + Number(ligne.get('plancher')), 0);
+ expect(somme).toBe(diagnostic.objectifsInevitables.horsObjectif);
+ expect(Number(laSoiree.get('plancher'))).toBe(somme);
+ const hors = Number(laSoiree.get('possibles')) - Number(laSoiree.get('servis'));
+ const ligne = await ligneAuTableau(id);
+ expect(ligne.get('toursHorsObjectif')).toBe(plat(format.nombre(hors)));
+ await revenirALaQualite(id);
+
+ const objectifs = vueQualite('objectifs');
+ await cadrerDansLaSurface([objectifs.querySelector('[data-jamais-servies]'), objectifs.querySelector('ol.tours')]);
+ await photographier(m, '15a-qualite-objectifs', {
+ condition: ['[data-vue-qualite="objectifs"] [data-soiree-objectifs]', '[data-vue-qualite="objectifs"] ol.tours'],
+ graine: GRAINE,
+ });
+ });
+
+ test('16 la petite : « minimum atteint », collisions et répétitions à zéro, les ancrés à « — »', async () => {
+ await chargerDemonstration('petite');
+ await passerEnEcriture();
+ await generer();
+ const id = await qualiteDeLaPremiere();
+ const instance = normaliser(configurationDepuisCharge(charge()));
+ const mesures = mesurer(instance, indexerPlan(instance, planDepuisFichier(charge().propositions.find((p) => p.id === id))));
+ expect(mesures.collisionsCumulees).toBe(0);
+ expect(mesures.rencontresRepetees).toEqual({ choisies: 0, imposees: 0 });
+ const entete = vueQualite('entete');
+ expect(texteDe(entete.querySelector('.certificat'))).toBe(plat(t('propositions.certificat.atteint')));
+ const valeur = (nom) => texteDe(entete.querySelector(`[data-tuile="${nom}"] .valeur`));
+ for (const nom of ['collisionsCumulees', 'rencontresRepetees']) expect(valeur(nom), nom).toBe('0');
+ expect(valeur('rencontresAncres')).toBe(t('format.vide'));
+ // Le relais est resté inerte pour chaque génération qui suit la grande.
+ expect(relais.avancements, 'aucun avancement compté après la grande').toBe(memoire.grande.avancements);
+ // Le bas de l'en-tête, du groupe de la diversité à la mention : le bord
+ // haut tombe entre deux groupes de tuiles, aucune n'y est coupée. Du
+ // groupe des collisions à la mention, l'en-tête est plus haut que la
+ // surface : les rencontres et leur ligne des ancrés, les collisions et
+ // les répétitions s'affirment plus haut, sans l'image.
+ await cadrerAuBord(entete.querySelector('section.groupe:has([data-tuile="diversite"])'), 'haut');
+ await photographier(m, '16-minimum-atteint', {
+ condition: [
+ '[data-vue-qualite="entete"] section.groupe:has([data-tuile="diversite"]) h4',
+ '[data-vue-qualite="entete"] [data-tuile="manqueMax"]',
+ '[data-vue-qualite="entete"] .certificat',
+ ],
+ graine: GRAINE,
+ });
+ });
+});
+
// --- Les captures d'écran du parcours (§ 19.5, § 19.7) ----------------------------------------
// La dernière épreuve du fichier. Une épreuve du fichier en échec, même
diff --git a/src/interface/primitives/infobulle.js b/src/interface/primitives/infobulle.js
index 20e40d9..29362c5 100644
--- a/src/interface/primitives/infobulle.js
+++ b/src/interface/primitives/infobulle.js
@@ -12,7 +12,11 @@
// prend le plus grand et reste dans le cadre, quitte à couvrir le terme.
// Horizontalement, elle s'aligne sur le bord gauche du terme, puis recule
// pour garder MARGE_INFOBULLE_PX entre elle et chaque bord du cadre ; plus
-// large que le cadre, elle se colle à la marge gauche.
+// large que le cadre, elle se colle à la marge gauche. Verticalement, le
+// cadre peut se borner à la zone visible où défile le terme — haut et bas,
+// ramenés dans la fenêtre — : l'infobulle n'en sort pas, et ne couvre pas
+// ce qui reste fixe au-dessus ou au-dessous de cette zone, comme un bandeau
+// collant.
/** Distance entre le terme et l'infobulle, en px. */
export const ECART_INFOBULLE_PX = 6;
@@ -26,8 +30,10 @@ export const MARGE_INFOBULLE_PX = 8;
* @param {{gauche: number, haut: number, droite: number, bas: number}} ancre
* le rectangle du terme expliqué
* @param {{largeur: number, hauteur: number}} taille celle de l'infobulle
- * @param {{largeur: number, hauteur: number}} cadre la partie visible de la
- * fenêtre, barres de défilement exclues
+ * @param {{largeur: number, hauteur: number, haut?: number, bas?: number}} cadre
+ * la partie visible de la fenêtre, barres de défilement exclues ; haut et
+ * bas, facultatifs, bornent la zone visible où défile le terme, 0 et
+ * hauteur par défaut
* @returns {{gauche: number, haut: number, cote: 'dessous'|'dessus'}} le coin
* haut gauche de l'infobulle, et le côté du terme où elle se pose
*/
@@ -37,15 +43,16 @@ export function placerInfobulle(ancre, { largeur, hauteur }, cadre) {
const dessous = ancre.bas + ECART_INFOBULLE_PX;
const dessus = ancre.haut - ECART_INFOBULLE_PX - hauteur;
- const basMax = cadre.hauteur - MARGE_INFOBULLE_PX;
+ const hautMin = Math.max(0, cadre.haut ?? 0) + MARGE_INFOBULLE_PX;
+ const basMax = Math.min(cadre.hauteur, cadre.bas ?? cadre.hauteur) - MARGE_INFOBULLE_PX;
if (dessous + hauteur <= basMax) return { gauche, haut: dessous, cote: 'dessous' };
- if (dessus >= MARGE_INFOBULLE_PX) return { gauche, haut: dessus, cote: 'dessus' };
+ if (dessus >= hautMin) return { gauche, haut: dessus, cote: 'dessus' };
// Aucun côté ne la reçoit : le plus grand, la boîte ramenée dans le cadre.
const placeDessous = basMax - dessous;
- const placeDessus = ancre.haut - ECART_INFOBULLE_PX - MARGE_INFOBULLE_PX;
+ const placeDessus = ancre.haut - ECART_INFOBULLE_PX - hautMin;
const cote = placeDessous >= placeDessus ? 'dessous' : 'dessus';
const voulu = cote === 'dessous' ? dessous : dessus;
- const haut = Math.max(MARGE_INFOBULLE_PX, Math.min(voulu, basMax - hauteur));
+ const haut = Math.max(hautMin, Math.min(voulu, basMax - hauteur));
return { gauche, haut, cote };
}
diff --git a/src/interface/primitives/infobulle.test.js b/src/interface/primitives/infobulle.test.js
index 714cdae..9b09481 100644
--- a/src/interface/primitives/infobulle.test.js
+++ b/src/interface/primitives/infobulle.test.js
@@ -65,6 +65,21 @@ describe('placerInfobulle : sous le terme, au-dessus, dans le cadre', () => {
assert.ok(dansLeCadre(boite(haut, haute), petit), JSON.stringify(haut));
});
+ test('rouge : un cadre borné en haut et en bas — la zone visible où défile le terme, sous un bandeau collant — : l’infobulle n’en sort jamais, quitte à couvrir le terme ; sans bornes, la fenêtre', () => {
+ // Sous la zone, elle monte ; au-dessus de la zone, elle descend.
+ assert.deepEqual(placerInfobulle(terme(200, 500), TAILLE, { largeur: 1366, hauteur: 700, bas: 600 }), { gauche: 200, haut: 404, cote: 'dessus' });
+ assert.deepEqual(placerInfobulle(terme(200, 600), TAILLE, { largeur: 1366, hauteur: 700, haut: 560, bas: 690 }), { gauche: 200, haut: 592, cote: 'dessous' });
+ const zone = { largeur: 1366, hauteur: 700, haut: 260, bas: 690 };
+ for (let haut = zone.haut; haut <= zone.bas - 20; haut += 11) {
+ const b = boite(placerInfobulle(terme(200, haut), TAILLE, zone), TAILLE);
+ assert.ok(b.haut >= zone.haut + MARGE_INFOBULLE_PX && b.bas <= zone.bas - MARGE_INFOBULLE_PX, `${haut} : ${JSON.stringify(b)}`);
+ }
+ const ancre = terme(200, 300);
+ assert.deepEqual(placerInfobulle(ancre, TAILLE, { ...CADRE, haut: 0, bas: 700 }), placerInfobulle(ancre, TAILLE, CADRE));
+ const debordante = { ...CADRE, haut: -40, bas: 900 };
+ assert.deepEqual(placerInfobulle(terme(200, 640), TAILLE, debordante), placerInfobulle(terme(200, 640), TAILLE, CADRE), 'la zone se borne à la fenêtre');
+ });
+
test('sur une grille de termes qui couvre le cadre : dès qu’un côté la reçoit, l’infobulle reste dans le cadre et ne couvre jamais le terme', () => {
let essais = 0;
for (let gauche = -100; gauche <= CADRE.largeur; gauche += 37) {
diff --git a/src/interface/qualite/graphiques/Barres.svelte b/src/interface/qualite/graphiques/Barres.svelte
index 0ca3ef7..aa0454d 100644
--- a/src/interface/qualite/graphiques/Barres.svelte
+++ b/src/interface/qualite/graphiques/Barres.svelte
@@ -23,7 +23,12 @@
// titre, jamais empilées ni sur un axe commun, valeurs[k] celle de la
// colonne k, les lignes dans le même ordre.
// genre : serie1, serie2, prouve ou reste, chacun son jeton (REMPLISSAGES,
- // pointage.js). Un segment nul ne se trace pas.
+ // pointage.js). Un segment au remplissage en contour — « prouvé
+ // inévitable » — se trace d'un trait de TRAIT_CONTOUR_PX de son jeton,
+ // tenu dans la boîte du segment, que la disposition garde au moins large
+ // de LARGEUR_MIN_CONTOUR_PX ; les autres en aplat : prouvé et reste se
+ // distinguent par la forme comme par la couleur, à toute largeur (§ 12.4,
+ // B13). Un segment nul ne se trace pas.
//
// Le pointage désigne la ligne sous le pointeur ; pointe, liable, en porte
// l'indice ; infobulle, {colonnes, lignes}, une ligne du jumeau par ligne
@@ -36,7 +41,7 @@
// pointée, par son rang à partir de 1. Chaque marque porte data-marque.
import { getContext } from 'svelte';
import Graphique from './Graphique.svelte';
- import { ESPACE_PX, cibleLigne, dispositionBarres } from './pointage.js';
+ import { ESPACE_PX, TRAIT_CONTOUR_PX, cibleLigne, dispositionBarres } from './pointage.js';
let {
graphique,
@@ -127,15 +132,29 @@
{ligne.secondaire.texte}
{/if}
{#each ligne.segments as segment (segment.colonne)}
-
+ {#if segment.contour}
+
+ {:else}
+
+ {/if}
{/each}
{/each}
@@ -146,6 +165,10 @@