Plan d'implémentation
PD-233 : Communication publique pré-INPI
Références contractuelles : - PD-233-specification.md — Règles impératives - PD-233-annexe-copywriting-fr.md — Source de vérité textuelle (FR) - PD-233-annexe-copywriting-en.md — Source de vérité textuelle (EN)
1. Découpage en composants
1.1 Composants de contenu (Source de vérité)
| Composant | Responsabilité | Source |
| CopywritingRegistry (FR) | Registre des textes canoniques FR | PD-233-annexe-copywriting-fr.md |
| CopywritingRegistry (EN) | Registre des textes canoniques EN | PD-233-annexe-copywriting-en.md |
| ApprovedTermsGlossary | Micro-termes autorisés (§0 annexes) | Annexes FR + EN |
| ForbiddenTermsBlacklist | Termes strictement interdits (§4.2 spec) | PD-233-specification.md |
1.2 Composants de validation
| Composant | Responsabilité | Localisation |
| ContentValidator | Valide conformité spec + annexe | scripts/validate-content.ts |
| TextExactMatcher | Vérifie que le texte affiché = texte annexe | scripts/validate-content.ts |
| ForbiddenTermsDetector | Détecte termes interdits | scripts/validate-content.ts |
| SequencePatternDetector | Détecte descriptions procédurales | scripts/validate-content.ts |
1.3 Composants d'intégration
| Composant | Responsabilité | Localisation |
| PreCommitHook | Validation avant commit | .husky/pre-commit |
| CIPipeline | Validation CI/CD bloquante | .gitlab-ci.yml |
| AuditTrail | Journal des validations | docs/audit/content-reviews.md |
1.4 Pages Astro (périmètre)
Pages FR (annexe-copywriting-fr.md)
| Page | Route | Sections annexe |
| Accueil | /fr/ | §2 |
| Produit | /fr/product/ | §3 |
| Cas d'usage | /fr/use-cases/ | §4 |
| Tarifs | /fr/pricing/ | §5 |
| FAQ | /fr/faq/ | §6 |
| À propos | /fr/about/ | §7 |
| Contact | /fr/contact/ | §8 |
| Mentions légales | /fr/legal/legal-notice/ | §9 |
| Confidentialité | /fr/legal/privacy-policy/ | §10 |
Pages EN (annexe-copywriting-en.md)
| Page | Route | Sections annexe |
| Home | /en/ | §2 |
| Product | /en/product/ | §3 |
| Use Cases | /en/use-cases/ | §4 |
| Pricing | /en/pricing/ | §5 |
| FAQ | /en/faq/ | §6 |
| About | /en/about/ | §7 |
| Contact | /en/contact/ | §8 |
| Legal Notice | /en/legal/legal-notice/ | §9 |
| Privacy Policy | /en/legal/privacy-policy/ | §10 |
2. Flux techniques
2.1 Flux de publication de contenu
┌──────────────────────────────────────┐
│ Rédaction / Modification de contenu │
└──────────────────┬───────────────────┘
│
▼
┌──────────────────────────────────────┐
│ RÈGLE IMPÉRATIVE (annexes §Règles) │
│ Tout texte DOIT être issu de │
│ l'annexe copywriting (FR ou EN) │
└──────────────────┬───────────────────┘
│
┌─────────┴─────────┐
│ Texte dans annexe │
│ ? │
└─────────┬─────────┘
NON │ OUI
▼ │ ▼
┌─────────────┐│┌─────────────────────────┐
│ MODIFIER │││ Implémenter dans Astro │
│ L'ANNEXE │││ avec texte EXACT │
│ D'ABORD │││ │
└─────────────┘│└────────────┬────────────┘
│ │
│ ▼
│┌─────────────────────────┐
││ Pre-commit validation │
││ ├─ TextExactMatcher │
││ ├─ ForbiddenTerms │
││ └─ SequenceDetector │
│└────────────┬────────────┘
│ │
│ ┌────────┴────────┐
│ │ Valide? │
│ └────────┬────────┘
│ NON │ OUI
│ ▼ │ ▼
│ ┌─────────┐│┌───────────┐
│ │ Rejet │││ Commit OK │
│ │ +Motif │││ │
│ └─────────┘│└─────┬─────┘
│ │ │
│ │ ▼
│ │┌───────────┐
│ ││ CI/CD │
│ ││ (2nd val) │
│ │└─────┬─────┘
│ │ │
│ │ ▼
│ │┌───────────┐
│ ││ Deploy │
│ │└───────────┘
2.2 Flux de modification de l'annexe copywriting
┌────────────────────────────────────┐
│ Demande de modification textuelle │
└──────────────────┬─────────────────┘
│
▼
┌────────────────────────────────────┐
│ Vérification spec PD-233 │
│ ├─ Pas de terme interdit (§4.2) │
│ ├─ Pas de séquence procédurale │
│ ├─ Catégorie autorisée (§4.3) │
│ └─ Pas de preuve technique requise │
└──────────────────┬─────────────────┘
│
┌─────────┴─────────┐
│ Conforme spec? │
└─────────┬─────────┘
NON │ OUI
▼ │ ▼
┌─────────────┐│┌─────────────────────┐
│ REJET │││ Modifier annexe │
│ Reformuler │││ (FR ou EN) │
└─────────────┘│└──────────┬──────────┘
│ │
│ ▼
│┌─────────────────────┐
││ MR avec revue │
││ éditoriale │
│└──────────┬──────────┘
│ │
│ ▼
│┌─────────────────────┐
││ Implémenter dans │
││ pages Astro │
│└─────────────────────┘
3. Mapping invariants → mécanismes
3.1 Invariants de la spécification (§4)
| # | Invariant | Mécanisme | Implémentation |
| 1.a | Pas de suite d'étapes techniques numérotées | SequencePatternDetector | Regex : /étape\s*\d/gi, /\d\.\s*[A-Z]/g |
| 1.b | Pas de relation de dépendance entre mécanismes | SequencePatternDetector | Regex : /grâce à.*qui.*permet/gi, /ce qui (déclenche\ | entraîne)/gi |
| 1.c | Pas de description de calcul/dérivation | SequencePatternDetector | Regex : formules, opérateurs, pseudo-code |
| 2 | Termes strictement interdits | ForbiddenTermsDetector | Liste exhaustive ci-dessous |
| 3 | Affirmations = catégories autorisées | CategoryClassifier + revue humaine | Patterns + checklist |
| 4 | Pas de preuve technique interne requise | Revue humaine | Checklist éditoriale |
3.2 Liste des termes interdits (§4.2 spec)
// scripts/validate-content.ts
export const FORBIDDEN_TERMS_FR = [
// Termes exacts (case-insensitive, avec variantes)
'procédé propriétaire',
'procede proprietaire',
'preuve composite',
'auto-vérifiable',
'auto-verifiable',
'autovérifiable',
'autoverifiable',
'merkle',
'agrégation',
'agregation',
'racine', // ATTENTION: faux positifs possibles
'chaîne cryptographique',
'chaine cryptographique',
'algorithme interne',
] as const;
export const FORBIDDEN_TERMS_EN = [
// English equivalents (case-insensitive)
'proprietary process',
'composite proof',
'self-verifiable',
'self verifiable',
'merkle',
'aggregation',
'root', // ATTENTION: false positives possible
'cryptographic chain',
'internal algorithm',
] as const;
export const FORBIDDEN_TERMS = {
fr: FORBIDDEN_TERMS_FR,
en: FORBIDDEN_TERMS_EN,
} as const;
3.3 Termes autorisés (§0 annexes copywriting)
// scripts/validate-content.ts
export const APPROVED_TERMS_FR = [
'coffre-fort probatoire',
'preuve d\'intégrité',
'preuve d'intégrité',
'horodatage certifié',
'scellement cryptographique',
'archivage immuable',
'WORM',
'zero-knowledge',
'souverain',
'européen',
'conformité RGPD',
'NF Z42-013',
'ISO 14641',
'eIDAS',
'horodatage qualifié',
] as const;
export const APPROVED_TERMS_EN = [
'evidentiary vault',
'integrity proof',
'certified timestamp',
'cryptographic sealing',
'immutable archiving',
'WORM',
'zero-knowledge',
'sovereign',
'European',
'GDPR compliance',
'NF Z42-013',
'ISO 14641',
'eIDAS',
'qualified timestamp',
] as const;
export const APPROVED_TERMS = {
fr: APPROVED_TERMS_FR,
en: APPROVED_TERMS_EN,
} as const;
3.4 Règle impérative des annexes
| Règle | Mécanisme | Implémentation |
Texte FR DOIT être issu de annexe-copywriting-fr.md | TextExactMatcher | Comparaison hash MD5 par section |
Texte EN DOIT être issu de annexe-copywriting-en.md | TextExactMatcher | Comparaison hash MD5 par section |
| Toute variation DOIT modifier l'annexe concernée d'abord | Process éditorial | MR obligatoire sur annexe avant code |
| Champs [À RENSEIGNER] / [TO BE FILLED] obligatoires | Validation CI | Détection patterns [À RENSEIGNER], [TO BE FILLED] |
4. Gestion des erreurs
4.1 Codes d'erreur
| Code | Description | Blocage | Action |
E001 | Terme interdit détecté | Oui | Afficher terme + contexte |
E002 | Séquence procédurale détectée | Oui | Afficher extrait + pattern |
E003 | Texte non présent dans annexe (FR ou EN) | Oui | Afficher diff + section annexe |
E004 | Champ [À RENSEIGNER]/[TO BE FILLED] non rempli | Oui | Lister les champs manquants |
W001 | Terme "racine"/"root" en contexte ambigu | Warning | Revue humaine requise |
❌ [E001] Terme interdit détecté
Fichier : src/pages/fr/product.astro:42
Terme : "merkle"
Contexte : "...utilisant un arbre de merkle..."
📖 Référence : PD-233-specification.md §4.2
💡 Action : Reformuler sans mentionner le mécanisme technique
Utiliser une formulation fonctionnelle (cf. annexe §0)
❌ [E003] Texte non conforme à l'annexe copywriting
Fichier : src/pages/fr/index.astro:28
Attendu : "Votre preuve numérique, enfin souveraine."
Trouvé : "Votre preuve numérique, enfin libre."
📖 Référence : PD-233-annexe-copywriting-fr.md §2 Hero H1
💡 Action : (1) Utiliser le texte exact de l'annexe
(2) OU modifier l'annexe d'abord via MR
4.3 Procédure d'exception
- Créer issue avec label
editorial-exception - Justification écrite + référence spec concernée
- Validation par responsable désigné (cf. spec §10)
- Si approuvé : modifier l'annexe copywriting
- Puis implémenter le changement dans le code
5. Impacts sécurité
5.1 Risques identifiés
| Risque | Probabilité | Impact | Mitigation |
| Divulgation de procédé technique | Moyenne | Critique (perte antériorité INPI) | Double validation auto + humaine |
| Contournement pre-commit | Faible | Élevé | CI/CD bloquant obligatoire |
| Texte non canonique publié | Moyenne | Moyen (incohérence) | TextExactMatcher + MR obligatoire |
| Terme interdit dans image/PDF | Moyenne | Élevé | Checklist manuelle assets |
| Combinaison d'infos révélant procédé | Faible | Critique | Revue contextuelle expert IP |
5.2 Mesures de protection
| Mesure | Implémentation |
| Double validation | Pre-commit local + CI/CD distant |
| Source de vérité unique | Annexe copywriting = seul texte autorisé |
| Revue obligatoire | MR requise pour toute modification |
| Audit trail | Log de toutes les publications avec validateur |
| Archivage versionné | Git history = preuve de date publication |
6. Hypothèses techniques
| # | Hypothèse | Impact si fausse | Mitigation |
| H1 | Les annexes copywriting (FR + EN) sont exhaustives pour toutes les pages | Texte non autorisé = bloqué par validation | Compléter l'annexe concernée avant implémentation |
| H2 | Les termes interdits sont définis pour FR et EN | Faux négatifs si traduction incomplète | Maintenir les deux listes en cohérence |
| H3 | Les mots "racine"/"root" sont interdits même hors contexte technique | Faux positifs possibles | Warning + revue humaine |
| H4 | Les assets (images, PDF) ne contiennent pas de texte | Contournement possible | Checklist manuelle obligatoire |
| H5 | Le contenu est géré via Git avec hooks activés | Bypass si hooks désactivés | CI/CD bloquant en dernier recours |
| H6 | Deux versions linguistiques (FR + EN) avec annexes dédiées | Les textes doivent correspondre aux bonnes annexes | Validation distincte par langue |
7. Points de vigilance
7.1 Techniques
7.2 Organisationnels
7.3 Juridiques
8. Implémentation validation
8.1 Script de validation
// scripts/validate-content.ts
interface ValidationResult {
valid: boolean;
errors: ValidationError[];
warnings: ValidationWarning[];
}
interface ValidationError {
code: 'E001' | 'E002' | 'E003' | 'E004';
file: string;
line: number;
message: string;
context: string;
reference: string;
}
type Lang = 'fr' | 'en';
function detectLang(file: string): Lang | null {
if (file.includes('/fr/')) return 'fr';
if (file.includes('/en/')) return 'en';
return null;
}
export async function validateContent(
files: string[]
): Promise<ValidationResult> {
const errors: ValidationError[] = [];
const warnings: ValidationWarning[] = [];
for (const file of files) {
const lang = detectLang(file);
// 1. Vérifier termes interdits (selon la langue)
if (lang) {
const forbiddenResult = checkForbiddenTerms(file, lang);
errors.push(...forbiddenResult.errors);
}
// 2. Vérifier séquences procédurales
const sequenceResult = checkSequencePatterns(file);
errors.push(...sequenceResult.errors);
// 3. Vérifier conformité annexe (FR ou EN)
if (lang === 'fr') {
const annexeResult = checkAnnexeConformity(file, 'annexe-copywriting-fr.md');
errors.push(...annexeResult.errors);
} else if (lang === 'en') {
const annexeResult = checkAnnexeConformity(file, 'annexe-copywriting-en.md');
errors.push(...annexeResult.errors);
}
// 4. Vérifier champs non remplis (FR et EN patterns)
const placeholderResult = checkPlaceholders(file);
errors.push(...placeholderResult.errors);
}
return {
valid: errors.length === 0,
errors,
warnings,
};
}
8.2 Configuration pre-commit
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# Valider le contenu avant commit
npx tsx scripts/validate-content.ts $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(astro|md)$')
if [ $? -ne 0 ]; then
echo "❌ Validation failed. Fix errors before committing."
exit 1
fi
8.3 Configuration CI/CD
# .gitlab-ci.yml (extrait)
validate-content:
stage: test
script:
- npm ci
- npx tsx scripts/validate-content.ts src/pages/**/*.astro
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
9. Checklist de validation manuelle
## Checklist éditoriale pré-INPI
### Conformité spec PD-233
#### Termes interdits (§4.2)
- [ ] Aucun terme de la liste interdite présent (FR)
- [ ] Aucun terme de la liste interdite présent (EN)
- [ ] Aucune variante ou synonyme technique
- [ ] Vérification contextuelle de "racine"/"root" si présent
#### Structure (§4.1)
- [ ] Pas de séquence numérotée technique
- [ ] Pas de relation cause-effet entre mécanismes
- [ ] Pas de pseudo-code ou formule
#### Catégorisation (§4.3)
- [ ] Chaque affirmation = garantie fonctionnelle
OU propriété déclarative
OU engagement organisationnel
- [ ] Aucune affirmation nécessitant preuve technique
### Conformité annexes copywriting
#### Textes FR
- [ ] Tout texte FR = copie exacte de `annexe-copywriting-fr.md`
- [ ] Aucune reformulation non autorisée
- [ ] Aucun ajout non documenté
#### Textes EN
- [ ] Tout texte EN = copie exacte de `annexe-copywriting-en.md`
- [ ] Aucune reformulation non autorisée
- [ ] Aucun ajout non documenté
#### Champs obligatoires
- [ ] Tous les [À RENSEIGNER] sont remplis (FR)
- [ ] Tous les [TO BE FILLED] sont remplis (EN)
### Assets
- [ ] Images/schémas non exploitables
- [ ] PDF sans détail technique
- [ ] Aucun texte technique dans les visuels (FR et EN)
### Cohérence
- [ ] Mentions légales = mêmes infos que confidentialité (FR)
- [ ] Mentions légales = mêmes infos que confidentialité (EN)
- [ ] Footer = mêmes infos sur toutes les pages (FR et EN)
---
**Validateur** : _______________
**Date** : _______________
**Pages validées FR** : _______________
**Pages validées EN** : _______________
10. Planning de déploiement
Phase 1 : Outillage (Jour 1-2)
Phase 2 : Audit contenu existant (Jour 3)
Phase 3 : Documentation (Jour 4)
Phase 4 : Opérationnel (Continu)
11. Critères de succès
| Critère | Mesure | Cible |
| Termes interdits détectés (FR + EN) | Taux détection auto | 100% |
| Conformité annexe FR | Texte exact respecté | 100% |
| Conformité annexe EN | Texte exact respecté | 100% |
| Faux positifs | Warnings par semaine | < 3 |
| Temps validation (FR + EN) | Durée pre-commit | < 3s |
| Couverture revue | MR avec revue éditoriale | 100% |
| Champs [À RENSEIGNER] / [TO BE FILLED] | Remplis avant publication | 100% |