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 :

  1. Template éditable : Syndic édite template Word/HTML (via éditeur WYSIWYG)

  2. Variables dynamiques : {{building.name}}, {{meeting.date}}, {{owner.name}}

  3. Génération PDF : 1 clic → PDFs personnalisés (1 par copropriétaire)

  4. Envoi email : Automatique via SendGrid (tracking ouverture)

  5. 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 :

  1. Page “Nouvelle AG” → Remplir date, heure, agenda

  2. Onglet “Convocation” → Éditeur WYSIWYG (template préchargé)

  3. Éditer template : Insérer variables (dropdown {{...}})

  4. Prévisualiser PDF (1 copropriétaire exemple)

  5. Clic “Générer convocations” → Loader 5s

  6. Liste PDFs générés (1 par copropriétaire, download individuel)

  7. Clic “Envoyer par email” → Confirmation modal → Envoi SendGrid

  8. 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 :

  1. Feature flag ENABLE_CONVOCATIONS (défaut: false)

  2. Déploiement progressif : 10% copropriétés → 50% → 100% (2 semaines)

  3. Monitoring Grafana : Taux erreur, P99 génération, taux ouverture emails

  4. Trigger rollback : Taux erreur > 5% OU P99 > 10s OU feedback négatif > 20%

  5. 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 :

  1. 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 {{...}})

  2. 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)

  3. 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 :

  1. ✅ Tests unit coverage > 90% (domain + application)

  2. ✅ Tests integration PostgreSQL + MinIO (testcontainers)

  3. ✅ Tests E2E Playwright (full workflow)

  4. ✅ Performance P99 < 5s (génération 50 PDFs)

  5. ✅ Security audit OK (cargo audit, npm audit)

  6. ✅ RGPD compliant (PDFs chiffrés AES-256, logs anonymisés)

  7. ✅ Documentation Sphinx mise à jour (API, user guide)

  8. ✅ Déployé staging (smoke tests OK)

Critères non-fonctionnels

[Critères performance, sécurité, UX, etc.]

Exemple :

  1. Performance : P99 < 5s (génération 50 PDFs, backend)

  2. Scalabilité : Support 1.000 copropriétés × 4 AG/an = 4.000 générations/an

  3. Disponibilité : 99.9% uptime (monitoring Grafana)

  4. Sécurité : Sanitize HTML templates (XSS protection), HTTPS only

  5. Accessibilité : WYSIWYG editor WCAG 2.1 AA (keyboard navigation)

  6. UX : Mobile-friendly (responsive < 768px)

Processus Revue RFC

Soumission

  1. Créer fichier RFC : docs/governance/rfc/XXXX-titre-court.rst (copier template)

  2. Numéroter : XXXX = numéro séquentiel (check dernière RFC, +1)

  3. Rédiger : Compléter toutes sections (min 80% rempli)

  4. Commit : Branch rfc/XXXX-titre-court, commit, push

  5. Pull Request : Ouvrir PR vers main, tag rfc, assigner reviewers

Revue communauté

  1. GitHub Discussions : Créer discussion liée PR (commentaires asynchrones)

  2. Durée revue : 7 jours min (permettre contributeurs distributed de répondre)

  3. Reviewers : NIT (PO + SM + Tech Leads) + communauté (tous contributeurs)

  4. 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 → Accepted

  • Merge PR

  • Créer issues GitHub (décomposition tâches)

  • Ajouter Sprint Backlog (si prioritaire)

Rejected :

  • Statut → Rejected

  • Ajouter section “Raisons rejet” (justification obligatoire)

  • Merge PR (archiver, traçabilité)

  • Close issues liées

Post-implémentation

Implemented :

  • Statut → Implemented

  • Ajouter 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

RFCs liées :

  • RFC-XXXX : [Titre RFC dépendance]

ADRs liées :

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 :

Instructions utilisation template :

  1. Copier ce fichier : cp template.rst XXXX-votre-titre.rst

  2. Numéroter : Remplacer XXXX par numéro séquentiel (ex: 0001, 0042)

  3. Remplir : Compléter TOUTES sections (supprimer exemples)

  4. Commit : Branch rfc/XXXX-titre, PR vers main

  5. Soumettre : 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