Files
ki-fwi/docs/sessions/01-socle.md
T
OKIandClaude Opus 5 ccad7177b3 feat(session-1): socle SvelteKit et encyclopédie /zerbaj/ prérendue
SvelteKit 2 + Svelte 5 runes + TS strict, adapter-static en prérendu
intégral, trailingSlash always, paths.relative false.

Mesures de la porte de sortie
- 56 pages HTML prérendues (13 fiches × 3 langues + pages de service)
- 59 Ko de JS gzip (budget : 170) · build total 1,4 Mo (budget : 2 Mo)
- 0 chargement tiers, vérifié par grep du build
- fiche lisible sans JS : 1694 caractères de texte rendu
- npm run check : 248 fichiers, 0 erreur, 0 warning
- 0 erreur console au chargement
Lighthouse non exécuté : porte encore ouverte, à vérifier avant la S6.

Charte OKI
Tokens partagés, thème sombre par défaut, Archivo et Inter self-hébergées
(124 Ko de woff2), flag-bar à segments francs, bouton à balayage or,
gate prefers-reduced-motion unique. CSP stricte en .htaccess et _headers,
404 statique autonome, PWA avec registerSW à chemin absolu (playbook 2.9).

L'interface kréyòl n'est pas écrite par l'agent
Le catalogue gcf ne contient que les termes venant des documents du
porteur — 10 chaînes sur 132. Le reste vaut null et se replie sur le
français ; check:i18n produit la liste des 122 phrases à traduire, par
écran. <html lang> annonce la langue réellement écrite : fr tant que la
couverture reste sous 60 %, avec les fragments kréyòl marqués un par un.
Des tournures kréyòl que j'avais inventées ont été retirées.

Corrections en cours de build
- vite-plugin-pwa/sveltekit n'existe pas sans @vite-pwa/sveltekit :
  VitePWA en direct, comme le prescrivait déjà le playbook.
- @sveltejs/vite-plugin-svelte v7 n'exporte plus sveltekit : import
  depuis @sveltejs/kit/vite, vérifié sur les exports réels.
- Le sélecteur de langue fabriquait /fr/offline/, page inexistante.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 11:44:21 -04:00

5.2 KiB
Raw Blame History

Session 1 — Socle

Date : 2026-07-27 · Livrable : l'encyclopédie /zerbaj/, prérendue et trilingue.

Mesures de la porte de sortie

Critère Cible Mesuré
Fiches en ligne 13, une page prérendue chacune 56 pages HTML (13 fiches × 3 langues + 17 pages de service)
JS initial gzip ≤ 170 Ko 59 Ko
Poids total du build ≤ 2 Mo 1,4 Mo
Requêtes vers un domaine tiers 0 0, vérifié par grep du build
Contenu lisible sans JavaScript intégral 1 694 caractères de texte rendu sur une fiche, sans exécuter un octet de JS
npm run check 0 erreur, 0 warning 248 fichiers, 0/0
npm run build vert vert
Erreurs console au chargement 0 0
Chaque fiche affiche ce qui lui manque 13/13
Questions kréyòl affichées 4

Lighthouse n'a pas été exécuté : il demande un navigateur en conditions réelles que je ne peux pas piloter ici. La porte « Lighthouse ≥ 90/95/95/95 » reste donc non vérifiée et doit l'être avant la session 6. Les budgets qui la déterminent — JS, poids, absence de tiers, contenu SSR — sont eux mesurés et tenus.

Ce qui a été construit

SvelteKit 2 + Svelte 5 en runes, TypeScript strict, adapter-static en prérendu intégral, trailingSlash: 'always', paths.relative: false (playbook §5b.5).

Tokens de la charte OKI dans un fichier partagé, thème sombre par défaut et clair en opt-in, polices Archivo et Inter self-hébergées (124 Ko de woff2 latin), flag-bar et flag chip, bouton à balayage or, gate prefers-reduced-motion unique.

i18n par dossiers sans middleware : / en kréyòl, /fr/, /en/. Route optionnelle [[locale=locale]] avec matcher, ce qui évite de tripler chaque page.

PWA : VitePWA en direct plutôt que @vite-pwa/sveltekit, enregistrement par fichier statique à chemin absolu (playbook §2.9), page hors-ligne designée, manifest, icônes 192 / 512 / maskable générées depuis le SVG (1,8 à 6,3 Ko chacune).

CSP stricte en deux formats — .htaccess et _headers —, 404 statique autonome, sitemap généré depuis le build réel avec alternates hreflang (54 URLs sur 18 contenus).

Trois décisions prises en cours de route

L'interface kréyòl ne peut pas être écrite par un agent

Le projet pose le kréyòl comme langue principale, et l'ADR 0005 m'interdit d'en écrire. Résolu ainsi : le catalogue gcf ne contient que les termes venant des documents du porteur — KI FWI SA YÉ ?, Zerbaj, Rekonèt, Kaché, Sézon, Ranmasé, Pa touché, Lakou — soit 10 chaînes sur 132. Tout le reste vaut null et se replie sur le français.

npm run check:i18n produit la liste des 122 phrases à traduire, par écran, avec le français en regard. C'est une tâche de participation, pas une dette technique.

J'avais d'ailleurs commencé par écrire du kréyòl de mon cru dans le catalogue français (Pa ni ayen la, Ba on koudmen, Jwé, Pa ni rézo). Retiré : ces tournures étaient de moi, pas de la langue.

<html lang> annonce la langue réellement écrite

Poser lang="gcf" sur une page dont le texte est français ferait lire ce français avec la phonétique kréyòl par un lecteur d'écran. langDocument() renvoie donc fr tant que la couverture du catalogue reste sous 60 %, et les fragments réellement kréyòl — noms de fruits, noms de modes, titre du site — portent lang="gcf" individuellement.

La fonction basculera d'elle-même quand la traduction dépassera le seuil. Il n'y a rien à changer dans le code : il faut traduire.

Un bandeau discret le dit sur chaque page en kréyòl, plutôt que de laisser croire.

Les modes de jeu ne sont pas annoncés comme cliquables

/je/ liste les cinq modes, aucun n'est lié : les routes n'existent qu'en session 2 et 4. Le prerender en mode strict fait échouer le build sur un lien mort — c'est le comportement voulu, et il a effectivement attrapé le problème.

Le mode Rekonèt affiche en plus son blocage réel : il demande des photographies validées, et il n'y en a aucune. Le message le dit sans détour — « ce n'est pas un bug : personne ne les a encore versées » — et renvoie vers la page de participation.

Deux erreurs corrigées pendant le build

vite-plugin-pwa/sveltekit n'existe pas sans le paquet @vite-pwa/sveltekit : le playbook prescrivait déjà VitePWA en direct, je m'y suis aligné plutôt que d'ajouter une dépendance.

@sveltejs/vite-plugin-svelte v7 n'exporte plus sveltekit — l'import vient de @sveltejs/kit/vite. Vérifié sur les exports réels du paquet, pas supposé.

Et un vrai défaut de conception : le sélecteur de langue fabriquait /fr/offline/ pour une page qui n'existe qu'en un exemplaire. cheminAlterne() renvoie désormais la racine de la langue cible sur les routes non localisées.

Reste à faire avant la session 6

  • Lighthouse mobile sur l'accueil et sur une fiche.
  • Vérification manuelle de prefers-reduced-motion et de la navigation clavier.
  • og-image et icônes sont des aplats graphiques sans texte : à remplacer si le porteur veut une image sociale plus travaillée.