Aller au contenu

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

4.2 Format des messages d'erreur

❌ [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

  1. Créer issue avec label editorial-exception
  2. Justification écrite + référence spec concernée
  3. Validation par responsable désigné (cf. spec §10)
  4. Si approuvé : modifier l'annexe copywriting
  5. 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

  • Faux positifs "racine"/"root" : Ces termes peuvent apparaître dans des contextes non techniques ("racine du problème", "root cause"). Implémenter détection contextuelle ou warning avec revue humaine.
  • Synchronisation annexes ↔ code : Risque de désynchronisation si une annexe (FR ou EN) est modifiée sans mettre à jour le code (ou inversement). Le TextExactMatcher doit détecter les écarts pour chaque langue.
  • Cohérence FR/EN : Les termes interdits et autorisés doivent être maintenus en cohérence entre les deux langues. Ajouter une vérification de symétrie.
  • Performance validation : La validation (FR + EN) doit rester < 3s pour ne pas bloquer le workflow développeur.
  • Assets binaires : PDF avec texte, images avec texte intégré ne sont pas analysables automatiquement. Checklist manuelle requise (FR et EN).

7.2 Organisationnels

  • Responsable éditorial : Identifier le validateur final avant publication (cf. spec §10 - point à clarifier).
  • Bascule post-INPI : Préparer le switch vers PD-234-specification.md dès dépôt INPI effectué.
  • Formation contributeurs : Tous les développeurs doivent connaître le workflow annexe-first (FR et EN).
  • Champs [À RENSEIGNER] / [TO BE FILLED] : Le Product Owner / Legal doit fournir les valeurs obligatoires pour les deux langues avant publication.
  • Qualité de traduction : Assurer la relecture native de l'annexe EN avant finalisation.

7.3 Juridiques

  • Validation avocat IP : Faire valider la liste des termes interdits par un conseil en propriété intellectuelle.
  • Archivage pré-bascule : Versionner l'état du site avant passage en mode post-INPI pour preuve de date.
  • Cohérence pages légales : Les mentions légales et politique de confidentialité doivent utiliser les mêmes informations (cf. spec §7 critère 4).

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)

  • Créer scripts/validate-content.ts
  • Implémenter ForbiddenTermsDetector
  • Implémenter SequencePatternDetector
  • Configurer pre-commit hook
  • Ajouter job CI/CD

Phase 2 : Audit contenu existant (Jour 3)

  • Lancer validation sur toutes les pages FR
  • Lancer validation sur toutes les pages EN
  • Identifier les non-conformités
  • Corriger les écarts annexes ↔ code

Phase 3 : Documentation (Jour 4)

  • Finaliser checklist éditoriale
  • Documenter le workflow annexe-first
  • Former les contributeurs

Phase 4 : Opérationnel (Continu)

  • Activer validation bloquante
  • Monitorer les exceptions
  • Préparer bascule post-INPI

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%