RFC XXXX: [Titre Court de la Proposition]
- RFC:
XXXX
- Auteur:
[Votre Nom] <email@example.com>
- Date:
AAAA-MM-JJ
- Statut:
Draft
- Type:
[Feature / Architecture / Process]
- Équipes:
[backend, frontend, infra, ia]
- Jalon:
[1, 2, 3, 4, 5, 6]
Résumé (TL;DR)
[1-3 phrases décrivant la proposition de manière concise.]
Exemple :
Cette RFC propose d’intégrer le protocole MCP (Model Context Protocol) pour créer un réseau décentralisé de compute edge, permettant aux participants KoproGo de monétiser leurs ressources (Raspberry Pi, vieux laptops) en échange de revenus IA. Impact : 0 CO₂ cloud, revenus distribués (80% développement, 20% fonds solidarité).
Métadonnées
RFC |
XXXX (numéro séquentiel) |
Auteur |
[Nom Complet] <email@example.com> |
Date création |
AAAA-MM-JJ |
Statut |
Draft | Review | Accepted | Rejected | Implemented | Deprecated |
Type |
Feature (nouvelle fonctionnalité) | Architecture (changement archi) | Process (processus organisationnel) |
Équipes impliquées |
[backend, frontend, infra, ia] (sélectionner équipes concernées) |
Jalon cible |
[1-6] (voir ROADMAP.md) |
Priorité |
P0 (blocker) | P1 (high) | P2 (medium) | P3 (low) |
Effort estimé |
[Sprints] (ex: 2 sprints, 1 mois, 3 mois) |
Dépendances |
RFC-XXXX (si dépend autre RFC), ADR-XXXX (si dépend ADR) |
Statuts RFC
Statut |
Signification |
Actions |
|---|---|---|
Draft |
Rédaction en cours |
Auteur rédige, peut demander feedback informel |
Review |
Soumis pour revue communauté |
Commentaires GitHub Discussions, review 7j min |
Accepted |
Approuvé, prêt implémentation |
Passe en Sprint Backlog, création issues GitHub |
Rejected |
Refusé (justification obligatoire) |
Archivé, raisons documentées |
Implemented |
Implémenté et déployé production |
Archivé, lien vers PR/release |
Deprecated |
Obsolète (remplacé par autre RFC) |
Archivé, lien RFC remplaçante |
Contexte et Problème
Problème adressé
[Décrire le problème métier ou technique que cette RFC résout.]
Format recommandé :
Qui est affecté ? (utilisateurs, équipes, stakeholders)
Quelle douleur ? (inefficacité, coût, risque)
Impact si non résolu ? (quantifié si possible)
Exemple :
Qui : Syndics et copropriétaires
Problème : La génération des convocations d’assemblée générale (AG) est entièrement manuelle (Word, copier-coller adresses), prend 2-4 heures par AG, et génère des erreurs (mauvaise adresse, oubli copropriétaire).
Impact si non résolu :
Temps perdu syndics : 4h × 4 AG/an = 16h/an/copropriété
Erreurs légales : 5% AG invalidées (convocation incomplète)
Frustration copropriétaires : Retards, mauvaises infos
Contexte organisationnel
[Expliquer le contexte KoproGo : jalon actuel, contraintes, opportunités.]
Exemple :
Jalon actuel : 3 (Impact, 1.000 copropriétés)
Contrainte : Budget serré (5€/mois/copropriété, marge 98%)
Opportunité : 1.000 copropriétés = 4.000 AG/an = 16.000h syndics perdues = ROI énorme
Alignement roadmap : Jalon 3 cible “Assemblées numériques complètes”
Pourquoi maintenant ?
[Justifier le timing : pourquoi cette RFC maintenant, pas avant/après ?]
Exemple :
Jalon 2 (Viabilité) terminé → Comptabilité PCMN opérationnelle
500 copropriétés demandent feature AG (top feedback Sprint Review)
Compétition : 2 concurrents lancent feature similaire (urgence stratégique)
Solution Proposée
Vue d’ensemble
[Décrire la solution de manière concise, compréhensible par non-devs.]
Exemple :
Implémenter un système de génération automatique de convocations AG :
Template éditable : Syndic édite template Word/HTML (via éditeur WYSIWYG)
Variables dynamiques :
{{building.name}},{{meeting.date}},{{owner.name}}Génération PDF : 1 clic → PDFs personnalisés (1 par copropriétaire)
Envoi email : Automatique via SendGrid (tracking ouverture)
Archivage légal : PDFs stockés MinIO (10 ans, RGPD-compliant)
Détails techniques
[Décrire implémentation technique détaillée (architecture, stack, patterns).]
Format recommandé :
Architecture (diagrammes, composants)
Stack technique (langages, frameworks, libraries)
API endpoints (si applicable)
Database schema (migrations SQL)
Tests (stratégie, coverage cible)
Exemple :
Architecture:
┌─────────────────┐
│ Frontend │
│ - Editor WYSIWYG (TinyMCE)
│ - Preview PDF │
└────────┬────────┘
│ POST /meetings/:id/generate-convocations
┌────────▼────────┐
│ Backend │
│ - TemplateEngine (Handlebars)
│ - PDF Generator (wkhtmltopdf)
│ - Email Service (SendGrid)
└────────┬────────┘
│
┌────────▼────────┐
│ Infrastructure │
│ - MinIO (storage PDFs)
│ - PostgreSQL (templates, logs)
└─────────────────┘
Stack:
- Backend: Rust + handlebars-rust + wkhtmltopdf-rs
- Frontend: Svelte + TinyMCE (WYSIWYG editor)
- Storage: MinIO S3-compatible (chiffrement AES-256)
- Email: SendGrid API (tracking + analytics)
API Endpoints:
- POST /api/v1/meetings/:id/templates (create/update template)
- GET /api/v1/meetings/:id/templates (retrieve template)
- POST /api/v1/meetings/:id/generate-convocations (generate PDFs)
- GET /api/v1/meetings/:id/convocations (list generated PDFs)
- POST /api/v1/meetings/:id/send-convocations (send emails)
Database Schema (migration):
```sql
CREATE TABLE meeting_templates (
id UUID PRIMARY KEY,
meeting_id UUID REFERENCES meetings(id),
template_html TEXT NOT NULL,
variables JSONB, -- {'building.name', 'meeting.date', ...}
created_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ
);
CREATE TABLE convocations (
id UUID PRIMARY KEY,
meeting_id UUID REFERENCES meetings(id),
owner_id UUID REFERENCES owners(id),
pdf_path TEXT NOT NULL, -- MinIO path
sent_at TIMESTAMPTZ,
opened_at TIMESTAMPTZ, -- SendGrid webhook
created_at TIMESTAMPTZ
);
```
Tests:
- Unit: TemplateEngine rendering (100% coverage)
- Integration: PDF generation + MinIO upload
- E2E: Full workflow (edit template → generate → send → verify email)
- BDD: Cucumber scenario "Generate convocation for AG"
Interfaces utilisateur
[Décrire UX/UI : wireframes, mockups, user flows.]
Exemple :
User Flow Syndic :
Page “Nouvelle AG” → Remplir date, heure, agenda
Onglet “Convocation” → Éditeur WYSIWYG (template préchargé)
Éditer template : Insérer variables (dropdown
{{...}})Prévisualiser PDF (1 copropriétaire exemple)
Clic “Générer convocations” → Loader 5s
Liste PDFs générés (1 par copropriétaire, download individuel)
Clic “Envoyer par email” → Confirmation modal → Envoi SendGrid
Dashboard : Taux ouverture emails (temps réel)
Wireframe : (insérer mockup Figma/Excalidraw)
Impact et Métriques
Impact métier
[Quantifier impact pour utilisateurs, ASBL, et écologie.]
Métrique |
Avant RFC |
Après RFC |
|---|---|---|
Temps génération convocations |
4h manuelle |
10 min automatique |
Erreurs convocations |
5% AG (adresses, oublis) |
0% (automatique) |
Coût syndic |
4h × 50€/h = 200€/AG |
10 min × 50€/h = 8€/AG |
Satisfaction copropriétaires |
6/10 (retards, erreurs) |
9/10 (rapide, pro) |
ROI ASBL :
1.000 copropriétés × 4 AG/an = 4.000 AG
Économie : 192€/AG × 4.000 AG = 768.000€/an (temps syndics)
Coût développement : 2 sprints × 4 devs × 20h = 160h → 8.000€ équivalent
ROI : 768k€ / 8k€ = 96x 🚀
Impact technique
[Quantifier impact performance, CO₂, maintenance.]
Métrique |
Avant RFC |
Après RFC |
|---|---|---|
Performance P99 |
N/A (manuel) |
< 5s génération PDF |
CO₂/convocation |
~10g (Word, email manuel) |
0,5g (backend + SendGrid) |
Storage |
0 (rien archivé) |
2MB/AG × 4.000 AG = 8GB/an |
Maintenance |
0 (pas de code) |
Faible (libs stables) |
Dette technique :
➕ Ajoute dépendance wkhtmltopdf (binary externe)
➕ Ajoute complexité templates (Handlebars)
➖ Réduit dette UX (feature demandée top 3)
Impact roadmap
[Expliquer impact sur jalons, autres RFCs, dépendances.]
Exemple :
Jalon 3 : Bloqueur (AG numériques = promesse jalon 3)
RFC-0042 (Signatures électroniques) : Dépendance (convocation = 1ère étape, signature = 2ème)
ADR-0015 (Document storage) : Impacté (MinIO déjà choisi, OK)
Alternatives Considérées
Alternative 1 : [Nom Alternative]
Description : [Décrire alternative]
Avantages :
➕ [Avantage 1]
➕ [Avantage 2]
Inconvénients :
➖ [Inconvénient 1]
➖ [Inconvénient 2]
Décision : ❌ Rejetée (justification)
Exemple :
Alternative 1 : Intégration Google Docs API
Description : Utiliser Google Docs pour templates, export PDF via Google API
Avantages :
➕ Éditeur Google Docs = familier utilisateurs
➕ Pas de lib PDF à maintenir (Google gère)
Inconvénients :
➖ Dépendance externe (Google) = risque souveraineté données
➖ Coût Google Workspace API (0,01$/requête × 4.000 AG = 40$/an)
➖ Latence (appel externe, P99 > 500ms)
➖ RGPD : Données passent par USA (non conforme)
Décision : ❌ Rejetée (souveraineté + RGPD)
Alternative 2 : [Nom Alternative]
[Même structure que Alternative 1]
Alternative 3 : Ne rien faire
Description : Garder processus manuel actuel
Avantages :
➕ 0 développement (0 coût)
➕ Pas de dette technique
Inconvénients :
➖ Perte compétitive (concurrents ont feature)
➖ Frustration utilisateurs (top demande)
➖ Temps perdu syndics (768k€/an)
Décision : ❌ Rejetée (ROI 96x trop élevé pour ignorer)
Risques et Mitigation
Risques techniques
Risque |
Impact |
Mitigation |
Probabilité |
|---|---|---|---|
wkhtmltopdf cassé (update OS) |
Bloque génération PDF |
Dockerize (version fixe), tests CI |
Faible |
SendGrid quota dépassé |
Emails non envoyés |
Monitoring + alertes, upgrade plan auto |
Moyenne |
MinIO storage full |
Échec upload PDF |
Monitoring disk, rotation auto (> 10 ans) |
Faible |
Template XSS injection |
Sécurité (script malveillant) |
Sanitize HTML (DOMPurify), CSP headers |
Moyenne |
Total risque : Moyen (mitigations en place)
Risques métier
Risque |
Impact |
Mitigation |
Probabilité |
|---|---|---|---|
Adoption faible (syndics préfèrent Word) |
ROI non atteint |
Onboarding vidéo, support chat |
Faible |
Bugs légaux (convocation invalide) |
AG annulée, risque juridique |
Review legal expert, tests exhaustifs |
Faible |
Performance lente (> 10s génération) |
UX dégradée |
Benchmarks CI, optimisation async |
Moyenne |
Total risque : Faible-Moyen
Plan de Rollback
[Décrire comment revenir en arrière si échec production.]
Exemple :
Feature flag
ENABLE_CONVOCATIONS(défaut: false)Déploiement progressif : 10% copropriétés → 50% → 100% (2 semaines)
Monitoring Grafana : Taux erreur, P99 génération, taux ouverture emails
Trigger rollback : Taux erreur > 5% OU P99 > 10s OU feedback négatif > 20%
Rollback : Feature flag → false (1 min), redéploiement version N-1 (5 min)
Plan d’Implémentation
Décomposition tâches
[Décomposer RFC en user stories / tasks, estimées.]
Exemple :
ID |
User Story / Task |
Équipe |
Points |
Sprint |
|---|---|---|---|---|
#201 |
Domain: MeetingTemplate entity |
Backend |
3 |
Sprint 15 |
#202 |
Application: GenerateConvocationsUseCase |
Backend |
8 |
Sprint 15-16 |
#203 |
Infrastructure: wkhtmltopdf wrapper |
Backend |
5 |
Sprint 16 |
#204 |
Infrastructure: MinIO upload service |
Backend |
3 |
Sprint 16 |
#205 |
Infrastructure: SendGrid email service |
Backend |
5 |
Sprint 16 |
#206 |
Frontend: WYSIWYG editor (TinyMCE) |
Frontend |
8 |
Sprint 15-16 |
#207 |
Frontend: Preview PDF modal |
Frontend |
5 |
Sprint 16 |
#208 |
Tests E2E: Full workflow |
Backend + Frontend |
8 |
Sprint 17 |
#209 |
Docs: User guide syndic |
Docs |
2 |
Sprint 17 |
#210 |
Infra: MinIO production setup |
Infra |
3 |
Sprint 17 |
Total : 50 points ≈ 2,5 sprints (arrondir 3 sprints)
Jalons (Milestones)
Jalon |
Livrable |
Date cible |
Statut |
|---|---|---|---|
M1 |
Backend API génération PDF (mockup) |
Sprint 15 (S2) |
⏳ Pending |
M2 |
Frontend WYSIWYG + preview |
Sprint 16 (S2) |
⏳ Pending |
M3 |
Intégration complète + tests E2E |
Sprint 17 (S1) |
⏳ Pending |
M4 |
Déploiement staging + beta test (10 copropriétés) |
Sprint 17 (S2) |
⏳ Pending |
M5 |
Production (100% copropriétés) |
Sprint 18 (S1) |
⏳ Pending |
Dépendances
[Lister dépendances externes, RFCs, ADRs.]
Exemple :
ADR-0044 : Document Storage Strategy (MinIO) → ✅ Accepté
Infra : SendGrid production account (quota 10k emails/mois) → ⏳ En cours setup
Design : Mockups WYSIWYG editor → ⏳ Attente designer bénévole
Legal : Review template légal convocation (avocat ASBL) → ❌ Pas démarré
Critères d’Acceptation
Critères fonctionnels
[Critères acceptation métier, testables.]
Format : Given/When/Then (Gherkin-style)
Exemple :
Template édition
Given : Syndic logged in
When : Navigate to “Nouvelle AG” → Onglet “Convocation”
Then : WYSIWYG editor displayed avec template pré-rempli
And : Variables disponibles (dropdown
{{...}})
Génération PDFs
Given : Template édité et sauvegardé
When : Clic “Générer convocations”
Then : PDFs générés (1 par copropriétaire actif)
And : PDFs stored MinIO (path
/meetings/{id}/convocations/{owner_id}.pdf)And : Generation time < 5s (P99)
Envoi emails
Given : PDFs générés
When : Clic “Envoyer par email”
Then : Emails sent via SendGrid (tracking ID returned)
And : Dashboard shows delivery status (sent, opened, bounced)
Critères techniques
[Critères acceptation techniques, mesurables.]
Exemple :
✅ Tests unit coverage > 90% (domain + application)
✅ Tests integration PostgreSQL + MinIO (testcontainers)
✅ Tests E2E Playwright (full workflow)
✅ Performance P99 < 5s (génération 50 PDFs)
✅ Security audit OK (cargo audit, npm audit)
✅ RGPD compliant (PDFs chiffrés AES-256, logs anonymisés)
✅ Documentation Sphinx mise à jour (API, user guide)
✅ Déployé staging (smoke tests OK)
Critères non-fonctionnels
[Critères performance, sécurité, UX, etc.]
Exemple :
Performance : P99 < 5s (génération 50 PDFs, backend)
Scalabilité : Support 1.000 copropriétés × 4 AG/an = 4.000 générations/an
Disponibilité : 99.9% uptime (monitoring Grafana)
Sécurité : Sanitize HTML templates (XSS protection), HTTPS only
Accessibilité : WYSIWYG editor WCAG 2.1 AA (keyboard navigation)
UX : Mobile-friendly (responsive < 768px)
Processus Revue RFC
Soumission
Créer fichier RFC :
docs/governance/rfc/XXXX-titre-court.rst(copier template)Numéroter : XXXX = numéro séquentiel (check dernière RFC, +1)
Rédiger : Compléter toutes sections (min 80% rempli)
Commit : Branch
rfc/XXXX-titre-court, commit, pushPull Request : Ouvrir PR vers
main, tagrfc, assigner reviewers
Revue communauté
GitHub Discussions : Créer discussion liée PR (commentaires asynchrones)
Durée revue : 7 jours min (permettre contributeurs distributed de répondre)
Reviewers : NIT (PO + SM + Tech Leads) + communauté (tous contributeurs)
Critères approval :
✅ PO approve (alignement vision produit)
✅ 2+ Tech Leads approve (faisabilité technique)
✅ 0 objections majeures non résolues (communauté)
Décision
Accepted :
Statut →
AcceptedMerge PR
Créer issues GitHub (décomposition tâches)
Ajouter Sprint Backlog (si prioritaire)
Rejected :
Statut →
RejectedAjouter section “Raisons rejet” (justification obligatoire)
Merge PR (archiver, traçabilité)
Close issues liées
Post-implémentation
Implemented :
Statut →
ImplementedAjouter liens PR, release notes, docs
Retro : Lessons learned (ce qui a bien/mal marché)
Deprecated :
Si RFC remplacée : Statut →
Deprecated, lien RFC remplaçante
Références
TOGAF ADM pour KoproGo ASBL : TOGAF ADM (architecture d’entreprise)
Nexus Framework pour KoproGo : Nexus (coordination équipes)
Cérémonies Scrum Locales - KoproGo : Scrum local (sprints, DoD)
KoproGo - Roadmap par Capacités : Roadmap par jalons
RFCs liées :
RFC-XXXX : [Titre RFC dépendance]
ADRs liées :
ADR 0001: Rust and Actix-web for Backend : Choix stack backend
Issues GitHub :
#XXX : [Issue GitHub liée]
Annexes
Annexe A : Diagrammes
[Insérer diagrammes architecture, séquence, etc.]
Exemple :
Séquence génération convocations:
Syndic → Frontend : Clic "Générer"
Frontend → Backend : POST /meetings/:id/generate-convocations
Backend → PostgreSQL : Fetch meeting + owners
Backend → Handlebars : Render template × N owners
Backend → wkhtmltopdf : Generate PDFs × N
Backend → MinIO : Upload PDFs
Backend → PostgreSQL : Insert convocations records
Backend → Frontend : 200 OK {pdf_urls: [...]}
Frontend → Syndic : Display PDF list
Annexe B : Benchmarks
[Insérer résultats benchmarks performance.]
Exemple :
Benchmark génération 50 PDFs (Criterion):
test generate_50_pdfs ... bench: 3,245 ms/iter (+/- 234 ms)
Breakdown:
- Template rendering (Handlebars): 450 ms
- PDF generation (wkhtmltopdf): 2,100 ms
- MinIO upload: 695 ms
P50: 3,1s
P99: 4,8s ✅ (< 5s target)
Annexe C : Mockups
[Insérer mockups UI/UX, wireframes.]
Exemple :
Figma : https://figma.com/file/…
Excalidraw : (insérer image PNG)
—
Instructions utilisation template :
Copier ce fichier :
cp template.rst XXXX-votre-titre.rstNuméroter : Remplacer
XXXXpar numéro séquentiel (ex: 0001, 0042)Remplir : Compléter TOUTES sections (supprimer exemples)
Commit : Branch
rfc/XXXX-titre, PR versmainSoumettre : Tag
rfc, assigner reviewers, GitHub Discussions
Critères RFC complète :
✅ Métadonnées remplies (auteur, date, statut, équipes, jalon)
✅ Problème clairement défini (qui, quoi, impact)
✅ Solution détaillée (architecture, stack, API)
✅ Alternatives évaluées (min 2 alternatives + justification rejet)
✅ Impact quantifié (métriques avant/après, ROI)
✅ Risques identifiés + mitigation
✅ Plan implémentation (tâches, sprints, jalons)
✅ Critères acceptation (fonctionnels, techniques, non-fonctionnels)
—
Template RFC KoproGo ASBL - Inspiré de IETF RFC, Rust RFC, Python PEP