---
title: "STATUS — cotejardin-site — 2026-10-03"
date: 2026-10-03
time: "03:36"
author: agent
publishedBy: code
status: pub
tags: ["status", "cotejardin-site"]
---

# STATUS — cotejardin-site

_Article généré automatiquement depuis le STATUS.md de cotejardin-site — 2026-10-03. Les chemins locaux, les hôtes internes et les noms de variables ont été neutralisés._

# STATUS — Côté Jardin

État vivant du projet : **où on en est**, **ce qui reste ouvert**, **ce qui bloque**.

| | |
|---|---|
| **Dernière MAJ** | 2026-08-18 (correction responsive mobile déployée) |
| **Archive historique** | [`docs/archive/status/STATUS-historique-jusqua-2026-08-15.md`](docs/archive/status/STATUS-historique-jusqua-2026-08-15.md) |
| **Reprise session** | [`docs/plan/REPRISE.md`](docs/plan/REPRISE.md) |
| **Matrice de concurrence** | [`docs/plan/00-index.md`](docs/plan/00-index.md) |

> Lire l’**archive** pour le journal détaillé. Une tâche terminée met à jour
> ce tableau **dans le même commit**.

---

## Où en est le site

| | |
|---|---|
| **Production** | Oui — `cotejardin.pizza`, Vague 6 déployée le 15/08/2026 (CMS thèmes + admin apparence + interactions ; code lot I **sur `main`**) |
| **Indexation** | 🔒 `robots.txt` → `Disallow: /` (délibéré jusqu’à la bascule SEO) |
| **HTTPS** | ✅ Certificat valide (`www` compris), revérifié 15/08/2026 |
| **Design** | Proposition C — « Grand & clair » |
| **Carte publique** | Masquée temporairement (**T-096**) ; données internes conservées |
| **Annonce braderie 15 août** | Désactivée (`textes.annonce.actif: false`) |
| **Admin OVH** | Ouverte — `https://cotejardin.pizza/admin/` (ADR-002) |
| **ADR-003 archi** | ✅ **acceptée** (16/08) — revue baseline corrigée |
| **ADR-004 runtime** | ✅ **acceptée** (16/08) — autorité runtime, `sync-app` préserve la runtime |
| **T-090 + T-111** | ✅ **fait, mergé sur `main`** — PR [#6](https://github.com/FGDidou/cotejardin-site/pull/6), commit `4d4c104` (17/08) |
| **Données Yann (B3, B6, allergènes, avis, photos, GPS)** | Hors plan technique par décision FG (17/08) — saisie directe en admin, pas de développement à prévoir. Écrans déjà livrés (lot D). Détail : [§ En attente chez Yann](#en-attente-chez-yann) |
| **Bloquants levés** | B1, B2, B4, B5, B7, B8 |

---

## Synthèse des lots

| Lot | État |
|---|---|
| A–F | ✅ terminés |
| G — Déploiement | ✅ T-060, T-062, T-063 · **T-061** ⬜ |
| H — Bascule SEO | 🔴 attend la saisie admin des données Yann (plus une tâche de dev — § En attente chez Yann) |
| I — CMS natif | ✅ **clos** — T-097…T-107 · Vague 6 **déployée** 15/08 |
| **J — Finalisation qualité** | ✅ **clos** (vagues 0–4, 16/08) — T-120…T-148 · baseline **18/4 🟠** · JS **6060/6144** · plan [`PLAN-lot-J-ultime-2026-08-16.md`](docs/plan/PLAN-lot-J-ultime-2026-08-16.md) |
| **K — Portes qualité** | ✅ **clos** (16/08) — T-150…T-155 · plan [`PLAN-lot-K-portes-qualite-2026-08-16.md`](docs/plan/PLAN-lot-K-portes-qualite-2026-08-16.md) · **pas de deploy OVH** |
| **Cascade runtime portable** | 🔄 **en cours** — T-110 ✅, T-090 ✅, T-111 ✅ (PR [#6](https://github.com/FGDidou/cotejardin-site/pull/6)) · T-112 ✅ recadrée (PR [#7](https://github.com/FGDidou/cotejardin-site/pull/7)) · **T-113 ✅ fait, corrige un bug ADR-004** (17/08, PR en attente) · T-114…T-115 ⬜ GO séparé — objectif v1 stable |

Détail : [`00-index.md`](docs/plan/00-index.md) · lots clos : archive.

---

## Tâches encore ouvertes

### Lot I — CMS natif — **clos**

Presets : `carnet-village`, `comptoir`, `maison-images` ; `fete-locale`
événements. Priorité : événement actif > thème visiteur > `carnet-village`.
**ADR-003 reportée**. Recette : [`cms-recette.md`](docs/reference/cms-recette.md).

| # | Tâche | Statut | Fiche |
|---|---|---|---|
| T-097 | Cadrage CMS / thèmes | ✅ | [`T-097-cadrage-cms-themes.md`](docs/plan/taches/T-097-cadrage-cms-themes.md) |
| T-100 | Modèle / schéma CMS | ✅ | [`T-100-modele-cms.md`](docs/plan/taches/T-100-modele-cms.md) |
| T-103 | Conditions + expiration | ✅ | [`T-103-conditions-expiration.md`](docs/plan/taches/T-103-conditions-expiration.md) |
| T-098 | Thème visiteur mémorisé | ✅ | [`T-098-themes-visiteur.md`](docs/plan/taches/T-098-themes-visiteur.md) |
| T-101 | Rendu + thèmes + pastille | ✅ | [`T-101-rendu-themes.md`](docs/plan/taches/T-101-rendu-themes.md) |
| T-102 | Admin Apparence / Événements | ✅ | [`T-102-admin-apercu-cms.md`](docs/plan/taches/T-102-admin-apercu-cms.md) |
| T-104 | Micro-interactions sûres | ✅ | [`T-104-micro-interactions.md`](docs/plan/taches/T-104-micro-interactions.md) |
| T-105 | Tests + clôture CMS | ✅ | [`T-105-tests-cloture-cms.md`](docs/plan/taches/T-105-tests-cloture-cms.md) |
| T-106 | Allowlist thème visiteur | ✅ | [`T-106-allowlist-theme-visiteur.md`](docs/plan/taches/T-106-allowlist-theme-visiteur.md) |
| T-107 | Retirer CSS mort `.gros-texte` | ✅ | [`T-107-retire-gros-texte-css.md`](docs/plan/taches/T-107-retire-gros-texte-css.md) |

**Vague 6 faite** (15/08) : `deploy` + `sync-app` après `verifier.php` 11/4 🟠.
`robots.txt` inchangé (`Disallow: /`). MDP admin conservé.
Le code lot I est sur **`main`** ; les mentions « pas de commit » du 15/08
désignaient l'absence de commit de clôture dédié au moment du deploy, pas
l'absence du code sur la branche.

### Lot J — Finalisation qualité — **✅ clos** (vagues 0–4, 16/08)

Plan : [`PLAN-lot-J-ultime-2026-08-16.md`](docs/plan/PLAN-lot-J-ultime-2026-08-16.md).
**Vague 1 mergée** (16/08) : T-120, 121, 122, 123, 125, 126, 127, 128, 138, 146 → `main`.
**Vague 2 mergée** (16/08) : T-124, 129, 130, 131, 132, 133, 142, 143, 144, 145 → `main`.
**Vague 3 mergée** (16/08) : T-134, 135, 136, 137, 139, 147, 148 → `main`.
**Vague 4 mergée** (16/08) : T-140, T-141 → `main`. **Lot J clos** — paliers humains : [`REPRISE.md`](docs/plan/REPRISE.md) §3.
Matrice : [`00-index.md`](docs/plan/00-index.md) § Lot J · [`DISPATCH.md`](docs/plan/DISPATCH.md) § Lot J.
**T-044** absorbé par **T-128** ✅.

| # | Tâche | Statut |
|---|---|---|
| T-120 | Retirer djpizza accueil | ✅ |
| T-121 | Lanceur `tests/tous.php` | ✅ |
| T-122 | Garde-fou renforcé | ✅ |
| T-123 | Schéma carte + filtres | ✅ |
| T-125 | Auth admin durci | ✅ |
| T-126 | Publication verrou | ✅ |
| T-127 | API mesure atomique | ✅ |
| T-128 | Purge audience + doc cron | ✅ |
| T-138 | Deploy wrappers sync | ✅ |
| T-146 | Guide admin Apparence | ✅ |

| T-124 | CI GitHub verification | ✅ |
| T-129 | Accueil LCP + meta | ✅ |
| T-130 | Carte noindex + sitemap | ✅ |
| T-131 | Pages légales alignées | ✅ |
| T-132 | JSON-LD Restaurant | ✅ |
| T-133 | Apparence defer + budget | ✅ |
| T-134 | CSS polices contraste | ✅ |
| T-135 | Backups rotation | ✅ |
| T-136 | `.htaccess` sécurité + cache | ✅ |
| T-137 | Verifier baseline 18/4 | ✅ |
| T-139 | Aperçu CSP / mbstring signal | ✅ |
| T-148 | Doc garde sync-app | ✅ |
| T-142 | Hygiène handoff 08 | ✅ |
| T-143 | Tuto admin Apparence | ✅ |
| T-144 | Recette CMS → tous.php | ✅ |
| T-145 | README lot I | ✅ |
| T-147 | Budget JS CMS commentaires | ✅ |
| T-140 | Instantanés régénération | ✅ |
| T-141 | Restauration scénarios doc | ✅ |

Instantanés : `tests/rendu/instantanes.test.php` **32/32** (T-140).

### Lot K — Portes qualité — **✅ clos** (16/08)

Plan : [`PLAN-lot-K-portes-qualite-2026-08-16.md`](docs/plan/PLAN-lot-K-portes-qualite-2026-08-16.md).
Guide : [`portes-qualite-workflow.md`](docs/reference/portes-qualite-workflow.md).
Handoff : [`11-portes-qualite-session-2026-08-16.md`](docs/handoff/11-portes-qualite-session-2026-08-16.md).
Preflight : [`preflight-deploy.md`](docs/reference/preflight-deploy.md).
**Aucun deploy OVH** dans ce lot.

| # | Tâche | Statut |
|---|---|---|
| T-150 | Vague 0 docs + fiches | ✅ |
| T-151 | Baseline machine + CI | ✅ |
| T-152 | Vérifier Possède vs diff | ✅ |
| T-153 | Hooks Cursor + `/.tmp/` | ✅ |
| T-154 | Preflight deploy | ✅ |
| T-155 | Hygiène docs + CI | ✅ |

### Autres ouvertes

| # | Tâche | Statut | Note |
|---|---|---|---|
| T-061 | Mise en ligne `noindex` | ⬜ | `Disallow: /` déjà en place |
| T-070…T-072 | Bascule SEO | 🔴 | Attendent Yann — chemin de fiche |
| T-080 | MySQL OVH | 💡 | Pas de GO |
| T-110 | Autorité runtime + ADR-004 | ✅ | ADR-004 rédigée ; handoffs + CLAUDE.md réconciliés |
| T-090 | Squelette archi (cascade) | ✅ | Mergé sur `main` (PR #6, commit `4d4c104`, 17/08) |
| T-111 | Moteurs appelables (cascade) | ✅ | Mergé sur `main` (PR #6) ; moteurs appelables 17/17 ; `tests/tous.php` 32/33 (33/33 hors pitfall encodage Windows console — non-régression) |
| T-112 | Géométrie runtime OVH | ✅ recadrée | Objectif déjà en prod (T-138) ; recentrée sur les tests manquants — voir fiche § Constat |
| T-113 | Publication transactionnelle | ✅ fait, PR en attente | Corrige un bug ADR-004 réel (`publier()` écrasait la graine) — voir fiche § Constat |
| T-114…T-115 | Suite runtime portable | ⬜ | Prochain GO |

### Clos récemment (ne pas redispatcher)

| # | Note |
|---|---|
| T-149 | ✅ comparatif modèles Lot J livré : `docs/reference/comparatif-modeles-lot-J-2026-08-16.md` (post-Lot J documentaire) |
| T-090…T-092 | Architecture / miroir / mouvement |
| T-093 | ✅ via **T-095** (regex `class="avis"`) |
| T-095 | ✅ corrections post-audit |
| T-096 | ✅ carte masquée |
| T-094 | ✅ instantanés T-101/T-104 ; `instantanes.test.php` 32/32 |
| T-105 | ✅ recette Vague 5 ; Vague 6 déployée 15/08 (code sur `main`) |
| T-106 | ✅ allowlist `cotejardin-theme-visiteur` ; Gros texte retiré |
| T-107 | ✅ CSS mort `.gros-texte` retiré de `styles.css` |

---

## Lot L — Audit croisé (19/08/2026)

Audit croisé multi-agents sur SHA `8a7ee98` : **7 lentilles indépendantes**, en aveugle
les unes des autres, **74 findings**. Rapport complet :
[`docs/reference/audit-croise-2026-08-19.md`](docs/reference/audit-croise-2026-08-19.md).
11 fiches ouvertes, **T-160 … T-170** (bloc T-160…T-179 réservé).
Plan d'action : [`docs/plan/PLAN-lot-L-audit-2026-08-20.md`](docs/plan/PLAN-lot-L-audit-2026-08-20.md)
— **6 décisions FG bloquent le dispatch de 4 fiches sur 11**.

**Trois S0 — ils bloquent le jalon noindex T-061.** Tous rejoués sur copie hors dépôt :

- **A-LEG-03** — les 9 champs `legal.*` mis à `"-"` éteignent l'alerte 🟠 « bloquant B3 »
  (4 → 3) **et** font disparaître du HTML publié la bannière « ne pas mettre en ligne »
  (0 occurrence). C'est le geste le plus naturel de l'écran : faire taire la pastille 🔴.
- **A-LEG-01** — `carte.publiee = true` avec 24 plats sans allergènes → 18 verts, exit 0.
  `tests/tous.php` attraperait, mais **ni `cmd_deploy` ni `preflight_deploy.php` ne le
  lancent** : le filet existe et n'est branché sur aucun chemin de déploiement.
- **A-LEG-02** — cocher les allergènes éteint le 🟠 alors qu'aucun gabarit ne les rend.

**Deux motifs de fond, chacun confirmé par plusieurs lentilles aveugles :**

1. *Un contrôle mesure la forme de la donnée, jamais l'effet publié.*
   `src/inc/validation.php` ne lit jamais `dist/`.
2. *ADR-004 a été écrite, jamais propagée.* `sync-app` écrase la runtime de production
   (`ftp_deploy.py:816`) contre la règle 2 de l'ADR — **redécouvert indépendamment par
   L3 (code) et L7 (docs)**, et la commande a déjà tourné en réel (voir §Dernières
   vérifications). Les règles Cursor l'ignorent, aucun test ne la protège, sa soupape
   `fetch-runtime` n'a jamais été ouverte en fiche.

**7 mutations vérifiées passent la barrière au vert**, dont `robots.txt` `Disallow: /`
→ `Allow: /`, `Options -Indexes` → `+Indexes`, et deux chiffres inversés dans le
téléphone. Supprimer `tests/legal/legaux.test.php` en entier laisse `Baseline conforme.`

**Réserve de fiabilité** : la phase de réfutation croisée n'a pas eu lieu (limite de
session). 11 findings parmi les plus lourds ont été contre-vérifiés par le coordinateur,
dont 2 requalifiés — soit ~18 % de correction sur l'échantillon. **Les S0 et S1 sont
sûrs, tous rejoués** ; les S3 et au-dessous sont solides mais non garantis.

**Correction de mesure** : `tests/tous.php` n'a pas un résultat unique. Le verdict a
basculé **pendant l'audit**, sans qu'une ligne de code change : 34/35 exit 1 pendant les
heures d'ouverture, 35/35 exit 0 après 22 h Paris. `instantanes.test.php` compare un
instantané figé à `data-cms-ouvert="0"` avec une génération fraîche. Toute mesure
publiée doit désormais porter son heure (T-164, T-169).
Piège associé : sous Git Bash Windows, `TZ=Europe/Paris date` n'applique pas le fuseau —
relever l'heure avec PHP et `DateTimeZone("Europe/Paris")`.

**Palier humain prioritaire** : vérifier si un `sync-app` a déjà détruit une saisie de
Yann, en comparant la runtime OVH aux sauvegardes `site-*.json`.

## En attente chez Yann

Bloquent le **lot H**. **Décision FG (17/08) : ce lot de données sort du
plan technique** — plus une entrée de backlog dev à suivre agent par
agent. Les écrans admin qui permettent de les saisir existent déjà
(lot D : `legal.php`, `carte.php`, `avis.php`, `horaires.php`…) ; la
suite se fait **en ligne**, par Yann ou FG, pas par un agent qui
« corrigerait » du code pour ça. Conservé ici comme mémo de contenu,
pas comme tâche à dispatcher.

| | Attendu |
|---|---|
| 🔴 | 9 infos légales — saisissables dans l’admin |
| 🔴 | Allergènes par pizza · modalités sans gluten |
| 🟠 | Avis · réservation / terrasse / congés · fériés |
| 🟠 | Autorisation photos — `docs/handoff/autorisation-droit-image.md` |
| 🟡 | GPS relevés sur place |

Relance : `docs/handoff/questions-yann-telegram.md`.

---

## Dernières vérifications (18/08/2026)

- `php tests/tous.php` → **35/35 au vert** (43 découverts, 8 relayés CMS)
- `php bin/preflight_deploy.php --generer` → **OK** (verifier 18/4 🟠 attendu,
  génération dist 4 pages / 33 ressources)
- deploy OVH exécuté en réel :
  `python scripts/ftp_deploy.py deploy` (**37 fichiers envoyés**, sans miroir)
- sync applicatif/runtime exécuté en réel :
  `python scripts/ftp_deploy.py sync-app` (**136 fichiers envoyés** +
  `cotejardin-donnees/site.json`)
- wrappers admin/api régénérés en réel :
  `python scripts/ftp_deploy.py symlink-admin` (11 wrappers admin +
  `api/mesure.php`)
- contrôles post-deploy : `python scripts/ftp_deploy.py ls` OK ;
  `curl.exe -I https://cotejardin.pizza/` 200,
  `curl.exe -I https://cotejardin.pizza/admin/` 200,
  `curl.exe -I https://cotejardin.pizza/api/mesure.php` 200
- **Paliers humains restants** : cron purge (T-128) · drill T-141 ·
  GO T-112 (suite cascade runtime) · Lot H (attend saisie admin, hors dev)
  — [`REPRISE.md`](docs/plan/REPRISE.md) §3

---

## Ambiguïtés restantes

1. **Collisions de chemins** — lot H portable ; toujours cibler le fichier
   (`00-index` § collisions). Anciens numéros CMS T-064…T-069 → **T-100…T-105** ;
   cascade runtime → **T-110…T-115**.
2. **Allowlist localStorage** — **T-106** : `legaux.test.php` autorise
   `cotejardin-theme-visiteur` et `cotejardin-guide-admin-v1`.
   `cotejardin-gros-texte` n’est plus whitelistée (bouton retiré T-101).

---

## Journal

Historique 13–15/08 gelé dans l’archive. Entrées courtes ici :

- **2026-08-18 — Correction responsive mobile** : le bandeau animé de
  l'accueil créait un scroll horizontal sur petit écran malgré le rognage
  de `body`. Ajout de `overflow-x: clip` sur `html` dans
  `src/assets/styles.css`. Génération et vérification OK (18/4 🟠),
  déploiement réel de 37 fichiers. Contrôle production à 390 px : scroll
  horizontal à 0 sur accueil ; tablette, PC et pages légales sans
  débordement détecté.

- **2026-08-18 — Déploiement v1 exécuté + filière génération directe** :
  extraction des helpers légaux dans `src/inc/gabarits-legaux.php` pour
  supprimer les collisions de fonctions au second rendu ; bascule de la
  publication et de l'aperçu CMS vers `generer_site()` en appel direct
  (plus de sous-processus sur cette filière), avec restauration explicite
  de `COTEJARDIN_SITE_JSON` en fin d'appel. Tests adaptés (`legaux.test.php`
  copie désormais `gabarits-legaux.php` dans son bac ; preuve de mutation
  `conditions-cms.test.php` rendue robuste aux warnings PHP de démarrage).
  Vérifications avant release : `tests/tous.php` 35/35, preflight OK.
  Déploiement réel exécuté : `deploy` (37 fichiers), `sync-app` (136
  fichiers + runtime), `symlink-admin` (wrappers admin/api). Contrôles
  post-deploy : webroot listé en SFTP, endpoints publics/admin/api en 200.

- **2026-08-17 — T-113 publication transactionnelle (corrige un bug
  ADR-004)** : en lisant `publication.php` avant d'écrire du code,
  découverte que l'ancien `publier()` copiait le candidat admin **sur
  `donnees/site.json` du dépôt** avant validation/génération, et ne
  restaurait jamais cette copie sur succès — chaque publication réussie
  écrasait silencieusement la graine versionnée. Exactement le piège que
  l'ADR-004 documente, resté ouvert faute de mise à jour de `publier()`
  après son acceptation. Corrigé : le candidat admin (déjà hors webroot,
  déjà l'autorité runtime par construction ADR-001/002) est validé
  directement via `valider_site()` (T-111) sans jamais toucher
  `donnees/site.json` du dépôt — preuve directe : le dépôt renommé de
  côté pendant tout un appel `publier()`, qui réussit quand même.
  Deuxième découverte en écrivant le test : `generer_site()` (T-111)
  n'est appelable qu'une fois par processus PHP (fonctions globales des
  gabarits légaux qui collisionnent) — un appel direct aurait planté
  chaque worker FPM à sa deuxième publication. Recentré : validation
  directe, génération encore en sous-processus (hors `Possède`,
  `src/gabarits/**`) avec `COTEJARDIN_SITE_JSON` injecté explicitement.
  Promotion release simplifiée : `dist/` n'est mis de côté qu'au tout
  dernier moment (staging séparé), pas pendant toute la génération.
  Nouveau hook de preuve `COTEJARDIN_TEST_EXCEPTION_PROMOTION` (rollback
  entre les deux promotions, jamais testé avant). `verifier.php` 18/4 🟠
  inchangé ; `tests/tous.php` 35/35 ; `persistance.test.php`,
  `publication-verrou.test.php`, `publication-cms.test.php` (T-029/T-126/
  T-102, hors `Possède`) toujours verts sans modification. Pas de merge
  vers `main` : PR ouverte pour relecture FG.
- **2026-08-17 — T-112 recadrée (géométrie runtime OVH)** : à l'ouverture,
  constat que l'objectif principal de la fiche (webroot séparé de
  l'application privée, ADR-002) est **déjà en production** depuis
  **T-138** (16/08, commande `symlink-admin` dans `scripts/ftp_deploy.py`)
  — créer `public/admin/index.php`/`public/api/mesure.php` versionnés
  aurait dupliqué ce mécanisme plutôt que de le tester. Recentrée sur le
  trou réel : aucune preuve automatisée que `ADMIN_WRAPPERS` reste
  synchronisé avec `src/admin/*.php` (dérive = 404 silencieux en prod),
  ni que le générateur de wrapper reste inerte hors SFTP. Livré :
  `tests/technique/geometrie-runtime.test.py` (23 contrôles, dont deux
  preuves négatives — injection dans une cible piégée, écran ajouté hors
  liste) ; petit refactor pur de `ftp_deploy.py`
  (`contenu_wrapper()` extrait, comportement identique, `symlink-admin
  --essai` revérifié). `verifier.php` 18/4 🟠 inchangé ; `tests/tous.php`
  34/34. Fiche T-112 mise à jour avec le constat et les critères
  recentrés. Pas de merge vers `main` : PR ouverte pour relecture FG.
- **2026-08-17 — PR #6 mergée sur `main` + cap v1 stable** : revue des
  6 points de relecture du handoff 12 (autoloader `src/amorce.php`,
  garde-fou d'architecture avec preuve négative, `profil_runtime()`
  refuse source/cible vide, `validerCible()` appelé avant `effacer()`
  dans `generation.php`, adaptateurs CLI `bin/verifier.php`/`bin/generer.php`
  minces, preuve négative § 8 de `moteurs-appelables.test.php` détectée
  en appel direct **et** en sous-processus CLI) — tout conforme à ce
  qu'annonçait la PR. Merge confirmé par FG (commit `4d4c104`).
  `verifier.php` **18/4 🟠** inchangé ; `tests/tous.php` **32/33** en
  environnement Bash Windows par défaut, **33/33** avec `PYTHONUTF8=1`
  (le seul échec est un pitfall d'encodage console cp1252 sur l'emoji 🟠
  dans `verifier_baseline.test.py`, pas une régression PR #6). Worktree
  `T-090-T-111-squelette-moteurs` désinscrit de Git (branche locale
  supprimée) ; dossier physique verrouillé par un process tiers, à
  nettoyer manuellement. **Décision FG** : les données Yann (B3, B6,
  allergènes, avis, photos, GPS) sortent du plan technique — saisie
  admin directe (écrans lot D déjà livrés), plus une tâche de dev à
  suivre. Cap : **v1 release stable** — prochaine étape technique =
  cascade runtime portable T-112…T-115.
- **2026-08-17 — T-090 + T-111 commités (worktree, PR en attente)** :
  squelette 4 couches (`src/Domaine`, `src/Application` + 4 ports
  `DepotSite`/`DepotMesures`/`Journal`/`ReferenceOpposable`,
  `src/Infrastructure`, `src/Presentation`) + autoloader PSR-4 maison
  (`src/amorce.php`, sans autoload Composer) + garde-fou d'architecture
  `tests/architecture/dependances.test.php` (pattern maison, 2/2 dont
  preuve négative). Moteurs extraits : `valider_site()` (`src/inc/validation.php`)
  et `generer_site()` (`src/inc/generation.php`) — appelables deux fois
  dans le même processus sans collision ni exit ; profils `profil_depot()` /
  `profil_runtime()` (`src/inc/profils-execution.php`), ce dernier refuse
  source/cible vide avant suppression (fiche T-111 § Piège). `bin/*.php`
  deviennent adaptateurs CLI minces. `dist/` byte-pour-byte identique à
  main ; `verifier.php` **18/4 🟠** ; `tests/tous.php` 32/33
  (`instantanes.test.php` — 4 "zéro diff" pré-existants sur main, pas une
  régression) ; `moteurs-appelables.test.php` **17/17** ;
  `verifier-invariants.test.php` 9/9. Limitation documentée :
  `generer_site()` appelable une fois par processus (gabarits
  `mentions-legales.php` / `confidentialite.php` déclarent des fonctions
  globales qui collisionnent au second rendu — nettoyage T-095, hors
  périmètre). Handoff
  [`12-relecture-T-090-T-111-2026-08-17.md`](docs/handoff/12-relecture-T-090-T-111-2026-08-17.md).
  Pas de merge vers `main` : FG relit puis décide.
- **2026-08-16 — ADR-003 acceptée + ADR-004 rédigée** : revue de
  l'ADR-003 (baseline corrigée 18 323 lignes / 65 fichiers au 16/08,
  ~32 tests à migrer au lieu de 7, doublon `chemin_donnees_dir()` ajouté,
  `const RACINE` étendue aux tests, taille réelle des écrans admin ~267
  lignes, statut `proposée` → `acceptée`, renvoi vers ADR-004 pour
  l'autorité runtime). **ADR-004** « Autorité runtime » créée — contrat à
  4 niveaux (graine / copie dépôt / runtime / release), 8 règles
  opposables, `sync-app` préserve la runtime (inverse `05 §3 ligne 167`),
  alerte humaine périodique pour 04 vs runtime, `ReferenceOpposable` lu
  par agents/dev seuls. Handoffs 03/04/05/08 + `CLAUDE.md` réconciliés
  (T-110). `verifier.php` 18/4 🟠 inchangé. Worktree T-090 + T-111 ouvert
  (pas de merge vers `main`). Voir
  [`ADR-003`](docs/decisions/ADR-003-architecture-en-couches.md) et
  [`ADR-004`](docs/decisions/ADR-004-autorite-runtime.md).
- **2026-08-16 — Lot K clos** : portes qualité T-150…T-155 livrées
  (baseline pinnée, Possède, hooks Cursor, preflight, hygiène docs).
  `verifier.php` **18/4 🟠** ; `verifier_baseline.py` conforme (instantanés
  en ignore horaire). **Pas de deploy OVH**.
- **2026-08-16 — Lot K Vague 0** : handoff 11 + guide portes qualité + PLAN
  [`PLAN-lot-K-portes-qualite-2026-08-16.md`](docs/plan/PLAN-lot-K-portes-qualite-2026-08-16.md)
  + fiches T-150…T-155. Objectif : portes mécaniques (baseline, Possède,
  hooks Cursor, preflight, hygiène docs). **Pas de deploy OVH**.
- **2026-08-16 — T-149** : création fiche
  [`docs/plan/taches/T-149-comparatif-modeles-lot-J.md`](docs/plan/taches/T-149-comparatif-modeles-lot-J.md)
  et livrable
  [`docs/reference/comparatif-modeles-lot-J-2026-08-16.md`](docs/reference/comparatif-modeles-lot-J-2026-08-16.md).
  Comparatif Cursor / Ollama / Opus produit selon handoff 10 (6 axes + avis
  sur fusion), sans reouverture Lot J ni dettes connues. `verifier.php`
  conserve la baseline **18/4 🟠**. Pas de commit.
- **2026-08-16 — Relecture Lot J** : relecture lecture seule post-swarm.
  `verifier.php` **18/4 🟠** (conforme) ; `tests/tous.php` **27/28** (écart vs
  28/28 annoncé — `instantanes.test.php` / `data-cms-ouvert`, point #5 du
  handoff 09, pas une régression). Conformités T-126/T-127/T-136/T-137/T-138/
  T-139/T-140 vérifiées sur le code. Livrable
  [`docs/reference/rapport-relecture-lot-J-2026-08-16.md`](docs/reference/rapport-relecture-lot-J-2026-08-16.md) ;
  handoff [`10-relecture-lot-J-2026-08-16.md`](docs/handoff/10-relecture-lot-J-2026-08-16.md)
  (mission : retour comparatif forces/faiblesses des 3 modèles). Pas de commit.
- **2026-08-16 — Lot J Vague 3** : merge coordinateur T-134…148 sur `main`
  (conflit STATUS résolu ; `POLICES_REQUISES` aligné post-T-134). `verifier.php`
  **18/4 🟠** ; `budgets.test.php` 35/35 (6060/6144) ; `htaccess.test.php` 12/12 ;
  `tests/tous.php` 27/28 (`instantanes.test.php` — **T-140**). Dette **D1**
  `contenu.php:123` notée REPRISE §4. Pas de push.
- **2026-08-16 — T-137** : erifier.php durci — schéma, assets, pizzas vs 04
  (compte dynamique), accès gardés. Baseline **18/4 🟠** documentée ;
  erifier-invariants.test.php 9/9. Pas de push.
- **2026-08-16 — T-147** : budgets gzip documentés dans les 3 JS CMS
  (6060/6144, marge 84 o) ; en-tête evenements.js condensé ; commentaires
  seuls. udgets.test.php 35/35 ; baseline verifier **18/4 🟠**. Worktree
  	ache/T-147, pas de push.

- **2026-08-16 — Lot J Vague 1** : merge coordinateur T-120…146 sur `main`
  (0 conflit). `verifier.php` 11/4 🟠 ; `tests/tous.php` 25/26
  (`instantanes.test.php` 4 diffs — T-140). Pas de push.
- **2026-08-16 — Lot J Vague 0** : plan fusionné
  [`PLAN-lot-J-ultime-2026-08-16.md`](docs/plan/PLAN-lot-J-ultime-2026-08-16.md) ;
  fiches **T-120…T-148** créées ; **T-044** réintégré Lot E (absorbé → T-128) ;
  STATUS/REPRISE/index/DISPATCH alignés. **Vague 1 prête** (10 worktrees, pas de dispatch).
- **2026-08-15 — Vague 6** : mise en ligne contrôlée. `verifier.php` 11/4 🟠 ;
  `generer.php` 4 pages / 38 ressources ; essais à blanc puis `deploy` (42 fichiers)
  et `sync-app` (263 fichiers). Prod : thèmes + pastille + interactions ;
  carte masquée ; admin connexion ; `robots.txt` `Disallow: /` inchangé.
  Pas de commit de clôture dédié ce jour-là ; code lot I sur `main`.
- **2026-08-15 — T-105** : recette Vague 5 **rejouée**. Contrastes AA
  verts (T-101) ; instantanés 32/32 (T-094) ; T-107 CSS mort retiré.
  Batterie `tests/cms/*` + rendu + légaux + `verifier.php` 11/4 🟠.
  **GO Vague 6**. Pas de commit, pas de deploy.
- **2026-08-15 — T-107** : règles CSS mortes `.gros-texte` retirées
  de `src/assets/styles.css` (bouton et clé déjà partis T-101/T-106).
  `styles-mouvement.test.php` 3/3 ; `verifier.php` 11 verts / 4 🟠.
  Pas de commit.

- **2026-08-15 — T-094** : 4 instantanés régénérés (T-101/T-104).
  Diff = chrome CMS uniquement (pastille `aria-label`, anti-flash
  localStorage, `interactions.css`/`js`). Aucun fait commercial
  ajouté. `instantanes.test.php` 32/32 sans MAJ ; `verifier.php`
  11 verts / 4 🟠. Pas de commit.
- **2026-08-15 — T-105** : recette Vague 5. `tests/cms/**` +
  `docs/reference/cms-recette.md`. Matrice 36/36. T-102 et T-104
  confirmés verts (STATUS était resté ⬜). 2 contrastes AA → T-101 ;
  instantanés 4 diffs → T-094. **NO-GO Vague 6**. Pas de commit.
- **2026-08-15 — T-106** : allowlist légale = `cotejardin-theme-visiteur`
  + `cotejardin-guide-admin-v1` ; `cotejardin-gros-texte` retiré (plus
  d’usage dans `src/` hors commentaire). `legaux.test.php` 102/102.
  Fiche + index commités.
- **2026-08-15 — T-101** : 4 gabarits + `apparence.php` / `apparence.css`.
  Presets `carnet-village` / `comptoir` / `maison-images` ; pastille
  pizza ; anti-flash `amorcer()` ; Gros texte retiré. Tests 130/130 +
  rendu 47/47. Pas de commit. Suite : T-102 ∥ T-104. Allowlist légale
  et instantanés T-094 restent hors Possède.
- **2026-08-15 — T-103** : évaluateur Paris (`conditions.php` + `evenements.js`),
  fixtures partagées, 34/34 PHP et 59/59 JS (preuves mutation en bac).
  Pas de commit. Suite : T-101.
- **2026-08-15 — T-098** : `themes-visiteur.js` + tests JS 41/41, PHP 22/22.
  Repli `carnet-village`, cycle 5 activations, clé
  `cotejardin-theme-visiteur`. Pas de commit. Suite : T-103 puis T-101.
- **2026-08-15 — T-100** : schéma CMS + exemple + `schema-cms.test.php` (25/25).
  Suite : T-103 ∥ T-098.
- **2026-08-15 — index** : lot I = T-100…T-105 ; runtime = T-110…T-115 ;
  T-093 ✅ ; T-095 ✅ ; T-094 reste ⬜.
- **2026-08-15 — horaires** : confirmation écrite assumée par FG pour
  Yann (11 h–22 h, fermé mardi) — `docs/handoff/04` §2 ; congés / fériés
  restent 🟠.