Commit graph

63 commits

Author SHA1 Message Date
4e31c8d3e5 [ADD] guards: determinism and layer boundary checked over src/
A seed reproduces a plan only if nothing in the engine or the demo
generator reads the clock, a random source or the locale. One guard reads
every module of src/moteur and src/demo and names each such call by its
line, Node's crypto draws included. A second walks the engine's import
graph and refuses the interface, storage, Svelte, Capacitor, Electron,
Node built-ins and browser globals. Both fail on an empty tree.

Checked: each forbidden form is caught in a temporary tree; the real tree
is clean.

--- FR ---

[ADD] garde-fous : déterminisme et frontière des couches sur src/

Une graine ne reproduit un plan que si rien, dans le moteur ni dans le
générateur de démonstrations, ne lit l'horloge, une source aléatoire ou la
locale. Une garde lit chaque module de src/moteur et de src/demo et nomme
chaque tel appel par sa ligne, tirages de crypto de Node compris. Une
seconde parcourt le graphe d'imports du moteur et refuse l'interface, le
stockage, Svelte, Capacitor, Electron, les modules natifs de Node et les
globales du navigateur. Les deux échouent sur un arbre vide.

Vérifié : chaque forme interdite est relevée dans un arbre temporaire ;
l'arbre réel est propre.

Assisted-by: Claude Opus 5.5
2026-10-05 17:27:06 -04:00
518ef93f67 [ADD] engine: configuration normalised into an indexed instance
The engine works on dense arrays, not on the operator's objects.
normaliser checks the configuration, derives anchored, partially fixed and
mobile statuses from the reservations themselves, and suspends an excluded
person's reservations without stopping on them. It never refuses a room
that is too small: that is a property of the configuration, which the
diagnosis names and the search refuses (§ 5.9). A plan converts both ways
between ids and indices, seats in ascending id.

Checked: a reservation after an excluded one, and a conflict found under
« tous », each fail their mutant; an independent oracle agreed throughout.

--- FR ---

[ADD] moteur : configuration normalisée en une instance indexée

Le moteur travaille sur des tableaux denses, pas sur les objets de
l'opérateur. normaliser vérifie la configuration, dérive les statuts
ancré, partiellement fixé et mobile des réservations elles-mêmes, et
suspend les réservations d'un exclu sans s'y arrêter. Il ne refuse jamais
une salle trop petite : c'est une propriété de la configuration, que le
diagnostic nomme et que la recherche refuse (§ 5.9). Un plan passe dans
les deux sens des ids aux index, sièges par id croissant.

Vérifié : une réservation après celle d'un exclu, et un conflit découvert
sous « tous », font chacune tomber leur mutant ; un oracle indépendant
concorde partout.

Assisted-by: Claude Opus 5.5
2026-10-05 17:27:06 -04:00
cd9ea442a6 [ADD] prng: PCG32 checked against the reference C implementation
The demonstrations and the search must give the same plan from the same
seed on any machine, so every draw comes from one generator with explicit
state. PCG32 runs on 16-bit limbs without BigInt, seeded as
pcg32_srandom_r; bounded draws reject as pcg32_boundedrand_r does, and the
shuffle loop is the reference demo's. Expected values come from compiling
and running the reference implementation, never from this code.

Checked: outputs, coins, dice and deck match the reference demo; a wrong
multiplier, rotation or remainder each fail.

--- FR ---

[ADD] prng : PCG32 vérifié contre l'implémentation C de référence

Les démonstrations et la recherche doivent rendre le même plan pour la
même graine sur toute machine : chaque tirage vient d'un seul générateur à
état explicite. PCG32 calcule par mots de 16 bits sans BigInt, ensemencé
comme pcg32_srandom_r ; le tirage borné rejette comme
pcg32_boundedrand_r, et la boucle de mélange est celle de la démo de
référence. Les valeurs attendues sortent de l'implémentation de référence
compilée et exécutée, jamais de ce code.

Vérifié : sorties, pièces, dés et paquet égalent la démo de référence ;
un multiplicateur, une rotation ou un reste faussés échouent chacun.

