Skip to content

release: promote develop → staging (1.4.0) - #176

Closed
decarvalhoe wants to merge 9 commits into
stagingfrom
develop
Closed

release: promote develop → staging (1.4.0)#176
decarvalhoe wants to merge 9 commits into
stagingfrom
develop

Conversation

@decarvalhoe

Copy link
Copy Markdown
Owner

Promotion 1.4.0 (EPIC 10).

decarvalhoe and others added 9 commits July 2, 2026 14:20
Co-authored-by: decarvalhoe <dev@realisons.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(i18n): compléter l'anglais de l'UI — français résiduel traduit

Revue complète de l'UI en anglais (audit carte + salle + examen + bac à
sable + tas/sortie) : plus aucun français résiduel.

- game.js : bac à sable (titre/hint EXÉCUTÉ), résumé d'examen (score,
  temps, recommencer, ← carte), ligne de stats locales, « (réf) ».
- memoryView : « tas — mémoire dynamique », « // sortie », alloué/libéré.
- components/memory : libellés d'état des casiers (normal/modifié/
  pointeur/alloué/libéré).
- regionMapView : titre de la fenêtre carte, adresses de régions
  (« pile basse », « la pile »).
- Bac à sable (sandbox.js) ajouté aux niveaux traduits (id 'sandbox').
- en.js : toutes les clés correspondantes.

FR inchangé (défaut) · 621 tests · 8 écrans visuels · lint clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(i18n): README/CONTRIBUTING/WORKFLOW bilingues + gate de release doc

- README.en.md, CONTRIBUTING.en.md, docs/WORKFLOW.en.md (traductions
  complètes) + liens de langue (🌐) sur les versions FR.
- README FR : badges/chiffres à jour (v1.3.0, 621 tests, 8 écrans,
  280 KB, section i18n).
- .github/workflows/docs-gate.yml : bloque toute PR qui bump la version
  de package.json sans entrée CHANGELOG correspondante ni badge README
  (FR + EN) à jour → mise à jour de la doc OBLIGATOIRE à chaque release.
  Inerte sans bump. Rappel « description GitHub » en notice.
- Description du dépôt GitHub réécrite (bilingue, état actuel) + topics
  bilingual/i18n/gitflow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(a11y): refléter la langue sur <html lang> (lecteurs d'écran)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(ci): docs-gate.yml — corriger le parsing YAML (run en bloc)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: decarvalhoe <dev@realisons.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: decarvalhoe <dev@realisons.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…0-1, #162)

Ferme le trou qui laissait passer les oublis de traduction. La garde
tests/game/i18n-guard.test.mjs scanne les vues et échoue si :
- un littéral de « prose » rendu (valeur d'une prop non structurelle) n'est
  pas une clé enregistrée du pack EN ;
- une clé passée à t('…') n'existe pas dans le pack (fuite silencieuse FR en EN).

Fuites réelles corrigées, invisibles à l'audit précédent (title/aria-label,
tables de clés-source) :
- carte : « tu es ici / verrouillé / résolu » (DEFAULT_NOTE) restaient en FR ;
- programme : title/aria-label « monter/descendre/retirer » ;
- « ta libft », « n° », labels octets/pile déjà traduits mais non routés par t().

Nouvel écran visuel en-carte (carte en EN) : verrouille la non-régression de
la fuite signalée. 655 tests (+34), 9 écrans visuels.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cause racine des fuites de contenu : le lint ne couvrait que src/engine.
Désormais `npm run lint` = `eslint src tests` — la couche UI/jeu suit les
mêmes standards que le moteur.

- eslint.config.js : src/ui rejoint le périmètre ; eqeqeq garde l'idiome
  délibéré `x == null` (null: 'ignore'), === strict partout ailleurs ; les
  tests reçoivent les globals browser (callbacks page.evaluate du harnais).
- Corrections réelles révélées : import LEVELS mort (world.js), let→const,
  == → === hors null-checks.
- Refactors pour passer sous 50 lignes/fonction (standard du moteur), à
  comportement identique (tests + 9 écrans visuels à 0,00 %) :
  createTracker → helpers purs read/write/applyState/collectDue ;
  renderRegionMap → helpers roomLink/regionBlock ;
  Game.evaluate → extraction evaluateSandbox.

655 tests OK, lint vert sur tout src/+tests/, visuels conformes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…#165)

Audit d'accessibilité outillé et corrections, sans régression visuelle
(9 écrans à 0,00 %).

- axe-core (devDep) exécuté par le harnais sur 3 vues (carte FR/EN, salle) :
  la CI échoue sur toute violation serious/critical (WCAG 2.x AA). État : 0.
- Contraste : `.mf-locker__addr` — `opacity:.7` retirée (passait sous 4.5:1,
  détecté par axe).
- Focus visible (2.4.7) : anneau --ring sur tous les interactifs.
- Contournement (2.4.1) : lien d'évitement « Aller au contenu » (bilingue).
- Titres (1.3.1) : LA RAM / mission / région en <h2>/<h3> réels (h1→h2→h3),
  marges UA neutralisées → pixel-identique.
- prefers-contrast: more (bordures/texte renforcés, scanlines coupées).
- docs/A11Y.md étendu (audit runtime + couverture clavier/ARIA + limites).

655 tests, lint vert, 9 écrans + 3 audits axe conformes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…E10-2, #163)

Le CSS était codé en dur dans le JS (style: 'display:flex;…' massifs) :
difficile à thématiser/maintenir et bloquant pour une CSP stricte
(style-src 'unsafe-inline' requis). Extraction vers styles/views.css.

- Zéro attribut style="" statique dans les vues (9 fichiers).
- États dynamiques (actif/ouvert/propre/cliquable) → classes modificatrices
  (.mf-frame--active, .mf-region-block--open, .mf-valgrind--clean…) plutôt
  que des chaînes de style interpolées.
- Seul reste du CSSOM légitime et dynamique (géométrie de l'overlay de fils
  SVG, glow pointeur) — non concerné par style-src, calculé au runtime.
- Rendu pixel-identique : 9 écrans du harnais à 0,00 % (sources ET dist/).

Débloque la CSP stricte (#166). 655 tests, lint vert, poids 254 KB.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
)

CSP stricte SANS 'unsafe-inline', active via <meta http-equiv> et vérifiée
en CI. Débloquée par l'extraction des styles inline (#163).

- index.html : script de pré-peinture du thème externalisé (src/theme-init.js),
  bloc <style> déplacé dans main.css, attribut style="" du bouton langue → classe
  (.theme-toggle--lang). Plus aucun inline → script-src/style-src 'self'.
- CSP : default-src 'self' ; object-src 'none' ; frame-ancestors 'none' ;
  base-uri/form-action 'self' ; img-src 'self' data: (favicon). Seule exception
  documentée : Google Fonts (style-src/font-src scopés à ces 2 domaines).
- <meta name="referrer" content="no-referrer">.
- Harnais : nouveau check checkCSP (écoute securitypolicyviolation sur carte +
  salle → échoue à la moindre violation) ; normalisation du rendu via feuille
  construite (adoptedStyleSheets, CSP-safe) au lieu d'un <style> injecté ;
  bypass CSP ciblé pour l'injection d'axe (outil de test).
- docs/SECURITY.md : CSP, exception fonts, en-têtes serveur/CDN recommandés.

Les 9 écrans rendus CSP active à 0,00 % (sources ET dist/). 655 tests, lint vert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Garde i18n, a11y outillée (axe-core), CSP stricte, styles inline → classes,
lint étendu à tout src/. CHANGELOG + badges README (FR/EN) à jour.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants