mirror of
https://github.com/IliesAllali/parenthese.git
synced 2026-11-11 08:02:17 +00:00
Avant, la famille d'un conjoint (ses parents, sa fratrie, ses ancêtres) était posée au premier créneau libre, souvent au bout de l'arbre, et la filiation devenait une pastille « Voir ». L'arbre se lisait comme plusieurs arbres reliés par des pastilles. Maintenant chaque famille de conjoint est construite entière depuis son ancêtre le plus haut et collée au conjoint, de son côté, en poussant les voisins pour faire la place. Le conjoint est tourné vers l'extérieur de sa fratrie ; sa propre fratrie est dessinée en miroir s'il faut qu'il finisse au bout, contre le couple ; un enfant déjà dessiné ailleurs garde une place fantôme dans l'ordre de sa fratrie pour le centrage. Les lignées de la personne de référence sont dessinées d'abord (le sang gagne) ; une famille reliée deux fois (cousins, deux grandes lignées) n'est dessinée qu'une fois, l'autre filiation reste une pastille si son fil croiserait une famille ; une famille qu'il faudrait pousser de plus d'un écran est posée à part. L'ordre des lignées ne dépend plus des effectifs (rangée, année, identifiant). Les lignes de fratrie s'emboîtent : la ligne d'une famille qui en entoure une autre passe au-dessus (_railLift posé par le placement, plus de hachage), plus aucune superposition. Mesuré par le banc (tools/layout-bench) : pastilles 4 → 2 sur une famille réelle de 385 personnes, 78 → 12 sur une descendance fictive de 1 454 ; les 14 archétypes passent leurs invariants, Marc et Nadia et l'issue #67 sans aucune pastille ni croisement. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
layout-bench
Banc du placement de l'arbre, sur le code de production (computeBlockLayout), sans écran. Plus une sonde de performance, un scénario de bout en bout du parcours compte et un audit de la landing.
Installation
npm i
Ce qu'on mesure, et dans quel ordre
La beauté d'un arbre ne se score pas, ses défauts se comptent. Quatre étages, lus dans l'ordre, jamais additionnés.
- Invariants (
invariants.mjs), doivent valoir zéro sinon le placement est faux. Chevauchement, couple non adjacent ou sur deux rangées, fratrie coupée par un étranger ou hors de l'ordre choisi, rangée différente de la génération de parenté (recalculée ici depuis la personne de référence : conjoint 0, parent −1, enfant +1), médianes des années de naissance qui redescendent d'une rangée à l'autre. Les conflits de parenté (cousins de degrés différents, oncle et nièce) sont une propriété des données, pas un défaut du placement. - Défauts sur le tracé réel (
defects.mjs), comptés sur la géométrie detraceSibship(descente de l'union, ligne de fratrie, descente sur l'enfant), pas sur des segments droits. Dans l'ordre : renvois (filiations en pastilles, et le degré de parenté à la référence du plus proche), lignes de fratrie au-dessus d'un portrait étranger, croisements, lignes plus larges qu'un écran, foyers plus larges qu'un écran, proches à deux degrés de la référence visibles dans un écran. Le rapport liste les foyers les plus étendus, jamais une moyenne. - Archétypes (
archetypes.mjs,ascii.mjs), une douzaine de petits arbres, un par situation (ordre d'une fratrie, issue #67, branche courte, Marc et Nadia, petit conjoint, fratrie de douze, remariage, cousins, oncle et nièce, parent seul, adoption, deux familles, belle-famille, trois familles enchaînées). Chacun a un rendu texte validé une fois à l'œil, dansfrontend/src/components/galaxy/__snapshots__/archetypes/, qui sert de témoin en CI (archetypes.test.js). Un placement qui change un témoin doit être relu, puisvitest -u. - Stabilité (
perturb.mjs), retirer une feuille ne devrait déplacer que son foyer. On compte les nœuds qui bougent de plus de 40 px.
La largeur totale ne départage qu'une égalité parfaite. Pas de score composite, pas de capture pendant le travail : l'app une fois, à la recette.
Lancer
npm run bench: tous les archétypes,desc-3etasc-23(arbres fictifs générés,gen-fr.mjs), et chaquefixtures/*.json.npm run bench -- issue-67 desc-3pour choisir.ASCII=1imprime le rendu texte des archétypes.PERTURB=0saute la stabilité (lente sur les gros arbres).SRC=<dossier frontend/src> TAG=<nom>mesure une autre version du code (un autre worktree) et nomme le rapport.npm run diff -- <tag A> <tag B>compare deux rapports, arbre par arbre.- Sorties dans
out/:rapport-<tag>.json,<archétype>.txt,<arbre>.svgpour les gros arbres.
Arbres
- Archétypes : dans le dépôt, personnes fictives.
- Fictifs :
node gen-fr.mjs <asc|desc> <sortie.json> [graine], ou directementasc-<graine>etdesc-<graine>dans le banc.ascimite ce qu'importe un généalogiste (12 générations, fratries d'ancêtres, mariages entre cousins réglables parIMPLEX),descce qu'une famille saisit à la main (un couple fondateur, sa descendance, une belle-famille sur trois). - Réels :
TREE_PASSWORD='...' npm run fixture -- <slug> [nom]récupère un arbre par le chemin visiteur dansfixtures/<nom>-graph.json. Le dossierfixtures/est ignoré par git : ce sont les données d'une famille, elles ne quittent pas votre machine.
Performance, parcours compte, landing
TREE_PASSWORD='...' node perf-probe.mjs <url d'un arbre>: temps main thread par frame au repos, en drag et en zoom, appels canvas par frame, profil CPU. Brave ou Chrome headless piloté en CDP.node e2e-account.mjs <front> <api>: scénario complet sur un backend local (lien partagé, compte créé, rattachement, contributions).CLEANUP=1supprime l'arbre de test.node landing-check.mjs <url>: titres, liens, formulaires et erreurs JS d'une page, avec capture.