1Objet

Le Kit se présente comme indépendant du moteur d’intelligence artificielle qui l’exécute. Il ne l’est pas: sa chaîne suppose des outils, une arborescence et des comportements qu’elle ne fournit pas. Ce document déclare ce qu’elle exige.

Il ne nomme aucun moteur. Chaque moteur écrit en regard son propre relevé, qui répond ligne à ligne au contrat du §2 et déclare ce qui lui manque. Le contrat appartient au Kit et vaut partout; le relevé appartient au moteur, et lui seul peut le mesurer.

Note:Un relevé vieillit, et c’est voulu. Un environnement qui bouge se lit dans l’écart entre deux relevés. C’est aussi pourquoi le contrôle du §5 se rejoue à chaque session plutôt que de se lire dans un document.

2Contrat d’exécution

Chaque ligne nomme une capacité, l’usage qu’en fait la chaîne, et ce qui tombe en son absence. L’ordre des lignes est fixe: c’est lui qui rend deux relevés comparables.

Capacité Usage Sans elle Degré
Node.js Exécute les feuilles de style et les générateurs. Rien n’est produit. Requis
Module docx Construit le document et le sérialise. Aucun document. Requis
Python 3 Outils d’extraction, de contrôle et de rendu. Aucun contrôle, aucune couverture. Requis
pandoc Convertit un document en page web, et lit le Cover Sheet. Aucune page web. Conditionnel
LibreOffice Convertit un document en PDF. Le site se publie sans PDF. Conditionnel
zip Produit l’archive du projet quand projectShareable vaut true au Registry. La passe s’arrête: le lien annoncé par projectZip.downloadUrl pointerait une archive absente. Requis si projectShareable vaut true
Pillow Compose le PNG de la page de couverture. Pas de couverture rendue. Conditionnel
Module adm-zip Construit l’archive du site. Le site se génère sans archive. Conditionnel
Note:Aucun module externe n’est requis pour produire un document depuis General v1.83: l’empreinte se vérifie en lisant le répertoire central de l’archive, sans bibliothèque. adm-zip ne sert plus qu’à la publication du site.

3Degrés d’exigence

Trois degrés, et ils commandent la conduite à tenir quand une capacité manque.

Requis: la chaîne s’arrête. Il n’existe pas de version dégradée honnête d’un document: sans le moteur de construction, il n’y a pas un document plus pauvre, il n’y a pas de document.

Conditionnel: une production disparaît, le reste sort. Un site sans PDF vaut mieux que pas de site. La production omise se déclare.

Toléré: un contournement existe et se déclare avec son coût. Une installation en début de session en est un: elle ne survit pas.

Note:On produit ce qu’on peut tant que ce qu’on produit reste juste. La distinction n’est pas de gravité mais de nature: une capacité conditionnelle absente retire une production, une capacité requise absente rend le résultat faux. Un document au corps vide s’ouvre sans avertissement et passe le validateurQuality Control §3.14.

4Règles indépendantes du moteur

Elles découlent du contrat et valent dans tout environnement. Leur domicile est ailleurs; elles sont rappelées ici parce qu’un relevé y répond.

Résolution unique: tous les fichiers d’une même chaîne résolvent le module de construction de la même façon. Deux instances produisent un document valide et vide. General Reference §1.3.

Ordre de résolution: résolution ordinaire, puis la racine déclarée dans KIT_NODE_MODULES, puis celle que rapporte l’outil de paquets. Aucun chemin n’est écrit d’avance.

Horodatage local: les noms de fichiers portent l’heure du Luxembourg, jamais celle du conteneur. Seul l’horodatage de déploiement du Registry est en temps universel.

Générateur réécrit: aucun script de génération ne survit d’une session à l’autre. Chaque session repart de la feuille de style active et de sa Reference.

5Contrôle d’ouverture de session

Avant toute génération, le moteur rejoue le contrôle ci-dessous et déclare son résultat. Ce n’est pas une invitation: c’est le maillon zéro de la chaîne de validation, et il précède le premier contrôle de Quality Control §3.13.

node --version
node -p "require.resolve('docx')"
node -p "Object.keys(require('docx')).length"
python3 --version
python3 -c "import PIL; print('Pillow', PIL.__version__)"
which pandoc soffice
node -e "require('adm-zip'); console.log('adm-zip')"

La déclaration précède la génération, jamais l’inverse. Le moteur annonce ce qu’il produira et ce qu’il ne produira pas. Découvrir une absence à la fin d’une passe, c’est la découvrir trop tard.

Une capacité requise manque: arrêt, avec le nom de la capacité et la commande qui l’installe.

Une capacité conditionnelle manque: la production correspondante est annoncée absente, et la passe continue.

Un contournement est appliqué: il est déclaré dans la sortie de la passe et porté au relevé du moteur.

6Format d’un relevé

Un relevé de moteur porte le préfixe du moteur et la catégorie Documentation — Convention de nommage §2. Il comporte six sections, dans cet ordre.

# Section Contenu
1 Objet et dates Quel environnement, date de rédaction et date du dernier contrôle. L’écart entre les deux informe.
2 Réponse au contrat Le tableau du §2, même ordre de lignes, avec ce qui est constaté et où.
3 Lacunes Ce qui manque, et à quel degré du §3 cela correspond.
4 Contournements Ce qui est fait pour y pallier, et ce que cela coûte.
5 Particularités Ce qui n’est pas au contrat mais change la façon de travailler.
6 Relevé brut Commandes et sorties, verbatim. La preuve de la section 2.
Note:La section 5 est celle qu’aucun autre moteur ne peut écrire à la place du sien. Elle porte ce qui ne se mesure pas par une commande: la façon dont un fichier joint parvient au moteur, ce qui survit à une session, ce qui se perd.

7Ce que le Kit ne garantit pas

Deux hypothèses sortent du contrat parce que le Kit les subit sans pouvoir les imposer. Elles appartiennent au relevé de chaque moteur, section 5.

La persistance entre sessions. Rien ne garantit qu’un environnement retrouve son état. C’est ce qui fonde le contrôle du §5 et la réécriture du générateur.

La forme d’un fichier joint. Un moteur peut livrer un document sous forme de binaire ou de texte extrait. Dans le second cas, modifier un document existant à partir de ce qu’on en lit produit un fichier appauvri sans que rien ne le signale — d’où la règle du binaire obligatoire.