feat(aep): carte AEP — push Gitea 2026-04-28
This commit is contained in:
134
V2-cadrage/A-biblio-ecosysteme-archi.md
Normal file
134
V2-cadrage/A-biblio-ecosysteme-archi.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# NAV — Biblio seed écosystème architecture FR
|
||||
|
||||
Date : 2026-04-14
|
||||
Nombre d'entités : 94
|
||||
Méthode : recherche web (WebSearch + WebFetch) + connaissance modèle
|
||||
|
||||
## Résumé
|
||||
|
||||
- Couverture par typologie : 8 nat-institutionnel / 6 nat-syndicats / 6 nat-assos / 17 régional-CAUE-MA / 12 médias-revues / 6 podcasts-newsletters / 8 formations / 8 outils-plateformes / 10 santé-juridique-compta / 7 recrutement-RH / 6 entraide-solidaire
|
||||
- Couverture par fonction : Juridique (bon) / Technique (bon) / Économique (moyen) / Administrative-urbanism (bon) / Chantier-coordo (moyen) / Comptabilité-fiscal (moyen) / Prospection-commercial (faible) / RH-recrutement (moyen) / Santé mentale (couvert généraliste, faible spécifique archi)
|
||||
- Zones peu couvertes : newsletters business archi indépendants, ressources pricing honoraires, outils BIM accessibles, associations régionales hors grandes régions, numérique en archi (BIM Level 2-3), accompagnement création d'agence régional
|
||||
|
||||
## Tableau complet
|
||||
|
||||
| Nom | URL | Typologie | Échelle | Fonction principale | Localisation | Description (1 ligne) |
|
||||
|-----|-----|-----------|---------|--------------------|--------------|--------------------|
|
||||
| CNOA — Conseil National de l'Ordre des Architectes | https://www.architectes.org | Ordre | National | Institutionnel + juridique + déontologie | Paris | Corps réglementaire regroupant les 30 500 architectes inscrits ; registre national, déontologie, formations, ressources juridiques |
|
||||
| CROA Île-de-France | https://www.architectes-idf.org | Ordre régional | Régional | Juridique + entraide + info | Paris | Conseil régional IDF — réponses juridiques gratuites, médiation, réseau des architectes |
|
||||
| CROA PACA | https://www.ordrearchitectes-paca.fr | Ordre régional | Régional | Institutionnel + accompagnement | Marseille | Conseil régional Provence-Alpes-Côte d'Azur |
|
||||
| CROA Hauts-de-France | https://www.architectes-hdf.fr | Ordre régional | Régional | Institutionnel + accompagnement | Lille | Conseil régional Hauts-de-France |
|
||||
| CROA Auvergne-Rhône-Alpes | https://www.architectes-ara.fr | Ordre régional | Régional | Institutionnel + accompagnement | Lyon | Conseil régional AuRA — formations, veille, accompagnement |
|
||||
| CROA Bretagne | https://www.architectes-bretagne.fr | Ordre régional | Régional | Institutionnel + accompagnement | Rennes | Conseil régional Bretagne |
|
||||
| CROA Nouvelle-Aquitaine | https://www.bordeaux.architectes.org | Ordre régional | Régional | Institutionnel + accompagnement | Bordeaux | Conseil régional Nouvelle-Aquitaine |
|
||||
| CROA Grand Est | https://www.architectes-grandest.fr | Ordre régional | Régional | Institutionnel + accompagnement | Strasbourg | Conseil régional Grand Est |
|
||||
| UNSFA — Union Nationale des Syndicats Français d'Architectes | https://www.unsfa.fr | Syndicat patronal | National | Défense profession + employeurs + négociation CCN | Paris | Fédère syndicats territoriaux depuis 1969 ; représentation prud'homale, CCN, commissions paritaires |
|
||||
| Le Syndicat de l'Architecture | https://syndicatdelarchitecture.com | Syndicat | National | Défense profession + accompagnement jeunes agences | Paris | Syndicat indépendant depuis 40 ans ; conseil juridique, incubateurs Échelle Un et SANA |
|
||||
| SNACG — Syndicat National des Architectes Contractants Généraux | https://www.snacg.fr | Syndicat | National | Défense architecte contractant général | Paris | Défense et promotion du modèle architecte-constructeur clé en main ; affilié UNSFA |
|
||||
| SYNATPAU — Syndicat Salariés Architecture Urbanisme | https://www.synatpau.fr | Syndicat salariés | National | Droit du travail + salariés archi-urba | Paris | Représente les salariés des agences ; CCN, classifications, congés, négociations |
|
||||
| Branche Architecture | https://www.branche-architecture.fr | Branche professionnelle | National | Convention collective + fonds social | Paris | Site officiel de la branche — CCN IDCC 2332, fonds social solidarité, accords de branche |
|
||||
| ANABF — Association Nationale des Architectes des Bâtiments de France | https://www.anabf.org | Association | National | Patrimoine + ABF + conseil | Paris | Regroupe les ABF ; missions de service public sur le patrimoine protégé et non protégé |
|
||||
| FN CAUE — Fédération Nationale des CAUE | https://www.fncaue.com | Fédération | National | Architecture + urbanisme + environnement | Paris | Tête de réseau des 92 CAUE départementaux ; conseil gratuit aux particuliers et collectivités |
|
||||
| CAUE Paris (75) | https://www.caue75.fr | CAUE | Régional | Conseil archi-urba-environnement | Paris | Conseil gratuit aux particuliers, collectivités et professionnels |
|
||||
| CAUE Rhône Métropole (69) | https://caue69.fr | CAUE | Régional | Conseil archi-urba-environnement | Lyon | CAUE du Rhône — formations, conseil, veille |
|
||||
| CAUE Gironde (33) | https://www.cauegironde.com | CAUE | Régional | Conseil archi-urba-environnement | Bordeaux | CAUE de Gironde — accompagnement projets, formations |
|
||||
| CAUE Alsace | https://www.caue-alsace.com | CAUE | Régional | Conseil archi-urba-environnement | Strasbourg | CAUE Alsace — conseil et ressources architecture régionale |
|
||||
| CAUE Seine-Maritime (76) | https://www.caue76.fr | CAUE | Régional | Conseil archi-urba-environnement | Rouen | CAUE Normandie-Seine-Maritime |
|
||||
| Réseau des Maisons de l'Architecture | https://www.ma-lereseau.org | Réseau national | National | Culture architecturale + diffusion + résidences | Paris | Fédère 32 Maisons de l'architecture ; résidences, pédagogie, événements |
|
||||
| Maison de l'Architecture Île-de-France | https://www.maisonarchitecture-idf.org | Maison de l'architecture | Régional | Culture architecturale + événements | Paris | Diffusion culture archi en IDF ; expositions, conférences, ressources |
|
||||
| Maison de l'Architecture Occitanie-Pyrénées (MAOP) | https://maop.fr | Maison de l'architecture | Régional | Culture architecturale + publication Plan Libre | Toulouse | Édite Plan Libre, journal mensuel d'architecture depuis 2002 |
|
||||
| Maison de l'Architecture Hauts-de-France | https://www.maisonarchitecture-hdf.fr | Maison de l'architecture | Régional | Culture architecturale + événements | Amiens | Diffusion et sensibilisation archi en Hauts-de-France |
|
||||
| Maison de l'Architecture Centre-Val de Loire | https://ma-cvl.org | Maison de l'architecture | Régional | Culture architecturale + conseil | Tours | Accompagnement culture archi en Centre-Val de Loire |
|
||||
| Maison de l'Architecture de Franche-Comté | https://www.maisondelarchi-fc.fr | Maison de l'architecture | Régional | Culture architecturale | Besançon | Diffusion et médiation architecture en Franche-Comté |
|
||||
| MAF — Mutuelle des Architectes Français | https://www.maf.fr | Assurance mutuelle | National | Assurance RC professionnelle + protection juridique | Paris | Mutuelle fondée en 1931 ; RC obligatoire, protection juridique, fonds de solidarité |
|
||||
| CIPAV — Caisse Interprofessionnelle de Prévoyance et Assurance Vieillesse | https://www.cipav.fr | Caisse retraite | National | Retraite + prévoyance professions libérales | Paris | Régime retraite des architectes libéraux et autres professions libérales |
|
||||
| MIQCP — Mission Interministérielle pour la Qualité des Constructions Publiques | https://www.miqcp.gouv.fr | Mission d'État | National | Marchés publics + qualité construction + concours MOE | Paris | Conseil gratuit aux maîtres d'ouvrage publics, guides pratiques, concours archi |
|
||||
| OPPIC — Opérateur du patrimoine et des projets immobiliers de la Culture | https://www.oppic.fr | Établissement public | National | Maîtrise d'ouvrage publique culturelle | Paris | MOA délégué pour constructions et rénovations culturelles ; AJAP organisateur |
|
||||
| PUCA — Plan Urbanisme Construction Architecture | https://www.urbanisme-puca.gouv.fr | Programme d'État | National | Recherche + expérimentation urba-construction-archi | Paris | Recherche appliquée et expérimentation ; publications, séminaires, ressources libres |
|
||||
| Cité de l'Architecture et du Patrimoine | https://www.citedelarchitecture.fr | Institution culturelle | National | Culture architecturale + formation continue + patrimoine | Paris | Musée + formation continue architectes agréés (Chaillot) ; bibliothèque, podcasts, expositions |
|
||||
| Pavillon de l'Arsenal | https://www.pavillon-arsenal.com | Centre documentation | Régional | Documentation urbanism Paris + incubateur FAIRE | Paris | Centre info-documentation architecture et urbanisme parisien + programme FAIRE |
|
||||
| ASF France — Architectes Sans Frontières | http://asffrance.org | Association humanitaire | National | Solidarité internationale + habitat + formation | Paris | Asso loi 1901 (1979) ; accompagnement technique projets humanitaires, sans salariés, 100% bénévoles |
|
||||
| Architectes de l'Urgence | https://www.archi-urgent.com | Fondation humanitaire | National | Urgence post-catastrophe + sécurisation + reconstruction | Paris | Fondation reconnue d'utilité publique (2007) ; interventions post-désastre en France et monde |
|
||||
| Architectes Solidaires | https://www.helloasso.com/associations/architectes-solidaires | Association | National | Bénévolat + rénovation + santé | France | Créée pendant le confinement 2020 ; rénovation gratuite d'espaces de repos dans hôpitaux publics |
|
||||
| AMC Archi — Le Moniteur Architecture | https://www.amc-archi.com | Revue | National | Actualité architecture + projets + AJAP | Paris | Magazine de référence de la profession ; projets, actualité, AJAP, prix AMC |
|
||||
| L'Architecture d'Aujourd'hui (AA) | https://www.larchitecturedaujourdhui.fr | Revue | National | Actualité architecture + essais + international | Paris | Plus ancienne revue d'architecture FR (1930) ; projets, débats, urbanisme, paysage |
|
||||
| D'Architectures | https://www.darchitectures.com | Revue | National | Création architecturale + indépendant | Paris | Magazine indépendant de la création architecturale (88 bd de la Villette, 75019) |
|
||||
| Archistorm | https://www.archistorm.com | Revue | National | Architecture + design + art contemporain | Paris | Revue bimestrielle fondée en 2004 ; architecture, design, art — 11 500 ex. |
|
||||
| Archicréé (Architectures CREE) | https://archicree.com | Revue | National | Avant-gardes archi + design + tertiaire | Saint-Ouen | Revue depuis 1970 ; projets internationaux, tendances, esthétique européenne |
|
||||
| Chroniques d'Architecture | https://chroniques-architecture.com | Média web | National | Actualité archi + podcast Parole d'archi + critiques | Paris | Site indépendant d'actualité architecturale ; presse, critiques, podcast, concours |
|
||||
| Le Moniteur (lemoniteur.fr) | https://www.lemoniteur.fr | Presse professionnelle | National | Actualité BTP + marchés publics + architecture | Paris | Hebdomadaire de référence du BTP depuis 1903 ; construction, architecture, marchés |
|
||||
| Batiactu | https://www.batiactu.com | Média web | National | Actualité BTP + architecture + immobilier | Paris | Premier portail BTP digital (2001) ; 2M pages vues/mois, architecture, tech, régl. |
|
||||
| Batiweb | https://www.batiweb.com | Média web | National | Actualité BTP + produits + réglementation | Paris | Portail BTP professionnel quotidien ; produits, normes, emploi |
|
||||
| Plan Libre | https://planlibre.eu | Revue régionale | Régional | Journal architecture Occitanie | Toulouse | Journal mensuel MA Occitanie-Pyrénées ; 200 numéros depuis 2002, hybride recherche-pratique |
|
||||
| Team.archi — La French Connection | https://www.team.archi | Newsletter / réseau | National | Réseau + newsletter + emploi architectes | Paris | Newsletter 30 000+ architectes ; news agences, offres emploi, masterclass — Substack |
|
||||
| Paroles d'archi (Chroniques d'Architecture) | https://chroniques-architecture.com/epoque/medias/podcasts/ | Podcast | National | Interviews architectes + projets + réflexion | Paris | Podcast de Chroniques d'architecture ; entretiens chefs d'agence, chercheurs |
|
||||
| Podcast Pavillon de l'Arsenal | https://www.pavillon-arsenal.com | Podcast | Régional | Architecture + urbanisme Paris | Paris | Conférences et interviews architectes et urbanistes parisiens en audio |
|
||||
| Dans la tête d'un archi (Xavier Le Pennec) | https://www.ausha.co/podcast/dans-la-tete-d-un-archi | Podcast | National | Exploration architecture + image | France | Podcast explorant le rôle de l'image et de l'imaginaire en architecture |
|
||||
| Fondations (Solène Sillière) | https://open.spotify.com/show/foundationspodcast | Podcast | National | Responsabilité archi + ville + usagers | France | Podcast sur la responsabilité de l'architecture dans la fabrication des villes |
|
||||
| GEPA — Groupe pour l'Éducation Permanente des Architectes | https://www.formation-architecte.com | Formation | National | Formation continue architectes (Paris) | Paris | Association loi 1901 depuis 1968 ; formations DPC obligatoires, agréé CNOA |
|
||||
| MAJ Formation Continue | https://www.formation-architecte-maj.com | Formation | National | Formation continue architectes + juridique + gestion | Paris | Centre agréé Qualiopi (2020) ; formations juridique, gestion, technique, honoraires |
|
||||
| Cité de l'Architecture — Formation continue | https://www.citedelarchitecture.fr/fr/article/formation-professionnelle-continue | Formation | National | Formation continue architectes du patrimoine | Paris | Formations agréées CNOA, spécialité patrimoine et réhabilitation, Chaillot |
|
||||
| CFAA — Centre de Formation des Architectes Aquitains | https://www.cfaa-bordeaux.fr | Formation | Régional | Formation continue architectes Nouvelle-Aquitaine | Bordeaux | Membre GEPA ; formations DPC pour architectes du grand Sud-Ouest |
|
||||
| REFC'A — Réseau Formation Continue Architectes | https://www.architectes.org/le-refca-91377 | Réseau | National | Réseau organismes formation agréés CNOA | Paris | Réseau des 13 organismes de formation continue habilités par l'Ordre |
|
||||
| Grandes Ateliers de l'Isle d'Abeau | https://www.lesgrandsateliers.org | Formation + recherche | National | Innovation + matériaux + pédagogie archi | Isle d'Abeau | Lieu d'expérimentation grandeur nature ; formations, recherche, matériaux |
|
||||
| DU Business Management Architecture (Dauphine) | https://executive-education.dauphine.psl.eu/formations/executive-master-diplome-universite/du-bm-archi | Formation | National | Gestion agence + management + stratégie | Paris | Diplôme universitaire CPF-éligible ; gestion financière, business plan, leadership agence |
|
||||
| Archireport | https://www.archireport.com | Outil numérique | National | Suivi de chantier + rapports OPR | France | Logiciel suivi chantier 24 000 utilisateurs ; rapports, réserves, OPR, multi-plateformes |
|
||||
| OOTI | https://www.ooti.co | Outil numérique | National | Gestion agence archi (ERP) | France | ERP 100% archi : projet, facturation, RH, CRM, notes de frais — 39€/mois/utilisateur |
|
||||
| Archiliste | https://www.archiliste.fr | Annuaire / base données | National | Annuaire agences + projets + prescription | Paris | Annuaire 20 000+ agences, 3 500+ projets publiés ; newsletter, prescription BTP |
|
||||
| ArchiWIZARD (Graitec) | https://graitec.com/fr/products/archiwizard/ | Outil numérique | National | RE2020 + simulation thermique + BIM | France | Logiciel agréé CSTB-DHUP pour RE2020 ; performance énergétique, ACV, intégration BIM |
|
||||
| CYPETHERM RE2020 (CYPE) | http://cypetherm-re2020.cype.fr | Outil numérique | National | RE2020 + volet énergétique + Open BIM | France | Application Open BIM pour conformité RE2020 ; intégré BIMserver.center |
|
||||
| Expert-Comptable Architectes (compta-architectes.com) | https://compta-architectes.com | Cabinet spécialisé | National | Comptabilité + fiscal + gestion agence archi | France | Cabinet exclusivement dédié aux agences d'archi depuis 20 ans ; constitution, transmission, honoraires |
|
||||
| Expert-Comptable Architectes (expert-comptable-architectes.fr) | https://www.expert-comptable-architectes.fr | Cabinet spécialisé | National | Comptabilité + business plan + acquisition agence | France | Cabinet spécialisé archi ; création, développement, acquisition d'agences |
|
||||
| Ordre des architectes — Questions juridiques | https://www.architectes.org/vos-questions-juridiques-112331 | Ressource juridique | National | Droit archi : contrats, litiges, PI, urba | Paris | FAQ juridique officielle CNOA ; droit privé, marchés publics, PI, déontologie |
|
||||
| CROA IDF — Questions juridiques | https://www.architectes-idf.org/reponses-aux-questions-juridiques | Ressource juridique | Régional | Réponses juridiques gratuites pour architectes | Paris | Permanences juridiques CROA IDF ; contrats MOE, litiges, propriété intellectuelle |
|
||||
| MAF — Protection juridique | https://www.maf.fr/assurance-professionnelle-architectes | Assurance juridique | National | RC pro + défense pénale + recours | Paris | Assurance RC obligatoire + protection juridique intégrée — 80% de la profession |
|
||||
| Branche Architecture — Fonds social | https://www.branche-architecture.fr/action-sociale/les-prestations-sociales/ | Fonds solidarité | National | Aide sociale salariés archi : psycho, caregiver, parentalité | Paris | Fonds social branche archi (2,7 M€) ; accompagnement psy, aide caregiver, violences, prématurité |
|
||||
| Souffrance et Travail | https://www.souffrance-et-travail.com | Association santé mentale | National | Soutien psy + juridique souffrance professionnelle | France | Réseau 200+ consultations locales ; info sur burn-out, harcèlement, droit du travail |
|
||||
| France Burn-Out (asso-franceburnout.fr) | https://www.asso-franceburnout.fr | Association santé mentale | National | Burn-out : info + droits + psys + groupes de parole | France | Ressources burn-out, annuaire psychologues spécialisés, groupes de parole en France |
|
||||
| Psycom — Santé Mentale Info | https://www.psycom.org | Ressource santé mentale | National | Info santé mentale + lignes écoute + annuaire | Paris | Portail info fiable et indépendant sur santé mentale ; annuaire consultations, guides par département |
|
||||
| Réseau Burn Out (reseauburnout.org) | https://reseauburnout.org | Réseau santé | National/BE | Accompagnement pluridisciplinaire épuisement pro | France/Belgique | Réseau médecins, psys, coachs, juristes — attention : actif principalement Belgique/Luxembourg |
|
||||
| Croix-Rouge — Écoute | https://www.croix-rouge.fr/soutien-psychosocial-par-telephone | Ligne d'écoute | National | Écoute psychosociale gratuite et anonyme | France | Ligne 0800 858 858 — gratuite, anonyme, 7j/7 ; soutien psychosocial de proximité |
|
||||
| ASAfSAT | http://asafsat.asso.fr | Association santé mentale | National | Soutien psychologique salariés souffrance travail | France | Association loi 1901 ; accompagnement psy pour salariés en souffrance professionnelle |
|
||||
| Archires — Revue du CROA Centre | https://ordrearchicentre.org/litiges-et-mediation/ | Ressource juridique | Régional | Litiges + médiation architectes Centre | Orléans | Service de médiation CROA Centre ; conciliation amiable obligatoire avant tribunal |
|
||||
| ArchiBat RH | https://archibat.com | Recrutement | National | Recrutement archi + design + ingénierie + real estate | Paris | Cabinet de recrutement spécialisé architecture, design, ingénierie, immobilier |
|
||||
| Archi-Jobs | https://www.archi-jobs.fr | Recrutement | National | Offres emploi architectes + intérieur + BIM | France | Portail emploi dédié architecture ; centaines d'offres archi, intérieur, urbanisme |
|
||||
| Charette Service | https://www.charretteservice.fr | Recrutement | National | Recrutement archi + intérieur + projet + ingénierie | France | Plus de 40 ans de recrutement spécialisé archi ; toutes tailles d'agences |
|
||||
| Preference Search | https://www.preferencesearch.fr | Recrutement | National | Recrutement cadres archi + intérieur + retail | France | Cabinet headhunting architecture et retail ; directeurs, architectes seniors |
|
||||
| Annuaire CNOA (tableau des architectes) | https://annuaire.architectes.org | Annuaire officiel | National | Registre national architectes inscrits | Paris | Tableau officiel CNOA ; vérification inscription, compétences, adresse agences |
|
||||
| UNAID — Union Nationale Architectes d'Intérieur Designers | https://unaid.fr | Syndicat | National | Archi intérieur + designers + label qualité | Paris | Syndicat affilié FFB depuis 1978 ; qualification, formation, défense archi intérieur |
|
||||
| FFP — Fédération Française du Paysage | https://f-f-p.org | Fédération | National | Paysagistes concepteurs | France | 700+ paysagistes concepteurs ; défense du titre, formation, réseau 11 régions |
|
||||
| Collectif Fil | http://collectif-fil.fr | Collectif | Régional | Recherche-action archi + urbanisme + habitants | Nantes | Collectif architects-urbanistes-chercheurs fondé 2013 ; transformation des territoires habités |
|
||||
| Collectif Etc | https://www.collectifetc.com | Collectif | National | Expérimentation urbaine + DIY + participation | France | Collectif itinérant ; expérimentation architecturale et urbaine participative |
|
||||
| FAIRE — Pavillon de l'Arsenal | https://www.pavillon-arsenal.com/fr/faire/ | Incubateur | Régional | Incubateur projets innovants archi + urbanism | Paris | Programme d'accélération et d'expérimentation lancé en 2017 ; financement et suivi prototypes |
|
||||
| PUCA — Ressources en ligne | https://www.urbanisme-puca.gouv.fr/ressources-en-ligne-r9.html | Ressource recherche | National | Recherche urba-construction-archi ouverte | Paris | Rapports, séminaires, vidéos, podcasts libres sur urbanisme, construction, archi |
|
||||
| Cité de l'Architecture — Podcasts | https://www.citedelarchitecture.fr/fr/article/podcasts | Podcast | National | Conférences + entretiens architectes | Paris | Série de podcasts de la Cité ; conférences, débats, paroles d'architectes du patrimoine |
|
||||
| Archi-Urgent.com (Architectes de l'urgence) | https://www.archi-urgent.com | Fondation humanitaire | National | Urgence post-catastrophe + formation | Paris | Site officiel de la fondation ; appels aux dons, missions en cours, bénévolat |
|
||||
| Construction21 France | https://www.construction21.org/france/ | Réseau / média | National | Bâtiment durable + technique + transition | France | Réseau professionnel bâtiment durable ; articles, retours d'expérience, veille RE2020 |
|
||||
| Archiscopie | https://www.archiscopie.fr | Revue | National | Analyse archi + patrimoine + politique architecturale | Paris | Revue de l'ENSA et institutions ; analyses critiques, politique culturelle architecturale |
|
||||
| Urbanisme (revue) | https://www.revue-urbanisme.fr | Revue | National | Urbanisme + ville + architecture urbaine | Paris | Revue de référence urbanisme depuis 1932 ; projets urbains, politiques, réflexions |
|
||||
| NDA — Numéro d'Architecture | https://www.architecture-magazine-design.fr | Revue | National | Architecture + design | France | Magazine architecture et design — couverture internationale et projets FR |
|
||||
|
||||
## Notes
|
||||
|
||||
### Entités douteuses / à vérifier
|
||||
- `Réseau Burn Out (reseauburnout.org)` : initialement fondé en France, mais semble actif principalement en Belgique et Luxembourg — à vérifier avant d'inclure dans NAV
|
||||
- URL CROA régionaux (Bretagne, AuRA, Nouvelle-Aquitaine, Grand Est, HDF) : URLs reconstruites à partir du pattern CNOA — à confirmer manuellement sur architectes.org/les-17-conseils-regionaux
|
||||
- `Fondations` (podcast Solène Sillière) : URL Spotify approximative — à vérifier le flux RSS exact
|
||||
- `Dans la tête d'un archi` : URL ausha approximative — à vérifier
|
||||
|
||||
### Redondances potentielles
|
||||
- AMC et Le Moniteur : même groupe Infopro Digital, couvertures complémentaires (l'un est la revue mensuelle, l'autre est le portail web quotidien)
|
||||
- Archiliste et Annuaire CNOA : deux annuaires complémentaires, l'un institutionnel, l'autre commercial-éditorial
|
||||
- Plusieurs CROA et CAUE se recoupent fonctionnellement : garder tous car NAV est une carto multi-entrée
|
||||
|
||||
### Pistes d'approfondissement pour compléter à la main
|
||||
1. **CROA manquants** : Occitanie, Centre-Val de Loire, Bourgogne-Franche-Comté, Corse, DOM-TOM — URLs à confirmer sur architectes.org
|
||||
2. **Médias locaux / régionaux** : Rezo (revue CROA Normandie), Trait d'Union (CROA BFC), publications CROA spécifiques
|
||||
3. **Ressources MAR / rénovation énergétique** : FAIRE, programme CEE, ADEME archi-spécifique, ANAH
|
||||
4. **Outils BIM accessibles** : BIMsync, BIMcollab, plateformes GED projets archi FR
|
||||
5. **Ressources honoraires / pricing** : pas de ressource dédiée identifiée — gap important à combler (blog, outil, guide UNSFA ?)
|
||||
6. **Santé mentale spécifique archi** : aucun dispositif 100% dédié aux architectes trouvé — gap confirmé, à signaler dans NAV comme besoin non couvert
|
||||
7. **Associations régionales type ARDEPA (Nantes), MA Rhône-Alpes** : non listées faute d'URLs confirmées
|
||||
8. **Podcasts FR actifs** : vérifier si les podcasts listés sont encore actifs en 2026 (certains ont pu s'arrêter)
|
||||
9. **Accélérateur Architecture de demain (France 2030)** : programme ADEME-BPI pour agences archi — à creuser
|
||||
10. **Fonds MAF de solidarité** : accès aux architectes en difficulté financière — URL directe à ajouter
|
||||
244
V2-cadrage/B-provider-ia-souverain.md
Normal file
244
V2-cadrage/B-provider-ia-souverain.md
Normal file
@@ -0,0 +1,244 @@
|
||||
# NAV — Choix provider IA souverain
|
||||
|
||||
Date : 2026-04-14
|
||||
|
||||
---
|
||||
|
||||
## TL;DR
|
||||
|
||||
Recommandation : **C. Mistral direct** (mistral-small ou mistral-nemo) pour ces raisons : prix imbattable pour les volumes NAV (< 1 €/mois), souveraineté FR/EU native, zero data retention disponible sur API, OpenAI-compatible, zero setup.
|
||||
|
||||
Plan B : **A. Scaleway Generative APIs** si besoin d'un fournisseur FR 100% indépendant de Mistral (pas de relation directe), ou si les modèles Scaleway (Qwen, Llama, Mistral hébergés en FR) conviennent mieux pour un usage multi-modèle.
|
||||
|
||||
---
|
||||
|
||||
## Tableau comparatif
|
||||
|
||||
| Critère | Scaleway Gen. APIs | Synthetic.new | Mistral direct | Ollama self-host | Scaleway GPU |
|
||||
|---|---|---|---|---|---|
|
||||
| Souveraineté | FR (Scaleway SAS) | EU (localisation à confirmer) | FR (Paris) | 100% VPS Hetzner DE | FR (Scaleway SAS) |
|
||||
| RGPD / rétention | Zéro rétention par défaut (2 sem. si incident) | Non documenté publiquement | 30 j par défaut, ZDR activable sur API | Zéro (local) | Zéro rétention (même politique que Gen. APIs) |
|
||||
| Kimi 2.5 dispo | Non | Oui (hf:moonshotai/Kimi-K2.5 et K2-Thinking) | Non | Oui (quantisé, mais VPS trop petit) | Oui (déployable) |
|
||||
| Meilleur modèle dispo | Qwen 3.5-397B, Mistral Small 3.2, Llama 3.3 70B | Kimi K2.5, Kimi K2-Thinking, 19+ modèles | Mistral Small 3.1, Mistral Medium 3, Mistral Large | Gemma3:4B, Phi-4 Mini, Qwen 3 4B (CPU-only) | Tout modèle open-weight |
|
||||
| Prix/1M input | €0,15 | Forfait ~$30/mois tout compris | $0,02 (Nemo) / $0,20 (Small) | ~0 + infra | ~0 + GPU |
|
||||
| Prix/1M output | €0,35 | inclus dans forfait | $0,04 (Nemo) / $0,60 (Small) | ~0 + infra | ~0 + GPU |
|
||||
| Coût estimé/mois (usage NAV) | ~€0,30–€1,20 | $30 (forfait fixe) | ~$0,05–$0,50 | €7,99–€15,99 (upgrade VPS) | €50–€100+ si à la demande |
|
||||
| Latence | Bonne (datacenters FR) | Bonne (EU) | Bonne (datacenters FR) | Très lente (CPU-only, 2–6 tok/s) | Excellente (GPU dédié) |
|
||||
| Setup | OpenAI-compat, drop-in | OpenAI-compat | OpenAI-compat | Docker + model pull | VM + déploiement modèle |
|
||||
| Plafonnement budget | Quota API configurable | Budget fixe par nature | Quota API + alertes | Infra-bound | Infra-bound + alertes billing |
|
||||
|
||||
---
|
||||
|
||||
## Analyse par option
|
||||
|
||||
### A. Scaleway Generative APIs
|
||||
|
||||
**Forces :**
|
||||
- Hébergement 100% France, filiale Iliad (groupe Xavier Niel)
|
||||
- Zéro data retention par défaut — politique claire et documentée
|
||||
- Drop-in OpenAI-compatible
|
||||
- Batch API disponible : -50% sur le prix, sans rate limit (idéal pour le worker post-processing fiches)
|
||||
- Modèles solides : Mistral Small 3.2, Qwen 3.5, Llama 3.3 70B
|
||||
- Free tier 1M tokens/mois inclus
|
||||
|
||||
**Faiblesses :**
|
||||
- Pas de Kimi 2.5 (si c'est un critère modèle)
|
||||
- Pricing output (€0,35/1M) légèrement plus élevé que Mistral direct
|
||||
- Dépend des modèles disponibles sur leur catalogue (moins de choix que Mistral direct)
|
||||
|
||||
**Coût estimé pour les 3 usages NAV :**
|
||||
|
||||
```
|
||||
Usage 1 — Worker post-processing fiches
|
||||
80 fiches/mois × (500 in + 500 out) = 80 000 tokens
|
||||
Input : 0,08M × €0,15 = €0,01
|
||||
Output : 0,08M × €0,35 = €0,03
|
||||
Sous-total : ~€0,04/mois (ou gratuit dans le free tier)
|
||||
|
||||
Usage 2 — Chatbot recherche
|
||||
150 req/mois × (2 000 in + 300 out) = 345 000 tokens
|
||||
Input : 0,30M × €0,15 = €0,045
|
||||
Output : 0,045M × €0,35 = €0,016
|
||||
Sous-total : ~€0,06/mois
|
||||
|
||||
Usage 3 — Filtre éthique commentaires
|
||||
150 req/mois × (200 in + 20 out) = 33 000 tokens
|
||||
Sous-total : négligeable
|
||||
|
||||
Total Scaleway : ~€0,10–€0,20/mois (hors free tier)
|
||||
Avec Batch API (-50%) sur Usage 1 : encore moins cher
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### B. Synthetic.new
|
||||
|
||||
**Forces :**
|
||||
- Forfait fixe $30/mois : budgétairement prévisible
|
||||
- Kimi K2.5 et K2-Thinking disponibles via API
|
||||
- OpenAI-compatible (endpoint `api.synthetic.new`)
|
||||
- Modèle "privacy-first" selon leur positionnement
|
||||
|
||||
**Faiblesses :**
|
||||
- $30/mois est sur-dimensionné pour les volumes NAV actuels (on paierait 60–300× trop cher)
|
||||
- Politique RGPD / data retention non documentée publiquement — point bloquant pour usage professionnel
|
||||
- Localisation exacte des serveurs non confirmée (EU oui, mais pays ?)
|
||||
- Dépendance à un petit acteur sans DPA public → risque de disparition ou changement tarifaire
|
||||
- Le forfait usage-based existe mais les tarifs par token ne sont pas clairement publiés
|
||||
|
||||
**Coût estimé pour les 3 usages NAV :**
|
||||
- $30/mois fixe quelle que soit la consommation
|
||||
- Cohérent uniquement si usage intensif personnel/prod (> 500 req/jour)
|
||||
- Pour NAV au stade actuel : sur-coût 60× vs Mistral
|
||||
|
||||
---
|
||||
|
||||
### C. Mistral direct
|
||||
|
||||
**Forces :**
|
||||
- Mistral = société française, siège à Paris, supervisée par CNIL
|
||||
- ZDR (Zero Data Retention) activable directement sur l'API — le seul fournisseur à l'offrir explicitement avec documentation officielle
|
||||
- OpenAI-compatible, drop-in, aucun setup
|
||||
- Mistral Nemo : $0,02/$0,04 par 1M tokens → le moins cher du marché parmi les modèles sérieux
|
||||
- Mistral Small 3.1 : $0,20/$0,60 — bon rapport qualité/prix pour le chatbot et le filtre éthique
|
||||
- Data Processing Addendum disponible pour toutes les entreprises
|
||||
|
||||
**Faiblesses :**
|
||||
- Pas de Kimi 2.5 (si besoin d'un modèle agentic spécifique)
|
||||
- Mistral Large ($2/$6) ou Medium ($0,40/$2) deviennent chers si on monte en gamme
|
||||
- Dépendance à un seul fournisseur pour tous les usages
|
||||
|
||||
**Coût estimé pour les 3 usages NAV :**
|
||||
|
||||
```
|
||||
Stratégie recommandée :
|
||||
Usage 1 (worker fiches) → mistral-nemo ($0,02/$0,04)
|
||||
Usage 2 (chatbot) → mistral-small-3.1 ($0,20/$0,60)
|
||||
Usage 3 (filtre) → mistral-nemo ($0,02/$0,04)
|
||||
|
||||
Usage 1 — 80 fiches/mois × 1 000 tokens = 80 000 tokens
|
||||
Input : 0,04M × $0,02 = $0,001 | Output : 0,04M × $0,04 = $0,002
|
||||
Sous-total : ~$0,003
|
||||
|
||||
Usage 2 — 150 req/mois × 2 300 tokens = 345 000 tokens
|
||||
Input : 0,30M × $0,20 = $0,060 | Output : 0,045M × $0,60 = $0,027
|
||||
Sous-total : ~$0,09
|
||||
|
||||
Usage 3 — 150 req/mois × 220 tokens = 33 000 tokens
|
||||
Sous-total : ~$0,001
|
||||
|
||||
Total Mistral : ~$0,10–$0,15/mois (<< €1)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### D. Ollama self-hosted (VPS actuel)
|
||||
|
||||
**VPS actuel : 4 GB RAM, 2 vCPU (Hetzner CAX11 ou équivalent)**
|
||||
- Insuffisant pour tout modèle 7B+ (minimum 8 GB RAM requis)
|
||||
- Gemma3:4B ou Phi-4 Mini peuvent tourner en Q4_K_M (~3,5 GB), mais en CPU-only
|
||||
- Performance CPU : 2–6 tokens/s → **inacceptable pour le chatbot** (temps de réponse 30–60s pour 300 tokens out)
|
||||
- Pour le filtre éthique (20 tokens out) : marginalement utilisable, mais toujours lent
|
||||
|
||||
**Upgrade nécessaire :**
|
||||
|
||||
```
|
||||
CAX21 (Hetzner ARM, 4 vCPU / 8 GB RAM) → €7,99/mois
|
||||
Modèles possibles : Gemma3:4B Q8, Phi-4 Mini, Qwen3:4B
|
||||
Performance CPU : ~8–15 tok/s (ARM Ampere)
|
||||
Qualité : correcte pour le filtre éthique, limite pour le chatbot
|
||||
|
||||
CAX31 (Hetzner ARM, 8 vCPU / 16 GB RAM) → €15,99/mois
|
||||
Modèles possibles : Gemma3:12B Q4, Mistral 7B Q8, Qwen3:8B
|
||||
Performance CPU : ~5–10 tok/s sur 7–12B
|
||||
Qualité : acceptable pour tous les usages NAV
|
||||
Charge maintenance : Docker, model pull, mises à jour, monitoring
|
||||
```
|
||||
|
||||
**Réalisme CPU-only :**
|
||||
- Pas de GPU sur les VPS Hetzner standard → inférence CPU uniquement
|
||||
- Mistral 7B ou Qwen 7B sur CPU = 3–6 tok/s = **non viable pour chatbot temps réel**
|
||||
- Gemma3:4B sur CAX21 = seul compromis réaliste, mais qualité inférieure à Mistral Small
|
||||
|
||||
**Coût total :**
|
||||
- CAX21 : €7,99/mois + temps de maintenance ~1h/mois
|
||||
- CAX31 : €15,99/mois + temps de maintenance
|
||||
- Dans les deux cas, prix 10–50× plus élevé que Mistral direct pour une qualité inférieure
|
||||
|
||||
**Conclusion Ollama :** pertinent uniquement si la contrainte de souveraineté est absolue (zéro tiers, données confidentielles très sensibles) ET si on accepte la latence. Pas recommandé pour le chatbot NAV.
|
||||
|
||||
---
|
||||
|
||||
### E. Scaleway GPU
|
||||
|
||||
**Contexte :**
|
||||
- GPU instances Scaleway (L4, L40S, H100 SXM) en datacenter France
|
||||
- H100 SXM : ~€3,50/h | A100 : ~€2,50/h | L4 : ~€0,50/h (estimation)
|
||||
- Usage facturable à l'heure → adapté aux bursts, pas au serving continu
|
||||
|
||||
**Forces :**
|
||||
- Souveraineté FR + RGPD = même niveau que Scaleway Generative APIs
|
||||
- Liberté totale sur les modèles (déployer Kimi 2.5 quantisé, Mistral, Qwen...)
|
||||
- Latence excellente (GPU dédié)
|
||||
- Zéro dépendance à un provider d'inférence
|
||||
|
||||
**Faiblesses :**
|
||||
- Coût fixe prohibitif : L4 à €0,50/h = €360/mois en continu → hors budget
|
||||
- Pour usage sporadique (50–200 req/mois), il faut un orchestrateur qui allume/éteint le GPU
|
||||
- Complexité d'orchestration (Kubernetes, Triton, ou script custom)
|
||||
- Overkill pour les volumes NAV actuels
|
||||
|
||||
**Coût estimé :**
|
||||
- En continu : €360–€2 500/mois selon GPU → hors budget 20€
|
||||
- En spot/burst (5h/mois d'inférence L4) : ~€2,50/mois d'infra, mais complexité setup = 2–3j de travail
|
||||
|
||||
**Conclusion GPU Scaleway :** à considérer uniquement à très grande échelle (10 000+ req/mois) ou pour le déploiement d'un modèle custom non disponible ailleurs.
|
||||
|
||||
---
|
||||
|
||||
## Reco finale
|
||||
|
||||
**Mistral direct (option C)** est la reco sans hésitation pour NAV dans sa phase actuelle.
|
||||
|
||||
Le coût réel sera inférieur à $0,15/mois pour les 3 usages combinés — soit 100× sous le budget de 20€. La souveraineté est native (France, CNIL), le ZDR est activable en un paramètre API, et l'intégration est un copier-coller de clé API. La stratégie à deux modèles (Nemo pour le worker + filtre éthique, Small pour le chatbot) optimise le rapport qualité/prix.
|
||||
|
||||
Si dans 12–18 mois les volumes explosent (> 5 000 req/mois chatbot) ou si un modèle spécifique non disponible chez Mistral devient critique, Scaleway Generative APIs est le plan B naturel — même souveraineté, catalogue élargi, Batch API intégré.
|
||||
|
||||
Synthetic.new et Ollama self-hosted ne sont pas recommandés pour ce cas d'usage à ce stade.
|
||||
|
||||
---
|
||||
|
||||
## Plafonnement budget
|
||||
|
||||
### Circuit breaker à 20€/mois
|
||||
|
||||
**Mistral direct** (recommandé) :
|
||||
|
||||
L'API Mistral expose des `usage` metrics dans chaque réponse. Options :
|
||||
1. **Alerte billing Mistral** : configurer une notification à 10€ et un hard limit à 20€ dans le dashboard `console.mistral.ai` → Settings → Billing → Budget alerts
|
||||
2. **Middleware applicatif** : compteur Redis cumulant les tokens, coupure si seuil atteint (patterns standard LangChain/LiteLLM)
|
||||
3. **LiteLLM proxy** : mode budget_manager intégré, peut limiter par utilisateur et par total mensuel
|
||||
|
||||
**Scaleway Generative APIs** (plan B) :
|
||||
- Interface billing avec quotas configurables par organisation
|
||||
- Batch API comme soupape : si quota temps réel atteint, basculer en batch (-50% coût)
|
||||
|
||||
**Confort :** à $0,15/mois de consommation prévue, le budget de 20€ représente 133× la consommation estimée — le circuit breaker est une précaution, pas une urgence en phase de lancement.
|
||||
|
||||
---
|
||||
|
||||
## Sources consultées
|
||||
|
||||
- [Scaleway Model-as-a-service pricing](https://www.scaleway.com/en/pricing/model-as-a-service/)
|
||||
- [Scaleway Generative APIs data privacy](https://www.scaleway.com/en/docs/generative-apis/reference-content/data-privacy/)
|
||||
- [Scaleway supported models](https://www.scaleway.com/en/docs/generative-apis/reference-content/supported-models/)
|
||||
- [Mistral AI pricing docs](https://docs.mistral.ai/deployment/ai-studio/pricing)
|
||||
- [Mistral ZDR documentation](https://help.mistral.ai/en/articles/347612-can-i-activate-zero-data-retention-zdr)
|
||||
- [Mistral data storage EU](https://help.mistral.ai/en/articles/347629-where-do-you-store-my-data-or-my-organization-s-data)
|
||||
- [Synthetic.new pricing](https://synthetic.new/pricing)
|
||||
- [Synthetic.new blog subscriptions](https://synthetic.new/blog/subscriptions)
|
||||
- [Kimi K2.5 via Synthetic (TypingMind guide)](https://www.typingmind.com/guide/synthetic/hf-moonshotai-Kimi-K2-Thinking)
|
||||
- [Hetzner CAX pricing](https://www.hetzner.com/cloud/cost-optimized)
|
||||
- [Ollama VPS requirements](https://localllm.in/blog/ollama-vram-requirements-for-local-llms)
|
||||
- [Best Ollama models 8GB RAM](https://localaimaster.com/blog/best-local-ai-models-8gb-ram)
|
||||
- [EU LLM API comparison JuiceFactory 2026](https://juicefactory.ai/en/guides/eu-llm-api-comparison)
|
||||
299
V2-cadrage/C-systeme-dons.md
Normal file
299
V2-cadrage/C-systeme-dons.md
Normal file
@@ -0,0 +1,299 @@
|
||||
# NAV — Choix système de dons
|
||||
|
||||
Date : 2026-04-14
|
||||
|
||||
## TL;DR
|
||||
|
||||
Recommandation principale : **Liberapay** (scénario collectif informel) ou **HelloAsso** (si ASO créée).
|
||||
|
||||
- **Sans ASO** : Liberapay est l'option la plus propre — 0% frais plateforme, open source FR/EU, aucun statut requis, dons récurrents, retrait SEPA gratuit. Fiscalement : dons liés à l'activité pro = CA imposable à déclarer à l'URSSAF.
|
||||
- **Avec ASO** : HelloAsso domine — 0% frais, très connu en France, reçus fiscaux Cerfa possibles (si reconnaissance d'intérêt général), UX excellente.
|
||||
|
||||
Question à trancher par Jules : créer une ASO "Collectif NAV" en 15 min, ou rester collectif informel avec Liberapay ?
|
||||
|
||||
---
|
||||
|
||||
## Point juridique / fiscal
|
||||
|
||||
### Statut actuel : auto-entrepreneur
|
||||
|
||||
Jules est auto-entrepreneur (micro-entreprise). Ce statut conditionne le traitement fiscal des dons reçus.
|
||||
|
||||
### Recevoir des dons en tant qu'auto-entrepreneur
|
||||
|
||||
**C'est légal, mais fiscalement contraint :**
|
||||
|
||||
- Les dons reçus en lien avec l'activité professionnelle (financer une plateforme que Jules porte via son AE) sont traités comme du **chiffre d'affaires**.
|
||||
- Ils doivent être **déclarés à l'URSSAF** (mensuel ou trimestriel) et intégrés au CA imposable.
|
||||
- Catégorie : BIC si l'AE relève déjà des BIC, BNC sinon.
|
||||
- Conséquences : cotisations sociales + impôt sur le revenu (abattement micro-BIC/BNC standard).
|
||||
- La TVA ne s'applique pas aux dons purs (sans contrepartie).
|
||||
|
||||
**Seuils 2026 pour information :**
|
||||
- BNC/prestations de services : 83 600 €/an (très au-delà du volume NAV prévu)
|
||||
|
||||
**Dons non liés à l'activité pro :**
|
||||
Si les dons proviennent de particuliers totalement extérieurs à l'activité (ex. famille, amis), ils relèvent des dons manuels entre particuliers — imposables uniquement si déclarés ou si montants dépassent les abattements familiaux. Pour 5-50 donateurs à 2-20 €/mois, **en pratique non significatif** mais l'ambiguïté reste réelle si la plateforme est publique.
|
||||
|
||||
**Risque principal :** Jules porte NAV sous son AE → les dons "pour NAV" sont clairement liés à son activité pro → déclaration URSSAF obligatoire. Cotisations sociales sur les montants (~40-60€/mois = impact faible, mais obligation existe).
|
||||
|
||||
### Alternative : ASO loi 1901 "Collectif NAV"
|
||||
|
||||
**Démarches :**
|
||||
- Minimum 2 membres fondateurs (Jules + 1 autre)
|
||||
- Rédaction statuts (modèle libre, ~1h)
|
||||
- Déclaration en préfecture (en ligne sur service-public.fr)
|
||||
- Publication au Journal Officiel (automatique, gratuit depuis 2020)
|
||||
- Délai : 5 jours ouvrés pour la préfecture, 2-3 semaines au total
|
||||
- Coût : 0 €
|
||||
|
||||
**Avantages ASO :**
|
||||
- HelloAsso accessible (0% frais plateforme)
|
||||
- Reçus fiscaux Cerfa possibles si rescrit fiscal (reconnaissance d'intérêt général — démarche supplémentaire, pertinente uniquement si donateurs personnes morales ou si montants significatifs)
|
||||
- Pas d'ambiguïté : les dons vont à l'ASO, pas à Jules personnellement
|
||||
- Séparation propre entre revenus Jules (AE) et fonds NAV (ASO)
|
||||
- Exonération des impôts commerciaux (TVA, IS, CET) pour l'ASO si activité non lucrative
|
||||
|
||||
**Contraintes ASO :**
|
||||
- AG annuelle obligatoire (formalité légère mais réelle)
|
||||
- Compte bancaire ASO à ouvrir (banque ou Nickel, Boursobank Pro)
|
||||
- Comptabilité simple (recettes/dépenses)
|
||||
- Charge annuelle estimée : ~2-4h/an pour une petite structure
|
||||
|
||||
### Alternative 3 : Fonds de dotation
|
||||
|
||||
Trop lourd pour ce stade (capital de 15 000 €, commissaire aux comptes). Non pertinent.
|
||||
|
||||
---
|
||||
|
||||
## Tableau comparatif
|
||||
|
||||
| Option | Statut requis | Fees plateforme | Fees paiement | Récurrent | Reçu fiscal | Intégration | Souveraineté | UX donateur |
|
||||
|--------|--------------|-----------------|---------------|-----------|-------------|-------------|--------------|-------------|
|
||||
| **HelloAsso** | ASO déclarée | 0% (pourboire opt.) | 0% | Oui | Oui (si intérêt général) | Widget / lien / API | FR | ★★★★★ |
|
||||
| **Liberapay** | Aucun | 0% | ~3% (Stripe) ou ~0,35€ SEPA | Oui (récurrent natif) | Non | Lien + widget | EU (FR, open source) | ★★★★ |
|
||||
| **Stripe** | Compte pro / AE | 0% (propre intégration) | 1,5%+0,25€ (CB EU) / 0,35€ (SEPA) | Oui (Stripe Billing) | Non | API / Payment Links | US (SEPA OK) | ★★★★ |
|
||||
| **Tipeee** | Aucun (particulier OK) | 8% TTC | Inclus | Oui | Non | Lien | FR | ★★★ |
|
||||
| **Ko-fi** | Aucun | 0% (tips) / 5% (memberships) | ~2,9%+0,30$ (Stripe/PayPal) | Oui (Gold ou memberships) | Non | Lien + widget | UK | ★★★★ |
|
||||
| **Buy Me a Coffee** | Aucun | 5% | Frais Stripe/PayPal | Oui | Non | Lien + widget | US | ★★★ |
|
||||
| **Virement SEPA direct** | Aucun | 0% | 0% | Non (manuel) | Non | IBAN publié sur site | Total | ★★ |
|
||||
|
||||
---
|
||||
|
||||
## Analyse par option
|
||||
|
||||
### A. HelloAsso
|
||||
|
||||
**Forces :**
|
||||
- 0% de frais plateforme (modèle : pourboire optionnel des donateurs)
|
||||
- Très connu en France, forte crédibilité associative
|
||||
- Dons récurrents natifs
|
||||
- Interface très soignée pour le donateur
|
||||
- Reçus fiscaux Cerfa possibles (si rescrit fiscal d'intérêt général)
|
||||
- Widget embed propre, API disponible
|
||||
|
||||
**Faiblesses :**
|
||||
- Nécessite statut ASO déclarée (ou structure ESS reconnue)
|
||||
- Pas accessible directement à Jules en tant qu'AE ou collectif informel
|
||||
- Dépendance à une plateforme privée (même si FR)
|
||||
|
||||
**Pour NAV :** Meilleur choix si Jules crée l'ASO. La démarche prend 15 min et ouvre une option très propre, sans frais, avec crédibilité FR.
|
||||
|
||||
---
|
||||
|
||||
### B. Liberapay
|
||||
|
||||
**Forces :**
|
||||
- 0% de frais plateforme (financé par dons à son propre compte)
|
||||
- Aucun statut juridique requis — ouvert aux particuliers, collectifs, projets open source
|
||||
- Dons récurrents natifs (hebdomadaire, mensuel)
|
||||
- Retrait SEPA gratuit vers compte bancaire
|
||||
- Open source, hébergé en EU, conformité RGPD native
|
||||
- Parfaitement adapté aux projets tech/open source
|
||||
- Interface simple, sobre
|
||||
|
||||
**Faiblesses :**
|
||||
- Frais du processeur de paiement : ~3% Stripe ou ~0,35€ SEPA (en réalité faible sur petits montants)
|
||||
- Moins connu du grand public FR que HelloAsso ou Tipeee
|
||||
- UX moins "grand public" — plus adapté communautés tech
|
||||
- Pas de reçu fiscal
|
||||
- Transparence totale (le montant collecté est public par défaut)
|
||||
|
||||
**Pour NAV :** Option idéale pour démarrer sans ASO. Communauté de la plateforme bien alignée avec un projet collaboratif archi/tech. Frais réels très bas (2-5€ sur 100€ collectés).
|
||||
|
||||
---
|
||||
|
||||
### C. Stripe
|
||||
|
||||
**Forces :**
|
||||
- Intégration native dans le site (Payment Links ou Checkout embed)
|
||||
- SEPA Direct Debit à 0,35€/transaction — très économique sur petits montants récurrents
|
||||
- Dons récurrents via Stripe Billing
|
||||
- Complet techniquement (webhooks, dashboard transparent)
|
||||
|
||||
**Faiblesses :**
|
||||
- Nécessite un compte Stripe (auto-entrepreneur ou entreprise — compte perso possible mais déconseillé pour activité récurrente)
|
||||
- Pas de "page de dons" publique clé-en-main — développement requis
|
||||
- Hébergement US (données RGPD : Stripe est conforme mais données hors EU)
|
||||
- Pas de reçu fiscal
|
||||
- Charge technique (maintenance intégration)
|
||||
|
||||
**Pour NAV :** Pertinent si Jules veut une intégration custom dans le site NAV avec contrôle total. Overkill pour un démarrage — à considérer à terme si volume justifie.
|
||||
|
||||
---
|
||||
|
||||
### D. Tipeee
|
||||
|
||||
**Forces :**
|
||||
- Connu en France, confiance des donateurs
|
||||
- Aucun statut requis (particulier OK)
|
||||
- Dons récurrents natifs
|
||||
|
||||
**Faiblesses :**
|
||||
- 8% TTC de commission — **le plus cher du comparatif** pour ce cas d'usage
|
||||
- Positionné créateurs de contenu (YouTube, streaming) — peu adapté à un projet archi/tech collaboratif
|
||||
- Esthétique "influenceur", pas forcément cohérente avec NAV
|
||||
|
||||
**Pour NAV :** À éviter. Les 8% de commission sont disproportionnés. Aucun avantage spécifique sur Liberapay ou Ko-fi.
|
||||
|
||||
---
|
||||
|
||||
### E. Ko-fi
|
||||
|
||||
**Forces :**
|
||||
- 0% de frais sur les tips simples
|
||||
- Aucun statut requis
|
||||
- Interface propre, moderne
|
||||
- Widget embed disponible
|
||||
|
||||
**Faiblesses :**
|
||||
- Frais Stripe/PayPal sous-jacents (~2,9%+0,30$ par transaction — coûteux sur petits montants)
|
||||
- Hébergement UK (post-Brexit — RGPD s'applique mais moins souverain)
|
||||
- 5% plateforme sur memberships (sauf Ko-fi Gold à 6$/mois)
|
||||
- Positionné créateurs (artistes, illustrateurs) — moins adapté projet tech
|
||||
|
||||
**Pour NAV :** Option correcte mais pas optimale. Ko-fi Gold (6$/mois) = 72€/an pour 0% fees — injustifié si volume < 500€/an collectés.
|
||||
|
||||
---
|
||||
|
||||
### F. Buy Me a Coffee
|
||||
|
||||
**Forces :**
|
||||
- Simple, rapide à déployer
|
||||
- 0% frais plateforme (frais Stripe/PayPal uniquement)
|
||||
|
||||
**Faiblesses :**
|
||||
- Hébergement US
|
||||
- RGPD moins clair
|
||||
- Positionné très "créateur solo", peu sérieux pour un projet collectif
|
||||
- Dollars par défaut
|
||||
|
||||
**Pour NAV :** Non adapté. Trop informel pour un outil professionnel d'architecture.
|
||||
|
||||
---
|
||||
|
||||
### G. GoFundMe / Leetchi
|
||||
|
||||
**Forces :**
|
||||
- Campagnes ponctuelles bien connues
|
||||
|
||||
**Faiblesses :**
|
||||
- Conçu pour campagnes one-shot, pas pour financement récurrent continu
|
||||
- Fees : GoFundMe 0% + frais paiement ; Leetchi 5%
|
||||
- Pas adapté au modèle "couvrir des frais d'infra en continu"
|
||||
|
||||
**Pour NAV :** Non pertinent.
|
||||
|
||||
---
|
||||
|
||||
### H. Virement SEPA direct
|
||||
|
||||
**Forces :**
|
||||
- 0% fees total
|
||||
- Souveraineté absolue
|
||||
- Simplicité maximale (IBAN publié sur le site)
|
||||
|
||||
**Faiblesses :**
|
||||
- Aucun don récurrent automatique — friction maximale pour le donateur
|
||||
- Pas de tableau de bord, pas de transparence publique
|
||||
- Pas de widget
|
||||
- Conversion très faible (démarche active requise du donateur)
|
||||
|
||||
**Pour NAV :** Utile en complément (afficher l'IBAN pour ceux qui préfèrent), pas comme solution principale.
|
||||
|
||||
---
|
||||
|
||||
## Scénarios recommandés
|
||||
|
||||
### Scénario 1 : NAV reste collectif informel (Jules AE)
|
||||
|
||||
**Option recommandée : Liberapay**
|
||||
|
||||
Pourquoi :
|
||||
- Aucune démarche administrative
|
||||
- 0% frais plateforme, SEPA gratuit pour les retraits
|
||||
- Techniquement aligné avec la nature open source / collaboratif de NAV
|
||||
- Widget embeddable sur le site
|
||||
- Transparence publique native (les donateurs voient le total collecté vs objectif)
|
||||
- Open source, hébergement EU, RGPD natif
|
||||
|
||||
Fiscalité pour Jules :
|
||||
- Les dons reçus via Liberapay pour financer NAV (plateforme portée par son AE) = **CA de l'AE**
|
||||
- Déclaration URSSAF mensuelle/trimestrielle obligatoire
|
||||
- Impôt : abattement micro-BNC (34%) puis imposition normale
|
||||
- Sur 40-60€/mois collectés : cotisations ~15-20€, impôt selon TMI Jules
|
||||
- Charge administrative réelle : ajouter 1 ligne dans la déclaration URSSAF
|
||||
|
||||
Virement SEPA direct en complément : publier l'IBAN NAV (compte bancaire dédié, même si perso) pour les virements ponctuels.
|
||||
|
||||
---
|
||||
|
||||
### Scénario 2 : Jules crée une ASO "Collectif NAV"
|
||||
|
||||
**Option recommandée : HelloAsso**
|
||||
|
||||
Démarches (estimé ~2-3h) :
|
||||
1. Rédiger statuts (modèle disponible sur service-public.fr)
|
||||
2. Tenir une AG constitutive avec 2 membres minimum (Jules + co-fondateur)
|
||||
3. Déclarer en préfecture via le portail en ligne (service-public.fr/associations)
|
||||
4. Obtenir le récépissé (5 jours ouvrés)
|
||||
5. Ouvrir un compte bancaire ASO (Nickel, Hello Bank Pro, ou banque classique)
|
||||
6. Créer le compte HelloAsso
|
||||
|
||||
Avantages concrets :
|
||||
- 0% frais plateforme (HelloAsso)
|
||||
- Séparation propre : fonds NAV ≠ revenus Jules
|
||||
- Transparence totale via HelloAsso (tableau de bord public optionnel)
|
||||
- Reçus fiscaux Cerfa possibles si rescrit fiscal (démarche optionnelle, 2-3 mois)
|
||||
- Crédibilité renforcée vis-à-vis des institutions (partenaires, mairies, etc.)
|
||||
|
||||
Charge annuelle :
|
||||
- 1 AG par an (peut être rapide, par mail si statuts le permettent)
|
||||
- Déclaration simple des comptes (recettes / dépenses)
|
||||
- Aucun commissaire aux comptes requis sous 153 000 € de subventions publiques
|
||||
- Durée : ~2-4h/an
|
||||
|
||||
---
|
||||
|
||||
## Reco finale
|
||||
|
||||
**Pour démarrer maintenant sans friction : Liberapay.** Zéro démarche, 0% plateforme, parfaitement adapté à NAV (projet open source / collaboratif tech), retrait SEPA gratuit vers le compte bancaire de Jules. Fiscalement, les dons s'intègrent au CA de l'AE — contrainte légère pour des montants de 40-60€/mois (quelques euros de cotisations). Ajouter un IBAN en complément pour les virements directs.
|
||||
|
||||
**À 6-12 mois, si NAV prend de l'ampleur : créer l'ASO et basculer sur HelloAsso.** La démarche est simple (2-3h), gratuite, et ouvre des options de crédibilité institutionnelle, de partenariats, et d'accès à des subventions. Le basculement Liberapay → HelloAsso est indolore (rediriger le widget).
|
||||
|
||||
**À éviter absolument :** Tipeee (8% de commission injustifiés), Buy Me a Coffee (US, peu sérieux), GoFundMe (one-shot uniquement).
|
||||
|
||||
---
|
||||
|
||||
## Piège fiscal à connaître
|
||||
|
||||
Les dons reçus pour financer NAV ne sont **pas** des dons manuels entre particuliers (abattements familiaux) — ils sont des recettes professionnelles liées à l'activité de l'AE. Traitement = CA imposable + cotisations URSSAF. Ne pas les omettre de la déclaration, même si les montants sont faibles.
|
||||
|
||||
---
|
||||
|
||||
## Questions ouvertes pour Jules
|
||||
|
||||
1. Y a-t-il déjà un co-fondateur potentiel pour l'ASO (si ce scénario est retenu) ?
|
||||
2. Quel compte bancaire utiliser pour recevoir les fonds Liberapay — compte perso AE ou compte dédié NAV ?
|
||||
3. Veux-tu afficher le total collecté publiquement sur le site (bandeau transparent) — Liberapay le permet nativement.
|
||||
4. Si ASO créée : quelle dénomination — "Collectif NAV", "Association NAV", autre ?
|
||||
1159
V2-cadrage/E-spec-frontend.md
Normal file
1159
V2-cadrage/E-spec-frontend.md
Normal file
File diff suppressed because it is too large
Load Diff
824
V2-cadrage/F-spec-pipe-collaboration.md
Normal file
824
V2-cadrage/F-spec-pipe-collaboration.md
Normal file
@@ -0,0 +1,824 @@
|
||||
# NAV V2 — Spec technique : pipe de collaboration
|
||||
|
||||
Date : 2026-04-14
|
||||
Statut : draft v1 — à valider avant implémentation
|
||||
Auteur : ATIS
|
||||
|
||||
---
|
||||
|
||||
## 1. Schéma ASCII global de la pipe
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SOUMISSION (mobile-first) │
|
||||
│ │
|
||||
│ [User remplit formulaire] │
|
||||
│ ↓ │
|
||||
│ POST /api/submit │
|
||||
│ → validation Zod (nom requis, URL valide si fournie, email valide si fni) │
|
||||
│ → rate check : ≤ 3 soumissions / IP / jour │
|
||||
│ → NocoDB: INSERT row │
|
||||
│ · moderation_status = pending │
|
||||
│ · scrape_status = pending (si URL) | no_link (si pas d'URL) │
|
||||
│ · ai_processed = false │
|
||||
│ → HTTP 201 + message "Merci, fiche en cours de traitement" │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
(async — NE PAS bloquer la requête HTTP)
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ WORKER CRON (toutes les 5 min) │
|
||||
│ │
|
||||
│ 1. Fetch NocoDB: rows WHERE ai_processed=false AND moderation_status=pending│
|
||||
│ 2. Pour chaque row : │
|
||||
│ │
|
||||
│ a. [Si scrape_status=pending ET URL présente] │
|
||||
│ → crawl4ai scrape (timeout 3 min) │
|
||||
│ → Si succès : scrape_status = scraped, contenu stocké │
|
||||
│ → Si échec : scrape_status = failed → passer à l'étape d │
|
||||
│ │
|
||||
│ b. [Budget check avant appel IA] │
|
||||
│ → Lire stats_usage: cumul coût_eur mois courant │
|
||||
│ → Si ≥ 20€ : row laissée en pending, worker s'arrête │
|
||||
│ │
|
||||
│ c. [Appel Mistral Nemo — enrichissement] │
|
||||
│ → Prompt enrichissement (voir §3) │
|
||||
│ → Retry 2× si erreur réseau ou JSON mal formé │
|
||||
│ → Si 3 échecs : ai_processed=false, moderation_status=ai_error │
|
||||
│ → Si succès : parse JSON, update NocoDB fields │
|
||||
│ │
|
||||
│ d. [Update NocoDB] │
|
||||
│ → ai_processed = true │
|
||||
│ → moderation_status = ai_processed │
|
||||
│ → description_enrichie, points_cles, tags_fonction, etc. │
|
||||
│ → ai_raw_output (debug) │
|
||||
│ │
|
||||
│ e. [Log tokens] │
|
||||
│ → INSERT stats_usage (tokens_in, tokens_out, coût_eur, model, ts) │
|
||||
│ │
|
||||
│ 3. Si N nouvelles fiches ai_processed : email Jules "N fiches à modérer" │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ MODÉRATION MANUELLE (Jules, review hebdo) │
|
||||
│ │
|
||||
│ Interface : NocoDB UI (ou page admin custom) │
|
||||
│ Jules filtre sur moderation_status = ai_processed │
|
||||
│ Pour chaque fiche : Approve → published | Reject → rejected │
|
||||
│ moderated_at = NOW(), moderator_note optionnel │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ FRONT │
|
||||
│ │
|
||||
│ GET /api/orgs → liste fiches WHERE moderation_status=published │
|
||||
│ Carte Leaflet/MapLibre + filtres taxonomie │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
PIPE COMMENTAIRE (parallèle) :
|
||||
|
||||
[User soumet commentaire]
|
||||
→ POST /api/comment
|
||||
→ rate check : ≤ 5 / IP / jour
|
||||
→ Budget check
|
||||
→ Mistral Nemo : filtre éthique (prompt §4)
|
||||
→ Si safe=true : INSERT comment, published=true
|
||||
→ Si safe=false : INSERT comment, published=false, flag pending review Jules
|
||||
→ Log usage
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Schéma NocoDB — champs complets table organisations
|
||||
|
||||
Table : `m08t7g5v4wch6wb` (base `pipilvsi7dibo80`)
|
||||
|
||||
```
|
||||
Champ Type Contraintes / Notes
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
id auto-int PK, auto-increment
|
||||
nom text required, max 200 chars
|
||||
url text nullable, validé comme URL si présent
|
||||
description_user longtext saisie brute du soumetteur, nullable
|
||||
description_enrichie longtext générée par IA, nullable jusqu'au traitement
|
||||
points_cles longtext JSON array stringifié ["bullet1","bullet2",…]
|
||||
nullable jusqu'au traitement IA
|
||||
echelle select values: National | Régional | Départemental | Local
|
||||
nullable (IA propose, Jules valide)
|
||||
territoire select values: Métropole | Guadeloupe | Martinique |
|
||||
Guyane | Réunion | Mayotte
|
||||
nullable
|
||||
tags_fonction multiselect values: Juridique | Technique | Économique |
|
||||
Administratif | Chantier | Comptabilité |
|
||||
Prospection | RH | Santé mentale
|
||||
max 5 valeurs (MVP : pas d'ordre priorité,
|
||||
ordre = ordre de sélection)
|
||||
localisation_ville text nullable, extraite par IA ou saisie user
|
||||
latitude decimal(9,6) nullable, géocodage post-modération (hors MVP)
|
||||
longitude decimal(9,6) nullable, idem
|
||||
scrape_status select values: pending | scraped | failed | no_link
|
||||
default: pending si URL, no_link sinon
|
||||
moderation_status select values: pending | ai_processed | ai_error |
|
||||
approved | rejected
|
||||
default: pending
|
||||
ai_processed checkbox false par défaut, true après traitement worker
|
||||
submitted_by_email text nullable, pas de validation format strict
|
||||
(tolérance typos côté UX)
|
||||
submitted_at datetime auto NOW() à l'INSERT
|
||||
moderated_at datetime nullable, rempli par Jules lors de la modération
|
||||
moderator_note text nullable, note interne Jules
|
||||
ai_raw_output longtext JSON brut retourné par Mistral, pour debug
|
||||
nullable, peut être purgé périodiquement
|
||||
scrape_content longtext contenu markdown extrait par crawl4ai
|
||||
nullable, utilisé comme input IA puis archivé
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
### Table avis : `m4hub7cdutgec47`
|
||||
|
||||
```
|
||||
Champ Type Notes
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
id auto-int PK
|
||||
orga_id int FK → table organisations.id
|
||||
contenu longtext required
|
||||
auteur_pseudo text nullable
|
||||
auteur_email text nullable (non affiché publiquement)
|
||||
published checkbox true si filtre éthique OK, false si pending
|
||||
safe_check select values: safe | flagged | pending
|
||||
default: pending
|
||||
safe_reason text nullable, raison du flag IA
|
||||
submitted_at datetime auto NOW()
|
||||
moderated_at datetime nullable
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
### Table stats_usage (nouvelle à créer)
|
||||
|
||||
```
|
||||
Champ Type Notes
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
id auto-int PK
|
||||
model text ex. "mistral-nemo-latest"
|
||||
endpoint text ex. "enrichissement" | "filtre-ethique" | "chatbot"
|
||||
tokens_in int
|
||||
tokens_out int
|
||||
cout_eur decimal(8,6) calculé : (in × prix_in + out × prix_out) / 1_000_000
|
||||
timestamp datetime auto NOW()
|
||||
orga_id int nullable (lié à la fiche si enrichissement)
|
||||
─────────────────────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Prompt Mistral Nemo — enrichissement fiche
|
||||
|
||||
### Paramètres d'appel
|
||||
|
||||
```
|
||||
model: "open-mistral-nemo"
|
||||
temperature: 0.2
|
||||
max_tokens: 800
|
||||
response_format: { type: "json_object" }
|
||||
```
|
||||
|
||||
### System prompt (copier-coller tel quel)
|
||||
|
||||
```
|
||||
Tu es un assistant spécialisé dans l'écosystème professionnel de l'architecture en France. Tu reçois des informations sur une organisation ou ressource liée au secteur de l'architecture, et tu dois les enrichir pour alimenter une cartographie collaborative.
|
||||
|
||||
RÈGLES ABSOLUES :
|
||||
1. Tu ne dois JAMAIS inventer d'informations non présentes dans les sources fournies.
|
||||
2. Si une information est absente ou incertaine, retourne `null` pour ce champ.
|
||||
3. Tu dois retourner UNIQUEMENT un objet JSON valide, sans texte avant ou après.
|
||||
4. La description_enrichie doit être neutre, factuelle, en français, sans jugement de valeur.
|
||||
5. Les points_cles sont des phrases courtes (max 12 mots chacune), actionnables pour un architecte.
|
||||
6. Pour les tags_fonction, ne propose que des valeurs parmi la liste autorisée.
|
||||
|
||||
TAXONOMIE AUTORISÉE :
|
||||
- Échelle (une seule valeur) : "National" | "Régional" | "Départemental" | "Local"
|
||||
- Territoire (une seule valeur) : "Métropole" | "Guadeloupe" | "Martinique" | "Guyane" | "Réunion" | "Mayotte" | null
|
||||
- Tags fonction (1 à 5 valeurs) : "Juridique" | "Technique" | "Économique" | "Administratif" | "Chantier" | "Comptabilité" | "Prospection" | "RH" | "Santé mentale"
|
||||
|
||||
FORMAT DE SORTIE JSON :
|
||||
{
|
||||
"description_enrichie": "string (max 300 chars, français, neutre, factuel)",
|
||||
"points_cles": ["string", "string", "string"],
|
||||
"tags_fonction": ["Valeur1", "Valeur2"],
|
||||
"echelle": "National" | "Régional" | "Départemental" | "Local" | null,
|
||||
"territoire": "Métropole" | ... | null,
|
||||
"localisation_ville": "string" | null,
|
||||
"confiance": "haute" | "moyenne" | "faible"
|
||||
}
|
||||
|
||||
Le champ "confiance" reflète ta certitude globale sur l'enrichissement :
|
||||
- "haute" : URL scrapée avec contenu riche, informations claires
|
||||
- "moyenne" : URL scrapée mais contenu partiel, ou description_user seule suffisante
|
||||
- "faible" : URL non disponible et description_user vague, inférences importantes
|
||||
```
|
||||
|
||||
### User prompt (template — substituer les variables)
|
||||
|
||||
```
|
||||
ORGANISATION À ENRICHIR :
|
||||
|
||||
Nom : {{nom}}
|
||||
URL : {{url_ou_"non fournie"}}
|
||||
Description soumise par l'utilisateur : {{description_user_ou_"non fournie"}}
|
||||
|
||||
CONTENU DU SITE WEB (extrait par scraping) :
|
||||
{{scrape_content_ou_"Site non accessible ou URL non fournie."}}
|
||||
|
||||
---
|
||||
|
||||
Enrichis cette fiche selon les règles du system prompt. Retourne uniquement le JSON.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Prompt Mistral Nemo — filtre éthique commentaires
|
||||
|
||||
### Paramètres d'appel
|
||||
|
||||
```
|
||||
model: "open-mistral-nemo"
|
||||
temperature: 0.0
|
||||
max_tokens: 100
|
||||
response_format: { type: "json_object" }
|
||||
```
|
||||
|
||||
### System prompt (copier-coller tel quel)
|
||||
|
||||
```
|
||||
Tu es un modèle de modération de contenu. Tu analyses des commentaires soumis sur une plateforme professionnelle française dédiée aux architectes. Tu dois détecter les contenus problématiques.
|
||||
|
||||
CONTENUS À SIGNALER (safe=false) :
|
||||
- Propos racistes, antisémites, islamophobes, xénophobes
|
||||
- Propos sexistes, misogynes, homophobes, transphobes, LGBTQIA-phobes
|
||||
- Propos validistes (mépris des personnes handicapées)
|
||||
- Diffamation personnelle nominative (accusations graves sans fondement contre une personne identifiable)
|
||||
- Spam publicitaire explicite (lien commercial non sollicité + texte promotionnel)
|
||||
- Harcèlement ciblé, menaces explicites
|
||||
|
||||
CONTENUS À AUTORISER (safe=true) :
|
||||
- Critiques d'organisations ou de services (même sévères), sans attaque personnelle
|
||||
- Partages d'expériences professionnelles négatives factuelles
|
||||
- Désaccords et débats professionnels
|
||||
- Signalement d'erreurs ou d'informations inexactes
|
||||
|
||||
RÈGLES :
|
||||
1. En cas de doute, favorise safe=true (la liberté d'expression professionnelle prime).
|
||||
2. Le champ "category" est obligatoire si safe=false.
|
||||
3. Le champ "reason" est une phrase courte en français (max 20 mots).
|
||||
4. Retourne UNIQUEMENT un objet JSON valide.
|
||||
|
||||
FORMAT DE SORTIE :
|
||||
{
|
||||
"safe": true | false,
|
||||
"category": "racisme" | "sexisme" | "homophobie" | "antisémitisme" | "lgbtqia-phobie" | "validisme" | "diffamation" | "spam" | "harcelement" | null,
|
||||
"reason": "string (max 20 mots)" | null
|
||||
}
|
||||
```
|
||||
|
||||
### User prompt (template)
|
||||
|
||||
```
|
||||
COMMENTAIRE À ANALYSER :
|
||||
|
||||
"{{contenu_commentaire}}"
|
||||
|
||||
Analyse ce commentaire et retourne le JSON de modération.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Mapping normalisation tags
|
||||
|
||||
Le worker utilise ce mapping pour corriger et compléter les tags suggérés par l'IA. L'IA peut nommer les tags librement dans son raisonnement interne, mais le worker applique cette normalisation avant d'écrire en base.
|
||||
|
||||
```
|
||||
Entrée (variantes fréquentes) → Tag normalisé
|
||||
──────────────────────────────────────────────────────────────────────────────
|
||||
JURIDIQUE
|
||||
"droit du travail", "droit de l'urbanisme", → Juridique
|
||||
"litiges", "contrats MOE", "PI",
|
||||
"propriété intellectuelle", "déontologie",
|
||||
"marchés publics droit", "CCAG",
|
||||
"responsabilité décennale", "médiation"
|
||||
|
||||
TECHNIQUE
|
||||
"RE2020", "réglementation thermique", → Technique
|
||||
"structure", "BIM", "DTU",
|
||||
"normes acoustiques", "performance énergétique",
|
||||
"matériaux", "simulation thermique",
|
||||
"OPR", "réserves chantier", "ACV",
|
||||
"accessibilité PMR", "eurodes"
|
||||
|
||||
ÉCONOMIQUE
|
||||
"prix", "tarifs", "honoraires", "devis", → Économique
|
||||
"ROI", "financement", "subventions",
|
||||
"CEE", "MaPrimeRénov", "ANAH",
|
||||
"business plan agence", "pricing MOE"
|
||||
|
||||
ADMINISTRATIF
|
||||
"permis de construire", "PC", "DP", → Administratif
|
||||
"déclaration préalable", "PLU", "PLUi",
|
||||
"urbanisme réglementaire", "ERP",
|
||||
"autorisation travaux", "ABF", "patrimoine",
|
||||
"marchés publics procédure", "CCTP", "DPGF",
|
||||
"concours architecture"
|
||||
|
||||
CHANTIER
|
||||
"coordination chantier", "DET", → Chantier
|
||||
"suivi travaux", "OPR", "levée réserves",
|
||||
"coordo SPS", "sécurité chantier",
|
||||
"planning chantier", "entreprises",
|
||||
"sous-traitance", "réception travaux"
|
||||
|
||||
COMPTABILITÉ
|
||||
"comptabilité agence", "fiscal", → Comptabilité
|
||||
"TVA", "micro-BNC", "BNC", "BIC",
|
||||
"expert-comptable", "bilan", "trésorerie",
|
||||
"transmission agence", "création agence"
|
||||
|
||||
PROSPECTION
|
||||
"développement commercial", "clients", → Prospection
|
||||
"réseau", "candidatures marchés",
|
||||
"réponse consultation", "acquisition",
|
||||
"marketing agence", "notoriété"
|
||||
|
||||
RH
|
||||
"recrutement", "emploi", "salaires", → RH
|
||||
"CCN architecture", "convention collective",
|
||||
"IDCC 2332", "temps de travail",
|
||||
"formation continue", "DPC", "CPF",
|
||||
"management équipe"
|
||||
|
||||
SANTÉ MENTALE
|
||||
"burn-out", "épuisement professionnel", → Santé mentale
|
||||
"souffrance au travail", "bien-être",
|
||||
"harcèlement moral", "stress",
|
||||
"soutien psychologique", "équilibre vie pro/perso"
|
||||
──────────────────────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
### Logique de normalisation dans le worker
|
||||
|
||||
```javascript
|
||||
// Pseudo-code — pas du code final
|
||||
function normalizeTag(raw) {
|
||||
const tag = raw.toLowerCase().trim()
|
||||
for (const [pattern, normalized] of TAG_MAP) {
|
||||
if (tag.includes(pattern)) return normalized
|
||||
}
|
||||
return null // tag non reconnu : ignoré, pas inséré
|
||||
}
|
||||
```
|
||||
|
||||
Si l'IA retourne un tag non reconnu, il est ignoré silencieusement (pas d'erreur). Si zéro tags valides après normalisation : champ laissé vide, fiche toujours traitée.
|
||||
|
||||
---
|
||||
|
||||
## 6. Circuit breaker budget 20€/mois
|
||||
|
||||
### Logique de calcul des coûts
|
||||
|
||||
```
|
||||
Mistral Nemo :
|
||||
cout = (tokens_in / 1_000_000 × 0.02) + (tokens_out / 1_000_000 × 0.04)
|
||||
(prix en USD — convertir en EUR au taux du jour ou fixer à 0.93)
|
||||
|
||||
Mistral Small :
|
||||
cout = (tokens_in / 1_000_000 × 0.20) + (tokens_out / 1_000_000 × 0.60)
|
||||
```
|
||||
|
||||
### Paliers de déclenchement
|
||||
|
||||
| Seuil | Action automatique |
|
||||
|----------|--------------------|
|
||||
| 15€ | Email Jules : "Budget IA : 15€ atteints ce mois. Estimation fin de mois : X€." |
|
||||
| 18€ | Banner site : "La curation IA approche sa limite mensuelle. Soutenir NAV → [lien dons]" |
|
||||
| 19€ | Email Jules : "Budget IA : 19€. Hard stop imminent." |
|
||||
| 20€ | Hard stop : worker refuse tout nouvel appel IA. Banner site : "IA en pause ce mois. Reprise le 1er [mois+1]." |
|
||||
|
||||
### Implémentation
|
||||
|
||||
```
|
||||
Avant chaque appel IA dans le worker :
|
||||
|
||||
1. SELECT SUM(cout_eur) FROM stats_usage
|
||||
WHERE timestamp >= DATE_TRUNC('month', NOW())
|
||||
|
||||
2. Si total >= 20.00 → throw new Error('BUDGET_EXCEEDED'), skip la fiche, continuer le cron
|
||||
|
||||
3. Si total >= 18.00 → set flag budget_warning=true en config (env ou NocoDB config row)
|
||||
→ front affiche banner "pause imminente"
|
||||
|
||||
4. Emails automatiques à 15€ et 19€ :
|
||||
→ Vérifier si email déjà envoyé ce mois (flag en NocoDB config ou fichier lock)
|
||||
→ Si non : sendmail Jules, set flag
|
||||
```
|
||||
|
||||
### Gestion mid-pipeline
|
||||
|
||||
Si le budget est atteint pendant le traitement d'un batch :
|
||||
- La fiche en cours de traitement **termine** son cycle complet (pas d'état incohérent)
|
||||
- Les fiches suivantes dans le batch sont laissées en `pending` sans appel IA
|
||||
- Le cron repassera au prochain cycle, vérifiera le budget, et restera bloqué jusqu'au 1er du mois suivant
|
||||
|
||||
### Reset mensuel
|
||||
|
||||
Cron mensuel (1er du mois à 00h05) :
|
||||
- Clear les flags budget (`budget_15_sent`, `budget_19_sent`, `hard_stop_active`)
|
||||
- Worker reprend normalement
|
||||
|
||||
---
|
||||
|
||||
## 7. Endpoints API à créer
|
||||
|
||||
```
|
||||
Méthode Endpoint Description
|
||||
──────────────────────────────────────────────────────────────────────────────
|
||||
POST /api/submit Soumission nouvelle fiche
|
||||
Body: { nom, url?, description_user?,
|
||||
echelle?, territoire?, tags_fonction?,
|
||||
localisation_ville?, submitted_by_email? }
|
||||
Rate limit: 3 req/IP/jour
|
||||
Réponse: 201 { message, id } | 400 (validation) |
|
||||
429 (rate limit)
|
||||
|
||||
POST /api/comment Soumission commentaire
|
||||
Body: { orga_id, contenu, auteur_pseudo?,
|
||||
auteur_email? }
|
||||
Rate limit: 5 req/IP/jour
|
||||
Filtre éthique IA synchrone (Mistral Nemo)
|
||||
Réponse: 201 { published, message } | 400 | 429
|
||||
|
||||
GET /api/orgs Liste des fiches publiées pour la carte
|
||||
Query params: ?echelle=&territoire=&fonction=
|
||||
Réponse: 200 [{ id, nom, url, description_enrichie,
|
||||
points_cles, echelle, territoire,
|
||||
tags_fonction, localisation_ville,
|
||||
latitude, longitude }]
|
||||
Pas d'auth, public, cacheable 5 min
|
||||
|
||||
GET /api/search Recherche texte classique (fallback chatbot)
|
||||
Query: ?q=string&limit=10
|
||||
Recherche sur: nom, description_enrichie, tags_fonction
|
||||
SQL ILIKE ou NocoDB search API
|
||||
Réponse: 200 [{ id, nom, url, echelle, tags_fonction }]
|
||||
|
||||
POST /api/chatbot Requête chatbot Mistral Small
|
||||
Body: { message, context_orga_ids?: [] }
|
||||
Rate limit: 10 req/IP/jour
|
||||
Mistral Small (stream optionnel MVP)
|
||||
Réponse: 200 { answer, sources: [{id, nom}] }
|
||||
Budget check avant appel
|
||||
|
||||
GET /api/stats Statistiques pour bandeau bas du site
|
||||
Réponse: 200 { total_orgas, total_avis,
|
||||
budget_mois_eur, budget_max_eur,
|
||||
budget_warning: bool }
|
||||
Cacheable 1 min
|
||||
──────────────────────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
### Note sur /api/chatbot
|
||||
|
||||
Le chatbot (Mistral Small) reçoit les fiches publiées comme contexte RAG simplifié :
|
||||
- Fetch les 50 fiches les plus récentes (ou résultat de recherche)
|
||||
- Passe leur nom + description_enrichie + tags dans le prompt system
|
||||
- Mistral Small répond en mode assistant "je connais cet écosystème"
|
||||
- Pas de vector search en MVP — recherche par mots-clés suffit à ce stade
|
||||
|
||||
---
|
||||
|
||||
## 8. Rate limiting / anti-abus
|
||||
|
||||
### Implémentation recommandée : fichier JSON local + cron reset
|
||||
|
||||
Redis serait plus robuste mais ajoute une dépendance. Pour le MVP, un fichier JSON par IP est suffisant.
|
||||
|
||||
```
|
||||
Structure : /tmp/nav-ratelimit/{IP_hash}.json
|
||||
{
|
||||
"submit": { "count": 2, "date": "2026-04-14" },
|
||||
"comment": { "count": 1, "date": "2026-04-14" },
|
||||
"chatbot": { "count": 5, "date": "2026-04-14" }
|
||||
}
|
||||
```
|
||||
|
||||
Middleware Node.js `rateLimit(endpoint, maxPerDay)` :
|
||||
1. Lire le fichier de l'IP (créer si absent)
|
||||
2. Si `date` != aujourd'hui → reset tous les compteurs
|
||||
3. Si `count[endpoint] >= max` → retourner 429
|
||||
4. Sinon : incrémenter et sauvegarder
|
||||
|
||||
Cron journalier (00h01) : purger les fichiers de rate limit > 2 jours.
|
||||
|
||||
### Plafonds
|
||||
|
||||
| Endpoint | Max / IP / jour | Justification |
|
||||
|-----------------|-----------------|---------------|
|
||||
| /api/submit | 3 | Anti-spam soumission fiches |
|
||||
| /api/comment | 5 | Anti-spam commentaires |
|
||||
| /api/chatbot | 10 | Budget IA + anti-abus |
|
||||
| /api/search | 100 | Pas d'IA, peu de risque |
|
||||
| /api/orgs | illimité | Public, cacheable |
|
||||
|
||||
### Gestion IP derrière proxy
|
||||
|
||||
Si VPS derrière reverse proxy (Caddy, Nginx) : utiliser le header `X-Forwarded-For` pour l'IP réelle. S'assurer que le proxy est configuré pour le passer (`trusted_proxies` dans Caddy).
|
||||
|
||||
---
|
||||
|
||||
## 9. Worker — implémentation
|
||||
|
||||
### Choix : Option A — cron toutes les 5 min
|
||||
|
||||
**Recommandation : cron 5 min.**
|
||||
|
||||
Pourquoi pas le webhook NocoDB :
|
||||
- NocoDB webhooks (v0.9x) sont peu fiables sur les installs self-hosted — déclenchements manqués documentés
|
||||
- Le cron est plus simple à debugger (logs clairs, relance manuelle possible)
|
||||
- 5 min de latence est acceptable pour un process qui sera de toute façon modéré manuellement
|
||||
|
||||
Mise en place : `crontab -e` sur le VPS, ou PM2 avec `cron: "*/5 * * * *"` si Node.
|
||||
|
||||
### Structure du script `worker.js`
|
||||
|
||||
```
|
||||
Fichier : /opt/nav-worker/worker.js
|
||||
|
||||
IMPORTS :
|
||||
- node-fetch ou axios (appels HTTP)
|
||||
- crawl4ai (CLI local ou appel HTTP si installé comme service)
|
||||
- nodemailer (email Jules)
|
||||
- Zod (validation JSON Mistral)
|
||||
|
||||
CONSTANTES (depuis .env) :
|
||||
NOCODB_URL, NOCODB_TOKEN, NOCODB_BASE_ID, NOCODB_TABLE_ORGAS
|
||||
MISTRAL_API_KEY
|
||||
EMAIL_JULES, SMTP_*
|
||||
BUDGET_MAX_EUR (default: 20)
|
||||
WORKER_LOCK_FILE (default: /tmp/nav-worker.lock)
|
||||
|
||||
FLOW PRINCIPAL :
|
||||
|
||||
async function run() {
|
||||
// 1. Lock anti-overlap
|
||||
if (lockExists()) { log("Worker déjà en cours"); return }
|
||||
createLock()
|
||||
|
||||
try {
|
||||
// 2. Check budget global
|
||||
const cumulMois = await getBudgetMoisCourant()
|
||||
if (cumulMois >= BUDGET_MAX_EUR) {
|
||||
log("Budget atteint, worker en pause")
|
||||
return
|
||||
}
|
||||
|
||||
// 3. Fetch rows pending
|
||||
const rows = await fetchPendingRows()
|
||||
if (rows.length === 0) return
|
||||
|
||||
let processedCount = 0
|
||||
|
||||
for (const row of rows) {
|
||||
// Re-check budget avant chaque fiche
|
||||
const budget = await getBudgetMoisCourant()
|
||||
if (budget >= BUDGET_MAX_EUR) break
|
||||
|
||||
// 4. Scrape si URL présente
|
||||
let scrapeContent = null
|
||||
if (row.url && row.scrape_status === 'pending') {
|
||||
try {
|
||||
scrapeContent = await scrapeWithCrawl4ai(row.url, timeout=180000)
|
||||
await updateRow(row.id, { scrape_status: 'scraped', scrape_content: scrapeContent })
|
||||
} catch (e) {
|
||||
await updateRow(row.id, { scrape_status: 'failed' })
|
||||
// On continue quand même avec IA (sans contenu scrape)
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Appel Mistral Nemo enrichissement
|
||||
const enriched = await callMistralWithRetry(
|
||||
buildEnrichmentPrompt(row, scrapeContent),
|
||||
model='open-mistral-nemo',
|
||||
maxRetries=2
|
||||
)
|
||||
|
||||
if (!enriched) {
|
||||
await updateRow(row.id, { moderation_status: 'ai_error', ai_processed: true })
|
||||
continue
|
||||
}
|
||||
|
||||
// 6. Normalisation tags
|
||||
enriched.tags_fonction = enriched.tags_fonction
|
||||
.map(normalizeTag)
|
||||
.filter(Boolean)
|
||||
|
||||
// 7. Update NocoDB
|
||||
await updateRow(row.id, {
|
||||
description_enrichie: enriched.description_enrichie,
|
||||
points_cles: JSON.stringify(enriched.points_cles),
|
||||
tags_fonction: enriched.tags_fonction,
|
||||
echelle: enriched.echelle,
|
||||
territoire: enriched.territoire,
|
||||
localisation_ville: enriched.localisation_ville,
|
||||
moderation_status: 'ai_processed',
|
||||
ai_processed: true,
|
||||
ai_raw_output: JSON.stringify(enriched)
|
||||
})
|
||||
|
||||
// 8. Log usage tokens
|
||||
await logUsage(enriched._usage, 'open-mistral-nemo', 'enrichissement', row.id)
|
||||
|
||||
processedCount++
|
||||
}
|
||||
|
||||
// 9. Email Jules si nouvelles fiches prêtes
|
||||
if (processedCount > 0) {
|
||||
await emailJules(processedCount)
|
||||
}
|
||||
|
||||
// 10. Alerts budget
|
||||
await checkBudgetAlerts()
|
||||
|
||||
} finally {
|
||||
removeLock()
|
||||
}
|
||||
}
|
||||
|
||||
run().catch(err => {
|
||||
log("Worker error:", err)
|
||||
removeLock()
|
||||
})
|
||||
```
|
||||
|
||||
### Détail crawl4ai
|
||||
|
||||
crawl4ai s'installe via pip et expose une CLI ou un serveur HTTP local.
|
||||
Appel recommandé : **serveur HTTP local sur le VPS** (démarré via Docker ou systemd).
|
||||
|
||||
```bash
|
||||
# Installation
|
||||
pip install crawl4ai
|
||||
crawl4ai-setup
|
||||
|
||||
# Démarrer comme service (optionnel)
|
||||
crawl4ai serve --port 11235
|
||||
```
|
||||
|
||||
Depuis Node :
|
||||
```javascript
|
||||
const res = await fetch('http://localhost:11235/crawl', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ url: row.url, max_pages: 1 }),
|
||||
signal: AbortSignal.timeout(180000) // 3 min
|
||||
})
|
||||
const data = await res.json()
|
||||
return data.markdown || null
|
||||
```
|
||||
|
||||
Si crawl4ai n'est pas disponible comme service : appel CLI via `execSync` avec timeout — moins propre, acceptable en MVP.
|
||||
|
||||
---
|
||||
|
||||
## 10. Fallbacks et gestion d'erreurs
|
||||
|
||||
### Matrice des cas d'erreur
|
||||
|
||||
```
|
||||
Situation Action worker Status final
|
||||
──────────────────────────────────────────────────────────────────────────────────
|
||||
URL absente Passer directement à IA scrape_status=no_link
|
||||
avec description_user moderation_status=ai_processed
|
||||
|
||||
Scrape timeout (>3 min) flag scrape_failed scrape_status=failed
|
||||
IA appelée avec moderation_status=ai_processed
|
||||
description_user seule (Jules voit le flag)
|
||||
|
||||
Scrape 403 / 404 Idem timeout scrape_status=failed
|
||||
|
||||
Scrape JS-heavy (SPA) crawl4ai gère JavaScript — si quand même vide :
|
||||
traiter comme no_link scrape_status=failed
|
||||
|
||||
IA JSON mal formé (1er try) Retry 1 —
|
||||
IA JSON mal formé (2e try) Retry 2 —
|
||||
IA JSON mal formé (3e try) log erreur moderation_status=ai_error
|
||||
ai_processed=true
|
||||
|
||||
IA timeout réseau Retry 2x (backoff 2s) ai_error si 3 échecs
|
||||
|
||||
URL invalide au submit Rejet 400 HTTP Fiche jamais créée
|
||||
avant INSERT NocoDB
|
||||
|
||||
Email invalide au submit Accepter la fiche submitted_by_email vide
|
||||
Email ignoré Pas d'email post-modération
|
||||
|
||||
Budget atteint mid-pipeline Fiche en cours termine Fiches suivantes en pending
|
||||
Worker s'arrête Reprend au 1er du mois
|
||||
|
||||
Budget atteint au check Worker s'arrête Toutes les fiches en pending
|
||||
avant le batch
|
||||
──────────────────────────────────────────────────────────────────────────────────
|
||||
```
|
||||
|
||||
### Fiches avec scrape_failed : review Jules
|
||||
|
||||
Jules voit dans NocoDB UI les fiches avec `scrape_status=failed` et `moderation_status=ai_processed`. Il peut :
|
||||
- Approuver en l'état (description_user suffit)
|
||||
- Ajouter une description manuelle dans `description_enrichie` avant d'approuver
|
||||
- Rejeter si la fiche est trop vague
|
||||
|
||||
---
|
||||
|
||||
## 11. Sécurité
|
||||
|
||||
### Gestion des secrets
|
||||
|
||||
Tous les secrets dans `.env` sur le VPS. Jamais dans le code source ni dans git.
|
||||
|
||||
```bash
|
||||
# /opt/nav-worker/.env (chmod 600, owned root:root)
|
||||
NOCODB_URL=http://localhost:8070
|
||||
NOCODB_TOKEN=e9rUEwfUrE7mo_am0QAytwM0vCbwh4o0sisZIbHl
|
||||
NOCODB_BASE_ID=pipilvsi7dibo80
|
||||
NOCODB_TABLE_ORGAS=m08t7g5v4wch6wb
|
||||
NOCODB_TABLE_AVIS=m4hub7cdutgec47
|
||||
MISTRAL_API_KEY=sk-...
|
||||
EMAIL_JULES=jules@...
|
||||
SMTP_HOST=...
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=...
|
||||
SMTP_PASS=...
|
||||
BUDGET_MAX_EUR=20
|
||||
```
|
||||
|
||||
Ajouter `.env` au `.gitignore` impérativement.
|
||||
|
||||
### Validation des inputs (Zod)
|
||||
|
||||
```javascript
|
||||
// Schéma de validation POST /api/submit
|
||||
const submitSchema = z.object({
|
||||
nom: z.string().min(2).max(200),
|
||||
url: z.string().url().optional().or(z.literal('')),
|
||||
description_user: z.string().max(2000).optional(),
|
||||
echelle: z.enum(['National','Régional','Départemental','Local']).optional(),
|
||||
territoire: z.enum(['Métropole','Guadeloupe','Martinique','Guyane','Réunion','Mayotte']).optional(),
|
||||
tags_fonction: z.array(z.enum([
|
||||
'Juridique','Technique','Économique','Administratif',
|
||||
'Chantier','Comptabilité','Prospection','RH','Santé mentale'
|
||||
])).max(5).optional(),
|
||||
localisation_ville: z.string().max(100).optional(),
|
||||
submitted_by_email: z.string().email().optional().or(z.literal(''))
|
||||
})
|
||||
```
|
||||
|
||||
### Autres règles de sécurité
|
||||
|
||||
- **Pas d'eval/exec** sur le contenu scrapé — le markdown retourné par crawl4ai est passé comme string dans le prompt, jamais exécuté
|
||||
- **Sanitisation** du contenu scrapé avant insertion en base : strip des balises HTML résiduelles (marked ou DOMPurify côté Node si nécessaire)
|
||||
- **CSP headers** sur toutes les routes API :
|
||||
```
|
||||
Content-Security-Policy: default-src 'none'
|
||||
X-Content-Type-Options: nosniff
|
||||
X-Frame-Options: DENY
|
||||
```
|
||||
- **NocoDB exposé uniquement en localhost** (pas de port 8070 ouvert sur le pare-feu Hetzner)
|
||||
- **Worker tourne avec un user non-root** sur le VPS (user dédié `nav-worker`)
|
||||
- **Pas de logs des tokens Mistral** en clair dans les fichiers log système (les ai_raw_output vont en NocoDB, pas dans syslog)
|
||||
|
||||
---
|
||||
|
||||
## Notes pour l'agent dev
|
||||
|
||||
### Ce qui est tranché dans cette spec
|
||||
- Stack : Node.js + NocoDB API + Mistral API + crawl4ai
|
||||
- Cron 5 min (pas webhook)
|
||||
- Deux modèles Mistral : Nemo pour worker + filtre, Small pour chatbot
|
||||
- Rate limiting fichier JSON (pas Redis)
|
||||
- Lock file anti-overlap pour le worker
|
||||
|
||||
### Ce qui n'est pas dans cette spec (hors scope MVP)
|
||||
- Interface admin custom (Jules utilise NocoDB UI directement pour la modération)
|
||||
- Géocodage automatique (latitude/longitude) — à ajouter en V2.1
|
||||
- Vector search / RAG avancé pour le chatbot — SQLite FTS ou Postgres pgvector en V2.1
|
||||
- Streaming Mistral Small pour le chatbot — MVP retourne la réponse complète
|
||||
- Export CSV ou API publique fiches — à ajouter selon demande communauté
|
||||
- Tests automatisés — à ajouter avant toute mise en prod
|
||||
|
||||
### Questions ouvertes pour Jules avant de coder
|
||||
1. **Formulaire de soumission** : outil existant (Tally, Formbricks) ou formulaire custom HTML ? Si Tally → l'endpoint /api/submit doit accepter le webhook Tally (format différent du body JSON standard)
|
||||
2. **Email Jules** : serveur SMTP existant sur le VPS, ou service transactionnel externe (Brevo, Mailgun) ? Si externe → ajouter la clé API dans .env
|
||||
3. **Environnement de déploiement** : le worker tourne-t-il dans Docker (Compose avec NocoDB) ou directement sur l'hôte (PM2 + cron) ?
|
||||
4. **Version NocoDB** : v0.9x ou v1.x ? L'API de patch des records diffère légèrement entre les deux versions
|
||||
5. **Domaine API** : même domaine que le front (reverse proxy Caddy) ou sous-domaine séparé (`api.nav.trans-former.fr`) ?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Spec générée par ATIS le 2026-04-14. Alimenter un agent dev pour l'implémentation.*
|
||||
289
V2-cadrage/G-prompt-dev-final.md
Normal file
289
V2-cadrage/G-prompt-dev-final.md
Normal file
@@ -0,0 +1,289 @@
|
||||
# G — Prompt dev final NAV V2
|
||||
|
||||
> **⚠ CE PROMPT EST MAINTENANT SPLITTÉ EN 3 SESSIONS DÉDIÉES**
|
||||
> Voir plus bas le statut d'avancement et les prompts de reprise.
|
||||
|
||||
## État d'avancement (dernière MAJ : 2026-04-14)
|
||||
|
||||
```
|
||||
[✓] Session 1 — Setup + Fondations (terminée 2026-04-14)
|
||||
├── VPS setup (token nav-v2-worker, crawl4ai 0.8.6, .env)
|
||||
├── Schéma NocoDB (organisations +19 champs, stats_usage créée)
|
||||
├── Parsing A-biblio (93 entités, 72 géocodées)
|
||||
├── Taxonomie révisée (10 fonctions, 3 échelles)
|
||||
├── Palette figée (palette-nav-v2.md)
|
||||
└── 96 fiches importées (bypass modération), 3 réservées test pipe IA
|
||||
|
||||
[⏸] Session 2 — Front (à lancer)
|
||||
→ Prompt : H-prompt-session-2-front.md
|
||||
→ Durée : 6-8h
|
||||
→ Étapes : carte Leaflet + sidebar + fiche + formulaire soumission
|
||||
|
||||
[⏸] Session 3 — IA + Deploy (à lancer après S2)
|
||||
→ Prompt : I-prompt-session-3-ia-deploy.md
|
||||
→ Durée : 6-8h
|
||||
→ Étapes : worker Mistral Nemo + chatbot + bandeau + /a-propos + deploy
|
||||
```
|
||||
|
||||
## Décisions validées Session 1
|
||||
|
||||
- **Palette** : A sobre institutionnel + bleu nuit #1a2238 à 60% opacité partout (cf. `palette-nav-v2.md`)
|
||||
- **Taxonomie** :
|
||||
- Échelle (3) : National / Régional (inclut Départemental) / Local
|
||||
- Territoire : Métropole + 5 DOM-TOM (enrichissement ultérieur)
|
||||
- Fonctions (10) : Juridique, Technique, Économique, Administratif, Chantier, Comptabilité, **Développement** (ex-Prospection), **Formation** (nouveau), **Gestion d'agence** (ex-RH élargi), Santé mentale
|
||||
- **Liberapay** : `liberapay.com/trans-former.fr`, transparence origine dans `/a-propos`
|
||||
- **From email modération** : `contact@trans-former.fr`
|
||||
- **Seed** : bypass pour 96 fiches, 3 réservées test pipe IA en S3 (CNOA National, Archireport, Collectif Fil)
|
||||
- **Circuit breaker 20€ dépassé** → bandeau "manque de fonds" + pédagogie "1€ = N requêtes"
|
||||
- **CNOA** : 1 fiche National + 13 CROA Régional (antennes pins secondaires reportées V3)
|
||||
|
||||
## Points ouverts (cf. JOURNAL-V2.md)
|
||||
|
||||
- [ ] Rate limit chatbot (Session 2) : fichier JSON vs Redis
|
||||
- [ ] Seuil email modération (Session 3) : reco 5 fiches pending
|
||||
- [ ] Facteur CO2eq : 0.052 (RTE FR) ou 0.055 (ADEME 2024)
|
||||
- [ ] MCP nocodb à reconfigurer (URL de base incorrecte)
|
||||
- [ ] Conflit `rich` après install crawl4ai : vérifier si lightrag impacté
|
||||
|
||||
---
|
||||
|
||||
## ⬇ PROMPT ORIGINAL CI-DESSOUS ⬇
|
||||
|
||||
> Conservé pour référence. Ne PAS relancer en bloc — utiliser H et I pour les sessions suivantes.
|
||||
|
||||
> **À lancer en session Claude Code dédiée, modèle Opus, avec autorisation de déléguer à des sous-agents Sonnet.**
|
||||
> Autonomie : 7/10 (2 checkpoints Jules : validation palette + review fiche seed test).
|
||||
> Durée estimée : 20-28h (worker + front + deploy + tests).
|
||||
> Prérequis humains : Mistral key créée, Liberapay créé, ssh vps-hetzner OK.
|
||||
|
||||
---
|
||||
|
||||
## Mission
|
||||
|
||||
Coder NAV V2 à partir des specs produites. La V2 ajoute à la V1 existante :
|
||||
1. Carte de France interactive (Leaflet + OSM)
|
||||
2. Sidebar filtres (échelle + fonction)
|
||||
3. Page fiche détaillée partageable (`/fiche/[id]`)
|
||||
4. Worker IA async qui enrichit les soumissions (Mistral Nemo)
|
||||
5. Chatbot recherche sémantique (Mistral Small)
|
||||
6. Filtre éthique commentaires
|
||||
7. Bandeau bas stats (coût IA + dons + activité)
|
||||
8. Onglets territoire (Métropole / Outre-mer)
|
||||
|
||||
Stack : Nuxt 3 + Tailwind + Leaflet + NocoDB + Mistral direct + Resend.
|
||||
|
||||
---
|
||||
|
||||
## Fichiers de référence (à LIRE en premier)
|
||||
|
||||
Tous dans `C:\Users\jules\Dropbox\ATIS - IPCJRA\0 INBOX\NAV-V2-recherches\` :
|
||||
|
||||
1. `A-biblio-ecosysteme-archi.md` — 94 entités seed à importer
|
||||
2. `B-provider-ia-souverain.md` — Mistral Nemo + Small, circuit breaker 20€/mois
|
||||
3. `C-systeme-dons.md` — Liberapay widget
|
||||
4. `E-spec-frontend.md` — Wireframes ASCII, 28 composants, routes, states
|
||||
5. `F-spec-pipe-collaboration.md` — Schéma DB, prompts IA, endpoints, fallbacks
|
||||
6. `VPS-check.md` — NocoDB 0.301.5, Resend SMTP, crawl4ai à installer
|
||||
|
||||
Fichier V1 existant :
|
||||
- `1 PROJETS/TECH - infra VPS, website pro, RAG/nav-carte/` (code Nuxt V1)
|
||||
|
||||
---
|
||||
|
||||
## Credentials & endpoints
|
||||
|
||||
```
|
||||
VPS : ssh vps-hetzner (port 4422)
|
||||
NocoDB : http://localhost:8070 (interne VPS)
|
||||
Base : pipilvsi7dibo80
|
||||
Table orgas : m08t7g5v4wch6wb
|
||||
Table avis : m4hub7cdutgec47
|
||||
Token V1 : e9rUEwfUrE7mo_am0QAytwM0vCbwh4o0sisZIbHl
|
||||
→ Créer un NOUVEAU token "nav-v2-worker" au premier démarrage
|
||||
Mistral : api.mistral.ai (key Scale, stockée côté Jules)
|
||||
Resend : smtp.resend.com:465 (password dans /opt/vps-kit/.env)
|
||||
Deploy : /opt/nav-carte/ (systemd nav-carte.service)
|
||||
Domaine : nav.trans-former.fr
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Arbitrages tranchés (ne pas remettre en cause)
|
||||
|
||||
**Taxonomie :**
|
||||
- Échelle (mono, obligatoire) : National / Régional / Départemental / Local
|
||||
- Fonction (multi 1-5, ordre=priorité) : Juridique / Technique / Économique / Administratif / Chantier / Comptabilité / Prospection / RH / Santé mentale
|
||||
- Territoire (séparé) : Métropole + 5 DOM-TOM
|
||||
|
||||
**UX :**
|
||||
- Fiche = page dédiée `/fiche/[id]`
|
||||
- Chatbot = bottom-sheet (mobile ET desktop)
|
||||
- Onglets territoire = toggle Métropole/Outre-mer → sous-onglets DOM-TOM
|
||||
- Formulaire = HTML custom Nuxt (pas Tally)
|
||||
- Libs UI : Headless UI + Tailwind
|
||||
- Filtres encodés dans URL (`?echelle=...&fonctions=...&territoire=...`)
|
||||
- Filtrage côté client (< 300 fiches)
|
||||
|
||||
**Stack IA :**
|
||||
- Mistral Nemo pour worker enrichissement + filtre éthique commentaires
|
||||
- Mistral Small pour chatbot recherche
|
||||
- Circuit breaker 20€/mois (table `stats_usage` + check avant chaque call)
|
||||
- Chat completions API classique, pas Mistral Agents
|
||||
|
||||
**Système don :**
|
||||
- Liberapay (widget embed dans bandeau bas)
|
||||
- URL : liberapay.com/nav-archi (à confirmer avec Jules)
|
||||
|
||||
---
|
||||
|
||||
## Étapes
|
||||
|
||||
### Étape 0 — Setup (30 min)
|
||||
|
||||
- [ ] SSH VPS, vérifier NocoDB + Resend
|
||||
- [ ] Créer un token NocoDB dédié "nav-v2-worker"
|
||||
- [ ] Installer crawl4ai : `docker run ... crawl4ai` OU `pip install crawl4ai` selon l'environnement VPS
|
||||
- [ ] Demander à Jules :
|
||||
- La Mistral API key (stockée en `.env` sur VPS, jamais commitée)
|
||||
- L'URL Liberapay finale
|
||||
- [ ] **CHECKPOINT Jules** : proposer 3 palettes design (sobre / chaleureux / moderne) avec mockups colorés → validation
|
||||
|
||||
### Étape 1 — Schéma NocoDB (30 min)
|
||||
|
||||
- [ ] Étendre la table orgas avec les nouveaux champs (cf. F §2)
|
||||
- [ ] Créer table `stats_usage` (circuit breaker IA)
|
||||
- [ ] Créer table `scrape_queue` si besoin
|
||||
- [ ] Test : insert/update via API token
|
||||
|
||||
### Étape 2 — Front carte + sidebar (3-4h)
|
||||
|
||||
- [ ] Installer vue-leaflet, Headless UI
|
||||
- [ ] Composants : `NavMap`, `NavSidebar`, `EchelleFilter`, `FonctionFilter`, `TerritoireToggle`
|
||||
- [ ] Wrapper Leaflet dans `<ClientOnly>` (SSR Nuxt)
|
||||
- [ ] Géocoder les 94 fiches seed (Nominatim, batch script)
|
||||
- [ ] Filtres encodés dans URL
|
||||
- [ ] Responsive : drawer mobile, sidebar 320px desktop
|
||||
|
||||
### Étape 3 — Page fiche + commentaires (2-3h)
|
||||
|
||||
- [ ] Route `/fiche/[id]` avec SSR
|
||||
- [ ] Composants : `FicheDetail`, `CommentSection`, `CommentForm`
|
||||
- [ ] API : `GET /api/fiche/[id]`, `POST /api/comment`
|
||||
- [ ] Filtre éthique commentaire sync (Mistral Nemo, < 2s)
|
||||
- [ ] Meta SEO (title, description, og:image)
|
||||
- [ ] Bouton retour carte avec restauration filtres (query params)
|
||||
|
||||
### Étape 4 — Worker IA enrichissement (4-5h)
|
||||
|
||||
- [ ] Script Node.js `worker/enrich.js` (cron systemd toutes les 5 min)
|
||||
- [ ] Pipeline : fetch pending → scrape (crawl4ai, timeout 3min) → Mistral Nemo → update NocoDB
|
||||
- [ ] Prompts exacts de F §3
|
||||
- [ ] Troncature contenu scrapé à 4k tokens avant prompt
|
||||
- [ ] Logs usage → table `stats_usage`
|
||||
- [ ] Circuit breaker 20€ (check avant chaque call)
|
||||
- [ ] Email Jules (Resend) quand N fiches en attente modération
|
||||
- [ ] Fallback scrape échoué : flag `scrape_failed`, review manuel
|
||||
|
||||
### Étape 5 — Chatbot recherche (3-4h)
|
||||
|
||||
- [ ] Composant `ChatbotSheet` (bottom-sheet, Headless UI)
|
||||
- [ ] Message onboarding (texte exact de E §6)
|
||||
- [ ] Template requête (besoin / thématique / lieu)
|
||||
- [ ] API `POST /api/chatbot` : Mistral Small + contexte JSON fiches
|
||||
- [ ] Rate limit : 10 req/IP/jour (stockage fichier JSON ou Redis)
|
||||
- [ ] Affichage résultats : fiches + explication 1-2 lignes
|
||||
|
||||
### Étape 6 — Formulaire soumission (2h)
|
||||
|
||||
- [ ] Composant `SubmitModal` ou page `/contribuer`
|
||||
- [ ] Validation Zod côté client + serveur
|
||||
- [ ] Champs : nom, URL, desc, échelle, fonctions (1-5), territoire, ville, email
|
||||
- [ ] Message post-submit (E §9)
|
||||
- [ ] Rate limit : 3/IP/jour
|
||||
|
||||
### Étape 7 — Bandeau bas + Liberapay (1-2h)
|
||||
|
||||
- [ ] Composant `BandeauBas`
|
||||
- [ ] Gauche : data depuis `stats_usage` (coût mois, tokens, carbone estimé)
|
||||
- [ ] Milieu : bouton "Soutenir NAV" → Liberapay
|
||||
- [ ] Droite : compteurs semaine (dons, nouvelles fiches, requêtes)
|
||||
- [ ] Carbone estimé : kWh × 0.052 kg CO2eq/kWh (facteur FR RTE)
|
||||
|
||||
### Étape 8 — Page /a-propos (1h)
|
||||
|
||||
- [ ] Contenu : NAV, souveraineté, gouvernance, transparence
|
||||
- [ ] Badges "IA souveraine", "Hébergé en France", "Zéro cookie US"
|
||||
- [ ] Lien vers formulaire + Liberapay
|
||||
|
||||
### Étape 9 — Deploy + tests (2-3h)
|
||||
|
||||
- [ ] Build production
|
||||
- [ ] Deploy via git pull + pm2/systemd restart
|
||||
- [ ] Vérifier DNS, HTTPS (Caddy déjà config)
|
||||
- [ ] **CHECKPOINT Jules** : soumettre une fiche test → vérifier pipeline IA → valider → voir sur carte
|
||||
- [ ] Tester chatbot avec requête réelle
|
||||
- [ ] Tester mobile (iOS Safari + Android Chrome)
|
||||
|
||||
### Étape 10 — Import seed 94 fiches (1h)
|
||||
|
||||
- [ ] Script import : parser `A-biblio-ecosysteme-archi.md`
|
||||
- [ ] Pour chaque entité : créer en NocoDB avec status `published` (bypass modération pour seed)
|
||||
- [ ] Géocoder ville via Nominatim
|
||||
- [ ] Vérifier que les marqueurs apparaissent sur la carte
|
||||
|
||||
---
|
||||
|
||||
## Délégation
|
||||
|
||||
Tu peux (et dois) déléguer les sous-tâches indépendantes à des sous-agents Sonnet. Exemples :
|
||||
|
||||
- **Sonnet 1** : setup NocoDB (étape 1) + géocoding seed
|
||||
- **Sonnet 2** : composants front carte + sidebar (étape 2)
|
||||
- **Sonnet 3** : worker IA (étape 4)
|
||||
- **Sonnet 4** : chatbot (étape 5)
|
||||
|
||||
Toi (Opus) = pilote :
|
||||
- Arbitrages design + UX
|
||||
- Checkpoints Jules
|
||||
- Assemblage final + deploy
|
||||
- Debug quand ça coince
|
||||
|
||||
---
|
||||
|
||||
## Règles
|
||||
|
||||
- Mobile-first, testé à chaque étape
|
||||
- Français avec accents partout (UI + code comments)
|
||||
- Pas de Google Fonts externe (self-hosted ou system font)
|
||||
- Pas de librairie UI lourde (Vuetify, Quasar) — Tailwind + Headless UI uniquement
|
||||
- Commits atomiques par étape (ex: `feat(front): carte Leaflet + sidebar filters`)
|
||||
- Secrets via `.env` sur VPS, jamais dans le code
|
||||
- Si un point bloque > 30 min → reporter dans le journal de session et demander Jules
|
||||
- Tester le pipeline IA complet sur 1 fiche avant de scaler
|
||||
|
||||
---
|
||||
|
||||
## Output attendu
|
||||
|
||||
1. V2 déployée sur nav.trans-former.fr
|
||||
2. 94 fiches seed visibles sur la carte
|
||||
3. Worker IA qui tourne (cron 5 min)
|
||||
4. Chatbot fonctionnel
|
||||
5. Bandeau bas avec stats en temps réel
|
||||
6. Liberapay relié
|
||||
7. Journal de session `/1 PROJETS/TECH - infra VPS.../nav-carte/JOURNAL-V2.md` avec :
|
||||
- Temps passé par étape
|
||||
- Décisions techniques prises
|
||||
- Points bloquants rencontrés
|
||||
- TODOs V3
|
||||
|
||||
---
|
||||
|
||||
## Questions ouvertes (à trancher par Jules AVANT lancement)
|
||||
|
||||
1. **Palette design** : sobre / chaleureux / moderne ? (checkpoint étape 0)
|
||||
2. **URL Liberapay finale** : `nav-archi` ou `trans-former` ?
|
||||
3. **From email modération** : `newsletter@trans-former.fr` (existant Resend) ou créer `nav@trans-former.fr` ?
|
||||
4. **Seed fiches** : bypass modération IA pour les 94 (publication directe) ou les passer dans la pipe pour tester ?
|
||||
→ Reco : bypass pour rapidité, passer 2-3 fiches dans la pipe en test
|
||||
155
V2-cadrage/H-prompt-session-2-front.md
Normal file
155
V2-cadrage/H-prompt-session-2-front.md
Normal file
@@ -0,0 +1,155 @@
|
||||
# H — Prompt Session 2 : Front NAV V2
|
||||
|
||||
## État d'avancement (mis à jour 2026-04-14)
|
||||
|
||||
**Décisions tranchées :**
|
||||
- A) Rate limit submit : **Redis** (côté propre)
|
||||
- B) Cluster Leaflet : seuil **15 pins** (densité FR)
|
||||
- C) Hiérarchie racine/antennes (CNOA/CROA, CAUE…) : **HORS SCOPE S2** → Session 2.5 dédiée (`L-prompt-session-2.5-hierarchie.md`)
|
||||
- D) Session 1 : **terminée 2026-04-14** (~96 fiches seed)
|
||||
- E) Sécurité API : proxy Nuxt + token `.env` VPS + rate limit IP. GET fiches public, POST modéré.
|
||||
|
||||
**Dispatch en cours (séquencement anti-conflits) :**
|
||||
- Phase 1 — **Sonnet 1** : étape 2 (carte + sidebar) — EN COURS
|
||||
- Checkpoint Jules : layout mobile + desktop
|
||||
- Phase 2 — **Sonnet 2** (étape 3 fiche) + **Sonnet 3** (étape 6 contribuer) en parallèle après checkpoint 1
|
||||
- Prompts : `J-prompt-session-2-fiche.md` et `K-prompt-session-2-contribuer.md`
|
||||
- Checkpoint Jules : 1 fiche seed rendue (typo + espacements)
|
||||
- Phase 3 (post-S2) — Session 2.5 hiérarchie : prompt `L-prompt-session-2.5-hierarchie.md`
|
||||
|
||||
**Note chemins :** specs sont dans `nav-carte/V2-cadrage/`, pas `0 INBOX/NAV-V2-recherches/` (le prompt original ci-dessous référence le mauvais chemin — corrigé dans J/K/L).
|
||||
|
||||
---
|
||||
|
||||
> **Session dédiée Claude Code, modèle Opus pilote avec délégation sous-agents Sonnet autorisée.**
|
||||
> Prérequis : Session 1 terminée (schéma NocoDB en place, ~103 fiches importées).
|
||||
> Durée estimée : 6-8h.
|
||||
> Autonomie : 7/10 (checkpoints : validation layout sidebar mobile + rendu Leaflet).
|
||||
|
||||
## Mission
|
||||
|
||||
Construire la partie front de NAV V2 à partir du code Nuxt V1 existant :
|
||||
1. Carte interactive (Leaflet + OSM)
|
||||
2. Sidebar filtres (échelle + fonction + territoire)
|
||||
3. Page fiche détaillée `/fiche/[id]` + commentaires
|
||||
4. Formulaire de soumission (`/contribuer`)
|
||||
|
||||
## Fichiers de référence (à LIRE en premier)
|
||||
|
||||
Tous dans `C:\Users\jules\Dropbox\ATIS - IPCJRA\0 INBOX\NAV-V2-recherches\` :
|
||||
- `G-prompt-dev-final.md` (vision globale V2, étapes 2, 3, 6)
|
||||
- `E-spec-frontend.md` (wireframes ASCII, composants, routes, states)
|
||||
- `F-spec-pipe-collaboration.md` (§2 schéma DB — pour comprendre les champs affichés)
|
||||
- `palette-nav-v2.md` **SOURCE UNIQUE palette CSS** — respecter à la lettre
|
||||
|
||||
Journal projet : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\JOURNAL-V2.md`
|
||||
Code V1 existant (base de travail) : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\`
|
||||
|
||||
## Taxonomie finale (ne pas remettre en cause, cf. JOURNAL-V2)
|
||||
|
||||
- Échelle : `National` / `Régional` / `Local`
|
||||
- Territoire : `Métropole` + 5 DOM-TOM (Guadeloupe, Martinique, Guyane, La Réunion, Mayotte)
|
||||
- Fonctions (10) : Juridique, Technique, Économique, Administratif, Chantier, Comptabilité, Développement, Formation, Gestion d'agence, Santé mentale
|
||||
|
||||
**UX options vides :** afficher les valeurs d'échelle/territoire sans fiches avec un compteur `(0)` pour inviter à contribuer (cohérent esprit collaboratif).
|
||||
|
||||
## Credentials
|
||||
|
||||
```
|
||||
NocoDB accessible via API publique : https://nav.trans-former.fr/api/proxy/nocodb ?
|
||||
(à décider — pour l'instant back-end Nuxt fait proxy via token .env)
|
||||
Token nav-v2-worker : dans /opt/nav-carte/.env sur VPS
|
||||
Base : pipilvsi7dibo80
|
||||
Table orgas : m08t7g5v4wch6wb
|
||||
Table stats_usage : mbbq7n47ixy19mc
|
||||
```
|
||||
|
||||
## Étapes
|
||||
|
||||
### Étape 2 — Carte + sidebar (3-4h)
|
||||
|
||||
- [ ] Installer `@nuxtjs/leaflet` (ou `vue-leaflet/vue-leaflet` selon compat Nuxt 3) + `@headlessui/vue`
|
||||
- [ ] Composants à créer :
|
||||
- `NavMap.vue` — carte Leaflet wrapped dans `<ClientOnly>` (SSR)
|
||||
- `NavSidebar.vue` — wrapper filtres
|
||||
- `EchelleFilter.vue` — chips exclusifs 3 valeurs
|
||||
- `FonctionFilter.vue` — chips multi-sélection 10 valeurs
|
||||
- `TerritoireToggle.vue` — toggle Métropole/Outre-mer + sous-onglets DOM-TOM
|
||||
- [ ] Filtres encodés dans URL : `?echelle=National&fonctions=Juridique,Technique&territoire=Métropole`
|
||||
- [ ] Filtrage **côté client** (< 300 fiches)
|
||||
- [ ] Responsive :
|
||||
- Desktop ≥ 1024px : sidebar 320px fixe à gauche
|
||||
- Mobile : drawer (Headless UI Dialog) + bouton flottant "Filtres"
|
||||
- [ ] Pins Leaflet customisés :
|
||||
- Pin standard : `--nav-primary` (60% opacité, bleu nuit)
|
||||
- Pin prioritaire (fiche mise en avant) : `--nav-accent` (safran)
|
||||
- [ ] Cluster markers si > 50 pins visibles (`leaflet.markercluster`)
|
||||
|
||||
### Étape 3 — Page fiche + commentaires (2-3h)
|
||||
|
||||
- [ ] Route : `/fiche/[id]` avec SSR
|
||||
- [ ] Composants :
|
||||
- `FicheDetail.vue` — affichage complet (nom, description_enrichie si dispo sinon description_user, tags, URL, localisation)
|
||||
- `CommentSection.vue` — liste commentaires approuvés
|
||||
- `CommentForm.vue` — formulaire + submit API
|
||||
- [ ] API endpoints à créer/adapter :
|
||||
- `GET /api/fiche/[id]` — proxy NocoDB
|
||||
- `POST /api/comment` — filtre éthique Mistral Nemo sync (timeout 2s, cf. F §3)
|
||||
- [ ] Méta SEO dynamiques : `<title>`, description, og:image (carte générée ou logo par défaut)
|
||||
- [ ] Bouton retour carte avec restauration filtres (query params préservés)
|
||||
|
||||
### Étape 6 — Formulaire soumission (2h)
|
||||
|
||||
- [ ] Page `/contribuer` (ou modal `SubmitModal.vue`)
|
||||
- [ ] Validation Zod client + serveur
|
||||
- [ ] Champs :
|
||||
- nom (required, min 3)
|
||||
- url (optional, regex URL)
|
||||
- description_user (required, 50-500 chars)
|
||||
- echelle (required, enum)
|
||||
- fonctions (required, 1-5 multi)
|
||||
- territoire (required, enum)
|
||||
- localisation_ville (optional)
|
||||
- submitted_by_email (required, format email)
|
||||
- [ ] Après submit :
|
||||
- POST NocoDB avec `moderation_status: "pending"`, `ai_processed: false`
|
||||
- Message confirmation (texte exact E §9)
|
||||
- La fiche partira dans le worker IA (cron 5 min) qui tournera en Session 3
|
||||
- [ ] Rate limit : 3 submits/IP/jour (fichier JSON ou Redis — Session 2 tranche)
|
||||
|
||||
### Checkpoints Jules
|
||||
|
||||
1. Après étape 2 : montrer rendu mobile + desktop pour validation layout sidebar
|
||||
2. Après étape 3 : une fiche seed rendue → validation typo + espacements
|
||||
|
||||
## Délégation (Opus pilote)
|
||||
|
||||
- Sonnet 1 : composants carte + sidebar (étape 2)
|
||||
- Sonnet 2 : page fiche + commentaires (étape 3)
|
||||
- Sonnet 3 : formulaire + validation Zod (étape 6)
|
||||
|
||||
Lancer en parallèle si pas de dépendance, regrouper si besoin pour économiser fenêtres.
|
||||
|
||||
## Règles
|
||||
|
||||
- Mobile-first, testé à chaque étape
|
||||
- Accents français partout
|
||||
- Pas de Google Fonts (system font stack)
|
||||
- Respect strict `palette-nav-v2.md` (tokens CSS reproduits en variables Tailwind ou CSS globales)
|
||||
- Commits atomiques par étape
|
||||
- Ne pas toucher au worker IA / chatbot / bandeau — réservé Session 3
|
||||
|
||||
## Output attendu
|
||||
|
||||
- V2 front navigable en local (`npm run dev`)
|
||||
- ~103 fiches visibles sur la carte
|
||||
- Filtres fonctionnels (URL sync)
|
||||
- Page fiche par ID OK
|
||||
- Formulaire de soumission écrit dans NocoDB (status pending)
|
||||
- Journal mis à jour : `JOURNAL-V2.md` (décisions, points bloquants, TODOs S3)
|
||||
|
||||
## Questions à trancher
|
||||
|
||||
- Rate limit soumission : fichier JSON simple ou Redis installé sur VPS ?
|
||||
- Clustering carte : activation automatique dès 50 pins, ou seuil différent ?
|
||||
- Cas CNOA + 13 CROA : tous les CROA au même zoom désaturent la carte. Clustering les absorbera — à vérifier.
|
||||
194
V2-cadrage/I-prompt-session-3-ia-deploy.md
Normal file
194
V2-cadrage/I-prompt-session-3-ia-deploy.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# I — Prompt Session 3 : IA + Deploy NAV V2
|
||||
|
||||
> **Session dédiée Claude Code, modèle Opus pilote avec délégation sous-agents Sonnet autorisée.**
|
||||
> Prérequis : Sessions 1 et 2 terminées (front navigable, fiches visibles, formulaire OK).
|
||||
> Durée estimée : 6-8h.
|
||||
> Autonomie : 6/10 (checkpoints : test pipeline IA sur 3 fiches + deploy final).
|
||||
|
||||
## Mission
|
||||
|
||||
Brancher la couche IA et déployer la V2 :
|
||||
1. Worker IA async qui enrichit les soumissions (Mistral Nemo)
|
||||
2. Chatbot recherche sémantique (Mistral Small)
|
||||
3. Bandeau bas stats (coût IA + dons + activité)
|
||||
4. Page `/a-propos` (souveraineté, gouvernance, transparence Liberapay)
|
||||
5. Deploy production `nav.trans-former.fr`
|
||||
6. Test pipeline IA sur les 3 fiches réservées
|
||||
|
||||
## Fichiers de référence (à LIRE en premier)
|
||||
|
||||
Tous dans `C:\Users\jules\Dropbox\ATIS - IPCJRA\0 INBOX\NAV-V2-recherches\` :
|
||||
- `G-prompt-dev-final.md` (vision V2, étapes 4, 5, 7, 8, 9)
|
||||
- `B-provider-ia-souverain.md` (Mistral Nemo + Small, circuit breaker 20€/mois)
|
||||
- `C-systeme-dons.md` (Liberapay widget)
|
||||
- `F-spec-pipe-collaboration.md` (§3 prompts IA exacts, §4 endpoints)
|
||||
- `VPS-check.md` (deploy process)
|
||||
- `palette-nav-v2.md` (palette bandeau + /a-propos)
|
||||
- `seed-test-pipe-ia.json` (3 fiches CNOA/Archireport/Collectif Fil réservées pour test worker)
|
||||
|
||||
Journal projet : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\JOURNAL-V2.md`
|
||||
Code en cours : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\`
|
||||
|
||||
## Décisions tranchées (Sessions 1 + 2 + pilote S3)
|
||||
|
||||
- Circuit breaker 20€/mois dépassé → **bandeau "manque de fonds" + CTA Liberapay + pédagogie "1€ = N requêtes" + transparence origine Liberapay**
|
||||
- Transparence Liberapay (origine belge, asso non-lucrative, hébergement FR/UE éthique) → section dédiée dans `/a-propos`
|
||||
- From email modération : `contact@trans-former.fr`
|
||||
- Liberapay URL : `liberapay.com/trans-former.fr` (widgets fournis dans C-systeme-dons.md)
|
||||
- **Seuil email modération : 5 fiches `pending`** → envoi mail Jules via Resend
|
||||
- **Facteur CO2eq : 0.052 kg CO2/kWh (RTE FR)** pour calcul bandeau carbone
|
||||
- **Scraping : crawl4ai seul, pas de fallback httpx+BS4** (diag VPS pilote : crawl4ai occupe 4.3 MB, ms-playwright absent donc crawl4ai tourne en mode statique léger — un seul chemin de code, plus simple à maintenir)
|
||||
- **Rate limit chatbot : 10 req/IP/jour** (F §8, fichier JSON `/tmp/nav-ratelimit/{IP_hash}.json`, cron reset journalier)
|
||||
- **Prompts Mistral Nemo + Small : copier-coller exact depuis F §3 et §4**, ne pas reformuler
|
||||
- **Stack deploy : systemd + Caddy sur nav.trans-former.fr** (même domaine que V1, pas de sous-domaine API)
|
||||
- **Endpoint soumission** : `/api/organisations` (POST JSON standard, déjà existant — S2 a utilisé `organisations.post.ts`)
|
||||
|
||||
## État S1 et S2 — à lire AVANT de coder
|
||||
|
||||
**Lecture obligatoire en premier** : `1 PROJETS/TECH - infra VPS, website pro, RAG/nav-carte/JOURNAL-V2.md`
|
||||
|
||||
Points d'attention :
|
||||
- 96 fiches importées NocoDB, 3 réservées test pipe IA (CNOA, Archireport, Collectif Fil)
|
||||
- 8 anciens records V1 (IDs 1-8, `moderation_status null`) à purger avant deploy prod
|
||||
- Divergence taxonomie `moderation_status` tranchée : `approved`/`rejected` partout, `pending` = absence de validation
|
||||
- Endpoint NocoDB correct : `/api/v1/db/meta/tables/{id}/columns` (v0.301.5)
|
||||
- Disque VPS 76% (21/04) — surveiller pendant scraping, alerter si > 85%
|
||||
- Conflit lib Python `rich` résolu avec `--ignore-installed` — vérifier au passage que lightrag tourne toujours (TODO S1)
|
||||
|
||||
## Préflight avant tout code (obligatoire)
|
||||
|
||||
1. Lire `JOURNAL-V2.md` en entier
|
||||
2. Lire `F-spec-pipe-collaboration.md` §3, §4, §6 (circuit breaker), §7 (endpoints), §9 (worker)
|
||||
3. `ssh vps-hetzner "cat /opt/nav-carte/.env | grep -E 'MISTRAL|NOCODB|RESEND'"` → vérifier toutes les clés présentes
|
||||
4. `ssh vps-hetzner "df -h /"` → confirmer disque < 85%
|
||||
5. Si une clé manque ou disque > 85% → STOP, remonter au pilote Jules
|
||||
|
||||
## Test coût AVANT de scaler (règle sacrée)
|
||||
|
||||
Étape 5 (test pipe IA) :
|
||||
1. Lancer le worker sur **1 seule fiche** (CNOA)
|
||||
2. Vérifier `stats_usage` : tokens_in, tokens_out, cout_eur
|
||||
3. Extrapoler coût pour 96 fiches → **si > 1€ pour le batch test, STOP + ping Jules**
|
||||
4. Si OK, lancer sur les 2 fiches restantes (Archireport, Collectif Fil)
|
||||
|
||||
## Credentials
|
||||
|
||||
```
|
||||
VPS : ssh vps-hetzner (port 4422)
|
||||
NocoDB : localhost:8070
|
||||
Token nav-v2-worker : dans /opt/nav-carte/.env
|
||||
Mistral API key : dans /opt/nav-carte/.env (MISTRAL_API_KEY)
|
||||
Resend SMTP : /opt/vps-kit/.env
|
||||
Deploy : /opt/nav-carte/ (systemd nav-carte.service)
|
||||
Domaine : nav.trans-former.fr (Caddy config existante)
|
||||
```
|
||||
|
||||
## Étapes
|
||||
|
||||
### Étape 4 — Worker IA enrichissement (4-5h)
|
||||
|
||||
- [ ] Script `worker/enrich.js` (Node.js, lancé via systemd timer toutes les 5 min)
|
||||
- [ ] Pipeline :
|
||||
1. Fetch `organisations` WHERE `moderation_status=pending` AND `ai_processed=false` (LIMIT 5 par run)
|
||||
2. Pour chaque fiche :
|
||||
- Scrape URL via **crawl4ai** (timeout 3 min, mode statique) — si échec : flag `scrape_status=failed`, pas de fallback httpx+BS4
|
||||
- Truncate contenu scrapé à 4k tokens
|
||||
- Appel Mistral Nemo avec prompt **F §3 (copier-coller exact)**
|
||||
- Parser réponse → update `description_enrichie`, `points_cles`, `tags_fonction` (si IA propose), `ai_raw_output`, `ai_processed=true`, `scrape_status`
|
||||
- Log dans `stats_usage` (model, tokens_in, tokens_out, cout_eur, timestamp, orga_id)
|
||||
3. Si **circuit breaker 20€/mois dépassé** : skip enrich, log, trigger bandeau "manque de fonds"
|
||||
4. Si **5 fiches en attente modération** : email Jules via Resend (from `contact@trans-former.fr`)
|
||||
5. Si scrape échoué : flag `scrape_status=failed`, review manuel
|
||||
- [ ] Gestion erreurs : retry 2x, puis flag `scrape_status=failed`
|
||||
|
||||
### Étape 5 — Test pipeline IA sur 3 fiches (1-2h)
|
||||
|
||||
Utiliser `seed-test-pipe-ia.json` (3 entrées : CNOA, Archireport, Collectif Fil) :
|
||||
- [ ] Injecter manuellement dans NocoDB avec `moderation_status=pending`, `ai_processed=false`
|
||||
- [ ] Déclencher worker manuellement (pas attendre cron)
|
||||
- [ ] Observer les 3 runs, documenter :
|
||||
- Temps d'exécution par fiche
|
||||
- Qualité `description_enrichie` et `points_cles`
|
||||
- Fonctions détectées par l'IA vs fonctions Jules
|
||||
- Coût Mistral (stats_usage)
|
||||
- [ ] Produire `1 PROJETS/TECH - infra VPS.../nav-carte/PIPE-IA-DOC.md` : documentation précise du pipeline, input, output, prompts, paramètres — servira de base pour le futur **skill `/mistral-nemo-vps`**
|
||||
|
||||
### Étape 5bis — Chatbot recherche (3-4h)
|
||||
|
||||
- [ ] Composant `ChatbotSheet.vue` (bottom-sheet Headless UI, mobile + desktop)
|
||||
- [ ] Message onboarding : texte exact E §6
|
||||
- [ ] Template requête : champs besoin / thématique / lieu → prompt structuré
|
||||
- [ ] API `POST /api/chatbot` :
|
||||
- Input : question utilisateur + contexte JSON des fiches (top N matchs par taxonomie)
|
||||
- Appel Mistral Small (prompt F §3)
|
||||
- Output : fiches recommandées + explication 1-2 lignes par fiche
|
||||
- [ ] Rate limit : 10 req/IP/jour, fichier JSON `/tmp/nav-ratelimit/{IP_hash}.json` (F §8, aligné avec S2)
|
||||
|
||||
### Étape 7 — Bandeau bas + Liberapay (1-2h)
|
||||
|
||||
- [ ] Composant `BandeauBas.vue`, fond `--nav-primary` 60%
|
||||
- [ ] **Gauche** : stats live depuis `stats_usage`
|
||||
- Coût mois en cours / 20€
|
||||
- Nombre tokens utilisés
|
||||
- Carbone estimé : kWh × **0.052 kg CO2eq/kWh (RTE FR)** — valeur tranchée
|
||||
- [ ] **Milieu** : CTA "Soutenir NAV" → Liberapay widget (snippet C-systeme-dons.md)
|
||||
- [ ] **Droite** : compteurs semaine (nouveaux dons, fiches ajoutées, requêtes chatbot)
|
||||
- [ ] **Mode "manque de fonds"** (si circuit breaker dépassé) : bandeau bascule en mode "NAV a épuisé son budget IA ce mois — aide-nous à continuer" + pédagogie "1€ permet ~X requêtes" (calcul depuis prix Mistral)
|
||||
|
||||
### Étape 8 — Page `/a-propos` (1-2h)
|
||||
|
||||
- [ ] Sections :
|
||||
- **NAV** — mission, esprit collaboratif, pour qui
|
||||
- **Souveraineté** — IA française (Mistral), hébergement FR (Hetzner), zéro cookie US
|
||||
- **Gouvernance** — qui tient le projet, transparence code (GitHub si public)
|
||||
- **Transparence Liberapay** — origine (asso belge Liberapay Recurrent Donations ASBL), non lucrative, pas de cut par défaut, hébergement FR/UE éthique, modèle de dons récurrents
|
||||
- **Transparence IA** — modèles utilisés, circuit breaker, coût mensuel visible sur bandeau
|
||||
- [ ] Badges : "IA souveraine", "Hébergé en France", "Zéro cookie US"
|
||||
- [ ] Lien vers formulaire + widget Liberapay
|
||||
|
||||
### Étape 9 — Deploy + tests (2-3h)
|
||||
|
||||
- [ ] Build production (`npm run build`)
|
||||
- [ ] **Avant deploy** : purger les 8 anciens records V1 (IDs 1-8, `moderation_status null`) dans NocoDB
|
||||
- [ ] Deploy via `git pull && systemctl restart nav-carte.service`
|
||||
- [ ] Vérifier DNS `nav.trans-former.fr`, HTTPS Caddy (config V1 déjà présente — vérifier si routes V2 nécessitent ajustement)
|
||||
- [ ] **Checkpoint Jules** : test manuel
|
||||
- Soumettre une fiche test via `/contribuer`
|
||||
- Vérifier passage dans worker (cron 5 min)
|
||||
- Jules valide en NocoDB manuellement
|
||||
- Vérifier apparition sur la carte
|
||||
- [ ] Tester chatbot avec 2-3 requêtes réelles
|
||||
- [ ] Tester mobile iOS Safari + Android Chrome
|
||||
|
||||
## Checkpoints Jules
|
||||
|
||||
1. Avant étape 5 : valider texte onboarding chatbot + prompt recherche
|
||||
2. Étape 5 test pipe : valider qualité enrichissement sur 3 fiches
|
||||
3. Étape 8 : review texte `/a-propos` (ton Jules appliqué)
|
||||
4. Étape 9 : checkpoint deploy final + submit test
|
||||
|
||||
## Délégation (Opus pilote)
|
||||
|
||||
- Sonnet 1 : worker IA + test pipe 3 fiches + PIPE-IA-DOC (étapes 4-5)
|
||||
- Sonnet 2 : chatbot (étape 5bis)
|
||||
- Sonnet 3 : bandeau + /a-propos (étapes 7-8)
|
||||
- Opus : deploy + checkpoint finaux + debug
|
||||
|
||||
## Règles
|
||||
|
||||
- Tester pipeline IA sur 1 fiche AVANT de scaler aux 3
|
||||
- Circuit breaker 20€ = sacré, jamais dépasser
|
||||
- Secrets via `.env`, jamais dans le code
|
||||
- Si blocage > 30 min → reporter au pilote
|
||||
- À la fin : mettre à jour JOURNAL-V2 avec backlog V3 détaillé
|
||||
|
||||
## Output attendu
|
||||
|
||||
1. V2 déployée sur `nav.trans-former.fr`
|
||||
2. ~103 fiches sur la carte + 3 fiches enrichies par IA
|
||||
3. Worker cron 5 min opérationnel
|
||||
4. Chatbot fonctionnel
|
||||
5. Bandeau live avec stats
|
||||
6. Liberapay relié + page `/a-propos` complète
|
||||
7. `PIPE-IA-DOC.md` produit (base skill `/mistral-nemo-vps`)
|
||||
8. `JOURNAL-V2.md` final avec backlog V3
|
||||
87
V2-cadrage/J-prompt-session-2-fiche.md
Normal file
87
V2-cadrage/J-prompt-session-2-fiche.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# J — Prompt Sonnet 2 : Page fiche détaillée + commentaires
|
||||
|
||||
> **Lancer APRÈS validation checkpoint étape 2 (Sonnet 1).**
|
||||
> Peut tourner en **parallèle avec Sonnet 3** (étape 6 contribuer) — pas de conflit attendu sur les fichiers.
|
||||
|
||||
## Mission
|
||||
|
||||
Construire la page fiche détaillée `/fiche/[id]` + section commentaires modérés.
|
||||
|
||||
## Contexte (lis AVANT)
|
||||
|
||||
**Racine projet** : `nav-carte/`
|
||||
|
||||
Specs (toutes dans `nav-carte/V2-cadrage/`) :
|
||||
1. Spec session : `H-prompt-session-2-front.md` (section "Étape 3")
|
||||
2. Wireframes : `E-spec-frontend.md` (page fiche)
|
||||
3. Pipe collaboration / modération : `F-spec-pipe-collaboration.md` §3 (filtre éthique Mistral Nemo)
|
||||
4. Palette : `palette-nav-v2.md`
|
||||
5. Schéma DB : `F-spec-pipe-collaboration.md` §2
|
||||
|
||||
Code base :
|
||||
- `nav-carte/pages/fiche/` (squelette V1 à enrichir)
|
||||
- `nav-carte/components/OrgCard.vue` (réutilisable pour card en haut)
|
||||
- `nav-carte/server/routes/` (proxy NocoDB existant)
|
||||
- Note Sonnet 1 (à lire dans JOURNAL-V2.md) : conventions composants + résolutions de conflits
|
||||
|
||||
## Livrables
|
||||
|
||||
- [ ] Route SSR : `/fiche/[id]`
|
||||
- [ ] Composants :
|
||||
- `FicheDetail.vue` — affichage complet : nom, `description_enrichie` si dispo sinon `description_user`, tags fonctions, échelle, territoire, URL, localisation (mini-carte Leaflet)
|
||||
- `CommentSection.vue` — liste commentaires `moderation_status: approved`, tri chronologique
|
||||
- `CommentForm.vue` — formulaire (nom + email + commentaire 50-500 chars) + submit API
|
||||
- [ ] API endpoints :
|
||||
- `GET /api/fiche/[id]` — proxy NocoDB
|
||||
- `POST /api/comment` — filtre éthique Mistral Nemo synchrone (timeout 2s, fallback : `moderation_status: pending` si timeout). Cf. F §3.
|
||||
- [ ] Méta SEO dynamiques : `<title>{nom} — NAV`, description (extrait description), og:image (logo par défaut)
|
||||
- [ ] Bouton "← retour carte" qui restaure les query params filtres
|
||||
- [ ] Rate limit POST commentaire : Redis (cf. Sonnet 3 si déjà en place, sinon coordonner)
|
||||
|
||||
## Règles
|
||||
|
||||
- Accents français
|
||||
- Palette respectée
|
||||
- Mobile-first
|
||||
- Pas de Google Fonts
|
||||
- Pas de modif schéma NocoDB
|
||||
- Pas de touche à : carte index, sidebar filtres, formulaire `/contribuer`, worker IA
|
||||
|
||||
## Délégation cascade autorisée
|
||||
|
||||
Sous-agents Task (Sonnet) pour : recherche pattern Mistral Nemo dans codebase, génération composant isolé, audit V1 fiche.
|
||||
|
||||
## Critère de fin
|
||||
|
||||
- `npm run dev` charge `/fiche/[id]` pour une fiche seed (ex : id=1)
|
||||
- Commentaire posté apparaît avec status correct (approved si filtre OK, pending sinon)
|
||||
- Bouton retour carte préserve filtres URL
|
||||
- Mobile testé (devtools)
|
||||
- Commits atomiques
|
||||
|
||||
## Doute / blocage
|
||||
|
||||
- Mistral Nemo non configuré → POST commentaire = `pending` direct + TODO dans journal
|
||||
- Spec ambiguë → tranche au plus simple, note dans `JOURNAL-V2.md`
|
||||
- Blocage dur → STOP + reporte
|
||||
|
||||
## Résumé attendu
|
||||
|
||||
```
|
||||
## S2 Étape 3 — [DONE / BLOCKED]
|
||||
|
||||
### Livrables
|
||||
- ✓ ... / ✗ ...
|
||||
|
||||
### Décisions
|
||||
- ...
|
||||
|
||||
### À tester
|
||||
- /fiche/1, /fiche/2, post commentaire, retour carte avec filtres
|
||||
|
||||
### Fichiers modifiés / Commits
|
||||
- ...
|
||||
|
||||
### Coordination Sonnet 3
|
||||
- Rate limit Redis : posé / à poser ?
|
||||
```
|
||||
105
V2-cadrage/K-prompt-session-2-contribuer.md
Normal file
105
V2-cadrage/K-prompt-session-2-contribuer.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# K — Prompt Sonnet 3 : Formulaire `/contribuer` + Redis rate limit
|
||||
|
||||
> **Lancer APRÈS validation checkpoint étape 2 (Sonnet 1).**
|
||||
> Peut tourner en **parallèle avec Sonnet 2** (étape 3 fiche) — pas de conflit attendu.
|
||||
|
||||
## Mission
|
||||
|
||||
Construire le formulaire de soumission de nouvelle organisation + setup Redis pour rate limiting.
|
||||
|
||||
## Contexte (lis AVANT)
|
||||
|
||||
**Racine projet** : `nav-carte/`
|
||||
|
||||
Specs (toutes dans `nav-carte/V2-cadrage/`) :
|
||||
1. Spec session : `H-prompt-session-2-front.md` (section "Étape 6")
|
||||
2. Wireframes formulaire : `E-spec-frontend.md` (page contribuer)
|
||||
3. Pipe collaboration : `F-spec-pipe-collaboration.md` (workflow modération + statut `pending`)
|
||||
4. Palette : `palette-nav-v2.md`
|
||||
5. VPS infra (Redis dispo ?) : `V2-cadrage/VPS-check.md`
|
||||
|
||||
Code base :
|
||||
- `nav-carte/pages/ajouter.vue` (formulaire V1 à reprendre / refondre)
|
||||
- `nav-carte/server/routes/` (proxy NocoDB)
|
||||
- Note Sonnet 1 dans JOURNAL-V2.md : conventions composants
|
||||
|
||||
## Livrables
|
||||
|
||||
- [ ] Page `/contribuer` (refonte de `ajouter.vue`) ou modal `SubmitModal.vue` (tu tranches selon UX cohérence)
|
||||
- [ ] Validation **Zod** côté client + serveur
|
||||
- [ ] Champs :
|
||||
- `nom` (required, min 3)
|
||||
- `url` (optional, regex URL)
|
||||
- `description_user` (required, 50-500 chars)
|
||||
- `echelle` (required, enum National/Régional/Local)
|
||||
- `fonctions` (required, 1-5 multi parmi 10)
|
||||
- `territoire` (required, enum Métropole + 5 DOM-TOM)
|
||||
- `localisation_ville` (optional, geocoding Nominatim côté serveur si fourni)
|
||||
- `submitted_by_email` (required, format email)
|
||||
- [ ] Submit :
|
||||
- POST `/api/submit` → NocoDB avec `moderation_status: "pending"`, `ai_processed: false`
|
||||
- Message confirmation : texte exact `E-spec-frontend.md` §9
|
||||
- Worker IA (cron 5 min) traitera plus tard — Session 3 (toi tu ne touches pas le worker)
|
||||
- [ ] **Rate limit Redis** : 3 submits / IP / jour
|
||||
- Setup Redis sur VPS (vérifier `VPS-check.md` — sinon `apt install redis-server` + config localhost only)
|
||||
- Connexion depuis Nuxt (`ioredis` ou `redis` npm)
|
||||
- En local dev : Redis en Docker ou fallback compteur en mémoire (TODO journal)
|
||||
- [ ] Endpoint `/api/comment` (Sonnet 2) : ajouter rate limit Redis 5 commentaires/IP/jour — coordonne avec Sonnet 2 via JOURNAL-V2.md
|
||||
|
||||
## Règles
|
||||
|
||||
- Accents français
|
||||
- Palette respectée
|
||||
- Mobile-first
|
||||
- Pas de Google Fonts
|
||||
- Pas de touche à : carte, sidebar, page fiche détail, worker IA, schéma NocoDB
|
||||
- Sécurité : pas de leak token NocoDB côté client (proxy Nuxt obligatoire)
|
||||
|
||||
## Délégation cascade autorisée
|
||||
|
||||
Sous-agents Task (Sonnet) pour : install Redis VPS via SSH, génération schéma Zod, recherche Nominatim API.
|
||||
|
||||
## Credentials VPS
|
||||
|
||||
- SSH alias : `vps-hetzner` (port 4422)
|
||||
- Détails : `_System` ou cf. mémoire (reference_vps_ssh_access)
|
||||
- App nav-carte : `/opt/nav-carte/`
|
||||
|
||||
## Critère de fin
|
||||
|
||||
- `npm run dev` charge `/contribuer`
|
||||
- Soumission valide → fiche en NocoDB avec status pending
|
||||
- Soumission invalide → erreurs Zod affichées
|
||||
- 4ᵉ submit même IP/jour → 429 rate limit
|
||||
- Redis tourne sur VPS (ou fallback documenté en local)
|
||||
- Mobile testé
|
||||
- Commits atomiques
|
||||
|
||||
## Doute / blocage
|
||||
|
||||
- Redis impossible à installer VPS → fallback fichier JSON simple (compteur IP/jour) + TODO journal
|
||||
- Nominatim rate-limited → skip geocoding, store ville texte brut
|
||||
- Spec ambiguë → tranche au plus simple, note JOURNAL-V2.md
|
||||
- Blocage dur → STOP + reporte
|
||||
|
||||
## Résumé attendu
|
||||
|
||||
```
|
||||
## S2 Étape 6 — [DONE / BLOCKED]
|
||||
|
||||
### Livrables
|
||||
- ✓ ... / ✗ ...
|
||||
|
||||
### Décisions
|
||||
- Redis : VPS / Docker local / fallback JSON ?
|
||||
- Page vs modal : ...
|
||||
|
||||
### À tester
|
||||
- /contribuer (submit valide + invalide + rate limit)
|
||||
|
||||
### Fichiers modifiés / Commits
|
||||
- ...
|
||||
|
||||
### Coordination Sonnet 2
|
||||
- Rate limit `/api/comment` : posé pour toi ou à toi de poser ?
|
||||
```
|
||||
102
V2-cadrage/L-prompt-session-2.5-hierarchie.md
Normal file
102
V2-cadrage/L-prompt-session-2.5-hierarchie.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# L — Prompt Session 2.5 : Hiérarchie racine / antennes (CNOA, CAUE, syndicats, etc.)
|
||||
|
||||
> **Session dédiée — à lancer APRÈS S2 (carte + fiche + contribuer) et AVANT S3 (worker IA + déploiement).**
|
||||
> Modèle conseillé : **Opus pilote** + délégation Sonnet (modif schéma + UI + filtrage non-trivial).
|
||||
> Durée estimée : 3-4h.
|
||||
|
||||
## Mission
|
||||
|
||||
Introduire dans NAV V2 la notion de **fiche racine** (tête de réseau national) avec **antennes** dépendantes (régionales / départementales / locales).
|
||||
|
||||
### Cas métier couverts
|
||||
|
||||
- **CNOA** (Conseil National de l'Ordre des Architectes) ↔ 13 CROA régionaux
|
||||
- **Réseau CAUE** (national) ↔ ~95 CAUE départementaux
|
||||
- **Syndicats nationaux** (UNSFA, CNAJEP…) ↔ antennes locales
|
||||
- Patrons identiques pour autres réseaux à venir
|
||||
|
||||
### Pourquoi
|
||||
|
||||
Sans hiérarchie :
|
||||
- Carte FR désaturée (100+ pins CAUE qui se chevauchent)
|
||||
- Filtre "Local" ne montre pas la racine → utilisateur perd le contexte
|
||||
- Pas de breadcrumb pour naviguer racine ↔ antenne
|
||||
- Soumissions redondantes (chaque antenne crée fiche déconnectée)
|
||||
|
||||
## Spec
|
||||
|
||||
### Schéma NocoDB (ajout 2 colonnes table `orgas`)
|
||||
|
||||
```
|
||||
parent_id FK nullable → orgas.id (NULL pour racines et fiches indépendantes)
|
||||
is_root bool (true si tête de réseau, sinon false)
|
||||
```
|
||||
|
||||
Migration : script Python ou via UI NocoDB. Mettre à jour les ~96 fiches seed pour rattacher les CROA à CNOA, etc. (requiert mapping manuel, ~30 min).
|
||||
|
||||
### UI
|
||||
|
||||
**Fiche racine** (ex : CNOA)
|
||||
- Pin carte : `--nav-accent` (safran) — déjà cas "prioritaire"
|
||||
- Sur fiche détail : bandeau "Réseau de N antennes" + carte miniature des antennes + liste cliquable
|
||||
- Apparaît dans filtre `échelle=National`
|
||||
|
||||
**Fiche antenne** (ex : CROA Île-de-France)
|
||||
- Pin carte : `--nav-primary` standard
|
||||
- Sur fiche détail : breadcrumb en haut "← CNOA (racine du réseau)"
|
||||
- Apparaît dans filtre `échelle=Régional` ou `Local`
|
||||
|
||||
**Filtrage**
|
||||
- Filtre `échelle=Local` : affiche antennes locales SANS masquer les racines (toujours pinables si onglet National actif)
|
||||
- Cluster carte absorbe la désaturation quand 13+ enfants visibles dans un département/région
|
||||
|
||||
**Soumission**
|
||||
- Formulaire `/contribuer` : ajouter champ optionnel "Cette organisation fait-elle partie d'un réseau ?" → autocomplete sur racines existantes
|
||||
- Si racine non trouvée : créer en pending sans `parent_id`, modérateur lie manuellement après
|
||||
|
||||
## Livrables
|
||||
|
||||
- [ ] Migration schéma NocoDB (`parent_id`, `is_root`)
|
||||
- [ ] Mapping seed : rattacher CROA à CNOA, autres réseaux identifiés
|
||||
- [ ] Composants :
|
||||
- `FicheRacineHeader.vue` — bandeau réseau + miniature carte
|
||||
- `BreadcrumbReseau.vue` — "← Racine"
|
||||
- `AutocompleteRacine.vue` — pour formulaire contribuer
|
||||
- [ ] Logique filtrage hiérarchique (composable `useHierarchicalFilter.ts`)
|
||||
- [ ] Adaptation `NavMap.vue` : pin racine vs antenne distincts
|
||||
- [ ] Adaptation `FicheDetail.vue` : afficher bandeau ou breadcrumb selon `is_root`
|
||||
- [ ] Adaptation `pages/contribuer.vue` : champ réseau parent
|
||||
- [ ] Tests manuels : naviguer CNOA → CROA-IDF → retour CNOA, filtre échelle cohérent
|
||||
|
||||
## Règles
|
||||
|
||||
- Accents français
|
||||
- Palette respectée
|
||||
- Mobile-first
|
||||
- Migration backward-compat : fiches sans `parent_id` continuent à fonctionner comme avant
|
||||
- Pas de touche au worker IA / chatbot (Session 3)
|
||||
|
||||
## Délégation (si Opus pilote)
|
||||
|
||||
| Sous-agent | Tâche | Modèle |
|
||||
|------------|-------|--------|
|
||||
| Sonnet 1 | Migration schéma + mapping seed CROA/CAUE | Sonnet |
|
||||
| Sonnet 2 | Composants UI hiérarchie + adaptation map/fiche | Sonnet |
|
||||
| Sonnet 3 | Composable filtrage + adaptation formulaire | Sonnet |
|
||||
|
||||
## Critère de fin
|
||||
|
||||
- Carte affiche CNOA (safran) + 13 CROA (bleu)
|
||||
- Click CROA → breadcrumb vers CNOA
|
||||
- Click CNOA → liste 13 CROA cliquables
|
||||
- Filtre `Local` n'efface pas CNOA si onglet National actif
|
||||
- Soumission de nouvelle antenne CAUE → autocomplete trouve "Réseau CAUE"
|
||||
- Aucune régression sur les fiches sans `parent_id`
|
||||
|
||||
## Hors scope (pour Session 3)
|
||||
|
||||
- Worker IA enrichissement automatique
|
||||
- Chatbot
|
||||
- Bandeau collaboration
|
||||
- Déploiement VPS prod
|
||||
- SEO/GEO
|
||||
179
V2-cadrage/M-prompt-session-2-mobile.md
Normal file
179
V2-cadrage/M-prompt-session-2-mobile.md
Normal file
@@ -0,0 +1,179 @@
|
||||
# M — Prompt Sonnet 1.8 : Mobile UX dédié NAV V2
|
||||
|
||||
> **Lancer APRÈS Sonnet 1.7 (correctif desktop final).**
|
||||
> Mission : refonte de l'expérience mobile selon spec Jules validée 2026-04-14.
|
||||
|
||||
## Racine projet
|
||||
`C:\Users\jules\Dropbox\ATIS - IPCJRA\1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\`
|
||||
|
||||
## État
|
||||
|
||||
Sonnet 1.7 a posé le desktop final (top search + onglets territoire haut + chatbot zone droite + sidebar filtres+fiches). Le mobile actuel = drawer générique. Toi tu refais le mobile selon la spec ci-dessous.
|
||||
|
||||
Lis AVANT :
|
||||
- `git log --oneline -25`
|
||||
- `JOURNAL-V2.md`
|
||||
- Composants : `app.vue`, `pages/index.vue`, `NavSidebar.vue`, `NavMap.vue`, `FilterDrawer.vue`, `EchelleFilter.vue`, `FonctionFilter.vue`, `TerritoireTabs.vue`, `TopSearchBar.vue`, `ChatbotPlaceholder.vue`
|
||||
|
||||
## Spec mobile (< 1024px)
|
||||
|
||||
```
|
||||
═══════════════════════════════════════════
|
||||
[Logo NAV] [🔍] [✚ Contribuer] ← top nav, recherche s'étend au tap
|
||||
═══════════════════════════════════════════
|
||||
[ Métropole ] [ Outre-mer ] ← onglets territoire (sous top nav)
|
||||
─────────────────────────────────────
|
||||
|
||||
CARTE LEAFLET ← haut, hauteur dynamique
|
||||
(Métropole ou grille ~40-50% viewport par défaut
|
||||
Outre-mer adaptée mobile)
|
||||
|
||||
─── ⇅ (poignée draggable - bonus) ───
|
||||
☐ Nat ☐ Rég ☐ Loc ← échelle ultra compact (1 ligne)
|
||||
[1] Jur ☐ Tech ☐ Eco ☐ Adm … ← fonctions inline, scroll horizontal
|
||||
───────────────────────────────────
|
||||
[card fiche 1] ← liste, scroll vertical, max espace
|
||||
[card fiche 2]
|
||||
[card fiche 3]
|
||||
...
|
||||
|
||||
┌────┐
|
||||
│ 💬 │ ← bouton flottant transparent
|
||||
└────┘ bas-droite, ~56x56px
|
||||
═══════════════════════════════════════════
|
||||
```
|
||||
|
||||
### A) Top nav mobile
|
||||
- `TopSearchBar.vue` reste fonctionnel — au tap, s'étend en pleine largeur
|
||||
- "Contribuer" en bouton compact (icône + texte ou icône seule selon largeur)
|
||||
- Pas de menu hamburger nécessaire (3 éléments suffisent)
|
||||
|
||||
### B) Onglets territoire mobile
|
||||
- Identiques au desktop, juste ré-adaptés en largeur
|
||||
- Placés sous le top nav, au-dessus de la carte
|
||||
- Compact : barre horizontale full-width
|
||||
|
||||
### C) Zone carte mobile
|
||||
- Métropole : carte Leaflet pleine largeur, hauteur ~40-50% viewport
|
||||
- Outre-mer : grille 5 mini-cartes adaptée mobile (1 colonne empilée OU 2 colonnes selon largeur)
|
||||
- Si 5 mini-cartes Leaflet trop lourd sur mobile → fallback 1 carte avec sélecteur dropdown du DOM-TOM affiché (note dans journal)
|
||||
|
||||
### D) Bonus poignée draggable (skip si non-trivial)
|
||||
- Barre horizontale entre carte et tagging (icône ⇅ ou poignée style iOS bottom sheet)
|
||||
- Drag vers le haut → réduit la carte à ~25%, étend la liste fiches
|
||||
- Drag vers le bas → étend la carte à ~70%
|
||||
- Skip si > 30 min de dev — note dans journal pour Session 3
|
||||
|
||||
### E) Tagging compact (entre carte et liste)
|
||||
- Bandeau ultra fin
|
||||
- Échelle : 3 checkboxes en ligne, taille mini (16-18px), labels courts ("Nat", "Rég", "Loc")
|
||||
- Fonctions : inline, scroll horizontal (overflow-x: auto), max 1 ligne visible
|
||||
- Chaque fonction : case + label compact
|
||||
- Numéro priorité visible quand sélectionnée [1], [2], etc.
|
||||
- Bouton "tout effacer" mini icône à droite si filtres actifs
|
||||
|
||||
### F) Liste fiches mobile
|
||||
- Cards compactes (densité supérieure au desktop)
|
||||
- Tap sur card → centre la carte sur la fiche + pin highlighted (animation léger zoom)
|
||||
- Scroll vertical infini (toutes les fiches filtrées)
|
||||
- Header "N résultats" sticky en haut de la liste
|
||||
|
||||
### G) Bouton chatbot flottant
|
||||
- Position fixed bas-droite, ~56x56px
|
||||
- Fond `--nav-primary` avec opacité ~85% (transparence)
|
||||
- Icône 💬 ou MessageCircle
|
||||
- Shadow légère
|
||||
- Tap → ouvre **bottom sheet plein écran** :
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ ← Retour 💬 NAV │ ← header sheet
|
||||
├─────────────────────────────────────────┤
|
||||
│ │
|
||||
│ (zone discussion IA) │
|
||||
│ placeholder pour S3 │
|
||||
│ │
|
||||
│ │
|
||||
├─────────────────────────────────────────┤
|
||||
│ [Pose ta question…] [➤] │ ← input + bouton envoi (disabled)
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
- Composant `ChatbotSheet.vue` (ou réutiliser `ChatbotPlaceholder.vue` adapté)
|
||||
- Animation slide-up depuis le bas
|
||||
- Fermeture : tap "← Retour" ou backdrop ou swipe down
|
||||
- Logique : strictement visuelle, pas d'IA branchée (Session 3)
|
||||
|
||||
### H) Suppression du drawer "Filtres" actuel
|
||||
|
||||
- L'ancien drawer `FilterDrawer.vue` n'a plus de raison d'être (filtres sont maintenant inline dans le flow mobile)
|
||||
- Soit : supprimer FilterDrawer + bouton flottant "Filtres" associé
|
||||
- Soit : transformer en `ChatbotSheet.vue` et brancher au bouton 💬
|
||||
|
||||
→ Tranche au plus propre.
|
||||
|
||||
## Règles
|
||||
|
||||
- Mobile-first
|
||||
- Ne touche pas : page fiche détail, formulaire `/contribuer`, schéma NocoDB, worker IA
|
||||
- Palette stricte
|
||||
- Accents français
|
||||
- Commits atomiques par bloc
|
||||
- Update `JOURNAL-V2.md`
|
||||
|
||||
## Délégation cascade autorisée
|
||||
|
||||
Sous-agents Task pour : recherche pattern bottom sheet Vue, recherche pattern poignée draggable, recherche multi-Leaflet adaptation mobile.
|
||||
|
||||
## Critère de fin
|
||||
|
||||
- Mobile (< 1024px en devtools ou vrai téléphone) :
|
||||
- Top nav avec recherche fonctionnelle
|
||||
- Onglets territoire commutent vue carte
|
||||
- Carte Leaflet en haut, lisible
|
||||
- Tagging compact échelle + fonctions inline
|
||||
- Liste fiches scrollable
|
||||
- Tap card → centre carte
|
||||
- Bouton chatbot flottant
|
||||
- Tap chatbot → bottom sheet plein écran
|
||||
- `npm run build` clean
|
||||
- Aucune régression desktop (≥ 1024px)
|
||||
- Commits poussés
|
||||
- JOURNAL-V2 à jour
|
||||
|
||||
## Doute / blocage
|
||||
|
||||
- Multi-Leaflet 5 instances trop lourd mobile → fallback 1 carte + dropdown sélecteur DOM-TOM
|
||||
- Poignée draggable non-trivial → skip + note S3
|
||||
- Bottom sheet animation Vue compliqué → utiliser `<Teleport>` + transition CSS simple
|
||||
- Spec ambiguë → tranche au plus simple, note journal
|
||||
- Blocage dur → STOP + reporte
|
||||
|
||||
## Résumé attendu
|
||||
|
||||
```
|
||||
## S2 Étape 2 — Mobile UX [DONE / BLOCKED]
|
||||
|
||||
### Ajustements
|
||||
- ✓/✗ A) Top nav mobile (recherche)
|
||||
- ✓/✗ B) Onglets territoire mobile
|
||||
- ✓/✗ C) Zone carte (Métropole + Outre-mer adapté)
|
||||
- ✓/✗ D) Poignée draggable (bonus) : fait / skipped
|
||||
- ✓/✗ E) Tagging compact inline
|
||||
- ✓/✗ F) Liste fiches + tap → centre carte
|
||||
- ✓/✗ G) Bouton chatbot flottant + bottom sheet
|
||||
- ✓/✗ H) Drawer Filtres supprimé/transformé
|
||||
|
||||
### Décisions
|
||||
- Multi-Leaflet mobile : fait / fallback (raison)
|
||||
- Poignée : fait / skipped (raison)
|
||||
|
||||
### À tester
|
||||
- Devtools mobile (Pixel 7, iPhone 14 Pro)
|
||||
- Si possible : vrai tel via npm run dev -- --host
|
||||
|
||||
### Fichiers / Commits
|
||||
- ...
|
||||
```
|
||||
|
||||
Go.
|
||||
174
V2-cadrage/N-prompt-session-taxonomie-carte-unifiee.md
Normal file
174
V2-cadrage/N-prompt-session-taxonomie-carte-unifiee.md
Normal file
@@ -0,0 +1,174 @@
|
||||
# N — Session : Taxonomie v2 + Carte unifiée AEP
|
||||
|
||||
> **À lancer APRÈS déploiement prod V2 stable.**
|
||||
> Bundle : refonte taxonomie + refonte zone carte + hiérarchie racine/antennes.
|
||||
> Modèle : Opus pilote + délégation Sonnet.
|
||||
> Durée estimée : 6-8h.
|
||||
|
||||
## Mission
|
||||
|
||||
Refonte de l'architecture navigation + taxonomie AEP pour supporter :
|
||||
1. 2 modes d'usage (Entraide / Pratiques inspirantes) + prévoir 3ème futur (Bibliothèque RAG)
|
||||
2. Hiérarchie racine/antennes (CNOA/CROA, CAUE, syndicats…)
|
||||
3. Affichage unifié Métropole + DOM-TOM (plus d'onglet territoire)
|
||||
|
||||
## Contexte
|
||||
|
||||
- Racine : `nav-carte/`
|
||||
- Spec Session 2 : `V2-cadrage/H-prompt-session-2-front.md` (bloc État d'avancement)
|
||||
- Journal : `JOURNAL-V2.md`
|
||||
- Session 2 livre le front complet (desktop + mobile), déployé en prod
|
||||
|
||||
## 3 chantiers
|
||||
|
||||
### CHANTIER 1 — Onglets top : modes d'usage
|
||||
|
||||
Remplacer les onglets `Métropole | Outre-mer` par :
|
||||
|
||||
```
|
||||
[ 🤝 Entraide ] [ ✨ Pratiques inspirantes ] [ 📚 Bibliothèque RAG ]
|
||||
actif actif (MVP) disabled (S4+)
|
||||
```
|
||||
|
||||
**Mode Entraide (défaut)** :
|
||||
- Sidebar : échelle + fonctions (10 actuelles) + territoires
|
||||
- Types affichés : Institution, Association, Syndicat, Formation, Média
|
||||
- Logique : "J'ai besoin d'aide, où je trouve ?"
|
||||
|
||||
**Mode Pratiques inspirantes** :
|
||||
- Sidebar : postures (multi-tag) + régions + fonctions secondaires
|
||||
- Types affichés : Agence, Entreprise
|
||||
- Logique : "Qui fait des choses qui m'inspirent ?"
|
||||
|
||||
**Mode Bibliothèque RAG** :
|
||||
- Onglet visible mais désactivé (tooltip "à venir")
|
||||
- Placeholder pour future intégration LightRAG/QMD
|
||||
|
||||
URL sync : `?mode=entraide|pratiques|rag`
|
||||
|
||||
### CHANTIER 2 — Nouvelle taxonomie
|
||||
|
||||
#### Dimension "Type d'organisation" (nouveau, required)
|
||||
|
||||
Ajout colonne NocoDB `type_organisation` (enum) :
|
||||
- `institution` — CNOA, CAUE, ordres
|
||||
- `association` — UNSFA, CNAJEP, assos thématiques
|
||||
- `syndicat` — syndicats pro
|
||||
- `agence` — agences d'archi / entreprises privées
|
||||
- `formation` — ENSA, écoles
|
||||
- `media` — AOC, magazines spécialisés
|
||||
- `autre` — catch-all
|
||||
|
||||
Migration : assigner manuellement aux 96 fiches seed (mapping ~30 min, faire en script Python ou UI NocoDB).
|
||||
|
||||
#### Dimension "Postures" (nouveau, optional, multi)
|
||||
|
||||
Ajout colonne NocoDB `postures` (multi-select) :
|
||||
- `regenerative` — Pratique régénérative
|
||||
- `bas-carbone` — Bas carbone
|
||||
- `cooperative` — SCOP / Coopérative
|
||||
- `patrimoine` — Patrimoine / réhabilitation
|
||||
- `ecoconstruction` — Écoconstruction
|
||||
- `low-tech` — Low-tech
|
||||
- `participatif` — Habitat participatif
|
||||
- (liste évolutive — documenter le vocabulaire dans JOURNAL)
|
||||
|
||||
**Critères de sélection** (à définir avec Jules) : viser le **vérifiable** (signature charte X, labellisation Y, mention dans source Z) plutôt que le subjectif. Piste pour éviter la "guéguerre" politique.
|
||||
|
||||
#### Hiérarchie racine/antennes (cf. prompt L existant)
|
||||
|
||||
Ajout `parent_id` (FK nullable) + `is_root` (bool). Mapping CROA→CNOA, CAUE→Réseau CAUE.
|
||||
|
||||
### CHANTIER 3 — Carte unifiée (remplace tabs Métropole/Outre-mer)
|
||||
|
||||
Layout zone carte :
|
||||
|
||||
```
|
||||
┌─────────────────────────────────┬──────────────┐
|
||||
│ │ Guadeloupe │
|
||||
│ │ mini-Leaflet│
|
||||
│ ├──────────────┤
|
||||
│ FRANCE MÉTROPOLE │ Martinique │
|
||||
│ (Leaflet principal) │ mini-Leaflet│
|
||||
│ ~2/3 largeur zone carte ├──────────────┤
|
||||
│ │ Guyane │
|
||||
│ │ mini-Leaflet│
|
||||
│ ├──────────────┤
|
||||
│ │ La Réunion │
|
||||
│ │ mini-Leaflet│
|
||||
│ ├──────────────┤
|
||||
│ │ Mayotte │ ← à confirmer Jules (4 ou 5 ?)
|
||||
│ │ mini-Leaflet│
|
||||
└─────────────────────────────────┴──────────────┘
|
||||
```
|
||||
|
||||
- Sidebar DOM-TOM à droite : colonne scrollable avec mini-cartes Leaflet (~160-180px hauteur chacune)
|
||||
- Chaque mini-carte = vue centrée + zoomée sur son territoire avec ses pins propres
|
||||
- Click sur pin OU card fiche (sidebar gauche) → centre la carte pertinente (principale ou mini)
|
||||
- Titre au-dessus de chaque mini : "Guadeloupe", etc.
|
||||
- Responsive mobile :
|
||||
- Métropole en haut pleine largeur
|
||||
- Mini-cartes DOM-TOM empilées dessous, scroll vertical
|
||||
|
||||
Suppression de `TerritoireTabs.vue` + `OutremerMap.vue` refactoré.
|
||||
|
||||
## Livrables
|
||||
|
||||
- [ ] Migration schéma NocoDB : `type_organisation`, `postures`, `parent_id`, `is_root`
|
||||
- [ ] Mapping seed 96 fiches (script ou UI)
|
||||
- [ ] Composants :
|
||||
- `ModeTabs.vue` (3 onglets top, RAG disabled)
|
||||
- `TypeFilter.vue` (selon mode actif)
|
||||
- `PostureFilter.vue` (mode Pratiques)
|
||||
- `DomTomSidebar.vue` (mini-cartes droite)
|
||||
- `FicheRacineHeader.vue`, `BreadcrumbReseau.vue` (hiérarchie, cf. L)
|
||||
- [ ] Adaptation sidebar selon mode (filtres différents)
|
||||
- [ ] Adaptation NavMap : layout 2/3 + 1/3 DOM-TOM
|
||||
- [ ] Pin racine (safran) vs antenne (bleu) sur carte
|
||||
- [ ] Backward compat : fiches sans type/postures continuent à fonctionner (fallback "autre")
|
||||
- [ ] Tests manuels : changement mode, filtrage par type/posture, hiérarchie CNOA→CROA, affichage DOM-TOM unifié
|
||||
|
||||
## Règles
|
||||
|
||||
- Accents français
|
||||
- Palette stricte (`palette-nav-v2.md`)
|
||||
- Mobile-first
|
||||
- Pas de régression S2
|
||||
- Commits atomiques par chantier (T1, T2, T3)
|
||||
- Update `JOURNAL-V2.md`
|
||||
|
||||
## Délégation (Opus pilote)
|
||||
|
||||
| Sous-agent | Tâche | Modèle |
|
||||
|-----------|-------|--------|
|
||||
| Sonnet 1 | Migration schéma + mapping seed | Sonnet |
|
||||
| Sonnet 2 | Onglets top + adaptation sidebar selon mode | Sonnet |
|
||||
| Sonnet 3 | Carte unifiée (layout + DomTomSidebar) | Sonnet |
|
||||
| Sonnet 4 (optionnel) | Hiérarchie UI (breadcrumb, bandeau racine) | Sonnet |
|
||||
|
||||
Parallélisation : Sonnet 1 d'abord (schéma), puis Sonnet 2+3+4 en parallèle.
|
||||
|
||||
## Critère de fin
|
||||
|
||||
- 3 onglets visibles, Entraide et Pratiques commutent la logique filtres+types
|
||||
- Type et Postures filtrables, fiches seed migrées
|
||||
- Carte unifiée : Métropole + 5 (ou 4) DOM-TOM visibles simultanément
|
||||
- Hiérarchie fonctionnelle (CNOA → CROA-IDF → retour CNOA)
|
||||
- Aucune régression S2 (recherche, filtres existants, /fiche, /contribuer)
|
||||
- `npm run build` clean
|
||||
- Commits poussés
|
||||
- JOURNAL V2 à jour
|
||||
|
||||
## Questions à trancher avec Jules AVANT dispatch
|
||||
|
||||
1. **4 ou 5 DOM-TOM** ? (Guadeloupe, Martinique, Guyane, La Réunion, Mayotte = 5 ; Jules a mentionné 4)
|
||||
2. **Critères Postures vérifiables** : liste des labels/chartes/sources faisant foi ?
|
||||
3. **Fonctions du mode Pratiques** : garde-t-on les 10 fonctions ou on simplifie ?
|
||||
4. **Modération** : fiches type "agence" passent-elles par le même workflow `pending` ou filtre plus strict ?
|
||||
|
||||
## Hors scope (Session 3)
|
||||
|
||||
- Worker IA enrichissement (parse URL + Mistral)
|
||||
- Chatbot live
|
||||
- Bibliothèque RAG (vectorisation + interface query)
|
||||
- Déploiement final prod post-taxonomie
|
||||
111
V2-cadrage/VPS-check.md
Normal file
111
V2-cadrage/VPS-check.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# VPS check — NAV V2 prérequis
|
||||
|
||||
Date : 2026-04-14
|
||||
|
||||
---
|
||||
|
||||
## NocoDB
|
||||
|
||||
- **Version exacte** : `0.301.5` (release `2026.04.0`)
|
||||
- **Image Docker** : `nocodb/nocodb:latest` (tag latest, mais version réelle récupérée via API)
|
||||
- **Port interne** : `8080` → mappé sur `8070` en externe
|
||||
- **API version à utiliser** : **v1.x** (confirmé : `http://localhost:8080/api/v1/version` répond correctement)
|
||||
- **Table IDs connues** (depuis `/opt/nav-carte/.env`) :
|
||||
- `NUXT_ORG_TABLE_ID=m08t7g5v4wch6wb`
|
||||
- `NUXT_AVIS_TABLE_ID=m4hub7cdutgec47`
|
||||
- **Implications pour le dev** :
|
||||
- API v1 (NocoDB >= 0.100.x) — utiliser `/api/v1/db/data/noco/{baseId}/{tableId}`
|
||||
- Auth via token API (à récupérer dans NocoDB Settings > Tokens)
|
||||
- Doc officielle v1 : https://docs.nocodb.com/developer-resources/rest-APIs/overview
|
||||
|
||||
---
|
||||
|
||||
## Listmonk SMTP
|
||||
|
||||
- **Provider** : Resend
|
||||
- **Host** : `smtp.resend.com`
|
||||
- **Port** : `465`
|
||||
- **TLS** : oui (SSL implicite sur 465)
|
||||
- **Username** : `resend`
|
||||
- **From email** : `newsletter@trans-former.fr`
|
||||
- **From name** : `Jules Neny`
|
||||
- **Password** : **stocké dans** `/opt/vps-kit/.env` (variable `SMTP_PASSWORD`)
|
||||
|
||||
Jules : récupère-le avec :
|
||||
```bash
|
||||
ssh vps-hetzner "grep SMTP_PASSWORD /opt/vps-kit/.env"
|
||||
```
|
||||
|
||||
- **Réutilisation dans NAV V2** : OUI — utiliser directement les mêmes credentials Resend en SMTP
|
||||
- Alternative légère : utiliser l'**API HTTP Resend** (plus simple qu'SMTP dans un worker Python/Node)
|
||||
- API key Resend dans `/opt/vps-kit/.env` variable `RESEND_API_KEY` (à vérifier)
|
||||
|
||||
```bash
|
||||
ssh vps-hetzner "grep -i resend /opt/vps-kit/.env | grep -v SMTP"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NAV V1 — Deploy path
|
||||
|
||||
- **Chemin** : `/opt/nav-carte/`
|
||||
- **Type** : Build Nuxt statique (pas de container Docker — `.output/` présent)
|
||||
- **Config** : `/opt/nav-carte/.env`
|
||||
- `NUXT_NOCODB_URL=http://localhost:8070`
|
||||
- Table IDs ci-dessus
|
||||
- **Pas de docker-compose** — servi probablement via Caddy ou node process direct
|
||||
|
||||
---
|
||||
|
||||
## Bonus infra
|
||||
|
||||
- **Espace disque** : 38 GB total / **9.7 GB libre** (73% utilisé — attention)
|
||||
- **RAM** : 7.5 GB total / 4.7 GB disponible (cache inclus) — correct
|
||||
- **Swap** : 2 GB / 1.3 GB libre
|
||||
- **crawl4ai installé** : **non** (ni container Docker, ni pip global)
|
||||
|
||||
### Stack Docker actif
|
||||
|
||||
| Container | Image | Port externe |
|
||||
|-----------|-------|-------------|
|
||||
| nocodb | nocodb/nocodb:latest | 8070 |
|
||||
| astro-site | astro-site | 8090 |
|
||||
| listmonk | listmonk/listmonk:v4.1.0 | 9000 |
|
||||
| n8n | n8nio/n8n:1.40.0 | 5678 |
|
||||
| coolify | coolify:4.0.0-beta.470 | 8000 |
|
||||
| castopod | castopod:1.15.5 | 8081 |
|
||||
| gitea | gitea:latest | 3030 |
|
||||
| heyform | heyform community | 3000 |
|
||||
| umami | umami:postgresql-v2.13.2 | 3001 |
|
||||
| uptime-kuma | uptime-kuma:1.23.13 | 3002 |
|
||||
|
||||
---
|
||||
|
||||
## Recommandations pour NAV V2
|
||||
|
||||
- [x] **SMTP réutilisable : OUI** — Resend `smtp.resend.com:465`, username `resend`, from `newsletter@trans-former.fr`. Password dans `/opt/vps-kit/.env`
|
||||
- [x] **NocoDB API à utiliser : v1.x** — endpoint `/api/v1/db/data/noco/{baseId}/{tableId}` avec token API
|
||||
- [x] **crawl4ai : à installer** — pas présent sur le VPS. Option A : `docker run unclecode/crawl4ai` (container léger). Option B : `pip install crawl4ai` dans un venv Python sur le VPS.
|
||||
- [x] **Espace disque : surveiller** — 9.7 GB libre. Si le worker NAV V2 génère des logs/cache, prévoir rotation.
|
||||
- [x] **Alternative SMTP recommandée** : utiliser l'**API HTTP Resend** directement (pas SMTP) — plus fiable, pas de timeouts TLS, même provider.
|
||||
|
||||
```python
|
||||
import resend
|
||||
resend.api_key = "re_..."
|
||||
resend.Emails.send({"from": "newsletter@trans-former.fr", "to": ["jules@..."], ...})
|
||||
```
|
||||
|
||||
### Actions manuelles requises (Jules)
|
||||
|
||||
1. **Récupérer le SMTP password Resend** :
|
||||
```bash
|
||||
ssh vps-hetzner "grep SMTP_PASSWORD /opt/vps-kit/.env"
|
||||
```
|
||||
|
||||
2. **Récupérer le token API NocoDB** (pour le worker NAV V2) :
|
||||
- Aller sur `http://[VPS]:8070` → Settings → API Tokens → créer un token `nav-v2-worker`
|
||||
|
||||
3. **Vérifier si une API key Resend existe** (alternative plus propre que SMTP) :
|
||||
```bash
|
||||
ssh vps-hetzner "grep -i resend /opt/vps-kit/.env"
|
||||
```
|
||||
100
V2-cadrage/palette-nav-v2.md
Normal file
100
V2-cadrage/palette-nav-v2.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# Palette NAV V2 — Sobre institutionnel (validée 2026-04-14)
|
||||
|
||||
Direction : **A — Sobre institutionnel**, avec atténuation du bleu nuit à 60% d'opacité partout.
|
||||
|
||||
## Tokens CSS
|
||||
|
||||
```css
|
||||
:root {
|
||||
/* Fonds */
|
||||
--nav-bg: #f8f6f1; /* fond principal, crème cassé */
|
||||
--nav-bg-alt: #eee9df; /* fond carte, chips inactifs */
|
||||
--nav-surface: #ffffff; /* cards, sidebar, header */
|
||||
|
||||
/* Bleu nuit — couleur primaire, utilisée avec opacité 60% */
|
||||
--nav-primary-raw: 26, 34, 56; /* #1a2238 en RGB */
|
||||
--nav-primary: rgba(26, 34, 56, 0.6); /* usage standard partout */
|
||||
--nav-primary-solid: #1a2238; /* uniquement texte sur fond clair si lisibilité l'exige */
|
||||
|
||||
/* Accent — safran */
|
||||
--nav-accent: #f5b342;
|
||||
--nav-accent-soft: rgba(245, 179, 66, 0.85);
|
||||
|
||||
/* Texte */
|
||||
--nav-text: #1a2238; /* texte principal : plein pour lisibilité */
|
||||
--nav-text-muted: rgba(26, 34, 56, 0.55);
|
||||
--nav-text-on-primary: #f8f6f1; /* texte sur fond bleu 60% */
|
||||
}
|
||||
```
|
||||
|
||||
## Règle — application du bleu à 60%
|
||||
|
||||
Le bleu nuit est **toujours utilisé à 60% d'opacité** sur les éléments visuels :
|
||||
|
||||
| Élément | Couleur | Note |
|
||||
|----------------------|----------------------|-------------------------------|
|
||||
| Bandeau bas (fond) | `--nav-primary` | rgba(26,34,56,0.6) |
|
||||
| Pins carte | `--nav-primary` | border white 2px |
|
||||
| Chips actifs (fond) | `--nav-primary` | texte safran dessus |
|
||||
| Surlignages / hover | `--nav-primary` | transition douce |
|
||||
| Header (si coloré) | `--nav-primary` | sinon blanc |
|
||||
| Titres h1/h2 | `--nav-text` (plein) | lisibilité > esthétique |
|
||||
| Texte courant | `--nav-text` (plein) | lisibilité > esthétique |
|
||||
|
||||
**Exception lisibilité** : texte, titres, et labels restent en bleu **plein** (`#1a2238`). Le 60% s'applique aux surfaces colorées, pas au texte. Si un texte doit apparaître sur fond bleu 60%, utiliser `--nav-text-on-primary` (crème).
|
||||
|
||||
## Swatches de référence
|
||||
|
||||
```
|
||||
#f8f6f1 crème (fond)
|
||||
#eee9df sable (fond alt)
|
||||
#1a2238 bleu nuit (plein — texte/titres uniquement)
|
||||
60% opa bleu nuit 60% (tout le reste : bandeau, pins, chips, surlignages)
|
||||
#f5b342 safran (accent : CTA, pins prioritaires, liens actifs)
|
||||
```
|
||||
|
||||
## Typographie
|
||||
|
||||
- System font stack (pas de Google Fonts externe, cf. G règles)
|
||||
- `font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;`
|
||||
- Titres : `font-weight: 700`
|
||||
- Courant : `font-weight: 400`
|
||||
|
||||
## États interactifs
|
||||
|
||||
- Hover : augmenter l'opacité du bleu à 0.75
|
||||
- Active/selected : bleu plein en fond + texte safran
|
||||
- Disabled : opacité 0.3
|
||||
|
||||
## Accessibilité
|
||||
|
||||
- Contraste texte plein bleu nuit sur crème : ratio > 10:1 (AAA)
|
||||
- Bleu 60% sur crème : éviter d'y mettre du texte lisible — usage décoratif ou élément UI uniquement
|
||||
- Safran sur bleu plein : ratio ~6:1 (AA)
|
||||
- Focus ring : outline safran 2px, offset 2px
|
||||
|
||||
## Usage par composant
|
||||
|
||||
```
|
||||
Header fond: --nav-surface (blanc)
|
||||
logo: --nav-text plein
|
||||
nav-links: --nav-text-muted
|
||||
|
||||
Sidebar fond: --nav-surface
|
||||
titres filtres: --nav-text-muted UPPERCASE
|
||||
chips inactifs: fond --nav-bg-alt, texte --nav-text
|
||||
chips actifs: fond --nav-primary (60%), texte --nav-accent
|
||||
|
||||
Carte fond: --nav-bg-alt
|
||||
pins standard: fond --nav-primary (60%), border white
|
||||
pins prioritaires: fond --nav-accent, border --nav-primary
|
||||
|
||||
Bandeau bas fond: --nav-primary (60%)
|
||||
texte: --nav-text-on-primary
|
||||
CTA "Soutenir": fond --nav-accent, texte --nav-text plein
|
||||
|
||||
Fiche détail fond: --nav-surface
|
||||
header fiche: bandeau --nav-primary (60%) avec crème dessus
|
||||
tags fonction: chips --nav-bg-alt
|
||||
bouton retour: --nav-primary (60%) hover --nav-accent
|
||||
```
|
||||
226
V2-cadrage/palettes-preview.html
Normal file
226
V2-cadrage/palettes-preview.html
Normal file
@@ -0,0 +1,226 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>NAV V2 — Palettes preview</title>
|
||||
<style>
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: #f0f0f0; padding: 24px; }
|
||||
h1 { font-size: 20px; margin-bottom: 4px; }
|
||||
.intro { color: #666; margin-bottom: 24px; font-size: 14px; }
|
||||
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
|
||||
@media (max-width: 1200px) { .grid { grid-template-columns: 1fr; } }
|
||||
|
||||
.palette-card { background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
|
||||
.palette-label { padding: 12px 16px; background: #222; color: white; font-size: 13px; font-weight: 600; letter-spacing: 0.5px; }
|
||||
.palette-label small { display: block; font-weight: 400; opacity: 0.7; margin-top: 2px; font-size: 11px; }
|
||||
.swatches { display: flex; height: 40px; }
|
||||
.swatch { flex: 1; display: flex; align-items: center; justify-content: center; font-size: 10px; font-family: monospace; color: rgba(0,0,0,0.5); }
|
||||
|
||||
/* Wireframe NAV */
|
||||
.mockup { height: 480px; display: flex; flex-direction: column; font-size: 12px; }
|
||||
.mock-header { padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(0,0,0,0.08); }
|
||||
.mock-logo { font-weight: 700; font-size: 14px; }
|
||||
.mock-nav-links { display: flex; gap: 12px; font-size: 11px; opacity: 0.7; }
|
||||
.mock-body { flex: 1; display: flex; overflow: hidden; }
|
||||
.mock-sidebar { width: 160px; padding: 12px; border-right: 1px solid rgba(0,0,0,0.08); font-size: 10px; }
|
||||
.mock-filter-group { margin-bottom: 12px; }
|
||||
.mock-filter-title { font-weight: 600; margin-bottom: 4px; font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px; opacity: 0.6; }
|
||||
.mock-chip { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 9px; margin: 2px 2px 0 0; }
|
||||
.mock-chip.active { font-weight: 600; }
|
||||
.mock-map { flex: 1; position: relative; overflow: hidden; }
|
||||
.mock-map-bg { position: absolute; inset: 0; opacity: 0.8; background-image:
|
||||
radial-gradient(circle at 30% 40%, rgba(0,0,0,0.06) 0, transparent 40%),
|
||||
radial-gradient(circle at 70% 60%, rgba(0,0,0,0.06) 0, transparent 40%); }
|
||||
.mock-pin { position: absolute; width: 14px; height: 14px; border-radius: 50% 50% 50% 0; transform: rotate(-45deg); border: 2px solid white; }
|
||||
.mock-pin.p1 { top: 25%; left: 40%; }
|
||||
.mock-pin.p2 { top: 45%; left: 50%; }
|
||||
.mock-pin.p3 { top: 60%; left: 35%; }
|
||||
.mock-pin.p4 { top: 35%; left: 65%; }
|
||||
.mock-pin.p5 { top: 55%; left: 70%; }
|
||||
.mock-banner { padding: 10px 16px; font-size: 10px; display: flex; justify-content: space-between; align-items: center; border-top: 1px solid rgba(0,0,0,0.08); }
|
||||
.mock-banner-btn { padding: 4px 10px; border-radius: 4px; font-size: 10px; font-weight: 600; }
|
||||
|
||||
/* ============ PALETTE A — SOBRE INSTITUTIONNEL ============ */
|
||||
.palette-a .mockup { background: #f8f6f1; color: #1a2238; }
|
||||
.palette-a .mock-header { background: white; }
|
||||
.palette-a .mock-logo { color: #1a2238; }
|
||||
.palette-a .mock-sidebar { background: white; }
|
||||
.palette-a .mock-filter-title { color: #1a2238; }
|
||||
.palette-a .mock-chip { background: #eee9df; color: #1a2238; }
|
||||
.palette-a .mock-chip.active { background: #1a2238; color: #f5b342; }
|
||||
.palette-a .mock-map { background: #eee9df; }
|
||||
.palette-a .mock-pin { background: #1a2238; }
|
||||
.palette-a .mock-pin.p2, .palette-a .mock-pin.p4 { background: #f5b342; }
|
||||
.palette-a .mock-banner { background: #1a2238; color: #f8f6f1; }
|
||||
.palette-a .mock-banner-btn { background: #f5b342; color: #1a2238; }
|
||||
|
||||
/* ============ PALETTE B — CHALEUREUX ARTISANAL ============ */
|
||||
.palette-b .mockup { background: #f5ede2; color: #2d2418; }
|
||||
.palette-b .mock-header { background: #fbf6ec; }
|
||||
.palette-b .mock-logo { color: #9b4a2a; }
|
||||
.palette-b .mock-sidebar { background: #fbf6ec; }
|
||||
.palette-b .mock-filter-title { color: #2d5741; }
|
||||
.palette-b .mock-chip { background: #ecd9c1; color: #2d2418; }
|
||||
.palette-b .mock-chip.active { background: #9b4a2a; color: #f5ede2; }
|
||||
.palette-b .mock-map { background: #e6d3b8; }
|
||||
.palette-b .mock-pin { background: #9b4a2a; }
|
||||
.palette-b .mock-pin.p2, .palette-b .mock-pin.p4 { background: #2d5741; }
|
||||
.palette-b .mock-banner { background: #2d5741; color: #f5ede2; }
|
||||
.palette-b .mock-banner-btn { background: #e6b35a; color: #2d2418; }
|
||||
|
||||
/* ============ PALETTE C — MODERNE SOUVERAIN ============ */
|
||||
.palette-c .mockup { background: #fafafa; color: #1f2937; }
|
||||
.palette-c .mock-header { background: white; }
|
||||
.palette-c .mock-logo { color: #000091; }
|
||||
.palette-c .mock-sidebar { background: white; }
|
||||
.palette-c .mock-filter-title { color: #374151; }
|
||||
.palette-c .mock-chip { background: #f3f4f6; color: #1f2937; border: 1px solid #e5e7eb; }
|
||||
.palette-c .mock-chip.active { background: #000091; color: white; border-color: #000091; }
|
||||
.palette-c .mock-map { background: #e5e7eb; }
|
||||
.palette-c .mock-pin { background: #000091; }
|
||||
.palette-c .mock-pin.p2, .palette-c .mock-pin.p4 { background: #ffcc00; border-color: #000091; }
|
||||
.palette-c .mock-banner { background: #1f2937; color: #fafafa; }
|
||||
.palette-c .mock-banner-btn { background: #ffcc00; color: #1f2937; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>NAV V2 — Palettes preview</h1>
|
||||
<p class="intro">3 directions visuelles appliquées au wireframe. Choisis celle qui matche l'énergie du projet.</p>
|
||||
|
||||
<div class="grid">
|
||||
|
||||
<!-- PALETTE A -->
|
||||
<div class="palette-card palette-a">
|
||||
<div class="palette-label">A — Sobre institutionnel<small>Service public, lisible, sérieux</small></div>
|
||||
<div class="swatches">
|
||||
<div class="swatch" style="background:#f8f6f1">#f8f6f1</div>
|
||||
<div class="swatch" style="background:#eee9df">#eee9df</div>
|
||||
<div class="swatch" style="background:#1a2238;color:#fff">#1a2238</div>
|
||||
<div class="swatch" style="background:#f5b342">#f5b342</div>
|
||||
</div>
|
||||
<div class="mockup">
|
||||
<div class="mock-header">
|
||||
<span class="mock-logo">NAV</span>
|
||||
<div class="mock-nav-links"><span>Carte</span><span>Proposer</span><span>À propos</span></div>
|
||||
</div>
|
||||
<div class="mock-body">
|
||||
<div class="mock-sidebar">
|
||||
<div class="mock-filter-group">
|
||||
<div class="mock-filter-title">Échelle</div>
|
||||
<span class="mock-chip active">National</span>
|
||||
<span class="mock-chip">Régional</span>
|
||||
<span class="mock-chip">Local</span>
|
||||
</div>
|
||||
<div class="mock-filter-group">
|
||||
<div class="mock-filter-title">Fonction</div>
|
||||
<span class="mock-chip active">Juridique</span>
|
||||
<span class="mock-chip">Technique</span>
|
||||
<span class="mock-chip">Chantier</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mock-map">
|
||||
<div class="mock-map-bg"></div>
|
||||
<div class="mock-pin p1"></div><div class="mock-pin p2"></div>
|
||||
<div class="mock-pin p3"></div><div class="mock-pin p4"></div>
|
||||
<div class="mock-pin p5"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mock-banner">
|
||||
<span>IA : 3,40 €/20 € · 12 fiches · 0,8 kg CO₂</span>
|
||||
<span class="mock-banner-btn">Soutenir NAV</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PALETTE B -->
|
||||
<div class="palette-card palette-b">
|
||||
<div class="palette-label">B — Chaleureux artisanal<small>Humain, proche archi réno, terre</small></div>
|
||||
<div class="swatches">
|
||||
<div class="swatch" style="background:#f5ede2">#f5ede2</div>
|
||||
<div class="swatch" style="background:#9b4a2a;color:#fff">#9b4a2a</div>
|
||||
<div class="swatch" style="background:#2d5741;color:#fff">#2d5741</div>
|
||||
<div class="swatch" style="background:#e6b35a">#e6b35a</div>
|
||||
</div>
|
||||
<div class="mockup">
|
||||
<div class="mock-header">
|
||||
<span class="mock-logo">NAV</span>
|
||||
<div class="mock-nav-links"><span>Carte</span><span>Proposer</span><span>À propos</span></div>
|
||||
</div>
|
||||
<div class="mock-body">
|
||||
<div class="mock-sidebar">
|
||||
<div class="mock-filter-group">
|
||||
<div class="mock-filter-title">Échelle</div>
|
||||
<span class="mock-chip active">National</span>
|
||||
<span class="mock-chip">Régional</span>
|
||||
<span class="mock-chip">Local</span>
|
||||
</div>
|
||||
<div class="mock-filter-group">
|
||||
<div class="mock-filter-title">Fonction</div>
|
||||
<span class="mock-chip active">Juridique</span>
|
||||
<span class="mock-chip">Technique</span>
|
||||
<span class="mock-chip">Chantier</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mock-map">
|
||||
<div class="mock-map-bg"></div>
|
||||
<div class="mock-pin p1"></div><div class="mock-pin p2"></div>
|
||||
<div class="mock-pin p3"></div><div class="mock-pin p4"></div>
|
||||
<div class="mock-pin p5"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mock-banner">
|
||||
<span>IA : 3,40 €/20 € · 12 fiches · 0,8 kg CO₂</span>
|
||||
<span class="mock-banner-btn">Soutenir NAV</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PALETTE C -->
|
||||
<div class="palette-card palette-c">
|
||||
<div class="palette-label">C — Moderne souverain<small>Tech-forward, vibe gouv.fr</small></div>
|
||||
<div class="swatches">
|
||||
<div class="swatch" style="background:#fafafa">#fafafa</div>
|
||||
<div class="swatch" style="background:#000091;color:#fff">#000091</div>
|
||||
<div class="swatch" style="background:#ffcc00">#ffcc00</div>
|
||||
<div class="swatch" style="background:#1f2937;color:#fff">#1f2937</div>
|
||||
</div>
|
||||
<div class="mockup">
|
||||
<div class="mock-header">
|
||||
<span class="mock-logo">NAV</span>
|
||||
<div class="mock-nav-links"><span>Carte</span><span>Proposer</span><span>À propos</span></div>
|
||||
</div>
|
||||
<div class="mock-body">
|
||||
<div class="mock-sidebar">
|
||||
<div class="mock-filter-group">
|
||||
<div class="mock-filter-title">Échelle</div>
|
||||
<span class="mock-chip active">National</span>
|
||||
<span class="mock-chip">Régional</span>
|
||||
<span class="mock-chip">Local</span>
|
||||
</div>
|
||||
<div class="mock-filter-group">
|
||||
<div class="mock-filter-title">Fonction</div>
|
||||
<span class="mock-chip active">Juridique</span>
|
||||
<span class="mock-chip">Technique</span>
|
||||
<span class="mock-chip">Chantier</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mock-map">
|
||||
<div class="mock-map-bg"></div>
|
||||
<div class="mock-pin p1"></div><div class="mock-pin p2"></div>
|
||||
<div class="mock-pin p3"></div><div class="mock-pin p4"></div>
|
||||
<div class="mock-pin p5"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mock-banner">
|
||||
<span>IA : 3,40 €/20 € · 12 fiches · 0,8 kg CO₂</span>
|
||||
<span class="mock-banner-btn">Soutenir NAV</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
1727
V2-cadrage/seed-94-fiches-v2.json
Normal file
1727
V2-cadrage/seed-94-fiches-v2.json
Normal file
File diff suppressed because it is too large
Load Diff
1603
V2-cadrage/seed-94-fiches.json
Normal file
1603
V2-cadrage/seed-94-fiches.json
Normal file
File diff suppressed because it is too large
Load Diff
114
V2-cadrage/seed-94-rapport.md
Normal file
114
V2-cadrage/seed-94-rapport.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# NAV V2 — Rapport Seed 93 Entités
|
||||
|
||||
Date : 2026-04-14
|
||||
Source : A-biblio-ecosysteme-archi.md
|
||||
|
||||
## Résumé
|
||||
|
||||
- **Entités parsées** : 93
|
||||
- **Note** : A-biblio annonce 94 entités. Le tableau contient 93 entrées distinctes. Certaines entités multi-entrées (Architectes de l'Urgence vs Archi-Urgent.com, plusieurs pages MAF, Cité de l'Architecture x3, PUCA x2, Pavillon de l'Arsenal x2) expliquent l'écart si présent.
|
||||
|
||||
## Répartition par échelle
|
||||
|
||||
| Échelle | Nombre |
|
||||
|---------|--------|
|
||||
| National | 68 |
|
||||
| Régional | 25 |
|
||||
|
||||
## Répartition par fonction (multi-valué, occurrence dans les fiches)
|
||||
|
||||
| Fonction | Occurrences |
|
||||
|----------|-------------|
|
||||
| Administratif | 50 |
|
||||
| Technique | 49 |
|
||||
| Prospection | 32 |
|
||||
| Juridique | 29 |
|
||||
| RH | 17 |
|
||||
| Chantier | 10 |
|
||||
| Comptabilité | 9 |
|
||||
| Santé mentale | 9 |
|
||||
| Économique | 1 |
|
||||
|
||||
## Territoire
|
||||
|
||||
Toutes les entités : **Métropole** (par défaut, conforme à A-biblio qui couvre uniquement la France métropolitaine).
|
||||
|
||||
## Géocodage (Nominatim, 1 req/sec)
|
||||
|
||||
| Résultat | Nombre |
|
||||
|----------|--------|
|
||||
| Réussis | 72 |
|
||||
| Échecs | 0 |
|
||||
| Sans ville (national/itinérant/outil) | 21 |
|
||||
|
||||
Fichier JSON : `seed-94-fiches.json`
|
||||
|
||||
## Cas ambigus ayant nécessité une décision
|
||||
|
||||
### 1. Entités sans ville (21 entités)
|
||||
|
||||
Catégories concernées :
|
||||
- Outils SaaS sans siège (Archireport, OOTI, ArchiWIZARD, CYPETHERM, Construction21) → `ville: null`
|
||||
- Podcasts sans ancrage (Dans la tête d'un archi, Fondations) → `ville: null`
|
||||
- Recrutement national sans adresse précise (Archi-Jobs, Charette Service, Preference Search, FFP) → `ville: null`
|
||||
- Associations nationales diffuses (Architectes Solidaires, Collectif Etc) → `ville: null`
|
||||
- Santé mentale généraliste (Souffrance et Travail, France Burn-Out, Réseau Burn Out, Croix-Rouge, ASAfSAT) → `ville: null`
|
||||
|
||||
**Décision** : ne pas forcer lat/lon centre France — cela fausserait la carte Leaflet. Ces entités apparaîtront dans les filtres mais sans marqueur.
|
||||
|
||||
### 2. Réseau Burn Out (reseauburnout.org)
|
||||
|
||||
Signalé comme douteux dans A-biblio : actif principalement Belgique/Luxembourg.
|
||||
**Décision** : inclus avec note d'avertissement dans `source_note`. À revoir par Jules avant mise en ligne.
|
||||
|
||||
### 3. Entités doublons fonctionnels (conservées distinctes)
|
||||
|
||||
A-biblio liste plusieurs fois les mêmes entités sous différentes URLs/angles :
|
||||
- Architectes de l'Urgence + Archi-Urgent.com (2 entrées, même fondation)
|
||||
- MAF principale + MAF Protection juridique (2 entrées, même mutuelle)
|
||||
- Cité de l'Architecture + Formation continue + Podcasts (3 entrées, même institution)
|
||||
- PUCA principale + PUCA Ressources en ligne (2 entrées)
|
||||
- Pavillon de l'Arsenal + FAIRE — Pavillon de l'Arsenal (2 entrées)
|
||||
**Décision** : conservées distinctes — à fusionner en post-import si souhaité.
|
||||
|
||||
### 4. CAUE classés Régional (pas Départemental)
|
||||
|
||||
Les CAUE sont des structures départementales mais à fonction régionale/locale selon la taxonomie NAV.
|
||||
**Décision** : Régional pour les 5 CAUE listés — cohérent avec leur couverture multi-communale.
|
||||
|
||||
### 5. Isle d'Abeau
|
||||
|
||||
Géocodé via "Isle d'Abeau, France" → résultat Nominatim accepté (commune de Villefontaine, Isère).
|
||||
|
||||
### 6. Saint-Ouen (Archicréé)
|
||||
|
||||
Localisé Saint-Ouen selon A-biblio (88 bd de la Villette = adresse Paris 19e). Conservé tel quel.
|
||||
|
||||
### 7. Fonction "Économique" (FAIRE)
|
||||
|
||||
Utilisé pour FAIRE (programme de financement/accélération). Présent dans la taxonomie G. Maintenu.
|
||||
|
||||
## Décisions taxonomiques échelle
|
||||
|
||||
| Entité | Échelle retenue | Justification |
|
||||
|--------|-----------------|---------------|
|
||||
| CROA régionaux (8) | Régional | Compétence régionale explicite |
|
||||
| CAUE (5 + FN CAUE) | Régional / National | Départemental mais couverture régionale |
|
||||
| Plan Libre | Régional | Journal Occitanie uniquement |
|
||||
| Réseau des MA | National | Fédère 32 MA nationales |
|
||||
| Collectif Fil | Régional | Nantes, ancrage territorial clair |
|
||||
| Collectif Etc | National | Itinérant, pas d'ancrage fixe |
|
||||
| FAIRE | Régional | Paris / Arsenal spécifiquement |
|
||||
|
||||
## Recommandations — 3 fiches pour test pipe IA
|
||||
|
||||
1. **CNOA** (`architectes.org`) — entité principale, site riche et structuré, toutes les fonctions couvertes → test idéal du worker d'enrichissement Mistral Nemo
|
||||
2. **Archireport** (`archireport.com`) — outil SaaS avec page produit structurée → teste la diversité de traitement "outil" vs "institution"
|
||||
3. **Collectif Fil** (`collectif-fil.fr`) — petite structure régionale, site associatif simple → teste la robustesse sur sites moins riches + géolocalisation régionale
|
||||
|
||||
## URLs à vérifier manuellement avant import
|
||||
|
||||
- URLs CROA régionaux (Bretagne, AuRA, Nouvelle-Aquitaine, Grand Est, HDF) : reconstruites par pattern — confirmer sur architectes.org/les-17-conseils-regionaux
|
||||
- Podcast "Dans la tête d'un archi" : URL ausha approximative
|
||||
- Podcast "Fondations" (Solène Sillière) : URL Spotify approximative
|
||||
- Réseau Burn Out : vérifier l'activité française réelle
|
||||
54
V2-cadrage/seed-test-pipe-ia.json
Normal file
54
V2-cadrage/seed-test-pipe-ia.json
Normal file
@@ -0,0 +1,54 @@
|
||||
[
|
||||
{
|
||||
"nom": "CNOA — Conseil National de l'Ordre des Architectes",
|
||||
"url": "https://www.architectes.org",
|
||||
"description": "Corps réglementaire regroupant les 30 500 architectes inscrits ; registre national, déontologie, formations, ressources juridiques.",
|
||||
"echelle": "National",
|
||||
"fonctions": [
|
||||
"Juridique",
|
||||
"Administratif",
|
||||
"Gestion d'agence"
|
||||
],
|
||||
"territoire": "Métropole",
|
||||
"ville": "Paris",
|
||||
"lat": 48.8534951,
|
||||
"lon": 2.3483915,
|
||||
"status": "published",
|
||||
"geocoding_failed": false,
|
||||
"source_note": "A-biblio section nat-institutionnel"
|
||||
},
|
||||
{
|
||||
"nom": "Archireport",
|
||||
"url": "https://www.archireport.com",
|
||||
"description": "Logiciel suivi chantier 24 000 utilisateurs ; rapports, réserves, OPR, multi-plateformes.",
|
||||
"echelle": "National",
|
||||
"fonctions": [
|
||||
"Chantier",
|
||||
"Technique"
|
||||
],
|
||||
"territoire": "Métropole",
|
||||
"ville": null,
|
||||
"lat": null,
|
||||
"lon": null,
|
||||
"status": "published",
|
||||
"geocoding_failed": false,
|
||||
"source_note": "A-biblio section outils-plateformes"
|
||||
},
|
||||
{
|
||||
"nom": "Collectif Fil",
|
||||
"url": "http://collectif-fil.fr",
|
||||
"description": "Collectif architects-urbanistes-chercheurs fondé 2013 ; transformation des territoires habités.",
|
||||
"echelle": "Régional",
|
||||
"fonctions": [
|
||||
"Technique",
|
||||
"Développement"
|
||||
],
|
||||
"territoire": "Métropole",
|
||||
"ville": "Nantes",
|
||||
"lat": 47.2186371,
|
||||
"lon": -1.5541362,
|
||||
"status": "published",
|
||||
"geocoding_failed": false,
|
||||
"source_note": "A-biblio section entraide-solidaire"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user