Commit graph

154 commits

Author SHA1 Message Date
40bdfc7d77 [UPD] captures: redesigned screens, walkthrough checks a warning action
The walkthrough images and their manifest show the redesigned screens,
and the README regenerates from them. Before step 04 is captured, the
walkthrough now checks that the warning zone does not scroll and that
« Ouvrir les tables » sits inside it: a capture only refreshes when the
step's text changes, so a layout regression could hide behind an old
image. Print captures are unchanged.
Checked: node 4012, browser 872, long 105, walkthrough 34/34.

--- FR ---

[UPD] captures : écrans refondus, le parcours vérifie l'action d'un avis

Les images du parcours et leur manifeste montrent les écrans refondus,
et le README s'en régénère. Avant la capture de l'étape 04, le parcours
vérifie que la zone des avis ne défile pas et que « Ouvrir les tables »
y tient : une capture ne se renouvelle que si le texte de l'étape
change, une régression de mise en page pourrait se cacher derrière une
image ancienne. Les captures imprimées ne changent pas.
Vérifié : node 4012, navigateur 872, long 105, parcours 34/34.

Assisted-by: Claude Opus 5.5
2026-10-11 02:14:20 -04:00
16a7abbedc [FIX] event header: a lone warning shows its action without scrolling
A four-line warning with its action needed 132 px in the header's side
zone, capped at 7.25rem, so « Ouvrir les tables » hid below the fold. A
zone holding a single warning now grows to 10rem, five lines plus the
action; several warnings keep the lower cap, so the plan loses no more.
Checked: 1, 4 and 13 missing places at 1366 and 1024 px, the action
inside the visible zone; node 4012, browser 872.

--- FR ---

[FIX] en-tête : un avis seul montre son action sans défilement

Un avis de quatre lignes et son action demandaient 132 px dans la zone
latérale de l'en-tête, bornée à 7,25rem : « Ouvrir les tables » restait
caché. Une zone qui ne porte qu'un avis monte à 10rem, cinq lignes et
l'action ; plusieurs avis gardent la borne basse, le plan ne perd rien
de plus. Vérifié : 1, 4 et 13 places manquantes à 1366 et 1024 px,
l'action dans la zone visible ; node 4012, navigateur 872.

Assisted-by: Claude Opus 5.5
2026-10-11 01:53:47 -04:00
6f7cd3511b [FIX] event header, proposals: unclipped warning, wider proposal column
The header warning sat in a zone that could not grow past the header
content, so a five-line warning lost its last line at 1366 x 700. The
zone now takes part in the layout: the header grows with it up to
7.25rem, then the zone scrolls; under a 70rem header it drops below at
full width. The proposal cell gets a 14rem minimum, so the kept row no
longer wraps word by word. Checked: node 4012, browser 868.

--- FR ---

[FIX] en-tête, propositions : avis jamais rogné, colonne plus large

L'avis de l'en-tête vivait dans une zone qui ne dépassait pas le contenu
de l'en-tête : un avis de cinq lignes perdait sa dernière à 1366 x 700.
La zone prend part à la mise en page : l'en-tête grandit avec elle
jusqu'à 7,25rem, puis elle défile ; sous un en-tête de 70rem, elle passe
dessous en pleine largeur. La cellule de proposition prend 14rem au
moins, la ligne retenue ne se replie plus mot à mot.
Vérifié : node 4012, navigateur 868.

Assisted-by: Claude Opus 5.5
2026-10-11 01:45:15 -04:00
27f652c732 [UPD] spec: redesign of the screens, tints, pills, mode band, phases
The spec describes what each screen shows, so the redesign changes its
text: the token families, membership tints limited to lists, pill
anatomy, the bounded exception to render-only contrast checks, the
event list header and state tiles, the mode band, phase navigation,
state steps, grouped proposal headers and import message classes.
Checked: the full suites pass except the walkthrough capture gaps.

--- FR ---

[UPD] spec : refonte des écrans, teintes, pastilles, bande, phases

Le spec décrit ce que montre chaque écran, la refonte change donc son
texte : les familles de jetons, les teintes d'appartenance réservées aux
listes, l'anatomie d'une pastille, l'exception bornée à l'épreuve par
rendu, l'en-tête et les tuiles de la liste, la bande de mode, la
navigation par phase, les étapes d'état, les en-têtes groupés des
propositions et les classes de messages de l'import.
Vérifié : séries complètes vertes hors écarts de captures du parcours.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
c6082c3af2 [IMP] proposals, generation, badges, preview: cards and grouped headers
The proposal table had a dozen measure columns with no grouping. Five
group headers now gather neighbouring measures without changing any
column text; numbers align right in tabular figures, and the kept
placement row wears the Retenu tint and a « retenue » pill. Generation
settings and progress, badges and the paper choice become cards, each
paper a distinct choice; the preview toolbar groups its commands. The
printed paper is unchanged. Checked: node 172, browser 162.

--- FR ---

[IMP] propositions, génération, badges, aperçu : cartes, intitulés

Le tableau des propositions alignait une douzaine de mesures sans
groupe. Cinq intitulés de groupe réunissent les mesures voisines sans
changer le texte d'aucune colonne ; les nombres s'alignent à droite en
chiffres tabulaires, la ligne du retenu porte la teinte Retenu et une
pastille « retenue ». Réglages et avancement, badges et papier
deviennent des cartes, chaque papier un choix distinct ; la barre de
l'aperçu groupe ses commandes. Le papier imprimé ne change pas.
Vérifié : node 172, navigateur 162.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
901095a1ef [IMP] plan and diagnostic: grouped toolbar, card panels, bounded tooltip
The plan's chrome mixed view controls with panels of the same weight.
The toolbar groups round, zoom and views; side panels, the reserve and
the work lists become cards. A seat tooltip, like a refusal on a seat,
stays inside the plan frame and flips side rather than cover the next
panel. The diagnostic groups its statements into one card per colliding
membership, in the same order. The drawing keeps its colours and shapes.
Checked: node 231, browser 137, 6 mutations caught.

--- FR ---

[IMP] plan et diagnostic : barre groupée, panneaux en cartes, infobulle

L'habillage du plan mêlait commandes de vue et panneaux de même poids.
La barre groupe tour, zoom et vues ; panneaux, réserve et listes de
travail deviennent des cartes. L'infobulle d'un siège, comme un refus
sur une place, reste dans le cadre du plan et change de côté plutôt que
de couvrir le panneau voisin. Le diagnostic groupe ses énoncés en une
carte par appartenance en collision, sans changer l'ordre. Le dessin
garde couleurs et formes. Vérifié : node 231, navigateur 137.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
c4130d3b5e [IMP] participants, tables, import: counts, membership pills, messages
Long participant lists were hard to scan by organisation. The list now
opens on counts and a legend of memberships, each with its headcount;
the grid shows a membership as a pill of its tint, the expected title
and the exclusion as icon pills, and row commands wrap without breaking
their labels at 1024 px. The import preview and report class each
message as refus, avis or information. Editing and shortcuts are as
before. Checked: node 144, browser 117, 9 mutations caught.

--- FR ---

[IMP] participants, tables, import : comptes, pastilles, messages

Une longue liste se parcourait mal par organisation. Elle s'ouvre sur
des comptes et une légende des appartenances avec leur effectif ; la
grille montre l'appartenance en pastille de sa teinte, le titre
pressenti et l'exclusion en pastilles à icône, et les commandes de ligne
passent à la ligne sans casser leur libellé à 1024 px. L'aperçu et le
rapport d'import classent chaque message en refus, avis ou information.
L'édition et les raccourcis ne changent pas. Vérifié : node 144,
navigateur 117, 9 mutations prises.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
8b69b63a32 [IMP] event screen: header card, state steps, mode band, phase tabs
The event screen showed its states and sections as flat button rows. A
header card now carries the name, the counts and the fixed « Modifier »
place; the four plan states read as steps; sections group into
Préparer, Placer and Produire. A band under the app header states the
mode edge to edge and names the command that leaves it; the mode frame
stays around the work surface. A warning's action is no longer clipped.
Checked: evenement node and browser tests, 7 mutations caught.

