- Noms des liens d'équipe : comparés sans casse, accents ni ponctuation
(ld_engine::names), lettres latines seulement (pas de sosie cyrillique,
grec ou pleine chasse), une ligne ; index unique (migration additive
0003) contre deux ouvertures simultanées sous le même nom.
- Une personne déjà connectée ne prend une place que si le lien lui
ajoute un groupe ; « Ce n'est pas moi » la déconnecte sur un navigateur
partagé ; un lien collé dans le même onglet est relu.
- Coller ou couper un mot de quantité n'est pas une coquille
(« sur tout » → « surtout », « par tout » → « partout »).
- Libellés sans caractère de contrôle ; la soumission revérifie le titre.
Boucle : 68 tests Rust, svelte-check, 9 vitest, e2e 13/13.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Liens d'équipe (Yvv, 2026-10-21) : un lien réutilisable jusqu'à une date
et pour un nombre de personnes, révocable. Chaque ouverture demande un nom
et crée sa propre identité d'invitation, jamais administratrice ; un nom
déjà pris est refusé ; une personne déjà connectée reçoit les groupes.
trustinWallet montre par quel lien chaque identité est venue, et donne un
nouveau lien de connexion à une personne invitée (autre appareil).
Migration additive 0002 (table team_links, colonne identities.team_link).
Publication : yvv/libredecision-textes sur git.open.us.org, pour
l'instant (un dépôt pour l'ouverture, puis le dépôt officiel, viendront).
Huitième relecture (c3d6bf8 : ok), points corrigés :
- une négation n'est jamais coupée ni formée par collage (« ja mais ») ;
- caractères invisibles : tout l'ensemble Unicode des ignorables et les
contrôles autres que saut de ligne et tabulation ;
- sauts de ligne et indentation font partie de la forme (listes) ;
- un titre tient sur une ligne.
Boucle : 65 tests Rust, svelte-check, 9 vitest, e2e 13/13 (C12 ajouté).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Mots collés ou coupés : deux au plus, jamais sur une négation
(« Si non » → « Sinon », « ne certifier » → « necertifier » sont du fond).
- Titre et corps jugés chacun pour soi, puis ensemble : le titre n'absorbe
plus le début du corps.
- Caractères invisibles refusés aussi au découpage d'un brouillon et à la
soumission.
- Tabulation et retour chariot ne sont plus des espaces libres ; les lettres
latines rares (ǃ, Ʒ…) font partie de la forme.
- Le diff renvoyé après une coquille couvre le titre.
Boucle : 62 tests Rust, svelte-check, 9 vitest, e2e 12/12.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- La forme du texte (tout ce qui n'est ni lettre latine ni espace, dans
l'ordre, avec les espaces qui touchent un chiffre) ne bouge plus : ponctuation,
emphase, signes, parenthèses passent par une proposition (un signe moins devant
un nombre en gras, deux conditions fusionnées, une parenthèse déplacée).
Apostrophes et guillemets de tous styles comptent pour un même signe.
- Les espaces ne font que coller ou couper des mots, jamais déplacer une
frontière (« les avoir » → « le savoir »).
- Identifiants qui contiennent un chiffre (clés, références) comparés à
l'identique, casse comprise, comme les adresses.
- Correction écrite seulement sur le texte jugé (révision, statut, texte) :
sinon conflit « changed » — plus de course avec une entrée en vigueur.
- Déploiement : « previous » n'est pas repris d'un pipeline annulé.
- Interface (fr/en/es) : la note de correction dit la règle telle qu'elle est.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Signature : tout caractère qui n'est pas une lettre latine et touche un
chiffre compte, espaces et ponctuation comprises (« 5, 0 », « 1:5 »,
« 1…5 ») ; un tiret compte devant ou après un chiffre à travers les espaces
(« - 5 ») ; seules quatre espaces sont libres (ordinaire, insécable, fine
insécable, saut de ligne).
- Négations complétées (guère, point, nothing, nobody, nadie, jamás…).
- Adoption : le texte qui entre en vigueur est celui qui a été compté — une
révision arrivée pendant le passage l'arrête.
- Déploiement : « previous » est gardé avant le témoin de déploiement.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Une coquille ne touche que des lettres latines, des espaces et la ponctuation
ordinaire ; tout le reste est figé : chiffres de toute écriture, signes,
relations, parenthèses, sosies (U+201A, U+2044, pleine chasse), marques
superposées (U+0336, U+0338), autres alphabets, rayure Markdown, contenu entre
accents graves, séparateurs et tirets collés à un chiffre.
- Adresses (domaines, liens, courriels) comparées à l'identique.
- Glissement de clavier au cœur du mot seulement (ni les deux premières ni les
deux dernières lettres : préfixes, nombre, genre, temps, mode) ; mots de
position ajoutés (dessus/dessous, avant/après…).
- Chaque correction est mesurée contre le texte voté (dernière révision initiale
ou de fond) : les glissements ne s'additionnent plus ; le texte soumis d'un
brouillon devient sa révision initiale.
- Déploiement : « previous » = l'image du conteneur en service, pas la dernière
construite ; migrations inconnues tolérées pour qu'une image précédente démarre.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Mot mal tapé = un seul glissement (une lettre ajoutée, retirée, ou deux
voisines inversées), jamais au début du mot (préfixes : valide/invalide,
limitée/illimitée), jamais une lettre remplacée (deux/dix, majorité/minorité),
jamais sur un mot de négation ou de quantité, mots de 4 lettres au moins.
- Parenthèses, crochets, « / » et tout ce qui est entre accents graves comptent
comme le sens (ceil(N^(1/5)) → ceil(N^1/5) n'est plus une coquille).
- Caractères invisibles (inversion du sens d'écriture, largeur nulle, BOM)
refusés dans les textes, titres, traductions et motifs de signalement.
- Déploiement : la version en service est gardée (image « previous ») ; un
témoin marque le déploiement en cours ; « retablir » relance la maquette au
premier déploiement, la version précédente ensuite ; la liste des conteneurs
retirés n'est plus vidée par un pipeline annulé.
- Tests : 59 Rust (dont 14 scénarios d'API, avec deux → dix sur E2 en vigueur
et l'inversion bidi), e2e 12 / 12.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Dans Monnaie libre (électorat = toile de confiance), seuls les membres de la
toile votent (trustin_access::votes_in) ; une identité d'invitation y lit,
propose et signale. L'interface le dit à la place des boutons (fr/en/es).
- Un lien d'invitation ne vise jamais une identité Ğ1 ; le lien est réservé
avant de créer l'identité (deux acceptations simultanées : une seule passe).
- Un nombre n'est jamais une coquille (« 50 » → « 5,0 », « 1 5 » → « 15 »).
- Redirection après connexion : caractères de contrôle refusés.
- En-têtes : X-Frame-Options DENY, frame-ancestors 'none', nosniff, Referrer-Policy.
- Déploiement : le produit passe en premier ; la maquette attend son succès.
Les conteneurs, même arrêtés, qui revendiquent encore la racine sortent de
« restart: always » (ils reviendraient au redémarrage de Docker).
- Tests : 57 Rust (dont 14 scénarios d'API), e2e 12 / 12 avec C11.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- docker/app.Dockerfile : une image Rust + Svelte, la construction rejoue toute
la boucle (fmt, clippy -D warnings, tests, svelte-check, vitest) ; utilisateur
non-root, volume /data. docker/app-compose.yml pour sonic (fabio).
- .woodpecker/app.yml : produit sur decision.librodrome.org, attend la maquette,
écarte tout conteneur qui revendique encore la racine, healthcheck du commit.
- .woodpecker/maquette.yml (ex .woodpecker.yml) : la maquette v2 telle quelle,
sur maquette.decision.librodrome.org, mêmes volumes.
- .env.example de la maquette rangé dans maquette/ ; celui de la v3 à la racine.
- Docs : README, CONTRIBUTING (travail à deux), CLAUDE.md v3, HANDOFF,
docs/chantiers (feuille de route, fiche, contrôles, onboarding de Chiara,
demande à poka), docs/adr 0001–0006.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>