- ADR 0008 : bulletin scellé (ld1: + blake2b-256, sel de 128 bits), la transaction
utility.batchAll (virement + remarque), la confirmation sur l'indexeur, le dernier
fait foi dans l'ordre de la chaîne, groupes gérés, ce que voit la chaîne, ce que
sait le serveur, réglages LD_VOTE_*, coût et limites. Noté dans 0006.
- CHANTIER : le vote déplié, le panier, « une personne, une voix » par la chaîne ;
le droit de vote se vérifie au moment de la confirmation sur la chaîne.
- CONTROLES : C4, C5, C6, C11, C17, C19, C20, M1 mis à jour ; C21–C24 ; passage
du lot B, 25 / 25 verts.
- CLAUDE.md : ballots.rs, indexer.rs, ballot/address du moteur, wallet/, panier,
chaîne simulée des e2e. Compose : où poser LD_VOTE_ACCOUNT (en commentaire).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Le vote se déplie sous l'article, façon accordéon, l'URL pour état (?vote=) :
niveau d'eau, totaux, seuil et voix manquantes, ton vote et où il en est
(enregistré, inscrit sur la chaîne, en attente, à reconfirmer, non compté),
inertie et formule. Le reste d'une version (coquilles, traductions,
signalements, historique) passe dans l'onglet « Détails » du panneau.
- Le panier : article par article, « tout pour / tout contre » par section ou
pour tout le document, jamais pour un article à plusieurs versions ; un seul
geste (une écriture, ou une transaction).
- La signature : le portefeuille de la page (injectedWeb3), polkadot-api chargé
au moment de signer ; sans portefeuille, Ğecko par lien et QR ; la page
attend la confirmation. Un bulletin que le portefeuille n'a pas signé est
lâché aussitôt (DELETE /api/ballots/{id}).
- Pastilles d'ambiance : flèches dans le groupe, anneau de focus pointillé à
la couleur d'accent de la page (3:1 au moins), distinct du choix.
- e2e : chaîne simulée (indexeur et nœud), faux portefeuille ; C21–C24, et
C4, C5, C6, C11, C17, C19, C20, M1 mis à jour.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le bulletin scellé (ld1: + blake2b-256 du bulletin canonique, sel de 128 bits),
l'ordre de la chaîne (bloc, puis rang de l'événement : le dernier fait foi), les
adresses SS58 comparées par clé (ld-engine, pur). trustin-access : Monnaie libre
vote par la chaîne, les groupes gérés sur le serveur ; le droit de vote se lit à
la confirmation. Serveur : bulletins en attente, confirmation sur l'indexeur
(virement, auteur, identité, membre), identité idty:<index> créée au besoin,
tâche de fond toutes les 10 s, expiration à 24 h, vote groupé en une écriture
dans les groupes gérés. Migration additive 0006. Sans LD_VOTE_ACCOUNT, le vote
par la chaîne est éteint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La médiane de participation ne compte plus les propositions retirées (invisibles, votes
non repris). Quand l'échelle ramène la participation dans ses bornes, les réglages disent
la médiane mesurée (ou deux fois C) et, à part, la valeur sur laquelle les seuils se calculent.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR 0007 : les cinq crans, M_k et s_k, G_k déduit à la participation
habituelle ; la médiane (propositions votées dans l'année, au moins 5,
T compté à la mesure), la référence 2C/W, les bornes [1 %, 50 %], le
recalcul une fois par jour, l'héritage de l'inertie de l'inertie,
l'arrondi stable, la migration et l'amendement de E1 et E2, ce que ça
coûte (seuils comparés à ceux d'avant). L'ADR 0002 le note ; index.
CHANTIER.md : la table des crans et « l'inertie se vote aussi » au cran
de l'article. CLAUDE.md : l'invariant devient « hérite du cran de
l'article ». CONTROLES.md : C4, M1, et C20 « réglages de la formule et
cinq crans ». README, note de source du seed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'inertie se lit en crans, « 3 / 5 · moyenne » (très basse, basse,
moyenne, haute, très haute ; fr, en, es). Le sélecteur offre les cinq
crans, l'actuel marqué ; le changement se vote au cran de l'article.
L'article dit le passé de son inertie (vote ou réglage de départ).
« Réglages de la formule », en lecture seule, depuis l'en-tête du doc et
depuis le vote d'un article (onglet « Réglages » du panneau, dans
l'URL) : W et sa source, C, B, la participation habituelle (médiane ou
référence, sur combien de propositions, quand), et les cinq crans : M,
G, part exigée, voix pour exigées à la participation de la version
regardée (ou habituelle depuis l'en-tête).
Composants à part (InertiaPicker, FormulaSettings), branchés par
quelques lignes dans VoteView. La formule dépliée ne fait plus déborder
le panneau. e2e : C4 (cran de l'article dans la formule), C20 (réglages
et cinq crans), M1 (réglages lisibles sur mobile).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moteur (ld-engine/inertia.rs) : cinq crans, M_k = 50, 50, 55, 60, 66 % ;
s_k = 60, 67, 75, 83, 90 % de « pour » au-delà de C à la participation
habituelle p̃ ; G_k = ln(1 − (s_k − M_k)/(1 − M_k)) / ln(p̃). p̃ = médiane
des votants des propositions du groupe (au moins 5, votées dans l'année),
sinon la référence 2C/W ; bornée à [1 %, 50 %]. Le changement d'inertie
hérite du cran de l'article (remplace « inertie + »). Un seuil qui tombe
sur un entier n'y gagne plus une voix par arrondi.
Données : migration 0005 (les quatre mots deviennent 2 à 5, gardés tels
quels dans *_legacy ; adoptions intactes ; journaux inertia_changes et
inertia_amendments). Seed : 3 partout, 4 pour E1 et E2. Amendement
d'inertie gardé (E1, E2 : 3 → 4, seulement si aucun vote n'a changé leur
inertie ; une proposition d'inertie ouverte reste ouverte, votée au
nouveau cran), journalisé, une seule fois, republié.
Serveur : participation mesurée une fois par jour (settings), échelle
dans les seuils, le balayage et l'adoption ; crans, M, G, s_k, p̃ et sa
source servis au client.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le lien porte « Docs de référence, 1 doc en cours » (fr, en, es) au lieu
d'un texte masqué collé au libellé ; contrôlé dans C15.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Les variantes d'un seed partagent la même seconde : la liste les ordonnait par leur
identifiant aléatoire, donc différemment d'une base à l'autre (E3 : 0.4.0-draft avant
1.0.0 une fois sur deux, vu par C14). Dernier départage : l'ordre d'insertion (rowid).
Le moteur classe les rivales lui-même ; seul l'affichage change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Accueil : le titre, le leitmotiv en trois lignes (contexte et cadrage ·
processus et modalités · boîte à outils), puis directement le choix du
groupe ; sans session, la connexion à sa place. /groupes redirige vers /,
« Mes groupes » et le retour après connexion mènent à /.
- Logo « Clé de voûte » du DA (signe en currentColor, clé en --cle, libre
Literata italique, Decision romain), droit, dans le menu et la barre
mobile ; Stamp retiré, le sceau 井 ne bouge pas. Favicon, icônes 16/32/48,
apple-touch, 192/512, manifeste.
- Quatre ambiances : pierre et calcaire (claires), nuit et ardoise
(sombres), --cle par ambiance ; quatre pastilles à la place du soleil /
lune ; première visite selon l'appareil (pierre / nuit). Calcaire et
ardoise : textes, accent, mousse et avertissement à 4,5:1 au moins.
- Page d'un groupe : les quatre piliers, puis « En cours ».
- Menu : nombre de docs en cours à côté de « Docs de référence », surligné
seulement dedans, seul Docs réagit au survol ; les trois autres éteints
mais ouvrent leur page ; hors d'un groupe, le dernier groupe ouvert.
- /g/[group]/docs « En cours » + « À venir » ; /mandats et /protocoles du
groupe : « À venir » éteints ; /g/[group]/decisions : une ligne par doc,
« N modules à voter », « dont N sans ton vote ». Anciennes adresses
/decisions, /mandats, /protocoles : vers le groupe courant, sinon /.
- e2e : C1, C2, C11, C12, M1 mis à jour ; C13–C17 pour L1–L6 ; CONTROLES.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- « Propositions en cours » : une ligne par article. Un article à plusieurs versions montre
leur nombre et la meilleure en tête (niveau d'eau, pour / contre, « en tête » quand elle
devance vraiment) ; la ligne se déplie (bouton à aria-expanded, clavier) sur ses versions,
chacune avec son étiquette (variante, auteur), son niveau, ses marques, et un extrait qui
part de là où les versions divergent ; un clic ouvre son vote comme avant.
- Règle pure dans versions.ts (vitest) : ordre du document, meilleure d'abord (niveau d'eau,
puis pour, puis contre ; une version bloquée jamais en tête), un article reste dans un
filtre dès qu'une de ses versions passe.
- e2e : C3 compte 30 lignes, C14 déplie « Connaissance suffisante » au clavier ; C11 passe
par un article à une seule version.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- seed : I1 devient « Raison d'être », texte d'Yvv (fr), traduit en « Purpose » et
« Razón de ser » ; apostrophes droites comme le reste du seed, insécables avant « ; » et
dans les guillemets.
- seed_amend.rs : un amendement de seed remplace un texte de départ dans une base existante,
décidé une fois par document et seulement si personne n'a touché l'article (seed a minima
d'origine, révision 1, aucun vote, aucune correction, aucune traduction de membre, aucun
signalement, empreinte attendue). Décision consignée (migration 0004, table
seed_amendments), ligne d'historique « texte de départ remplacé » avec son diff,
republication mise en file là où le document publie.
- Une coquille se mesure désormais aussi contre le texte posé par l'amendement.
- Tests : règle pure (3), scénarios d'API (base neuve, amendement appliqué et republié une
seule fois, cinq refus), e2e C13 ; C3, C6 et l'API suivent le nouveau texte (C6 : les
apostrophes typographiques d'Unicité du compte, « latransmission » ayant disparu).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ld-engine/pending : un module (article) reste à voter tant qu'aucune
version n'a été adoptée par un vote (seed a minima non confirmé, ou pas
de version en vigueur et au moins une version ouverte) ; les variantes
comptent pour un ; « sans ton vote » = aucun vote valide sur aucune version.
- overview.rs : GET /api/groups/{slug} ajoute « upcoming » (docs, mandats,
protocoles), lu au démarrage dans seeds/upcoming/<groupe>.json, trilingue,
servi seulement à qui ouvre le groupe ; GET /api/groups/{slug}/decisions,
une ligne par doc avec toVote et withoutMyVote (si la personne vote).
- Retour après connexion par défaut : « / » au lieu de « /groupes ».
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Douzième relecture (850f9c4 : ok), défauts anciens de publish.rs mis en
jeu par le nouveau dépôt :
- un commit que le dépôt n'a jamais reçu (premier envoi refusé, clé sans
droit d'écriture) repart au passage suivant, au lieu d'une file marquée
faite avec un dépôt vide ;
- un changement de remote vers un dépôt neuf et vide lui envoie
l'historique ;
- au démarrage, ce qui attendait repart aussitôt (le délai croissant
pouvait atteindre 6 h).
trustinWallet montre l'état de la publication (en attente, dernier échec,
dernier commit) et offre « Publier maintenant ».
Boucle : 69 tests Rust, svelte-check, 9 vitest, e2e 13/13.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le dépôt des textes créé par Yvv sur git.open.us.org (2026-10-21) :
séparé du code, pour que la clé du serveur n'écrive jamais dans
yvv/decision et que le dépôt se transfère d'un bloc à l'ouverture.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tout auteur venu par invitation porte « sur invitation » à côté de son
nom (propositions, révisions, signalements) : un nom pris avant l'arrivée
de son titulaire Ğ1, ou une lettre sosie, ne passe pas pour un membre de
la toile.
- Un lien d'équipe refuse aussi le nom qu'une invitation attend encore.
Boucle : 68 tests Rust, svelte-check, 9 vitest, e2e 13/13.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- Correction de coquille : un chiffre, un signe, un séparateur dans un nombre ou
une relation changés (« >= » → « <= », « + » → « - », « 182.625 » → « 182 625 »,
« % » → « ‰ ») rendent la modification « de fond ». Testé dans le moteur et
par l'API sur le vrai texte K1.
- Déploiement : les conteneurs retirés de la racine qui tournaient sont notés ;
si la suite échoue, l'étape « retablir » arrête le produit et les relance.
Le produit est recréé à chaque déploiement (--force-recreate).
- Cookies préfixés en https : __Host-ld_session, __Secure-ld_oauth (pas de
cookie planté par un site voisin sous librodrome.org).
- syft épinglé (v1.55.0) dans les deux pipelines : ce conteneur a le socket Docker.
- Docs : limites connues assumées, groupe d'essai à deux voix, error.identity_kind.
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>
- Clé de publication ed25519 générée au démarrage dans le volume ; sa partie
publique et l'état de la file d'envoi s'affichent dans /acces.
- Publication initiale à l'instanciation d'un document seedé publiable.
- Reprise au démarrage : chaque document publié repasse une fois dans la file ;
la date publiée est celle du dernier changement, un document inchangé ne
fait pas de commit (testé contre un dépôt nu).
- Le travailleur fait un premier passage sans attendre ; journaux sans codes
couleur hors terminal.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Accueil sobre, menu complet à gauche (Décisions, Docs de référence, Mandats,
Protocoles), intro demandée, quatre sections, connexion Ğ1.
- Lecteur : texte en vigueur en Literata, actions contextuelles par article
(le vote, propositions, proposer), propositions en cours sous la « surface »
avec leur niveau d'eau, aperçus « si les bien cotées passent » / « si tout
passe », langue du texte fr/en/es (traductions éditoriales).
- Panneau : vote pour/contre, seuil et formule (MathML), inertie et son
changement (voté en inertie +), coquille sans vote, traduction, signalement
de contradiction, historique des corrections.
- trustinWallet (/acces) : groupes et membres, invitations à usage unique,
administrateurs, retours d'usage.
- Contrôles : vitest (markdown, catalogues, anti-lexique), Playwright C1–C10 + M1.
- Sections du seed portées jusqu'à l'écran.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- crates/ld-engine : formule inertielle (parité avec la maquette, garde C),
coquille / changement de fond, assistant d'édition à règles, composition
d'un document sous vote permanent (adoptions, aperçus, rivales).
- crates/trustin-access : qui voit, qui ouvre, qui gère les accès.
- crates/ld-server : API axum + SQLite, connexion Ğ1 (client OAuth2 de
connect.monnaie-libre.fr), invitations, entrée en vigueur automatique,
signalements de contradiction, traductions éditoriales, publication git,
taille de la toile lue sur la chaîne.
- seeds/acte-engagement-certification.json : 33 articles, fr + en + es ;
en vigueur : préambule, E1, E2 (seed a minima).
- maquette/ : frontend, backend et docker v2 déplacés tels quels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ACME : le challenge HTTP-01 échoue en IPv6 (AAAA présent, webroot non
servi en v6) ; quand un certificat est déjà en place (valide jusqu'au
30/09), on le conserve avec avertissement au lieu de bloquer le déploiement
— sans certificat existant, échec franc inchangé
- l'org forge renommée EHV→LPK a changé le COMPOSE_PROJECT_NAME : le
« compose stop » ne touchait plus l'ancienne stack ehv-decision-main-*
(double inscription fabio, trafic partagé v1/v2) → arrêt par filtre de nom
avant déploiement
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- le POST vers Dependency-Track meurt à la connexion (secret dtrack_domain
vide ou service éteint) et bloquait le déploiement au step sbom-publish
- failure: ignore — télémétrie ; le scan CVE trivy reste bloquant
- à réexaminer côté serveur : service DTrack + secrets dependency_track_token
/ dtrack_domain du repo Woodpecker
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- syft installé en « latest » émet une spec plus récente que ce que le
trivy 0.69.3 du runner décode → « invalid specification version »
au step sbom-scan (pipeline 26, tout le reste était vert)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- la dép git+ssh échouait en CI : pas de clé SSH dans les conteneurs, et
node:20-slim n'a pas le binaire git (ENOENT) — npm signalait un faux
« tarball corrupted »
- package.json + lock : git+https://git.open.us.org/… (#v0.1.0 → b1c6a2f,
même commit épinglé) — nécessite le repo yvv-nuxt-base public
- git + ca-certificates ajoutés : step test-frontend (.woodpecker.yml) et
image de base du frontend.Dockerfile
- vérifié : npm install + build zéro erreur
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- overlays Nuxt UI (UModal/USlideover) : géométrie posée en CSS
(assets/css/overlays.css) — les utilitaires tailwind attendus par @nuxt/ui
ne sont pas générés (UnoCSS ne scanne pas node_modules) : drawer mobile et
modales de confirmation se rendaient hors écran
- a11y : title/description sur les 3 overlays (DialogTitle/Description
rendus, warnings reka-ui éteints), fermeture du drawer ancrée et testée
- suppression du collectif actif : bascule sur un collectif restant —
jamais d'accueil orphelin (test store ajouté, 343 vitest verts)
- observatoire : la route « transmis » entre dans les barres (base 100 %)
- overflows mobiles à zéro : formules KaTeX (défilement), table vigueur
(défilement < 768px), pill cible (retour à la ligne), inputs decider et
mandat (border-box)
- vérifié navigateur : drawer, modale, 14 routes sans débordement,
zéro erreur console
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- les seeds (Ğ1, Atelier) n'ont aucun isMe : la carte identité propose
désormais de se désigner parmi les personnes existantes (chips) ou de
s'ajouter (formulaire), au lieu d'un état vide sans issue
- vitest 13 fichiers verts, build zéro erreur
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Ajout clause else IS NULL sur tous les endpoints list (protocols, decisions,
mandates, documents, groups, votes) — sans X-Organization → données globales
seulement, jamais le contenu d'un autre espace
- _get_protocol/_get_decision/_get_mandate : org_id propagé à tous les
endpoints GET/PUT/DELETE/advance/assign/revoke/steps → 404 si UUID d'un
autre espace
- votes.py : list_vote_sessions filtre via JOIN VotingProtocol.organization_id
- groups.py : suppression _org_id_from_header() mort, create_group assigne
organization_id correctement
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace par un bloc DO $$ IF NOT EXISTS ... $$ pour le FK circulaire
item_versions→document_items. Testé localement sur pg-test : 5 migrations
OK + idempotence OK.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 0b9c1d2e3f4a : migration initiale (CREATE TABLE IF NOT EXISTS) — safe
sur une DB déjà bootstrappée via create_all()
- 70914b334cfb : ADD COLUMN IF NOT EXISTS (organization_id) — was down_revision=None
- b78571ae9e00 : CREATE TABLE IF NOT EXISTS qualification_protocols
- c4e812fb3a01 : CREATE TABLE IF NOT EXISTS groups + group_members
- d91a3c7f8b02 : ADD COLUMN IF NOT EXISTS origin (mandates)
- Dockerfile prod : restaure alembic upgrade head au démarrage
Sur le serveur prod, exécuter une fois :
docker exec <projet>-backend alembic upgrade head
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le lifespan FastAPI appelle déjà init_db() (create_all) au démarrage.
Lancer alembic en plus cassait sur une DB vide (migration initiale manquante).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Login : panneau proto-mode en avant quand DEMO_MODE actif (profils API)
masque le formulaire extension-required ; note trustWallet à venir
- auth.ts : TODO trustWallet avec protocole postMessage prévu
- routers/auth.py : TODO trustWallet au point de vérification signature
- test_middleware : fixture _create_tables (autouse) — ASGITransport ne
déclenche pas le lifespan, init_db() ne tournait pas → duniter_identities
introuvable au verify ; 224/224 passent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- qualify_ai_service : ai_frame_async() avec Claude Haiku
· round 1 → questions contextualisées si ANTHROPIC_API_KEY définie
· round 2 → explication enrichie par Claude
· fallback transparent sur ai_frame() si pas de clé (tests inchangés)
- config : ANTHROPIC_API_KEY + ANTHROPIC_MODEL (claude-haiku-4-5-20251001)
- requirements : anthropic>=0.97.0
- main : auth rate limit = RATE_LIMIT_DEFAULT partout (prototype mode)
→ supporte accès démo/test sans lockout en prod comme en dev
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Middleware : CORSMiddleware ajouté en dernier = plus externe = tous les
codes de retour (dont 429) portent Access-Control-Allow-Origin
→ résout "no response / Failed to fetch" sur POST /auth/challenge
- Dev mode : rate_limit_auth = RATE_LIMIT_DEFAULT (60/min) au lieu de 10/min
→ plus de blocage login après quelques reconnexions
- app.vue : watcher activeSlug → refetch documents/décisions/protocoles/mandats
→ le sélecteur de workspace filtre désormais le contenu en temps réel
- TDD : 4 tests middleware (RED→GREEN) + doc méthode docs/dev/tdd-methode.md
- Régression : 190/190 tests verts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Titres cards : "Décisions et consultation d'avis", "Documents de référence",
"Mandats et nominations", "Protocoles et fonctionnement"
- Burger supprimé sur desktop (≥768px), conservé mobile uniquement
- CI : step seed (docker exec python seed.py) entre test-deploy et healthcheck
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le fichier séparé cassait Woodpecker 3.x (multi-file + when:manual
empêchait tous les triggers push depuis commit 1842303c).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Titre : ğ(Decision) → libreDecision (libre italic/muted + Decision accent)
- Chiffres : plus de valeurs hardcodées, tout dynamique depuis les stores
(mandates store ajouté, protocoles depuis protocols.protocols.length)
- Affichage intelligent : total quand actif = 0, labels contextuels
- Grilles centrées : margin: 0 auto sur .dash
- Font-weight 800 → 700 partout (moins gras, plus classe)
- Typo : "Nuance" → "Nuancé" dans les tags
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pipeline dédié au seeding DB, déclenché uniquement manuellement.
Retire le step seed du pipeline principal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Déclenche python seed.py dans le container backend via docker exec.
Uniquement sur event: manual — ne s'exécute pas sur les push normaux.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>