--- FR ---

[IMP] écran d'événement : carte d'en-tête, étapes, bande de mode, phases

L'écran montrait ses états et ses sections en rangées de boutons plates.
Une carte d'en-tête porte le nom, les comptes et la place fixe de
« Modifier » ; les quatre états du plan se lisent en étapes ; les
sections se groupent en Préparer, Placer et Produire. Une bande sous le
bandeau dit le mode de bord à bord et nomme la commande qui en sort ; le
cadre de mode reste autour de la surface. L'action d'un avertissement
n'est plus rognée. Vérifié : node et navigateur, 7 mutations prises.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
229a2d4067 [IMP] event list: summary, state filter tiles, table grouped by state
The list gave every event the same weight, so a manager could not see at
a glance what was still in draft or already printed. A header now sums
events and participants; one tile per plan state, in the § 9 order,
filters the table and holds only for the session; rows group by state or
not at all, under grouped column headers. Each « Ouvrir » is named after
its event, and messages take the avis, refus or information tone. The
cards sit under the table: a sidebar does not fit beside nine columns.
Checked: accueil node and browser tests, 8 mutations caught.

--- FR ---

[IMP] liste des événements : résumé, tuiles par état, groupes par état

La liste donnait à chaque événement le même poids : on ne voyait pas
d'un coup d'œil ce qui restait en brouillon ou déjà imprimé. Un en-tête
compte événements et participants ; une tuile par état du plan, dans
l'ordre du § 9, filtre le tableau le temps de la séance ; les lignes se
groupent par état ou pas, sous des en-têtes groupés. Chaque « Ouvrir »
porte le nom de son événement, les messages prennent le ton avis, refus
ou information. Les cartes passent sous le tableau, faute de place.
Vérifié : épreuves node et navigateur de l'accueil, 8 mutations prises.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
16e328ab12 [FIX] card primitive: no blank between the icon and the title text
A titled card rendered a whitespace text node before its title, so the
heading's text began with a space and a lookup of the title text inside
the heading missed it. The layout is flex, so nothing visible changes.
Checked: the cross-screen test that finds a step's title passes.

--- FR ---

[FIX] primitive carte : aucun blanc entre l'icône et le texte du titre

Une carte titrée rendait un nœud de blanc devant son titre : le texte de
l'intitulé commençait par une espace et la recherche du titre dans
l'intitulé échouait. La mise en page est en flex, rien de visible ne
change. Vérifié : l'épreuve transversale qui trouve le titre d'une étape
passe.

Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
4d34039f47 [ADD] interface: visual foundations, pills, cards, icons, navy header
Screens need colour that separates information without ever carrying it
alone. Tokens gain state, membership and status tints whose marks hold
3:1 and texts 4.5:1 in both themes and under three dichromacies, and
every hue stays 30 degrees from the reserved conflict hues. Commands get
three levels; Pastille, Carte and an icon module join the primitives;
memberships map to six stable tints over sorted names. A pill label
wraps and never truncates, and keeps one line beside a nowrap neighbour.
Checked: node 3949; browser 767, only the walkthrough captures differ.

--- FR ---

[ADD] interface : fondations, pastilles, cartes, icônes, bandeau marine

Les écrans ont besoin d'une couleur qui distingue l'information sans
jamais la porter seule. Les jetons gagnent des teintes d'état,
d'appartenance et de statut dont les marques tiennent 3:1 et les textes
4,5:1 dans les deux thèmes et sous trois dichromaties, chaque teinte à
30 degrés des teintes de conflit réservées. Les commandes ont trois
niveaux ; Pastille, Carte et un module d'icônes rejoignent les
primitives ; les appartenances reçoivent six teintes stables sur les
noms triés. Un libellé de pastille se replie, jamais tronqué.
Vérifié : node 3949 ; navigateur 767, seules les captures du parcours.

Assisted-by: Claude Opus 5.5
2026-10-10 22:59:59 -04:00
73d08294f5 [FIX] local settings: an unreadable or unwritable file no longer blocks
An unreadable reglages_locaux.json, or a folder that refused to write it,
refused the paper choice, so no badge sheet or preview could be produced
on that machine. The chosen paper now holds for the session on that
working folder, in memory, and the file is never overwritten. On that
folder it wins over a stale paper still in the file; the first settings
write that succeeds there retains it and withdraws the warning. The
warning names the file and no longer promises defaults never written.
Checked: node 3918, browser 773; each fix red under the previous code.

--- FR ---

[FIX] réglages locaux : un fichier illisible ou non écrit ne bloque plus

Un reglages_locaux.json illisible, ou un dossier qui refusait de l'écrire,
refusait le choix du papier : ni planche ni aperçu sur cette machine. Le
papier choisi vaut désormais pour la séance sur ce dossier de travail, en
mémoire, et le fichier n'est jamais écrasé. Sur ce dossier, il l'emporte
sur un papier périmé du fichier ; la première écriture des réglages qui y
réussit le retient et retire l'avertissement. L'avertissement nomme le
fichier et ne promet plus de valeurs par défaut jamais écrites.
Vérifié : node 3918, navigateur 773 ; chaque correction rouge avant elle.

Assisted-by: Claude Opus 5.5
2026-10-10 20:20:04 -04:00
a50d3278f1 [IMP] tooling: late off-loopback requests, version gap shown in tests
A request leaving the loopback after the last browser capture went
unnoticed: the walkthrough now checks requests at its closing too, and a
test that both emits one and gets a collector error names the request.
The short cycle prints the gap between the manifest version and the build
in the node series, without failing, as the spec asks; a test proves the
line reaches the console. The documentation script detects a direct run
through realpath, and the bench reading reruns the README region test.
Checked: node 3903, browser 770, each fix red under its mutant.

--- FR ---

[IMP] outillage : requêtes hors boucle tardives, écart de version montré

Une requête sortie de la boucle locale après la dernière capture passait
inaperçue : le parcours relève les requêtes à sa clôture aussi, et une
épreuve qui en émet une avec une erreur du collecteur nomme la requête.
Le cycle court affiche dans la série node l'écart entre la version du
manifeste et la construction, sans échouer, comme le veut la spec ; une
épreuve prouve que la ligne atteint la console. Le script de documentation
reconnaît l'appel direct par realpath, et le relevé du banc relance
l'épreuve de la région du README.
Vérifié : node 3903, navigateur 770, chaque correction rouge sous son mutant.

Assisted-by: Claude Opus 5.5
2026-10-10 20:17:25 -04:00
9a2c8c20f3 [FIX] plan preview: drag ghost effect, page fallback, sheet border
The drag ghost now states what releasing does where the default said
otherwise: a person with no reservation changes nothing, and the floor
under the retained plan removes the person from the tour. A long event
name no longer throws in the plan preview: the cut falls back to the
orientation that still has room, and throws only when neither has. The
on-screen sheet draws its edge as an inset outline, so the content zone
is as wide as on paper. The unused page cut of the preview model is gone.
Checked: node 3899, browser 769; captures 22 and 23 republished.

--- FR ---

[FIX] aperçu du plan : effet du fantôme, repli de page, bord de feuille

