| A1 |
Connexion OIDC (Zitadel), rôle admin, déconnexion côté site et IdP ; connexion locale de test hors production. |
| A2 |
Aujourd'hui (tableau de bord) : À faire trié par urgence (urgent ✕ : demandes d'accès ou d'effacement avec leur échéance d'un mois, refus dont des photos liées sont encore publiées ; bientôt ▲ : refus dans une sortie avec des photos publiées ni liées ni exclues, nouvelles personnes, Instagram en échec ou en pause ; plus tard ○ : photos à finir, publiées sans ville, titres sans traduction, preuves en erreur), chaque ligne menant à l'écran qui la règle, urgences comptées dans le menu ; photothèque filtrable par ce qui manque (?manque=ville, ?manque=traduction) ; photos à finir, ouverture, chiffres, rythme d'import, preuves, compte connecté et son sub. |
| A3 |
Photothèque : planche contact, inspecteur (une photo modifiée champ par champ, plusieurs photos classées, datées ou publiées d'un coup), sélection multiple, loupe, palette ⌘K, classement par glisser vers une série, annulation (⌘Z), recherche et filtres, suppression confirmée ; mode clair / sombre de l'admin. |
| A4 |
Import : envoi photo par photo avec suivi du traitement, photos en brouillon, date de prise de vue reprise de l'EXIF, titre provisoire tiré du nom de fichier ; puis Compléter et publier le lot (champ par champ ou d'un coup, sans JS aussi). |
| A5 |
Fiche photo : édition validée, publication, ordre, filigrane par photo, preuve d'antériorité, Instagram, audience de la photo. |
| A6 |
Séries : cartes avec couverture, création en tête, renommage, adresse, ordre (glisser ou clavier) ; supprimer une série non vide déplace ses photos vers une autre. |
| A7 |
Photographes (/admin/auteurs) : nom, adresse, bio, lettre des cartes, lien avec le compte de connexion. |
| A8 |
Site public (/admin/site : nom du site, textes, ouverture, carte du monde) et Droits & confidentialité (/admin/droits), chaque page n'enregistrant que ses champs ; /admin/reglages redirige vers Site public : nom du site, accroche, textes, à propos ; textes des droits en FR / EN / DE (le texte par défaut est affiché, « Rétablir le texte par défaut », un texte inchangé reste « par défaut ») et contact ; photos de l'ouverture (ordre, 8 au plus, vignettes en cadre 3:2, photo entière). |
| A9 |
Filigrane et EXIF : voir Filigrane et EXIF. |
| A10 |
Preuves d'antériorité : empreinte et horodatage de chaque original, téléchargement et vérification de la preuve. |
| A11 |
Apparence : thèmes (Atelier, Nicephos nuit et jour), aperçu réservé aux admins, emblème, icône et logo complet transformés en masque coloré par le thème, image de partage, sous-titre, favicon. |
| A12 |
Statistiques : fréquentation (pages vues, visiteurs), photos les plus vues, pages, provenance ; carte des visiteurs par pays : mappemonde Natural Earth embarquée (aucun service de carte), une bulle par pays (surface proportionnelle), liste des 10 premiers. |
| A13 |
Instagram : connexion d'un compte professionnel (API officielle de Meta), file d'attente publiée à heures fixes, légende tirée d'un modèle, cadre et filigrane par photo. Mise en file automatique par série, désactivée par défaut ; rien ne part sans INSTAGRAM_APP_ID, INSTAGRAM_APP_SECRET et PUBLIC_URL en HTTPS. ; limites de l'API réglables (Prudent par défaut : 25 publications / 24 h, 60 min d'écart, 100 appels / h ; Limites de Meta ; Personnalisé), quota réel lu avant chaque envoi, pause sans essai consommé quand Meta signale une limite, consommation affichée, « Publier maintenant » refusé hors budget avec explication ; likes et commentaires des posts publiés depuis le site relevés chaque matin (historique par jour, même autorisation que la publication), affichés dans la fiche (courbe) et en classement sur la page Instagram, relevé à la demande. |
| A14 |
Téléphone (iPhone, Android) : barre d'onglets, inspecteur en feuille ; « Compléter et publier » en cartes (une par photo) ; dans la photothèque, une photo touchée s'ouvre en un toucher (titre ou « Ouvrir la fiche ») ; cibles tactiles d'au moins 44 px. |
| A15 |
Ville des photos (pour la carte du site) : champ Ville avec propositions au fil de la frappe (GeoNames embarqué : toutes les communes de France, localités de plus de 500 habitants ailleurs, noms des villes en français, anglais et allemand, affichés dans la langue de l'admin avec la région, l'État ou la province pour lever les homonymes, server/geo/regions.tsv ; nom de la ville dans la langue de la page sur la carte du site), ville proposée d'après le GPS de l'original à l'import et pour les photos existantes (jamais d'écrasement d'un choix manuel) ; seule la ville est gardée, jamais la position exacte ; case « Afficher sur la carte » décochée par défaut, actions groupées annulables. |
| A17 |
Traductions : sous les champs concernés (Réglages, fiche photo, séries, auteurs), version anglaise et allemande repliée et facultative, avec son état (facultatif, 1 langue sur 2, traduit) ; gardées lors des modifications partielles (photothèque, lot) ; Proposer une traduction : serveur LibreTranslate de la pile (TRANSLATE_URL, aucun texte ne quitte le serveur, 0 €), proposition insérée dans le champ, à relire, annulable ; sans TRANSLATE_URL, pas de bouton. |
| A19 |
Accord par session : un accord couvre les photos du photographe prises le jour de la session (date EXIF, date de session corrigeable), exclusions photo par photo ; fiche photo « Personnes rencontrées » (même session ou liées, visage, usages acceptés) ; refus ciblé sur les photos liées ; visage de la personne (app ou fiche), gardé avec l'accord. |
| A20 |
Instagram suit les accords : Instagram suppose le site (formulaires /bonjour, app, carte : refusé sans le site ; ancien accord lu sans Instagram) ; une photo dont une personne liée, ou de la session non exclue, refuse ou n'a pas accepté Instagram est bloquée pour Instagram, sans confirmation possible : ajout à la file refusé, file vidée à chaque changement d'accord et avant chaque créneau (échec expliqué, « Réessayer » refusé), contrôle juste avant l'envoi ; fiche photo « Instagram bloqué » et « Pas sur cette photo » (exclusion de la session). |
| A21 |
Parcours de l'admin : barre latérale en groupes (Aujourd'hui ; Travailler : Photothèque, Personnes ; Publier : Site public, Séries, Instagram, Statistiques ; Sur le terrain ; Réglages : Photographes, Apparence, Filigrane & EXIF, Droits & confidentialité, Aide) ; vocabulaire fixe (photographe, sortie, personne, accord, carte d'accord, carte du monde) ; page Sur le terrain (/admin/terrain : app Rencontre, cartes d'accord et réserve de cartes numérotées, QR des vêtements avec le logo, liste de contrôle : fin de connexion, cartes, e-mail) ; états lisibles par un daltonien : forme et mot (✓, ▲, ✕) en plus de la couleur, palette bleu / jaune / vermillon (Okabe-Ito) dans l'admin et l'app. |
| A22 |
Sorties (/admin/sorties) : une par photographe et par jour (dates EXIF des photos, dates des rencontres), créées d'elles-mêmes ; liste (lieu, vignettes, photos et publiées, visages, accords, refus, sans décision, état ✕ refus à appliquer / ▲ à trier / ✓ terminée, filtres) ; fiche (photos avec heure et personnes liées, actions groupées : lier à une personne, personne de la sortie n'y figure, rétablir ; personnes ; lieu proposé puis modifiable) ; découpage à une heure (table outings, migration 021), heure de prise de vue lue dans l'EXIF (taken_time, anciennes photos lues une fois au démarrage) ; l'accord ne couvre que sa partie de journée, photo ou rencontre sans heure : toutes les parties ; liens depuis les fiches rencontre et photo. |
| A23 |
Visages et état des photos : détection des visages sur le serveur (YuNet, OpenCV Zoo, MIT ; ONNX Runtime), à l'import et une fois pour les anciennes photos, seulement le nombre et les cadres (migration 022) ; correction à la main ; état par usage (site, Instagram) : ✓ prête, ▲ à vérifier (confirmation explicite gardée dans photo_confirmations, valable pour ses raisons), ✕ bloquée ; personnes concernées : liées, et de la sortie si visage ; bande d'état de la fiche, pastilles et filtres de la photothèque, état dans la sortie et « Publier les photos prêtes », « Aujourd'hui » ; publication en un clic, actions groupées et lot : photos prêtes seulement ; Instagram : bloquée jamais, à vérifier sur confirmation. |
| A24 |
Fiche photo en rubriques (Infos, Où, Diffusion dans le formulaire ; Personnes & accords, Instagram, Audience, Preuve), repliables avec résumé, ouvertes d'elles-mêmes quand il y a à faire, ouvertes par un lien d'ancre ; accueil Terrain de l'app (/admin/rencontre/accueil, départ du manifeste, onglet Terrain de la barre du téléphone) : nouvelle rencontre et prochaine référence, mon QR (composition des vêtements, /admin/rencontre/qr), ma sortie du jour (personnes du jour, visage, décision), admin complet. |
| A25 |
Revue de code et de sécurité (octobre 2026) : /bonjour sans code ne modifie jamais une rencontre établie (refus appliqué, droits signalés, reste dans l'historique) ; accord en ligne sans code « non vérifié » (photo à vérifier) ; raisons gardées sans nom (référence seule) ; lieu de sortie jamais repris d'une rencontre ; annulation et actions groupées passées par le contrôle (brouillons seulement, confirmation qui couvre les raisons) ; photo en ligne confirmable sans dépublier ; refus de sortie et état « refus » limités aux photos avec visage ou liées ; détection : modèle indisponible = rien d'écrit (retenté), examens impossibles retentés au démarrage, import et rattrapage sans doublon ; heures saisies validées ; .npmrc : aucun téléchargement d'ONNX Runtime à l'installation. |
| A26 |
Personnes (/admin/personnes, migration 023 : people, encounters.person_id, email_hash, people_distinct) : une personne par rencontre à la création, rapprochement proposé par empreinte d'adresse (HMAC, clé dérivée de DATA_KEY ou des codes de contrôle), confirmé ou écarté à la main, jamais par le visage ; rattacher, séparer ; un accord vaut pour sa sortie, le refus le plus récent s'étend à toutes les rencontres ; ajouter à une sortie, lier des photos (rencontre de la sortie de la photo créée sans décision) ; export et effacement de la personne entière ; app : « Déjà rencontrée ? » (30 derniers jours). |
| A27 |
Signature Instagram du photographe (fiche Photographes, migration 024) : ajoutée aux posts des photos qui ont une légende (variable {signature}, sinon sous la légende), retirable photo par photo dans la section Instagram de la fiche ; jamais sur le site. |
| A28 |
Admin en trois langues (FR, EN, DE) : sélecteur au bout du menu (drapeau et code, comme le site), préférence gardée sur le photographe (authors.admin_lang, migration 025 ; cookie pour un compte sans photographe) ; server/admin-i18n.js (t(texteFrançais, variables)) et dictionnaires server/admin-i18n/*.json ; vues, messages, textes calculés (tâches, raisons, sorties), JavaScript de l'admin et de l'app ; dates et mois dans la langue choisie ; l'aide reste en français (signalé) ; la partie de l'app destinée à la personne garde sa langue ; test de couverture : chaque t('…') a sa version EN et DE ; messages d'erreur (validations, refus de droit, erreurs des modules) et messages composés ou enregistrés (Instagram, e-mail, preuves, imports) traduits à l'affichage (t.msg, reconnus d'après les clés à variables). |
| A29 |
Aide traduite : docs/aide/en/ et docs/aide/de/ (mêmes titres dans le même ordre que le français, vérifié par un test), servie dans la langue de l'admin avec les ancres françaises (liens de l'admin inchangés) ; wiki : pages « Help-… » et « Hilfe-… » générées avec leurs liens internes recalculés. |
| A30 |
Retours d'ergonomie (octobre 2026) : fiche photo sur grand écran, rubriques du bas (personnes, Instagram, audience, preuve) dans la colonne de l'aperçu ; vue rapide : enregistrement automatique annoncé ; cadre Instagram par défaut « Recadrage (sans bordure) » ; « Enregistrer » gardé (terme standard). |
| A31 |
Série proposée (désactivée par défaut) : page Séries, « Allumer les propositions » télécharge une fois le modèle CLIP (ONNX allégé, ≈ 90 Mo, SHA-256 vérifié) dans le dossier des données, puis analyse les photos en tâche de fond (progression affichée) ; chaque import analysé aussitôt. Un brouillon dont la série n'a pas été choisie à la main (vue rapide, fiche, glisser, action groupée, « Garder ») reçoit la série dont les photos rangées (choisies ou publiées, des deux photographes) lui ressemblent nettement plus que la sienne, deux si elles sont presque à égalité, à partir de 3 photos par série. Marquée ✦ et en pointillés : vignette, filtre « ✦ Série proposée », vue rapide (« Classer dans… », « Garder… »), fiche (« Choisir », photos voisines), sortie, ligne dans Aujourd'hui ; une photo à la fois. « Éteindre et effacer » supprime modèle et empreintes ; l’empreinte disparaît avec la photo (migration 027). |
| A32 |
Rôles et permissions, étape 1 (socle) : catalogue de permissions par domaine (server/permissions.js), certaines avec une portée « tout » ou « les miennes » ; quatre rôles (Administrateur, Photographe, Modérateur, Relecteur) ; chaque route d'admin déclare sa permission (démarrage refusé sinon), contrôle fermé par défaut, vérification par action dans les routes à plusieurs actions ; refus 403 en HTML ou JSON. Tous les comptes restent administrateurs (aucun changement visible). Étapes suivantes : comptes et rôles en base, portée « les miennes », interface selon les droits, rôles sur mesure. |
| A33 |
Rôles et permissions, étape 2 (comptes, rôles, journal) : table des comptes (identité, nom, e-mail, rôles, photographe lié, état actif / en attente / désactivé) ; anciens liens Photographe ↔ compte repris en administrateurs ; première connexion : administrateur si l'IdP transporte le rôle « admin », sinon « en attente » sans session (ligne dans Aujourd'hui ; jamais traité, effacé après 90 jours ; une décision d'administrateur n'est ni contredite par l'IdP ni purgée) ; rôles relus à chaque requête (effet immédiat) ; page « Comptes et rôles » (identifiant sub affiché, rôles, photographe lié, désactiver, supprimer) avec garde-fous (au moins un administrateur actif, pas soi-même, ADMIN_SUBS toujours administrateurs) ; rôle Photographe pas encore proposé ; lien compte ↔ photographe retiré de la fiche Photographe ; Journal en base (connexions, actions, comptes modifiés avec le détail ; 13 mois ; filtres) ; menu et barre du téléphone selon les droits ; site public : « admin » = compte avec un rôle, aperçus selon la permission (migration 029). |
| A34 |
Rôles et permissions, étape 3 (portée « les miennes ») : rôle Photographe proposé ; pour un compte Photographe, ce qui n'est pas au photographe lié n'existe pas (404 : photos et leurs sous-pages, images de l'admin, rencontres, personnes, sorties, QR) ; listes filtrées à la source (photothèque, recherche ⌘K, lot, actions groupées, suivi d'import, sorties, rencontres, personnes, candidates, app Terrain, cartes, Aujourd'hui et son badge, statistiques sans fréquentation du site) ; ni réattribuer une photo, ni importer pour l'autre photographe, ni réordonner la galerie ; une personne partagée n'apparaît qu'avec ses rencontres et ne se modifie que par un administrateur ; tâches d'« Aujourd'hui » selon les droits. |
| A35 |
Rôles et permissions, étape 4 (interface selon les droits) : droits du compte transmis à la page (data-can) ; photothèque (Publier, Dépublier, Supprimer, Importer, glisser pour réordonner, champs série, ville, date, photographe, actions groupées), raccourci P, palette ⌘K (actions et pages), glisser vers une série, propositions de série ; fiche photo : formulaire limité aux textes (/admin/photos/<id>/textes) pour le relecteur, lecture seule et rubrique Publication pour le modérateur (A36), raisons « à vérifier » masquées sans accès aux personnes (une photo à vérifier attend le photographe ou un administrateur), Personnes & accords, Instagram, Audience, preuve, suppression selon les droits ; lot, sortie, rencontre et personne (export, effacement) ; accueil (import) ; aide limitée aux chapitres des pages accessibles. Remarques adressées (taches.adresser) : un modérateur écrit au photographe d'une photo, la remarque apparaît dans son « Aujourd'hui » et sur la fiche jusqu'à « Fait » (photographe de la photo ou qui peut en adresser ; migration 030). |
| A36 |
Circuit de publication (site) (cadrage du 15 octobre 2026) : le photographe propose (fiche, photothèque, toute une sortie), avec un mot facultatif ; accords vérifiés et confirmés par lui à la proposition ; le modérateur valide sur la page « À valider » (par lot) : publier maintenant ou programmer (date et heure de Paris, publication automatique à l'échéance si la photo est toujours prête, sinon renvoyée), renvoyer avec une remarque (il ne retouche pas), dépublier avec la raison ; historique des décisions sur la fiche ; « Aujourd'hui » et e-mail au choix de chacun (photographe et modérateur, adresse réglable) ; réglages par photographe (page « Circuit de publication », circuit.regler) : « publier ses photos sans validation » et « modifier ses photos une fois publiées » ; le modérateur n'a plus photos.textes, le relecteur corrige aussi les photos publiées ; un signalement ne dépublie rien tout seul (migration 031). |
| A37 |
Republier sur Instagram depuis la fiche : post en échec (le dernier de la photo) : « Republier (remettre en tête de file) » pour qui gère la file (instagram.file) ; « Demander la republication » pour le photographe (ses photos, photos.proposer), une fois par échec, rien à demander si la photo est déjà dans la file ; demande visible (▲) dans « Aujourd'hui », l'historique de la page Instagram et la fiche, e-mail à qui gère la file s'il l'a choisi, effacée à la remise en file ; échecs de ses photos dans l'« Aujourd'hui » du photographe (migration 032). |
| A38 |
Page Instagram, nouvelle disposition : en haut, compte, rythme et consommation ; à gauche, la file ; à droite, les photos en échec (Réessayer, demandes de republication) et les 10 dernières publications ; en bas, le journal de la file (mises en file, envois et leurs étapes, publications, échecs, pauses, reprises, demandes ; état par symbole et mot, photo, auteur ou « automatique » ; 90 jours) ; réglages repliés ; « Publier maintenant » suivi sans recharger : envoi en arrière-plan, barre d'avancement par étape (GET /admin/instagram/:id/etat), refus immédiat expliqué, ✓ avec le lien du post ou ✕ avec la raison ; sans JavaScript, le formulaire classique reste (migration 033). |
| A39 |
E-mails et relances : « Comptes et rôles » : état de l'envoi (SMTP_URL, expéditeur) et e-mail de test à l'adresse choisie, erreur du serveur de messagerie affichée ; demandes RGPD (délai légal d'un mois coupé en quarts) : e-mail au photographe concerné dès l'arrivée (même sans préférence e-mail), rappel au quart, rappel à la moitié avec l'administrateur en copie, e-mail prioritaire aux trois quarts, à l'administrateur directement sans photographe joignable ; une seule relance par étape (celle du moment après un arrêt) ; référence de la carte seulement ; arrêt à « traitée » ; récapitulatif de « Aujourd'hui » réglé par chacun (jamais, chaque jour, chaque semaine le lundi), vers 8 h, jamais plus d'un par jour, seulement s'il y a quelque chose ; e-mails dans la langue de l'admin du photographe ; vérification toutes les heures (migration 034). Lettre d'information : plus tard. |
| A40 |
Circuit Instagram : le photographe propose une photo publiée sur le site pour Instagram depuis sa fiche (cadre, filigrane, signature, légende, aperçu exact, un mot ; accords vérifiés et confirmés par lui ; mise à jour ou retrait tant que rien n'est décidé) ; le modérateur décide sur « À valider » (section Instagram) : mettre dans la file avec les choix du photographe, ou renvoyer avec une remarque (remarque sur la fiche et dans « Aujourd'hui ») ; « Aujourd'hui », badge, e-mails au choix, journal de la file ; nouveau droit instagram.proposer (photographe, ses photos) ; instagram.file a une portée et se règle photographe par photographe (« Mettre ses photos dans la file Instagram sans validation » : ses photos seulement, l'ordre de la file et « Publier maintenant » restent au modérateur) ; aperçu et légende du modèle ouverts au photographe pour ses photos (migration 035). |
| A41 |
Voyages (admin) : des sorties regroupées — journées entières, une journée dans un voyage au plus (la rattacher ailleurs la déplace) ; voyage d'un photographe ou des deux (réglé par qui gère toutes les sorties) ; page « Voyages » (sous Sorties) : créer, liste avec couverture, dates, journées, photos, personnes ; page d'un voyage : journées J1, J2… avec lieu, photos, personnes et lien vers la sortie, rattacher entre deux dates ou en cochant, retirer, toutes les photos avec leur état, proposer ou publier d'un coup les photos prêtes, nom et texte en trois langues, case « Publier la page du voyage sur le site », supprimer (sorties et photos restent) ; sur la page d'une sortie : la rattacher, la changer de voyage, l'en détacher ; voyage indiqué sur la liste des sorties ; portée « les miennes » (migration 037). |
| A42 |
Nouveautés de l'admin : server/nouveautes.json (trois langues, depuis la version 1.79.0 = PR 79 ; version = 1..0, celle de package.json est la version installée) ; fenêtre modale à la connexion suivante une mise à jour, une seule fois, avec toutes les versions arrivées depuis la dernière vue du compte (accounts.seen_release), filtrées selon ses droits ; page et menu « Nouveautés » avec la version installée (migration 038).
|
| A43 |
Mots-clés suggérés (CLIP) : vocabulaire choisi d'environ 130 termes en trois langues (server/vocabulaire.json), empreintes texte CLIP calculées une fois (scripts/vocabulaire.mjs → server/vocabulaire-vecteurs.bin) ; suggestions d'une photo = empreinte image des propositions de séries comparée au vocabulaire (quelques millisecondes, aucun modèle de plus, rien d'inventé), 6 au plus, dans la langue de l'admin, mots déjà présents écartés ; boutons sur la fiche (un clic ajoute, à enregistrer) ; recherche du site : un mot du vocabulaire trouvé dans les trois langues. |
| A44 |
Descriptions suggérées (Florence-2) : désactivées par défaut (page Séries : modèle Léger = base, par défaut, ou Précis = large, refusé si la mémoire du conteneur — SITE_MEM_LIMIT, 3g par défaut — n'atteint pas 6 Go, repli sur Léger si elle baisse ; heures de nuit) ; une phrase courte en anglais par photo, traduite par LibreTranslate si configuré ; la nuit, une à la fois, sur un seul cœur ; une photo demandée depuis sa fiche passe tout de suite ; modèle chargé seulement pendant le calcul, révision Hugging Face fixée, téléchargé une fois dans le dossier des données ; fiche : « Décrire cette photo », « Reprendre comme légende » (jamais automatique), « Décrire de nouveau », suivi sans recharger ; « Éteindre et effacer le modèle » (migration 039). |
| A18 |
Rencontres : liste (nouvelles en tête, compteur dans la barre latérale), fiche (personne, historique, photos liées avec propositions du jour, carte signée et sa photo gardée dans la base, statut, « Écrire » par la messagerie), saisie d'une carte papier, lettre des cartes par auteur ; refus : publication impossible (fiche, actions groupées), « Appliquer le refus » dépublie et retire de la file Instagram ; effacement à la demande, purge des demandes sans accord ni refus après 12 mois ; cartes à imprimer (planches A4, paires numérotées avec QR et code de contrôle, ou génériques ; numéros retenus) ; offrir la photo (lien privé, compteurs, message prêt dans la langue de la personne, retrait) ; app Rencontre sur le téléphone (web app installable : position arrondie, photo de repère, consentement en trois langues signé au doigt, majorité ou parent, numéro suivant, écran « Merci » avec QR, récapitulatif envoyé par SMTP ou préparé dans Mail) ; QR des vêtements (compositions verticale avec le logo, logo seul, écusson, QR seul ; encre noire ou blanche ; SVG en tracés ou PNG 300 dpi ; l'écran Sur le terrain n'affiche que la verticale avec le logo). |
| A16 |
Messages de confirmation ou d'erreur après chaque action, annulation des actions groupées ; aide en ligne avec un lien « Aide sur cette page » sur chaque écran ; toutes les pages sont utilisables sans JS et au clavier. |