From c626f1adedd5c74865610b51ee564fdefeae1952 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 22:45:59 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Lot=20U3b=20:=20le=20test=20d'abord,=20roug?= =?UTF-8?q?e=20sur=20a47aed0=20=E2=80=94=20C44=20(ouverture.spec.ts)=20:?= =?UTF-8?q?=20les=20r=C3=A9glages=20de=20la=20formule=20ouverts,=20en=20t?= =?UTF-8?q?=C3=AAte=20du=20document=20et=20depuis=20une=20version=20(?= =?UTF-8?q?=C2=AB=20cet=20article=20=C2=BB),=20=C3=A0=201360=20=C3=97=2090?= =?UTF-8?q?0,=20=C3=A0=201024=20=C3=97=20768=20et=20sur=20Pixel=207,=20cha?= =?UTF-8?q?que=20cellule=20du=20tableau=20des=20cinq=20crans,=20en-t=C3=AA?= =?UTF-8?q?tes=20compris,=20dans=20le=20panneau,=20son=20texte=20dans=20sa?= =?UTF-8?q?=20cellule,=20ni=20le=20tableau,=20ni=20le=20panneau,=20ni=20la?= =?UTF-8?q?=20page=20ne=20d=C3=A9filent=20de=20c=C3=B4t=C3=A9.=20Rouge=20?= =?UTF-8?q?=C3=A0=201360=20et=20=C3=A0=201024=20(le=20tableau=20d=C3=A9fil?= =?UTF-8?q?e,=20412=20et=20421=20px=20pour=20394=20;=20=C2=AB=20Voix=20pou?= =?UTF-8?q?r=20=C2=BB=20et=20ses=20cinq=20chiffres=20hors=20du=20panneau),?= =?UTF-8?q?=20vert=20sur=20t=C3=A9l=C3=A9phone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/e2e/ouverture.spec.ts | 76 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/web/e2e/ouverture.spec.ts b/web/e2e/ouverture.spec.ts index 813b470..7831ec5 100644 --- a/web/e2e/ouverture.spec.ts +++ b/web/e2e/ouverture.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page } from '@playwright/test'; +import { devices, expect, test, type Page } from '@playwright/test'; import { DOC, seedsInForce, shot, signIn, TEST_DOC } from './helpers'; // Lot U3 (Yvv, 2026-11-03, vers 20 h 38 et avant 20 h 44): the rules of operation leave the votes @@ -255,3 +255,77 @@ test('C43 — les informations de fonctionnement là où elles servent : le vote await expect(inForce).toContainText('Si plusieurs versions atteignent leur seuil, celle qui a la marge la plus large entre en vigueur.'); await shot(page, 'c43-3-ordre-rival'); }); + +/** + * What of the table of the five levels is not seen whole in the settings panel: a header or a + * cell that leaves the table or the panel, a text that leaves its cell; the table, the panel or + * the page scrolled sideways to reach it. Empty when every column reads in full. + */ +async function hiddenInSettings(page: Page): Promise { + return page.evaluate(() => { + const panel = document.querySelector('aside.panel'); + const scroll = panel?.querySelector('.settings .scroll'); + const table = scroll?.querySelector('table'); + const body = panel?.querySelector('.body'); + if (!panel || !scroll || !table || !body) return ['pas de tableau dans le panneau']; + const faults: string[] = []; + for (const [el, what] of [ + [scroll, 'le tableau'], + [body, 'le panneau'], + [document.documentElement, 'la page'], + ] as const) { + if (el.scrollWidth > el.clientWidth + 1) faults.push(`${what} défile de côté (${el.scrollWidth} > ${el.clientWidth})`); + } + const p = panel.getBoundingClientRect(); + const s = scroll.getBoundingClientRect(); + const left = Math.max(p.left, s.left, 0); + const right = Math.min(p.right, s.right, document.documentElement.clientWidth); + const cols = table.querySelectorAll('thead th').length; + if (cols !== 6) faults.push(`${cols} colonnes au lieu de 6`); + for (const cell of table.querySelectorAll('th, td')) { + const name = (cell.textContent ?? '').replace(/\s+/g, ' ').trim(); + const c = cell.getBoundingClientRect(); + const range = document.createRange(); + range.selectNodeContents(cell); + const r = range.getBoundingClientRect(); + if (c.left < left - 0.5 || c.right > right + 0.5) + faults.push(`« ${name} » : sa cellule sort du panneau (${Math.round(c.left)}–${Math.round(c.right)} hors de ${Math.round(left)}–${Math.round(right)})`); + if (r.left < c.left - 0.5 || r.right > c.right + 0.5) faults.push(`« ${name} » : son texte sort de sa cellule`); + } + return faults; + }); +} + +test('C44 — les réglages de la formule se lisent en entier : chaque colonne des cinq crans et chaque en-tête dans le panneau, sur bureau et sur téléphone', async ({ page, browser }) => { + // Lot U3b (03/11): on a desktop, the panel cut the table on the right, « Voix pour » out of sight. + await signIn(page, 'Chiara'); + const g = await (await page.request.get('/api/groups/monnaie-libre')).json(); + const d = await (await page.request.get(`/api/docs/${g.docs[0].id}`)).json(); + const e1 = d.units.find((u: { code: string }) => u.code === 'E1'); + const version: string = e1.proposals.find((p: { seedProposal?: boolean }) => p.seedProposal).id; + const phone = await browser.newContext({ ...devices['Pixel 7'], locale: 'fr-FR' }); + const screens: { name: string; tag: string; page: Page; size?: { width: number; height: number } }[] = [ + { name: 'bureau 1360 × 900', tag: 'bureau-1360', page, size: { width: 1360, height: 900 } }, + { name: 'bureau 1024 × 768', tag: 'bureau-1024', page, size: { width: 1024, height: 768 } }, + { name: 'téléphone (Pixel 7)', tag: 'telephone', page: await phone.newPage() }, + ]; + for (const screen of screens) { + const p = screen.page; + if (screen.size) await p.setViewportSize(screen.size); + if (p !== page) await signIn(p, 'Chiara'); + // From the head of the document (the usual turnout), then from a version (« cet article » in its row). + for (const from of ['tete', 'version']) { + await p.goto(from === 'tete' ? `${DOC}?onglet=reglages` : `${DOC}?onglet=reglages&version=${version}`); + const panel = p.locator('aside.panel'); + await expect(panel.getByRole('heading', { name: 'Réglages de la formule' })).toBeVisible(); + await expect(panel.locator('table tbody tr')).toHaveCount(5); + if (from === 'version') await expect(panel.locator('tr.current th')).toContainText('cet article'); + await expect(panel.locator('thead th').last()).toHaveText('Voix pour'); + await panel.locator('table').scrollIntoViewIfNeeded(); + // Soft: every screen is looked at, and the report names each one where the table is cut. + expect.soft(await hiddenInSettings(p), `${screen.name}, ${from === 'tete' ? 'en tête du document' : 'depuis une version'}`).toEqual([]); + await shot(p, `c44-${screen.tag}-${from}`); + } + } + await phone.close(); +}); From 233cc45ff86ffeababca4f188f257e7a6279e837 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 22:50:38 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Lot=20U3b=20:=20C44=20en=20trois=20langues?= =?UTF-8?q?=20(fr,=20en,=20es),=20rouge=20sur=20l'interface=20de=20a47aed0?= =?UTF-8?q?=20=E2=80=94=2012=20cas=20sur=2018=20:=20=C3=A0=201360=20et=20?= =?UTF-8?q?=C3=A0=201024,=20en=20t=C3=AAte=20et=20depuis=20une=20version,?= =?UTF-8?q?=20le=20tableau=20d=C3=A9file=20(fr=20412=20/=20421,=20en=20406?= =?UTF-8?q?=20/=20424,=20es=20472=20/=20501=20px=20pour=20394)=20;=20sur?= =?UTF-8?q?=20Pixel=207,=20vert=20dans=20les=20trois=20langues.=20Un=20pre?= =?UTF-8?q?mier=20correctif=20(en-t=C3=AAtes=20repli=C3=A9s,=20marges=20du?= =?UTF-8?q?=20bureau=20gard=C3=A9es)=20laissait=20l'espagnol=20=C3=A0=2040?= =?UTF-8?q?6=20px=20:=20le=20test=20le=20dit=20d=C3=A9sormais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/e2e/ouverture.spec.ts | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/web/e2e/ouverture.spec.ts b/web/e2e/ouverture.spec.ts index 7831ec5..bea8b5c 100644 --- a/web/e2e/ouverture.spec.ts +++ b/web/e2e/ouverture.spec.ts @@ -313,19 +313,30 @@ test('C44 — les réglages de la formule se lisent en entier : chaque colonne d const p = screen.page; if (screen.size) await p.setViewportSize(screen.size); if (p !== page) await signIn(p, 'Chiara'); - // From the head of the document (the usual turnout), then from a version (« cet article » in its row). - for (const from of ['tete', 'version']) { - await p.goto(from === 'tete' ? `${DOC}?onglet=reglages` : `${DOC}?onglet=reglages&version=${version}`); - const panel = p.locator('aside.panel'); - await expect(panel.getByRole('heading', { name: 'Réglages de la formule' })).toBeVisible(); - await expect(panel.locator('table tbody tr')).toHaveCount(5); - if (from === 'version') await expect(panel.locator('tr.current th')).toContainText('cet article'); - await expect(panel.locator('thead th').last()).toHaveText('Voix pour'); - await panel.locator('table').scrollIntoViewIfNeeded(); - // Soft: every screen is looked at, and the report names each one where the table is cut. - expect.soft(await hiddenInSettings(p), `${screen.name}, ${from === 'tete' ? 'en tête du document' : 'depuis une version'}`).toEqual([]); - await shot(p, `c44-${screen.tag}-${from}`); + // From the head of the document (the usual turnout), then from a version (« cet article » in its + // row); in each language, whose headers are longer in Spanish (« Proporción exigida », « Votos a favor »). + for (const [lang, last, current] of [ + ['fr', 'Voix pour', 'cet article'], + ['en', 'Votes for', 'this article'], + ['es', 'Votos a favor', 'este artículo'], + ]) { + for (const from of ['tete', 'version']) { + await p.goto(from === 'tete' ? `${DOC}?onglet=reglages` : `${DOC}?onglet=reglages&version=${version}`); + if ((await p.evaluate(() => localStorage.getItem('ld:lang'))) !== lang) { + await p.evaluate((l) => localStorage.setItem('ld:lang', l), lang); + await p.reload(); + } + const panel = p.locator('aside.panel'); + await expect(panel.locator('table tbody tr')).toHaveCount(5); + if (from === 'version') await expect(panel.locator('tr.current th')).toContainText(current); + await expect(panel.locator('thead th').last()).toHaveText(last); + await panel.locator('table').scrollIntoViewIfNeeded(); + // Soft: every screen is looked at, and the report names each one where the table is cut. + expect.soft(await hiddenInSettings(p), `${screen.name}, ${lang}, ${from === 'tete' ? 'en tête du document' : 'depuis une version'}`).toEqual([]); + if (lang === 'fr') await shot(p, `c44-${screen.tag}-${from}`); + } } + await p.evaluate(() => localStorage.setItem('ld:lang', 'fr')); } await phone.close(); }); From 848968b154c597e01a7e1c2df5a9e5c52fac3ae0 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 22:52:08 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Lot=20U3b=20:=20le=20tableau=20des=20cinq?= =?UTF-8?q?=20crans=20se=20lit=20en=20entier=20dans=20le=20panneau=20des?= =?UTF-8?q?=20r=C3=A9glages,=20sur=20bureau=20comme=20sur=20t=C3=A9l=C3=A9?= =?UTF-8?q?phone=20(C44=20vert).=20La=20cause=20:=20le=20tableau=20ne=20re?= =?UTF-8?q?sserrait=20ses=20cellules=20et=20ne=20repliait=20ses=20en-t?= =?UTF-8?q?=C3=AAtes=20et=20le=20nom=20du=20cran=20que=20sous=20480=20px?= =?UTF-8?q?=20d'=C3=A9cran=20(@media),=20alors=20qu'il=20vit=20dans=20le?= =?UTF-8?q?=20panneau=20de=20droite,=2027rem=20quelle=20que=20soit=20la=20?= =?UTF-8?q?largeur=20de=20l'=C3=A9cran=20(394=20px=20utiles,=20=C3=A0=20pe?= =?UTF-8?q?ine=20plus=20que=20la=20feuille=20d'un=20t=C3=A9l=C3=A9phone,?= =?UTF-8?q?=20374)=20:=20sur=20bureau,=20en-t=C3=AAtes=20sur=20une=20ligne?= =?UTF-8?q?=20et=20marges=20larges,=20il=20demandait=20412=20=C3=A0=20501?= =?UTF-8?q?=20px=20et=20d=C3=A9filait=20de=20c=C3=B4t=C3=A9,=20=C2=AB=20Vo?= =?UTF-8?q?ix=20pour=20=C2=BB=20hors=20de=20vue.=20Le=20correctif,=20seule?= =?UTF-8?q?ment=20dans=20FormulaSettings.svelte=20:=20les=20r=C3=A8gles=20?= =?UTF-8?q?du=20t=C3=A9l=C3=A9phone=20pour=20toutes=20les=20largeurs=20(ce?= =?UTF-8?q?llules=20=C3=A0=200,4rem=200,3rem,=20en-t=C3=AAtes=20et=20nom?= =?UTF-8?q?=20du=20cran=20repliables,=20un=20chiffre=20jamais=20coup=C3=A9?= =?UTF-8?q?)=20;=20plus=20de=20@media.=20Aucun=20texte=20chang=C3=A9,=20le?= =?UTF-8?q?=20panneau=20inchang=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/src/lib/components/FormulaSettings.svelte | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/web/src/lib/components/FormulaSettings.svelte b/web/src/lib/components/FormulaSettings.svelte index 7481d3e..18ed6a3 100644 --- a/web/src/lib/components/FormulaSettings.svelte +++ b/web/src/lib/components/FormulaSettings.svelte @@ -148,12 +148,20 @@ font-size: 0.88rem; font-variant-numeric: tabular-nums; } + /* The table lives in the side panel, 27rem at most whatever the screen (DocPanel), about as + narrow as a phone's sheet: on a desktop as on a phone, the cells sit close and the headers + and the level's name wrap, so that the six columns hold, in each language; a figure never + wraps (lot U3b). */ th, td { - padding: 0.45rem 0.55rem; + padding: 0.4rem 0.3rem; text-align: right; white-space: nowrap; } + thead th, + th[scope='row'] { + white-space: normal; + } thead th { font-size: 0.74rem; font-weight: 800; @@ -193,15 +201,4 @@ .tag { font-size: 0.68rem; } - /* On a phone, six columns hold in the sheet: the headers and the level's name wrap. */ - @media (max-width: 480px) { - th, - td { - padding: 0.4rem 0.3rem; - } - thead th, - th[scope='row'] { - white-space: normal; - } - } From a6f5e22bea9393d9ed38ef2807a1aebd1ccbc105 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 22:52:47 +0100 Subject: [PATCH 4/5] =?UTF-8?q?Lot=20U3b=20:=20CONTROLES.md=20(C44=20:=20l?= =?UTF-8?q?es=20r=C3=A9glages=20de=20la=20formule=20se=20lisent=20en=20ent?= =?UTF-8?q?ier,=20bureau=201360=20et=201024,=20t=C3=A9l=C3=A9phone,=20fr,?= =?UTF-8?q?=20en,=20es)=20;=20UX-lecteur.md=20(le=20panneau=20des=20r?= =?UTF-8?q?=C3=A9glages=20se=20lit=20en=20entier,=20section=20du=20lot=20U?= =?UTF-8?q?3)=20;=20CLAUDE.md=20(C1=E2=80=93C44,=2046=20contr=C3=B4les,=20?= =?UTF-8?q?48=20tests)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 4 ++-- docs/chantiers/acte-certification/CONTROLES.md | 1 + docs/chantiers/acte-certification/UX-lecteur.md | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 40bc2c6..736622d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -106,7 +106,7 @@ web/src/ # · g/[group]/decisions · g/[group]/mandats · # g/[group]/protocoles (à venir) · acces (trustinWallet) · messages (la boîte) ; # /groupes, /decisions… redirigent -web/e2e/ # Playwright C1–C43 + M1, M2 ; serve.sh = serveur jetable /tmp/ld-e2e sur :8092 et +web/e2e/ # Playwright C1–C44 + M1, M2 ; serve.sh = serveur jetable /tmp/ld-e2e sur :8092 et # chain-mock.mjs (nœud et indexeur Ğ1 simulés) ; faux portefeuille dans helpers.ts docker/ # app.Dockerfile · app-compose.yml (sonic) .woodpecker/ # app.yml · maquette.yml @@ -128,7 +128,7 @@ maquette/ # v2 intacte (frontend Nuxt, backend FastAPI, docker, docs-v ```bash export PATH=$HOME/.cargo/bin:$PATH cargo fmt --all --check && cargo clippy --workspace --all-targets -- -D warnings && cargo test --workspace -cd web && npm run check && npm test && npm run build && npm run e2e # e2e : 45 contrôles (47 tests, C25 et C35 en deux) +cd web && npm run check && npm test && npm run build && npm run e2e # e2e : 46 contrôles (48 tests, C25 et C35 en deux) LD_DEV_LOGIN=1 cargo run -p ld-server # :8002, sert web/build cd web && npm run dev # :3002 à chaud diff --git a/docs/chantiers/acte-certification/CONTROLES.md b/docs/chantiers/acte-certification/CONTROLES.md index b588aa2..239e1fd 100644 --- a/docs/chantiers/acte-certification/CONTROLES.md +++ b/docs/chantiers/acte-certification/CONTROLES.md @@ -60,6 +60,7 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. | C41 | Qui n'est pas encore invité (lot U3 ; Yvv, 03/11) | sans session : `/`, puis « Se connecter » ; puis en anglais et en espagnol | à l'accueil, à la place du bouton de connexion Ğ1 (pas encore active) : « Pour rentrer dans un groupe de décisions, il faut pour l'instant demander un lien d'invitation à Chiara ou à Yvv. Ce prototype n'est pas encore câblé sur la chaîne. », puis « Tu as reçu un lien d'invitation ? Ouvre-le simplement : il te connecte. » ; sur « Se connecter », le même mot une seule fois, et la ligne Ğ1 ne dit plus « En attendant, on entre avec un lien d'invitation » ; en, es : le même mot traduit | | C42 | Une poignée tirée sur plusieurs lignes (lot U3, défaut vu par T4) | groupe d'essai : « Réordonner » les engagements fondamentaux ; tirer la poignée du dernier article jusqu'en haut, lentement ; puis flèche bas ; « Annuler » | l'article arrive en place 1, sans revenir en arrière en route ; « « … » en place 1 sur 4. » est dit, le focus est sur lui ; la flèche le descend en place 2, dit aussi | | C43 | Les informations de fonctionnement là où elles servent (lot U3, ADR 0014) | Monnaie libre : le vote de la Raison d'être, « La formule du seuil », « Réglages de la formule » ; groupe d'essai : « Réordonner » les engagements fondamentaux, puis « N ordre(s) proposé(s) » et « Le vote » de l'ordre en vigueur → « Autres versions » | sous les boutons : « Le vote reste ouvert, sans échéance : tu peux changer ou retirer ton vote à tout moment, le dernier fait foi. » ; la formule : T′ (« votants retenus : 12, T ou Q s'il en manque »), G « déduit de la participation habituelle du groupe », « arrondi à l'entier au-dessus », « Sous le quorum Q de l'article… autant de « pour » que si Q personnes avaient voté » ; les réglages : « Part exigée : celle que le cran demande au-delà du quorum de l'article, à la participation habituelle. », « Elle ne dépend pas du quorum d'un article. », la phrase de G, jamais « d'habitude » ; en réordonnant : « S'il entre en vigueur, seuls les articles de cette section changent de place ; aucun texte ne change. » ; le vote d'un ordre proposé à côté de l'ordre en vigueur : la marge à dépasser, et le texte remplacé qui redevient une proposition ; « Autres versions » : « Si plusieurs versions atteignent leur seuil, celle qui a la marge la plus large entre en vigueur. » (l'inventaire : `U3-informations.md`) | +| C44 | Les réglages de la formule se lisent en entier (lot U3b) | Monnaie libre : « Réglages de la formule » en tête du document, puis depuis le vote d'Unicité du compte ; sur un bureau (1360 × 900, puis 1024 × 768) et sur un téléphone ; en FR, EN, ES | le tableau « Les cinq crans » tient dans le panneau : ses six colonnes, « Voix pour » et ses cinq chiffres compris, sans que le tableau, le panneau ou la page défilent de côté ; les en-têtes peuvent passer sur deux lignes (« Part / exigée », « Voix / pour »), le nom du cran aussi, un chiffre jamais ; depuis le vote, « cet article » sur la ligne du cran 2 ; dans les quatre ambiances | ## Au-delà de la liste diff --git a/docs/chantiers/acte-certification/UX-lecteur.md b/docs/chantiers/acte-certification/UX-lecteur.md index db0c570..50b7f22 100644 --- a/docs/chantiers/acte-certification/UX-lecteur.md +++ b/docs/chantiers/acte-certification/UX-lecteur.md @@ -219,3 +219,8 @@ trouver leur place dans l'ux ». Tranché ainsi (inventaire : `U3-informations.m - **Réordonner au glisser** : la ligne sous le pointeur se lit à sa place dans la mise en page, pas là où l'animation la montre : tirée sur plusieurs lignes, la poignée ne revient plus en arrière, et la nouvelle place est dite. +- **Le panneau des réglages se lit en entier** (lot U3b) : le tableau des cinq crans vit dans le + panneau de droite, 27rem sur tout bureau, à peine plus large que la feuille d'un téléphone ; il en + prend donc les règles partout (cellules resserrées, en-têtes et nom du cran sur deux lignes au + besoin, un chiffre jamais coupé) : « Voix pour » ne se cache plus derrière un défilement de côté, + en français, en anglais, en espagnol (C44 ; captures : `/tmp/ld-u3b-shots/`). From 1938496ceaf80359c4d179196ff558f87164b471 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 22:59:19 +0100 Subject: [PATCH 5/5] CONTROLES : le passage de la boucle finale du lot U3b sur a6f5e22 (46 / 46 verts, 48 tests, du premier coup ; C44 vu rouge sur l'interface de a47aed0 avant le code, 12 cas sur 18) Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/CONTROLES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/chantiers/acte-certification/CONTROLES.md b/docs/chantiers/acte-certification/CONTROLES.md index 239e1fd..3afb0d4 100644 --- a/docs/chantiers/acte-certification/CONTROLES.md +++ b/docs/chantiers/acte-certification/CONTROLES.md @@ -107,3 +107,4 @@ page, la langue et la taille de l'écran. Les retours se traitent dans trustinWa | 2026-11-03 | automate | local, lot T3c sur `42c803e` (après la relecture de `e7ab82f` : « à la participation habituelle » à la place de « comme d'habitude » dans F1.2 et N1.1, « le quorum de l'article », « la part exigée », « repose sur moins de 5 propositions », « ramenée » ; aucun contrôle changé) | C1–C38, M1, M2 | 40 / 40 verts (42 tests), du premier coup (19 h 51 - 19 h 55, sous le verrou `/tmp/ld-e2e.lock`) | | 2026-11-03 | automate | local, lot T4 sur `3996f6f` (les textes d'Yvv du 03/11 pour I1, E1, E2 ; E12 « Responsabilité civique » entre E1 et E2 ; formule, inertie et ordonnancement sortis du document, ADR 0014 : C3, C9, C17, C18, C25, C31, C35, C38 repris ; C35 glisse d'une place) | C1–C38, M1, M2 | 40 / 40 verts (42 tests) à la boucle finale (21 h 47 - 21 h 50, sous le verrou `/tmp/ld-e2e.lock`) ; avant, 39 / 42 (C18, C31, C35 lisaient l'ancien texte d'I1 ou trois articles), puis 41 / 42 (C35 : un glisser de deux places réordonne mais n'est pas annoncé, signalé pour U3) | | 2026-11-03 | automate | local, lot U3 sur `d15d46e` (l'interface de l'Acte d'engagement : le chapitre « Info ouverture doc de réf. », la séparation, plus les titres « Introduction » et « Engagements fondamentaux », C39 ; « Proposition d'amorce » en fr, en, es, C40 ; le mot pour qui n'est pas invité, C41 ; une poignée tirée sur plusieurs lignes, annoncée et suivie par le focus, C42 ; les informations de fonctionnement là où elles servent, C43 ; C1, C3, C20, C27, C35, C38 suivent les mots) | C1–C43, M1, M2 | 45 / 45 verts (47 tests), du premier coup à la boucle finale (22 h 32 - 22 h 37, sous le verrou `/tmp/ld-e2e.lock`) ; avant le code, C39 à C43 vus rouges (5 / 5) sur `590ccd7` | +| 2026-11-03 | automate | local, lot U3b sur `a6f5e22` (le tableau des cinq crans se lit en entier dans le panneau des réglages, sur bureau comme sur téléphone, en fr, en, es, C44) | C1–C44, M1, M2 | 46 / 46 verts (48 tests), du premier coup à la boucle finale (22 h 55 - 22 h 59, sous le verrou `/tmp/ld-e2e.lock`) ; avant le code, C44 vu rouge sur l'interface de `a47aed0` : 12 cas sur 18 (bureau 1360 et 1024, en tête et depuis une version, trois langues : le tableau défile, 406 à 501 px pour 394), le téléphone vert |