Le fantôme du glisser dit ce que fait le relâcher là où le défaut disait
autre chose : une personne sans réservation ne change rien, et le sol
sous le retenu la retire du tour. Un long nom d'événement ne fait plus
lever l'aperçu du plan : la découpe se replie sur l'orientation qui a la
place, et ne lève que si aucune ne l'a. La feuille à l'écran trace son
bord en contour intérieur : la zone de contenu a la largeur du papier.
La découpe inutilisée du modèle de l'aperçu disparaît.
Vérifié : node 3899, navigateur 769 ; captures 22 et 23 republiées.

Assisted-by: Claude Opus 5.5
2026-10-10 20:14:18 -04:00
7c9b708cc9 [FIX] badges: injective sheet file names, a reissue never overwrites
Two propositions with the same timestamp, or the by-table order, gave the
same file name, so one badge sheet silently replaced another. The name now
carries -p<id> for a proposition and _table for the by-table order; the
unmarked retained alphabetical name is unchanged. A reissue, or a name cut
to fit under a long folder, takes the first free rank and never replaces a
file; a folder that cannot be listed refuses first. A faulty proposition is
refused with its own message. The control sheet names its source.
Checked: node 3896, browser 767, long 105; captures 24 and 25 republished.

--- FR ---

[FIX] badges : noms de planche injectifs, une réédition n'écrase rien

Deux propositions au même horodatage, ou l'ordre par table, donnaient le
même nom : une planche en remplaçait une autre sans un mot. Le nom porte
-p<id> pour une proposition et _table pour l'ordre par table ; le nom du
retenu alphabétique ne change pas. Une réédition, ou un nom raccourci sous
un dossier long, prend le premier rang libre et n'écrase rien ; un dossier
qui ne se liste pas refuse d'abord. Une proposition fautive a son refus.
La feuille de contrôle nomme sa source.
Vérifié : node 3896, navigateur 767, long 105 ; captures 24 et 25 republiées.

Assisted-by: Claude Opus 5.5
2026-10-10 20:09:25 -04:00
3db0bb138c [UPD] spec: paper written at the gesture, word cut, registry fields
Three passages contradicted the code. Section 8.5 said every local
setting is written late; only the framing is, and the paper is written
at the gesture that chooses it, both through one queue that rereads the
file. Section 7.4 said a row always breaks at a word; a word longer than
a page breaks between two characters, never inside a grapheme. Section
14.1 placed each constant's rationale in a comment; it lives in the
registry entry's fields.
Checked: version check conforms; every sentence read against the code.

--- FR ---

[UPD] spec : papier écrit au geste, coupe des mots, champs du registre

Trois passages contredisaient le code. Le § 8.5 disait chaque réglage
local écrit en différé ; seul le cadrage l'est, et le papier s'écrit au
geste qui le choisit, les deux par une même file qui relit le fichier.
Le § 7.4 disait une ligne toujours coupée à un mot ; un mot plus long
qu'une page se coupe entre deux caractères, jamais dans un graphème. Le
§ 14.1 mettait la raison de chaque constante en commentaire ; elle vit
dans les champs de son entrée du registre.
Vérifié : contrôle de version conforme ; chaque phrase relue sur le code.

Assisted-by: Claude Opus 5.5
2026-10-10 18:54:27 -04:00
f2cbad29df [ADD] captures: headless mode, preview bar and machine identity checked
Three capture rules held only by convention. The browser project must
run headless, MODE_AFFICHAGE names that mode, and a screenshot refuses
a page whose user agent is not headless. Captures 22 and 23 assert the
preview bar has scrolled out of the frame before they are taken.
Publishing refuses a text carrying the machine's host or user name, or
an instant outside the driven clock; the checks are shown red on
invented names, and the default identity is read from node:os.
Checked: 3883 node and 767 browser tests from the index alone.

--- FR ---

[ADD] captures : mode sans tête, barre de l'aperçu, identité de machine

Trois règles des captures ne tenaient que par convention. Le projet
navigateur tourne sans tête, MODE_AFFICHAGE nomme ce mode, et une
capture refuse une page dont l'agent n'est pas sans tête. Les captures
22 et 23 vérifient que la barre de l'aperçu est sortie du cadre. La
publication refuse un texte qui porte le nom d'hôte ou d'utilisateur de
la machine, ou un instant hors de l'horloge pilotée ; montré rouge sur
des noms inventés, l'identité par défaut lue de node:os.
Vérifié : 3883 node et 767 navigateur depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 18:54:15 -04:00
55765e93c2 [ADD] documentation: verifier checks every cited image against the disk
verifier read no image: an older PNG published under an unchanged
manifest, or an image outside doc/captures cited by the guide, left
every series green. It now refuses any image a carrier cites outside
doc/captures/<name>.png, in every Markdown or HTML form, and checks each
cited capture's hash and size against its manifest entry. When every
carrier is read, a manifest entry no carrier cites is a fault too; a
check narrowed by --porteur does not judge the carriers it skips.
Checked: 3877 node tests from the index alone; verifier at 0 fault.

--- FR ---

[ADD] documentation : verifier confronte chaque image citée au disque

verifier ne lisait aucune image : un PNG plus ancien publié sous un
manifeste inchangé, ou une image hors de doc/captures citée par le
guide, laissaient toutes les séries vertes. Il refuse désormais toute
image citée hors de doc/captures/<nom>.png, sous chaque forme Markdown
ou HTML, et confronte l'empreinte et la taille de chaque capture citée à
son entrée du manifeste. Quand tous les porteurs sont lus, une entrée
que nul ne cite est une faute ; restreint par --porteur, il ne juge pas
les porteurs qu'il ne lit pas.
Vérifié : 3877 node depuis l'index seul ; verifier à 0 faute.

Assisted-by: Claude Opus 5.5
2026-10-10 18:52:00 -04:00
aaa2c1a3a7 [IMP] mutation: count long-series kills apart, test the audit end to end
A mutant the node series missed but the long series killed was still
counted as a survivor, so the committed audit overstated what escapes
the tests. It now has its own column: 15 of the 137 survivors move
there, leaving 122; the committed files are regenerated from their own
results, without a rerun. The audit itself now runs in the long series
on a small fixture tree: long-series replay, exit code 0 with
survivors, exit 2 and nothing written when the baseline fails. The
committed audit files are read back and must match what rediger writes.
Checked: 3868 node and 105 long tests from the index alone.

--- FR ---

[IMP] mutation : tués par la série longue à part, audit éprouvé entier

Un mutant que la série node manquait et que la série longue tuait
comptait encore comme survivant : l'audit commis surestimait ce qui
échappe aux épreuves. Il a sa colonne : 15 des 137 survivants y passent,
il en reste 122 ; les fichiers commis sont réengendrés de leurs propres
résultats, sans rejeu. L'audit tourne entier dans la série longue sur un
petit arbre : rejeu long, sortie 0 avec survivants, sortie 2 et rien
d'écrit quand la ligne de base tombe. Les fichiers commis sont relus et
doivent égaler ce que rediger écrit.
Vérifié : 3868 node et 105 longues depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 18:51:43 -04:00
171de56c4e [ADD] guards: single print door, one core count reader, coverage flag
Three rules of the spec had no guard. Printing could bypass the preview:
now only the preview reads the 'imprimante' context, and no module of
the interface or application layers calls print or imprimer. Only the
entry module reads hardwareConcurrency. The coverage command must pass
--reporter=default, so the capped reporter never measures the
instrumented series. Each guard names the offending line, skips strings
and comments, and is shown red on a demonstration tree.
Checked: 3860 node tests from the index alone.

--- FR ---

[ADD] gardes : porte d'impression unique, cœurs lus une fois, rapporteur