Assisted-by: Claude Opus 5.5
2026-10-05 17:27:06 -04:00
100c0d3399 [FIX] electron: remove Electron's default English application menu
Without a menu set by the application, Electron installs its own: in
English, while the interface is French, and offering Reload and the
developer tools to the operator. The shell now sets a null menu before
its first window, which also removes the menu bar on Windows.

Checked: the shell test fails without the call and passes with it; the
rebuilt exe, run under Wine 11, shows the version banner and no menu bar.

--- FR ---

[FIX] electron : retirer le menu anglais par défaut d'Electron

Sans menu posé par l'application, Electron installe le sien : en
anglais, alors que l'interface est en français, et offrant à l'opérateur
le rechargement et les outils de développement. La coquille pose
désormais un menu nul avant sa première fenêtre, ce qui retire aussi la
barre de menu sous Windows.

Vérifié : l'épreuve de la coquille échoue sans l'appel et passe avec ;
l'exécutable reconstruit, lancé sous Wine 11, montre le bandeau de
version et aucune barre de menu.

Assisted-by: Claude Opus 5.5
2026-10-05 13:47:16 -04:00
a3354e2b0b [ADD] electron: own shell, portable Windows exe built under podman
The deliverable is a single-file portable executable whose Electron the
project updates itself. The shell keeps context isolation on, Node
integration off and the page sandboxed; one IPC channel returns the
folder the portable launcher publishes. The build runs in a no-Wine image
pinned by digest, relays no host variable, refuses to overwrite a built
number, removes what a failed build leaves, and accepts only the name
version.json gives. The spec stops claiming the portable target needs
Wine.

Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and
© 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail.

--- FR ---

[ADD] electron : coquille propre, exécutable portable construit sous podman

Le livrable est un exécutable portable à fichier unique, dont le projet
met lui-même Electron à jour. La coquille garde l'isolation de contexte,
coupe l'intégration de Node et isole la page ; un seul canal IPC rend le
dossier que publie le lanceur portable. La construction s'exécute dans
une image sans Wine épinglée par empreinte, ne relaie aucune variable de
l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec
laisse, et n'accepte que le nom que donne version.json. Le spec cesse
d'affirmer que la cible portable exige Wine.

