---
suivi: 1330
date: 2026-08-13
sujet: fix_journal_public_groupes_string
chantier: journal-mises-a_jour
type: fix
statut: poussé
hash: e4134e7c
fichiers:
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tools/diag/diag_journal_shape_1330.php
  - docs/suivi/SUIVI_1330_fix_journal_public_groupes.md
---

## PROMPT ENVOYÉ

SUIVI #1330 — `journal:sync` échoue en prod : `public_groupes` string `"tous"`
sur l’entrée #1329. Corriger, auditer toutes les entrées, mécanisme anti-récidive,
documenter dette chaîne `&&` / OPcache. Ne toucher que le fichier journal (+
validation si besoin).

## SYNTHÈSE

### Cause
Entrée `dashboard-widgets-chargement-1329-2026-08-13` : `'public_groupes' => 'tous'`
(string). `assertEntryShape` refuse → sync s’arrête → pas d’écritures journal +
chaîne déploiement `&&` bloque le `touch` OPcache.

### OBJET 1
- Corrigé en `['tous']`.
- Audit fichier : **1 seule** occurrence malformée (celle du #1329). Aucune autre
  `'public_groupes' => '…'` string.
- Clés contraintes `assertEntryShape` : obligatoires `code`, `date_maj`, `titre`,
  `description`, `public_groupes` ; strings pour les 4 premières ; `public_groupes`
  = `list<string>` ; `sujet` optionnel string.
- Entrées #1311–#1329 présentes dans le fichier (sauf 1324/1327/1328 sans journal
  volontaire ; #1326 entrée présente en WIP concurrent, préservée). Toutes
  conformes après correction. Aucune entrée antérieure disparue vs origin/main
  (missing=0).

### OBJET 2 — moyen retenu
**Test PHPUnit existant** `JournalMiseAJourSyncValidationTest::catalogue_post_fichier_valide_apres_correction`
(+ test chaîne malformée) — déjà ajouté au #1094.
- **Pourquoi** : couvre TOUT le fichier, sans assouplir le validateur, sans nouvelle
  commande. Déjà exécuté en local (4 passed).
- **Écartés** : nouvelle commande artisan (doublon de `--dry-run` + test) ;
  assouplir le validateur (interdit) ; contrôle supplémentaire dans la commande
  (déjà via `fuseContiguousEntries` → `assertEntryShape`).
- Gate locale avant push journal : `php artisan test --filter=JournalMiseAJourSyncValidationTest`
  et/ou `php artisan journal:sync --dry-run`.

### OBJET 3 — dette méthode (non corrigée)
Séquence déploiement `… && journal:sync && find … touch` : un échec sync empêche
la purge OPcache. À traiter dans la procédure de déploiement (ne pas chaîner une
étape critique derrière une commande métier faillible), pas dans ce lot.

### Entrée #1330
`journal-public-groupes-forme-1330-2026-08-13` avec `public_groupes => ['tous']`
(conforme).

### Note zone commune
Entrée WIP `#1326` (`reprise-siwi-actions-erp-1326-…`) déjà dans le fichier au
moment du fix : **préservée** (anti-écrasement #1270).

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan journal:sync
php artisan optimize:clear
php artisan view:clear
# puis purge OPcache (touch) même si sync était le point bloquant
```

## LEÇON
`public_groupes` = **toujours** un tableau PHP (`['tous']`). Le test #1094 existe :
le lancer avant tout push qui touche le fichier journal. Récidive #1094 → #1330.