Trois règles du spec n'avaient pas de garde. L'impression pouvait
contourner l'aperçu : seul l'aperçu lit désormais le contexte
« imprimante », et aucun module de l'interface ni de l'application
n'appelle print ou imprimer. Seul le module d'entrée lit
hardwareConcurrency. La commande de couverture passe --reporter=default,
pour que le rapporteur plafonné ne mesure jamais la série instrumentée.
Chaque garde nomme la ligne fautive, ignore chaînes et commentaires, et
rougit sur un arbre de démonstration.
Vérifié : 3860 node depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 18:51:03 -04:00
0af6aca64f [ADD] badges: tests that fonts are subset and cut lines are thin
Nothing checked that the sheet embeds font subsets rather than whole
fonts, nor how thick its cut lines are: subset: false or 5 pt lines left
the series green. The PDF reader used by the tests now reports each
embedded font program's length and each stroke's width in millimetres
under the current matrix. The sheet's programs must weigh under a tenth
of their .ttf, and every cut line at most 0.1 mm, in A4 and Letter.
Checked: 3856 node tests from the index alone; both mutants caught.

--- FR ---

[ADD] badges : épreuves des sous-ensembles de police et des filets fins

Rien ne vérifiait que la planche embarque des sous-ensembles de police
plutôt que les polices entières, ni l'épaisseur de ses filets : subset
false ou des filets de 5 pt laissaient la série verte. Le lecteur de PDF
des épreuves rend la longueur de chaque programme de police embarqué et
l'épaisseur de chaque trait en millimètres sous la matrice courante. Les
programmes pèsent moins du dixième de leur .ttf, et chaque filet au plus
0,1 mm, en A4 et en Lettre.
Vérifié : 3856 node depuis l'index seul ; les deux mutants tombent.

Assisted-by: Claude Opus 5.5
2026-10-10 18:50:40 -04:00
6dd2762d8e [UPD] spec: iteration 4 amendments, changelog for the badge sheet
The spec described several print and bench behaviours as planned rather
than as built: page cuts, table sheets split into tour groups, rows
continued across pages, the bench reading limited to the machine class,
the adopted thresholds, and capture inputs rasterised from the PDF.
Each amendment now states what the committed code does. The capture
manifest photographs both 07a captures on the large demo, as the walk
does. The changelog lists the badge sheet, print preview and guide.
Checked: 3852 node and 766 browser tests; version check conforms.

--- FR ---

[UPD] spec : amendements de l'itération 4, journal de la planche

Le spec décrivait plusieurs comportements de l'impression et du banc
comme prévus plutôt que comme bâtis : coupe en pages, feuilles par table
en groupes de tours, lignes continuées, relevé réduit à la classe de
machine, seuils adoptés, entrées des captures tirées du PDF. Chaque
amendement dit désormais ce que fait le code commis. Le manifeste
photographie les deux 07a sur la grande démonstration, comme le
parcours. Le journal annonce la planche, l'aperçu et le guide.
Vérifié : 3852 node et 766 navigateur ; contrôle de version conforme.

Assisted-by: Claude Opus 5.5
2026-10-10 17:27:41 -04:00
13bf16b5be [REF] interface: read every key through the shortcut table
Twelve components still compared key names themselves, so the shortcut
table could drift from what they actually did; a guard listed them as
pending. Each now reads its effect from RACCOURCIS through effetDe, the
pending list and its guard are removed, and the generated shortcut
table is unchanged. The keys the old guard pinned without a behaviour
test (Escape on the plan root with no active element, ArrowLeft in the
grid, and those of the participant and table lists) each gain one.
Checked: 3852 node, 766 browser, 101 long tests, from the index alone.

--- FR ---

[REF] interface : chaque touche lue par la table des raccourcis

Douze composants comparaient encore eux-mêmes les noms de touches : la
table des raccourcis pouvait s'écarter de ce qu'ils faisaient, et une
garde les tenait en attente. Chacun lit désormais son effet dans
RACCOURCIS par effetDe ; la liste d'attente et sa garde disparaissent,
la table engendrée ne change pas. Les touches que l'ancienne garde
figeait sans épreuve de comportement (Échap sur le plan sans élément
actif, flèche gauche dans la grille, listes des personnes et des
tables) en reçoivent chacune une.
Vérifié : 3852 node, 766 navigateur, 101 longues, depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 17:25:03 -04:00
8f1edc83c7 [ADD] badges: tests for control page wrapping, margins and imposition
No test covered how the control page wraps its lines at spaces, its
margins on a continuation page, the second imposition value or the
default order a sheet takes when none is given. Twelve mutants of the
sheet producer and of its session layer survived; each is now caught
by one test. The margin cases need the full control sheet and run in
the long series. No source file changes.
Checked: 3855 node and 101 long tests, from the index alone.

--- FR ---

[ADD] badges : épreuves du repli, des marges et de l'imposition

Aucune épreuve ne couvrait le repli des lignes de la feuille de
contrôle aux espaces, ses marges sur une page de suite, l'autre valeur
d'imposition ni l'ordre par défaut d'une planche. Douze mutants de la
production et de sa couche de séance survivaient ; chacun tombe
désormais sous une épreuve. Les marges exigent la feuille de contrôle
pleine et vivent dans la série longue. Aucun fichier source ne change.
Vérifié : 3855 node et 101 longues, depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 17:22:35 -04:00
01b5582f62 [FIX] print: continue overlong rows across pages, adopt bench values
A row taller than a page, on the table sheet or the welcome list, was
clipped by its page's content zone. It now continues piece by piece on
the next sheets under the repeated header, each cell's text once and in
order. SEUIL_SIEGES_LISIBLES (18 places) and TOLERANCE_CHAINE_TEMOIN
(0.011) move from working default to measured, matching the committed
bench reading. The walkthrough checks that leaving the read-only mode
writes only the badge PDF and the local paper setting.
Checked: 3853 node, 761 browser, 101 long tests, from the index alone.

--- FR ---

[FIX] impression : lignes trop hautes continuées, banc adopté

Une ligne plus haute qu'une page, sur la feuille par table ou la liste
d'accueil, était rognée par la zone de contenu. Elle se continue
désormais par morceaux sur les feuilles suivantes, sous l'en-tête
répété, chaque texte une fois et dans l'ordre. SEUIL_SIEGES_LISIBLES
(18 places) et TOLERANCE_CHAINE_TEMOIN (0,011) passent de défaut de
travail à mesurées, d'accord avec le relevé commis. Le parcours vérifie
que sortir de la lecture seule n'écrit que le PDF et le papier local.
Vérifié : 3853 node, 761 navigateur, 101 longues, depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 17:21:55 -04:00
c69c0f320b [ADD] bench: make banc orchestrator, first reading and constants table
`make banc` runs the node and browser measures, assembles releve.json in
the registry's order and fails when a measure is missing, a harness
check falls, a text measure is not in Noto Sans, or the time per image
is not held. It prints values to adopt and never edits constantes.js; ρ
is reported but stays at its working default on the reference machine.
Each bench constant cites the CPU slowdown of its own measure. The
reading names the machine class only: identifying keys, accented or
camelCase, and account paths are refused.
Checked: node 3836, browser 758, node-long 101; make banc exits 0.

--- FR ---

[ADD] banc : orchestrateur make banc, premier relevé, constantes

`make banc` lance les mesures node et navigateur, assemble releve.json
dans l'ordre du registre et échoue sur une mesure manquante, un contrôle
du harnais tombé, une mesure de texte hors Noto Sans ou un temps par
image non tenu. Il imprime les valeurs à adopter sans toucher
constantes.js ; ρ est relevé mais reste à son défaut de travail. Chaque
constante du banc cite le ralentissement de sa propre mesure. Le relevé
ne nomme que la classe de machine : clés identifiantes, accentuées ou
camelCase, et chemins de compte sont refusés.
Vérifié : node 3836, navigateur 758, longues 101 ; make banc sort en 0.