Vérifié : exécutable construit en 86 s, ressource FileVersion
2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux
mutations du contrôle de fin échouent.

Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
9fc104d0e9 [ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.

Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.

--- FR ---

[ADD] squelette : application web Capacitor qui affiche sa version datée

Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.

Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.

Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
0bd3f08093 [ADD] license: GNU AGPL v3 text, TechnoLibre copyright
The project is licensed under the GNU Affero General Public License,
version 3 or later, copyright TechnoLibre — the convention every
TechnoLibre script and module already follows. The text is the current
canonical one published by the Free Software Foundation, copied byte for
byte.

Checked: sha256 matches the file served by gnu.org.

--- FR ---

[ADD] licence : texte de la GNU AGPL v3, copyright TechnoLibre

Le projet est sous licence publique générale GNU Affero, version 3 ou
ultérieure, copyright TechnoLibre — la convention que suivent déjà tous
les scripts et modules de TechnoLibre. Le texte est le texte canonique
actuel publié par la Free Software Foundation, copié octet pour octet.

Vérifié : l'empreinte sha256 égale celle du fichier servi par gnu.org.

Assisted-by: Claude Opus 5.5
2026-10-05 07:12:53 -04:00
7e1042aacd [UPD] spec: Capacitor replaces Cordova, own Electron shell for Windows
The only route from Cordova to a Windows executable is cordova-electron,
whose latest stable release pins Electron 29, out of support. Capacitor
offers no maintained desktop platform either, so the executable now
ships a project-owned Electron shell packaged by electron-builder, which
sets its own Electron version and the exe name directly. The shell hosts
the file system and printing boundaries behind a narrow preload bridge,
with context isolation on and Node integration off in the page.

Checked: no Cordova mention left; every internal reference resolves.

--- FR ---

[UPD] spec : Capacitor remplace Cordova, coquille Electron pour Windows

Le seul chemin de Cordova vers un exécutable Windows est
cordova-electron, dont la dernière version stable épingle Electron 29,
hors support. Capacitor n'offre pas non plus de plateforme de bureau
maintenue : l'exécutable embarque donc une coquille Electron propre au
projet, emballée par electron-builder, qui fixe elle-même sa version
d'Electron et le nom de l'exécutable. La coquille porte le système de
fichiers et l'impression derrière un pont de préchargement étroit,
isolation de contexte active et intégration de Node coupée.

Vérifié : plus aucune mention de Cordova ; chaque renvoi interne résout.

Assisted-by: Claude Opus 5.5
2026-10-05 06:57:26 -04:00
44553c3544 [UPD] spec: collision excess ranks, both papers, 30-minute search
Five operator answers, one of which reverses a ranking.

Meeting the same colleague four times is worse than meeting six
colleagues once. Neither cumulative collisions nor distinct pairs
yields that order — both rank the concentrated plan first, exactly
backwards. The excess, cumulative minus distinct, yields it, and now
opens the collision ranking; distinct pairs stop being a sort key and
stay a column. Both paper sizes become first-class, each with its own
imposition and its own pagination test. The search stop count carries a
thirty-minute ceiling, so a long run announces its expected duration
first, leaves the interface alive, and cancels immediately.

Checked: with excess first, the three plans order 0 < 2 < 3 as the
operator stated; under either count alone the order inverts.

--- FR ---

[UPD] spec : l'excédent classe, les deux papiers, recherche de 30 min

Cinq réponses de l'opérateur, dont une renverse un classement.

Retrouver quatre fois le même collègue est pire que croiser six
collègues une fois. Ni les collisions cumulées ni les paires distinctes
ne rendent cet ordre — les deux classent le plan concentré en tête,
exactement à l'envers. L'excédent, cumulées moins distinctes, le rend,
et ouvre désormais le classement des collisions ; les paires distinctes
cessent d'être une clé de tri et restent une colonne. Les deux formats
de papier passent à égalité, chacun avec son imposition et son épreuve
de pagination. Le compte d'arrêt reçoit un plafond de trente minutes :
un calcul long annonce sa durée, laisse l'interface vivante, s'annule.

Vérifié : excédent d'abord, les trois plans s'ordonnent 0 < 2 < 3 comme
l'opérateur l'énonce ; sous l'un ou l'autre compte seul, l'ordre
s'inverse.

Assisted-by: Claude Opus 5
2026-10-05 06:27:10 -04:00
3b16be48b3 [UPD] spec: dated version, badges, tests, screenshots, lack metric
Six requirements enter the specification, and each one forced an
existing section to change rather than sit beside it.

The dated version AAAA.MM.JJ.NN derives a technical form MM×100+JJ,
which is monotone, bijective and fits the 16 bits Windows gives each
resource field; one source, four destinations, a check that refuses
divergence. PDF now serves one output only, the A6 badge sheet, which
removes the sole assumption the output architecture rested on. Raw
numbers stop comparing proposals as soon as a table is incomplete, so
the comparison draws the lack — realised ceiling minus encounters —
measured on occupancy, never on capacity.

Checked: 257 badges give 65 A4 sheets and 129 Letter; the four
facilitators of the 7-seat tables cap at 24, so the large demonstration
can never award "minimum reached".

--- FR ---

[UPD] spec : version datée, badges, tests, captures, métrique du manque

Six exigences entrent dans la spécification, et chacune a forcé une
section existante à changer plutôt qu'à s'asseoir à côté.

La version datée AAAA.MM.JJ.NN dérive une forme technique MM×100+JJ,
monotone, bijective, qui tient dans les 16 bits que Windows donne à
chaque champ de ressource ; une source, quatre destinations, un
contrôle qui refuse la divergence. Le PDF ne sert plus qu'à une sortie,
la planche de badges A6, ce qui retire la seule supposition sur
laquelle reposait l'architecture de sortie. Les nombres bruts cessent
de comparer deux propositions dès qu'une table est incomplète, donc la
comparaison trace le manque — plafond réalisé moins rencontres —
calculé sur l'occupation, jamais sur la capacité.

Vérifié : 257 badges donnent 65 planches A4 et 129 Lettre ; les quatre
animateurs des tables de 7 plafonnent à 24, donc la grande
démonstration ne peut jamais décerner « minimum atteint ».

Assisted-by: Claude Opus 5
2026-10-05 06:11:51 -04:00
41e24fb08e [UPD] spec: events, reservations, diversity, quality page, Svelte
The specification covered the placement and little else; it now covers
the session where an operator spends an evening — several events,
automatic saving, history, a read-only default.

Three points decide the design rather than describe it: a title belongs
to a place and never to a person, so removing someone leaves the role
visible instead of silently vacant; the read/write mode is orthogonal to
the four states, not a fifth; a perfect reduced instance does not prove
the complete ceiling, which an enumeration establishes.

Checked: 29 tables of 8 and 4 of 7 seat exactly 260, and four
facilitators cap at 24 — a minimum no rerun improves.

--- FR ---

[UPD] spec : événements, réservations, diversité, page qualité, Svelte

La spécification couvrait le placement et peu d'autre chose ; elle
couvre désormais la séance où un opérateur passe une soirée — plusieurs
événements, enregistrement automatique, historique, lecture par défaut.

Trois points décident de la conception au lieu de la décrire : un titre
appartient à une place et jamais à une personne, si bien que retirer
quelqu'un laisse le rôle visible plutôt que vacant en silence ; le mode
lecture/écriture est orthogonal aux quatre états, non un cinquième ; un
réduit parfait ne prouve pas le plafond complet, ce qu'établit une
énumération.

Vérifié : 29 tables de 8 et 4 de 7 asseyent exactement 260, et quatre
animateurs plafonnent à 24 — un minimum qu'aucune relance n'améliore.

Assisted-by: Claude Opus 5
2026-10-05 05:04:37 -04:00
6dd2084734 [ADD] spec: rotating-table seating, offline, as a Cordova app
Nothing is built yet, so the specification fixes the behaviour before any
code can quietly decide it. It states what the placement must guarantee —
several comparable proposals rather than one answer, each set against a
lower bound that is proven when one exists, and a diagnostic naming what a
configuration makes unavoidable before the operator searches in vain.

The development requirements each answer a known way of going wrong:
dimensions that depend on rendered text are measured and never derived, a
character threshold is set on the widest glyph and not on an average, a
test is shown failing before it is trusted, and the whole program stays in
one language so that no two implementations can drift into agreeing on a
wrong value.

Building a Windows executable from Linux is written as a first-week check
rather than an assumption. Four decisions are named as still open.

--- FR ---

[ADD] spec : placement en tables tournantes, hors ligne, sous Cordova

Rien n'est encore construit, donc la spécification fixe le comportement
avant qu'un bout de code n'en décide en silence. Elle énonce ce que le
placement doit garantir : plusieurs propositions comparables plutôt qu'une
réponse, chacune confrontée à une borne inférieure prouvée quand il en
existe une, et un diagnostic nommant ce qu'une configuration rend
inévitable avant que l'opérateur ne cherche en vain.

Les exigences de développement répondent chacune à une façon connue de se
tromper : une dimension qui dépend du texte rendu se mesure et ne se déduit
jamais, un seuil en caractères se cale sur le glyphe le plus large et non
sur une moyenne, un test se montre en train d'échouer avant qu'on s'y fie,
et le programme reste dans une seule langue pour que deux implémentations
ne puissent pas dériver jusqu'à s'accorder sur une valeur fausse.

Construire un exécutable Windows depuis Linux est inscrit comme une
vérification de la première semaine et non comme une hypothèse. Quatre
décisions sont nommées comme encore ouvertes.

Assisted-by: Claude Opus 5
2026-10-05 03:13:50 -04:00
491bfaa5ac First commit 2026-10-05 02:17:39 -04:00