Assisted-by: Claude Opus 5.5
2026-10-10 15:31:25 -04:00
cb89060e34 [ADD] captures: badge control page and first sheet, rasterised from PDF
The walkthrough produces the retained plan's badge sheet through the
Badges section and rasterises the PDF under node with pdfjs at 96 dpi:
page 1 becomes the control page, page 2 the first sheet of four A6.
Manifest entries carry the PDF's sha256, so an unchanged PDF leaves the
images unchanged; two productions under the driven clock must hash the
same, and a missing canvas fails the step by name with nothing written.
No capture remains pending.
Checked: node 3787, browser 758, node-long 101 from the index alone.

--- FR ---

[ADD] captures : feuille de contrôle et planche, tramées du PDF

Le parcours produit la planche du retenu par la section Badges et trame
le PDF sous node par pdfjs à 96 ppp : la page 1 donne la feuille de
contrôle, la page 2 la première planche de quatre A6. Les entrées du
manifeste portent le sha256 du PDF : un PDF inchangé laisse les images
inchangées ; deux productions sous l'horloge pilotée ont même empreinte,
et un canevas absent fait échouer l'étape en le nommant, rien d'écrit.
Plus aucune capture n'est à venir.
Vérifié : node 3787, navigateur 758, longues 101 depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 14:36:21 -04:00
b72f3fe784 [ADD] captures: print preview of a draft and of the retained plan
The walkthrough photographs the printed plan twice from the same scroll
position: a proposal not retained carries BROUILLON and its own footer,
the retained plan carries neither watermark nor proposal timestamp. The
visible condition is judged on the whole box of each element, so a
label cut at the window edge fails the walkthrough; capture 19 now aims
at a seat that keeps the ghost and its label inside the plan. A failed
preview step closes the preview before the next tests run.
Checked: node 3777, browser 756, node-long 101 from the index alone.

--- FR ---

[ADD] captures : aperçu imprimé d'un brouillon et du placement retenu

Le parcours photographie deux fois le plan imprimé au même défilement :
une proposition non retenue porte BROUILLON et son propre pied, le
retenu ne porte ni filigrane ni horodatage de la proposition. La
condition visible se juge sur la boîte entière de chaque élément : un
libellé coupé au bord de la fenêtre fait échouer le parcours ; la
capture 19 vise un siège qui garde le fantôme et son libellé dans le
plan. Un échec à l'aperçu le referme avant les épreuves suivantes.
Vérifié : node 3777, navigateur 756, longues 101 depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 13:37:50 -04:00
365561272e [ADD] print: real PDF output proven, table sheets split by tour groups
Printing goes through Chromium's PDF with the CSS page size; a browser
command reads the PDF under node and returns pages, MediaBox and text
only. The tests prove pages = sheets for the cut plan in A4 and Letter,
the paper size within 0.25 mm, BROUILLON and the placement timestamp on
every page of a draft and none of a retained plan. The startup trial
prints the preview through the real shell. A table sheet whose tours do
not fit side by side splits them into groups of consecutive tours, so a
long name wraps inside its page instead of being clipped.
Checked: node 3776, browser 753, node-long 101; startup trial conforms.

--- FR ---

[ADD] impression : PDF réel prouvé, feuilles par table en groupes

L'impression passe par le PDF de Chromium à la taille de page CSS ; une
commande lit le PDF sous node et ne rend que pages, MediaBox et textes.
Les épreuves prouvent pages = feuilles du plan découpé en A4 et Lettre,
le papier à 0,25 mm, BROUILLON et l'horodatage du placement sur chaque
page d'un brouillon et sur aucune d'un retenu. L'essai de démarrage
imprime l'aperçu par la vraie coquille. Une feuille par table dont les
tours ne tiennent pas côte à côte les répartit en groupes consécutifs :
un long nom passe à la ligne dans sa page au lieu d'être coupé.
Vérifié : node 3776, navigateur 753, longues 101 ; essai conforme.

Assisted-by: Claude Opus 5.5
2026-10-10 13:33:35 -04:00
e71879e852 [ADD] badges: event section to prepare, produce and reissue the sheet
The Badges section follows Propositions. It offers the retained plan by
default, or the proposal chosen in Propositions, which always prints as
BROUILLON; the announcement names the source, the imposition and the
page count before anything is written. The paper question is asked
once per machine, refusals sit beside « Produire » with their remedy,
and a new production clears the previous sheet's path. Section buttons
narrow so eight still fit one line at 1 366 px.
Checked: node 3769, browser 745, node-long 101 from the index alone.

--- FR ---

[ADD] badges : section pour préparer, produire et rééditer la planche

La section Badges suit Propositions. Elle offre le retenu par défaut,
ou la proposition choisie dans Propositions, toujours BROUILLON ;
l'annonce nomme la source, l'imposition et le nombre de pages avant
toute écriture. La question du papier se pose une fois par machine, les
refus se posent à côté de « Produire » avec leur remède, et une
nouvelle production efface le chemin de la précédente. Les boutons de
section s'amincissent : huit tiennent sur une ligne à 1 366 px.
Vérifié : node 3769, navigateur 745, node-long 101 depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 11:11:33 -04:00
62f8406d78 [ADD] print: welcome list and table sheets, paginated with headers
The welcome list sorts names by their normalised key and gives each
round a column whose width comes from the longest seat it holds; the
table sheet puts the rounds in columns, or one sheet per table and
round under « Une feuille par tour ». Rows are measured and paginated
with the header repeated, never split across pages; names wrap
instead of being cut. Read-only and locked plans print the same.
Checked: node 3753, browser 730, node-long 101 from the index alone.

--- FR ---

[ADD] impression : liste d'accueil et feuilles par table, paginées

La liste d'accueil trie les noms par leur clé normalisée et donne à
chaque tour une colonne large de la plus longue place qu'elle porte ;
la feuille par table met les tours en colonnes, ou une feuille par
table et par tour sous « Une feuille par tour ». Les lignes sont
mesurées et paginées sous l'en-tête répété, jamais coupées entre deux
pages ; les noms passent à la ligne plutôt que d'être tronqués. Un plan
en lecture ou verrouillé s'imprime de même.
Vérifié : node 3753, navigateur 730, node-long 101 depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 11:07:03 -04:00
e5d9026b2a [ADD] print: seating plan cut into pages, with cartouche and scale
The printed plan draws every table in seat mode with its name lists,
whatever the zoom, and drops screen gestures: no selection, focus,
grab handle or highlight reaches paper. Each page carries a cartouche
(page p of n, column, row) and references to its neighbours; the cut
uses the band measured under the footer. Print marks resolve their
colour tokens from the printed document, so a dark screen theme
leaves the paper light.
Checked: node 3721, browser 720, node-long 101 from the index alone.

--- FR ---

[ADD] impression : plan découpé en pages, avec cartouche et échelle

Le plan imprimé dessine chaque table en régime sièges, avec ses listes
de noms, quel que soit le zoom, et laisse les gestes à l'écran :
sélection, focus, poignée et mise en évidence n'atteignent pas le
papier. Chaque page porte un cartouche (page p sur n, colonne, rangée)
et ses renvois aux voisines ; la découpe prend la bande mesurée sous le
pied. Les marques lisent leurs jetons dans le document imprimé : un
thème sombre à l'écran laisse le papier clair.
Vérifié : node 3721, navigateur 720, node-long 101 depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 11:03:12 -04:00
9994858904 [ADD] docs: usage and Windows guides, with how the search works
An operator who did not write the software must be able to prepare an
evening alone. GUIDE-USAGE.md follows an evening step by step on the
published captures, with the seed and stop count that reproduce them, and
explains why two searches give two placements and how the ranking picks
the best one. GUIDE-WINDOWS.md covers installation and the portable mode.
README.md carries the generated contrast and constant tables, and a
delivery build fails when a generated region differs.
Checked: the guide's numbers are bounded in the tests; 3699 node and 101
long tests green from the index alone.

--- FR ---

[ADD] docs : guides d'usage et Windows, fonctionnement de la recherche

Une personne qui n'a pas écrit le logiciel doit pouvoir préparer une soirée
seule. GUIDE-USAGE.md suit une soirée pas à pas sur les captures publiées,
avec la graine et le compte d'arrêt qui les reproduisent, et explique
pourquoi deux recherches donnent deux placements et comment le classement
choisit le meilleur. GUIDE-WINDOWS.md couvre l'installation et le mode
portable. README.md porte les tableaux engendrés des contrastes et des
constantes, et une construction de livraison échoue quand une région diffère.
Vérifié : les nombres du guide sont bornés dans les épreuves ; 3699 node et
101 longues vertes depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 17:14:56 -04:00
1e5039af5b [ADD] audit: first engine mutation audit, survivors killed in tests
The audit must say how much of the engine its tests really check. Of 2576
mutants, 2171 are killed, 207 time out, 61 are declared equivalent with a
reason a reviewer can check, and 137 survive, listed by file, operator and
line; the ranking, indicators and ceiling modules have none left. New
tests in classement, indicateurs and plafond kill the survivors found
there, each red under its mutant.
Checked: 3677 node and 101 long tests green from the index alone.

--- FR ---

[ADD] audit : premier audit par mutation du moteur, survivants tués

L'audit doit dire combien du moteur ses épreuves vérifient vraiment. Sur
2576 mutants, 2171 sont tués, 207 dépassent leur délai, 61 sont déclarés
équivalents avec une raison qu'un relecteur vérifie, et 137 survivent,
listés par fichier, opérateur et ligne ; le classement, les indicateurs et
le plafond n'en ont plus. De nouvelles épreuves de classement, indicateurs
et plafond tuent les survivants trouvés là, chacune rouge sous son mutant.
Vérifié : 3677 node et 101 longues vertes depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 17:12:23 -04:00
416d91a88f [ADD] badges: prepare, produce and save the sheet from the session
The operator needs the badge sheet as a file next to the event, built
from what the session shows at that moment. The session prepares an
announcement (sheets per paper, counts, namesakes, missing glyphs, draft),
then produces the PDF through a single deferred import of the PDF code and
writes it atomically; under the web build it downloads instead. A gesture
started during production waits its turn. A proposal sheet is always a
draft, and an unwritable file or a missing paper choice gives its refusal
with a remedy.
Checked: red first; 3670 node, 707 browser and 101 long tests green from
the index alone.

--- FR ---

[ADD] badges : préparer, produire et déposer la planche depuis la séance

L'opérateur a besoin de la planche en fichier, à côté de l'événement, tirée
de ce que la séance montre à cet instant. La séance prépare une annonce
(planches par papier, comptes, homonymes, glyphes absents, brouillon), puis
produit le PDF par un seul import différé du code PDF et l'écrit de façon
atomique ; sous web, elle le télécharge. Un geste lancé pendant la
production attend son tour. Une planche tirée d'une proposition est
toujours un brouillon, et un fichier non écrit ou un papier non choisi
donnent leur refus avec un remède.
Vérifié : rouge d'abord ; 3670 node, 707 navigateur et 101 longues vertes
depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 17:11:48 -04:00
858018323b [ADD] print: preview screen, printable sheet, paper question
Printed pages must show exactly what will come out of the printer. An
Imprimer button in the event header opens a preview screen where each page
is a sheet at paper size, light whatever the theme, with its footer and,
under the strict draft rule, BROUILLON in outline; a proposal shown on a
retained plan prints as a draft. The paper is asked once per machine and
can be changed there. The table sheets offer one sheet per round. A failed
print shows IMPRESSION_ECHEC. The captures are republished with the button.
Checked: red first; 3651 node, 707 browser and 101 long tests green from
the index alone.

--- FR ---

[ADD] impression : aperçu, feuille imprimable, question du papier

Une page imprimée doit montrer exactement ce que l'imprimante rendra. Un
bouton Imprimer de la tête de l'événement ouvre un aperçu où chaque page
est une feuille au format du papier, claire quel que soit le thème, avec
son pied et, sous la règle stricte, BROUILLON au trait ; une proposition
montrée sur un plan retenu s'imprime en brouillon. Le papier se demande une
fois par machine et s'y change. Les feuilles par table offrent une feuille
par tour. Une impression échouée affiche IMPRESSION_ECHEC. Les captures
sont republiées avec le bouton.
Vérifié : rouge d'abord ; 3651 node, 707 navigateur et 101 longues vertes
depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 17:11:37 -04:00
43dbfad8a5 [ADD] docs: photographed walkthrough publishes doc/captures
The screenshots must come from the tested walkthrough, not from a separate
script that can drift. The browser walkthrough runs on the simulated file
system with a driven clock and the direct executor, light theme, 1366 x
700 at scale 1, transitions off, and photographs each step once its
condition holds. make captures writes the images and the manifest; the
plain test run compares them instead. Eighteen captures are published, the
later ones named as postponed. The forged-names scan skips the manifest,
which records the demo names shown on screen.
Checked: red first; 3620 node, 681 browser and 101 long tests green from
the index alone.

--- FR ---

[ADD] docs : parcours photographié, publication de doc/captures

Les captures doivent venir du parcours éprouvé, non d'un script à part qui
dérive. Le parcours navigateur joue sur le système de fichiers simulé,
l'horloge pilotée et l'exécuteur direct, thème clair, 1366 × 700 au facteur
1, transitions coupées, et photographie chaque étape quand sa condition
tient. make captures écrit les images et le manifeste ; la série ordinaire
les compare au lieu de les écrire. Dix-huit captures sont publiées, les
suivantes nommées reportées. Le balayage des noms forgés saute le
manifeste, qui relève les noms de démonstration affichés.
Vérifié : rouge d'abord ; 3620 node, 681 navigateur et 101 longues vertes
depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 15:33:59 -04:00
ec3bca4717 [ADD] mutation: engine audit command and its versioned written report
Spec 14.13 asks for an audit that shows which engine mutants the tests
kill, written where a reviewer can read it. npm run mutation and make
mutation run the baseline, a coverage pass that stops early when nothing is
measured, then every mutant; survivors are replayed against the long
series. The report holds version, scope, source fingerprint and Node
version only, no duration, host or date, and refuses any other field.
Declared equivalent mutants live in a separate list of key and reason.
Checked: red first; 3612 node tests green from the index alone.

--- FR ---

[ADD] mutation : commande d'audit du moteur, rapport écrit et versionné

Le § 14.13 demande un audit qui montre quels mutants du moteur les épreuves
tuent, écrit là où un relecteur le lit. npm run mutation et make mutation
jouent la ligne de base, une passe de couverture qui s'arrête tôt si rien
n'est mesuré, puis chaque mutant ; les survivants se rejouent contre la
série longue. Le rapport ne porte que version, périmètre, empreinte du
source et version de Node, ni durée, ni hôte, ni date, et refuse tout autre
champ. Les mutants déclarés équivalents vivent dans une liste à part.
Vérifié : rouge d'abord ; 3612 node verts depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 15:29:08 -04:00
3e4fd03a4c [IMP] generation: duration estimate counts the slowdown of busy cores
A core runs slower when its neighbours work too, so the estimate that
divided the run by the number of workers promised too short a wait. The
estimate now multiplies by rho(W), linear from 1 on one core to the
registry constant RALENTISSEMENT_PLEINE_CHARGE when every logical
processor works; the cores setting itself is unchanged. A bench file
measures the curve. An out-of-range setting is refused before
AUCUN_EVENEMENT.
Checked: red first; 3582 node and 659 browser tests green from the index.

--- FR ---

[IMP] génération : l'estimation compte le ralentissement des cœurs

Un cœur va moins vite quand ses voisins travaillent aussi : l'estimation
qui divisait le calcul par le nombre de travailleurs promettait une attente
trop courte. Elle multiplie désormais par rho(W), linéaire de 1 sur un cœur
à la constante RALENTISSEMENT_PLEINE_CHARGE du registre quand tous les
processeurs logiques travaillent ; le réglage des cœurs ne change pas. Un
fichier du banc mesure la courbe. Un réglage hors domaine est refusé avant
AUCUN_EVENEMENT.
Vérifié : rouge d'abord ; 3582 node et 659 navigateur verts depuis l'index.

Assisted-by: Claude Opus 5.5
2026-10-09 15:28:49 -04:00
0b2b2dc303 [ADD] bench: frame time, readable seats and witness string thresholds
Spec 19.10 leaves three rendering thresholds to measurement: the frame time
of the plan while zooming, the smallest seat target that stays readable,
and the width of the witness string under the embedded font. Three bench
files measure them in Chromium, frame time throttled four times, and write
each measure with its own CPU factor into the record; seuils.js derives the
threshold from the samples. No value enters the registry from here.
Checked: red first; 3576 node tests green from the index; the bench
project runs the three measures.

--- FR ---

[ADD] banc : seuils du temps par image, sièges lisibles, chaîne témoin

Le § 19.10 laisse trois seuils de rendu à la mesure : le temps par image du
plan pendant un zoom, la plus petite cible de siège qui reste lisible, et
la largeur de la chaîne témoin sous la police embarquée. Trois fichiers du
banc les mesurent dans Chromium, le temps par image ralenti quatre fois, et
écrivent chaque mesure avec son propre facteur au relevé ; seuils.js tire
le seuil des échantillons. Aucune valeur n'entre au registre d'ici.
Vérifié : rouge d'abord ; 3576 node verts depuis l'index ; le projet du
banc joue les trois mesures.

Assisted-by: Claude Opus 5.5
2026-10-09 15:27:10 -04:00
8fb80324e7 [ADD] pdf: badge sheet production with control page and draft mark
The badge sheet must print at true scale and read back exactly what the
model says. Page 1 is the control sheet: badge size, paper, counts,
namesakes, missing glyphs and a 100 mm ruler; it continues on extra control
pages when a long reprint overflows. One page per sheet follows, with cut
lines, embedded Noto Sans subsets and a ToUnicode map, no metadata, so the
same model yields the same bytes. A draft carries BROUILLON in outline on
every page; the word comes from the caller, never from src/pdf.
Checked: red first, text read back through pdfjs; 3541 node and 101 long
tests green from the index alone.

--- FR ---

[ADD] pdf : production de la planche, page de contrôle, brouillon

La planche de badges doit s'imprimer à l'échelle et se relire exactement
comme le modèle le dit. La page 1 est la feuille de contrôle : taille du
badge, papier, comptes, homonymes, glyphes absents et règle de 100 mm ; elle
continue sur des pages de contrôle quand une longue réédition déborde. Suit
une page par planche, avec traits de coupe, sous-ensembles de Noto Sans et
table ToUnicode, sans métadonnées : le même modèle rend les mêmes octets.
Un brouillon porte BROUILLON au trait sur chaque page ; le mot vient de
l'appelant, jamais de src/pdf.
Vérifié : rouge d'abord, texte relu par pdfjs ; 3541 node et 101 longues
vertes depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 15:26:53 -04:00
8b7c732399 [ADD] platform: print bridge, atomic byte writes, badge sheet file name
Printed views and the badge sheet leave the app through the platform. Under
Electron a gtt:imprimer channel prints with the paper and orientation asked
for and reports sent, cancelled, failed or unknown; an exception is logged
to the console and never shown raw to the operator. Every file system,
real or simulated, writes bytes atomically from a copy taken at the call.
The sheet name carries event, date and imposition, and a failed print
becomes IMPRESSION_ECHEC.
Checked: red first, twelve mutations caught; 3502 node, 659 browser and 79
long tests green from the index alone.

--- FR ---

[ADD] plateforme : pont d'impression, octets atomiques, nom de planche

Les vues imprimables et la planche sortent de l'application par la
plateforme. Sous Electron, un canal gtt:imprimer imprime au papier et à
l'orientation demandés et rend envoyé, annulé, échec ou inconnu ; une
exception va à la console, jamais brute à l'opérateur. Chaque système de
fichiers, réel ou simulé, écrit des octets de façon atomique, depuis une
copie prise à l'appel. Le nom de la planche porte événement, date et
imposition, et une impression échouée devient IMPRESSION_ECHEC.
Vérifié : rouge d'abord, douze mutations attrapées ; 3502 node, 659
navigateur et 79 longues vertes depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 15:26:13 -04:00
8371e8f1ec [ADD] docs: generated regions in README and guides, checked on build
Tables in the documentation must come from the code, not be copied by hand.
scripts/documentation.js fills marked regions of README.md and the guides
from the single sources: settings, shortcuts, CSV columns, constants and
measured contrasts. A check mode reports any region that differs, and a
missing manifest blocks a delivery build. Editing a carrier document reruns
the documentation tests.
Checked: red first; 3454 node, 655 browser and 76 long tests green from the
index alone.

--- FR ---

[ADD] docs : régions engendrées du README et des guides, vérifiées

Les tableaux de la documentation doivent venir du code, non d'une copie à la
main. scripts/documentation.js remplit les régions marquées de README.md et
des guides à partir des sources uniques : réglages, raccourcis, colonnes CSV,
constantes et contrastes relevés. Un mode de vérification signale toute
région qui diffère, et un manifeste absent bloque une construction de
livraison. Modifier un document porteur relance les épreuves de la
documentation.
Vérifié : rouge d'abord ; 3454 node, 655 navigateur et 76 longues vertes
depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 13:06:01 -04:00
8bdc959183 [ADD] mutation: run one mutant through node --test with a loader hook
A mutant counts only when the tests that import its module actually run
against the mutated source. A loader hook (module.registerHooks) serves the
mutated text in place of the module; the import graph picks the tests that
reach it, and node --test runs them in a child with a deadline. The verdict
is killed, survived, timed out or error; an empty request, a missing test
or a non-positive deadline is refused before anything starts.
Checked: red first; 3418 node and 76 long tests green from the index,
including a real run on a small invented module.

--- FR ---

[ADD] mutation : jouer un mutant sous node --test, crochet de chargement

Un mutant ne compte que si les épreuves qui importent son module jouent
vraiment contre le source muté. Un crochet de chargement
(module.registerHooks) sert le texte muté à la place du module ; le graphe
des imports choisit les épreuves qui l'atteignent, et node --test les joue
dans un enfant sous délai. Le verdict est tué, survivant, délai ou erreur ;
une demande vide, une épreuve absente ou un délai non positif sont refusés
avant tout lancement.
Vérifié : rouge d'abord ; 3418 node et 76 longues vertes depuis l'index,
dont un vrai lancement sur un petit module inventé.

Assisted-by: Claude Opus 5.5
2026-10-09 13:04:14 -04:00
079b158587 [ADD] bench: headless Chromium harness, statistics and make banc entry
Rendering thresholds must be measured in a real browser, apart from the
test series that guard behaviour. A separate Vitest project runs
scripts/banc/**/*.banc.js in headless Chromium at 1366 x 700, scale 1,
without frame-rate limit, CPU throttling set per run; the statistics module
gives medians and spreads over repeated samples. Outputs go to an ignored
folder. make banc and npm run banc name the entry; its orchestrator comes
with the bench measures.
Checked: red first; 3410 node tests green from the index; the bench project
runs its harness.

--- FR ---

[ADD] banc : harnais Chromium sans tête, statistiques, entrée make banc

Les seuils de rendu se mesurent dans un vrai navigateur, à part des séries
qui gardent le comportement. Un projet Vitest distinct joue
scripts/banc/**/*.banc.js dans Chromium sans tête à 1366 × 700, facteur 1,
sans limite d'images, le ralentissement du processeur réglé par lancement ;
le module de statistiques rend médianes et dispersions sur des mesures
répétées. Les sorties vont dans un dossier ignoré. make banc et npm run banc
nomment l'entrée ; son orchestrateur vient avec les mesures du banc.
Vérifié : rouge d'abord ; 3410 node verts depuis l'index ; le projet du
banc joue son harnais.

Assisted-by: Claude Opus 5.5
2026-10-09 13:03:37 -04:00
307ee526fc [ADD] bench: versioned record format and its agreement with constants
Measured thresholds must be adopted by a developer, never written by the
bench into the code. The record holds the bench configuration and its
measures; its reader refuses an empty record, a measure without its
constant, and any field or value that looks like a host, an account or a
date. A guard in the constants test makes every registry value that claims
a bench origin agree with the record.
Checked: red first, eight mutations caught; 3392 node tests green from the
index alone.

--- FR ---

[ADD] banc : format du relevé versionné, accord avec les constantes

Un seuil mesuré s'adopte par un geste du développeur ; le banc ne l'écrit
jamais dans le code. Le relevé porte la configuration du banc et ses
mesures ; sa lecture refuse un relevé vide, une mesure sans sa constante,
et tout champ ou valeur qui ressemble à un hôte, un compte ou une date. Une
garde de l'épreuve des constantes accorde au relevé chaque valeur du
registre qui se dit tirée du banc.
Vérifié : rouge d'abord, huit mutations attrapées ; 3392 node verts depuis
l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 13:03:20 -04:00
4e25e73a5d [ADD] badges: sheet model from the retained plan or a chosen proposal
Badges hang on guests' necks: their content must be exact and stable. The
model builds one badge per non-excluded person, from the retained plan or,
on demand, from a proposal, which always prints as a draft. Each round says
table, seat when seats are assigned, and a title only where a reservation
makes the person its holder there; a constant itinerary takes one line.
Names sort by code point, never by locale; namesakes carry their id, and a
reprint gives the same texts. Without any placement it refuses, pointing at
the proposals.
Checked: red first; 3343 node tests green from the index alone.

--- FR ---

[ADD] badges : modèle de planche, du retenu ou d'une proposition choisie

Les badges pendent au cou des invités : leur contenu doit être exact et
stable. Le modèle fait un badge par personne non exclue, depuis le retenu
ou, sur demande, une proposition, toujours imprimée en brouillon. Chaque
tour dit la table, le siège sous attribution, et un titre seulement là où
une réservation en fait la personne titulaire ; un itinéraire constant tient
en une ligne. Les noms se classent par points de code, jamais selon la
locale ; les homonymes portent leur identifiant, et une réédition rend les
mêmes textes. Sans aucun placement, il refuse et renvoie aux propositions.
Vérifié : rouge d'abord ; 3343 node verts depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 13:03:04 -04:00
270c27f7ed [ADD] pdf: badge layout with a sacrifice order and injected metrics
A badge must keep the name whole and readable whatever its length. The pure
layout picks the largest name size that fits in one to three lines, then
lays rounds on one or two columns down to the floor size, then drops the
event name from the footer and then the affiliation; past that it refuses.
A round line too wide shortens its title only, keeping at least one grapheme
of it, never the table or seat. Metrics are injected, so the same code lays
out under Noto Sans and under a fixed-pitch test font.
Checked: red first; 3299 node tests green from the index alone.

--- FR ---

[ADD] pdf : badge mis en page, ordre de sacrifice, métriques injectées

Un badge doit garder le nom entier et lisible, quelle que soit sa longueur.
La mise en page, pure, choisit le plus grand corps du nom qui tient en une à
trois lignes, pose les tours sur une ou deux colonnes jusqu'au corps
plancher, puis retire du pied le nom de l'événement, puis l'appartenance ;
au-delà, elle refuse. Une ligne de tour trop large n'abrège que son titre,
en garde au moins une grappe, jamais la table ni le siège. Les métriques
sont injectées : le même code se met en page sous Noto Sans et sous une
police d'épreuve à chasse fixe.
Vérifié : rouge d'abord ; 3299 node verts depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 13:02:53 -04:00
0ac686487f [ADD] geometry: cut the seating plan into printed pages
A plan too large to read on one sheet must print as a grid of pages that
join exactly. The cut picks the orientation that gives fewest pages, then
the larger scale, then landscape; tiles meet at exact equality on 2^-20 cm
coordinates, columns are lettered A to Z then AA, and a table or name block
that straddles two pages is reported on both. The print bounding box
includes measured name blocks but no handle or target.
Checked: red first, including a fast-check property on drawn plans, papers
and thresholds; 3245 node tests green from the index alone.

--- FR ---

[ADD] géométrie : découpe du plan de salle en pages imprimées

Un plan trop grand pour se lire sur une feuille doit s'imprimer en une
grille de pages qui se joignent exactement. La découpe choisit
l'orientation qui donne le moins de pages, puis la plus grande échelle, puis
le paysage ; les tuiles se touchent à l'égalité exacte sur des cotes de
2^-20 cm, les colonnes vont de A à Z puis AA, et une table ou un bloc de
noms à cheval sur deux pages se signale sur les deux. L'englobant imprimé
compte les blocs de noms mesurés, sans poignée ni cible.
Vérifié : rouge d'abord, dont une propriété fast-check sur plans, papiers
et seuils tirés ; 3245 node verts depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 13:02:18 -04:00
88d35f5979 [IMP] interface: Noto Sans everywhere, faces loaded before mounting
The screen must match the screenshots and the text the tests measure. The
interface now uses the embedded Noto Sans for every element, form controls
included, with a 1.3 line height. The entry point and the test mount wait
for both faces before mounting, so no text measurer caches the fallback
width; a face that fails to load is reported and the app mounts anyway.
The screens the wider font overflowed have their own CSS adjusted.
Checked: red first; 3216 node, 655 browser and 71 long tests green from the
index; the Electron start-up check loads the font from file://.

--- FR ---

[IMP] interface : Noto Sans partout, faces chargées avant le montage

L'écran doit ressembler aux captures et au texte que mesurent les épreuves.
L'interface emploie désormais Noto Sans, embarquée, pour tout élément,
contrôles de formulaire compris, avec un interligne de 1,3. Le point
d'entrée et le montage d'épreuve attendent les deux faces avant de monter :
aucun mesureur ne garde la largeur de repli ; une face qui ne se charge pas
est signalée et l'application se monte quand même. Les écrans que la police
plus large débordait ajustent leur propre CSS.
Vérifié : rouge d'abord ; 3216 node, 655 navigateur et 71 longues vertes
depuis l'index ; l'essai de démarrage charge la police par file://.

Assisted-by: Claude Opus 5.5
2026-10-09 13:01:49 -04:00