# Vérification point par point de la soutenance — QRamen

Contrôle fait **le 26 octobre 2026 entre 22 h 50 et 23 h 40 (Europe/Paris)** sur la production
(`https://qramen.fr`, base Airtable `apprQGtfmp88t4YL8`, instance n8n `n8n.ledeunf.fr`, service PDF
`tableqr-pdf`). Chaque ligne indique ce qui a été **réellement exécuté**, pas ce que la documentation
affirme. Verdicts : **OK** (vérifié), **À CORRIGER** (fait ou faisable tout de suite), **MANQUANT**
(livrable ou preuve absente), **À DÉCIDER** (choix d'Alexis).

## 1. Exigences de la soutenance (bloc « Développer un produit numérique avec des outils no-code »)

| Exigence | Attendu | État vérifié le 26/10 | Verdict |
| --- | --- | --- | --- |
| Fiche sujet validée par le référent avant construction | 10 champs | `QRamen-Fiche-Sujet.pdf` (5 p.) et `QRamen-Fiche-Sujet-1page.pdf` dans `/srv/projects/qramen/audit/`, validation référent du 25/10 | OK |
| Documentation technique | 1 document à jour | `docs/TECHNIQUE.md` aligné sur qramen.fr et sur les e-mails Amen | OK |
| Rapport de recette : cas testés **et erreurs corrigées** | preuves + corrections | `docs/RECETTE.md` + section « Vérifications du 26 octobre au soir » + `docs/RAPPORT-LIGHTHOUSE.md` | OK |
| Démonstration fonctionnelle | parcours complet rejouable | Rejouée par API le 26/10 : commande → ticket PDF → liste cuisine → statuts → avis → rupture → import IA | OK |
| Support de soutenance | 10 diapositives | Seul le plan écrit existe (`docs/SOUTENANCE.md`). Aucune diapositive produite ; le seul PDF de soutenance date du 13/10 et décrit l'ancien projet | **MANQUANT** |
| Démo vue par le référent | séance avec Rachid | Non planifiée à ce jour | **MANQUANT** |
| Le jury note le no-code | couche no-code visible | Airtable (8 tables, types variés), n8n (10 workflows) et **Softr livré** pour le back-office gérant (`qramen.softr.app`, 4 pages, 3 blocs de données) ; les écrans terrain restent en Astro | OK |
| IA expliquée | prompts versionnés, règle écrite, modèles comparés | Prompt **versionné** `outils/n8n/prompt-import-carte.txt` (v2) + injecteur ; règle de catégorisation écrite ; **comparaison de modèles non faite** | OK / **MANQUANT** (comparaison) |
| Pièges : site vitrine sans logique métier, projet non démontrable | — | Le site porte un parcours métier réel (commande, ticket, cuisine, avis, ruptures, import) | OK |

## 2. Retour du référent du 25/10 (points de notation)

| Point demandé | État vérifié | Verdict |
| --- | --- | --- |
| Propreté de la base : varier les types de champs | `currency` (prix, prix_unitaire, total), `email` (avis, établissements), `singleSelect` (statut, devise), `dateTime`, `checkbox`, `multipleAttachments`, `multipleRecordLinks` (catégories) | OK |
| Supprimer les colonnes inutiles au lieu de les masquer | `produits.photo` (pièces jointes) : **0 / 40 rempli** et jamais lue par le front (qui utilise `photo_url`). `commandes.ticket_pdf` (URL) : **0 rempli**, le ticket vit dans `commandes.ticket` | **À CORRIGER** (suppression = accord d'Alexis requis) |
| Filtres comparant des nombres, jamais du texte | **Aucune vue filtrée** dans la base : 7 tables, 7 « Grid view » par défaut, zéro filtre | **MANQUANT** |
| IA : documenter *comment* elle déduit | Règle de catégorisation désormais écrite dans le prompt v2 **et** vérifiée en production : avant, le modèle inventait une catégorie « Carte » ; après, il rend « Ramen » et « Accompagnements », les catégories réelles de la base | **À CORRIGER → corrigé** |

## 3. Ce qui a été exécuté ce soir (preuves)

| Test | Méthode | Résultat |
| --- | --- | --- |
| Bascule du domaine | RDAP AFNI + résolveurs publics | NS Cloudflare, aucun DS, `https://qramen.fr` = 200, `/panel` et `/cuisine` = 401 |
| Commande client | `POST /qramen-soutenance/commande` | 200, commande créée (`recAyn2jOFmosmfX9`), 2 lignes, total 29,50 € |
| Idempotence | même clé renvoyée | `deja: true`, même identifiant, aucune ligne dupliquée |
| Ticket cuisine PDF | workflow serveur, puis `POST /ticket` sur la même commande | PDF de 23 937 octets attaché en 5 s ; second appel = `deja: true` sans régénération |
| Progression cuisine | `POST /statut` (`recue` → `en-cuisine` → `servie`) | 200 à chaque étape, statut relu dans Airtable |
| Liste cuisine | `POST /commandes` avec clé gérant | 200, commande avec ses lignes et `ticket: true` |
| Sécurité | appel admin sans clé | 403 côté n8n, 401 côté Worker sur `/panel` et `/cuisine` |
| Avis client | `POST /qramen-soutenance/avis` | 200, avis créé (`recl5ZHaAWBAIS8ab`) ; `mail: false` faute d'adresse, aucun e-mail envoyé |
| Rupture | `POST /rupture` sur un produit, puis retour | disponible passe à `false` puis `true`, visible dans `GET /catalogue` |
| Import de carte par IA | `POST /importer-carte` avec `docs/import-carte/carte-test.png` | 200 en 4,1 s, 3 plats structurés, catégories réelles ; preuve `docs/import-carte/preuve-import-v2.json` |
| Performance et SEO | Lighthouse, 3 pages × 2 profils | Accessibilité, bonnes pratiques, SEO à 100 ; performance 95 à 100 (`docs/RAPPORT-LIGHTHOUSE.md`) |

## 4. Défauts trouvés et corrigés pendant ce contrôle

1. **Mention « TableQR » sur le ticket PDF** (pied de page « Document généré automatiquement — TableQR »).
   Interdit par la fiche validée. Corrigé dans le service `tableqr-pdf`, service redémarré, ticket
   régénéré et relu : « Document généré automatiquement — QRamen ».
2. **`robots.txt` absent** : Cloudflare Pages renvoyait la page d'accueil en HTML, SEO à 91.
   Fichier ajouté, build et déploiement faits, SEO à 100.
3. **Prompt d'import non versionné et sans règle de catégorisation** : externalisé dans
   `outils/n8n/prompt-import-carte.txt` (v2) avec une règle explicite et la liste des catégories
   existantes, injecté par `outils/n8n/prompt-import-carte.py`.
4. **Incohérences de données** : « Carafe d'eau filtrée, offerte » était facturée 2,50 € — libellé et prix
   se contredisaient. Renommée « Carafe d'eau filtrée » avec la description « Eau filtrée, servie fraîche
   en carafe » (le prix ne peut pas descendre à 0 : le validateur de synchronisation exige un prix
   strictement positif) ; l'établissement portait `contact@alexisld.fr` et un numéro d'Angers (02 41)
   pour un restaurant à Rouen (remplacés par `contact@qramen.fr` et 02 32 00 00 00).

## 5. Points restants, par ordre d'impact

État après les décisions d'Alexis du 26 octobre au soir (23 h 30).

| # | Point | État |
| --- | --- | --- |
| 1 | Support de soutenance (10 diapositives) | **Reporté volontairement** à la fin, quand le dossier sera bouclé. Le plan détaillé reste `SOUTENANCE.md`. |
| 2 | « Deux cartes » dans la fiche validée | **Corrigé** : QRoque retiré. Fiche sujet 5 pages, fiche 1 page, Réponses aux 10 points, audit de marché, audit 4 pages et Questions du formateur régénérés le 26 octobre. Les versions antérieures sont conservées dans `archives-avant-suppression-qroque/`. Seules deux mentions « TableQR » subsistent dans l'audit de marché : c'est le **concurrent** tableqr.co dans le comparatif de prix, information factuelle laissée telle quelle. |
| 3 | Couche no-code (Softr) | **Traité par un guide** : `Softr-Guide-QRamen.pdf`, cinq pages, marche à suivre en 40 minutes et prompt prêt à coller dans le AI Co-Builder de Softr. Reste à l'exécuter côté Alexis. |
| 4 | Vues filtrées Airtable | **Proposé** dans le guide Softr (vues À traiter, Service du jour, Ruptures, Prix > 12 €, À surveiller). L'API Airtable ne crée pas de vue : création manuelle en quatre clics. |
| 5 | Colonnes vides | **Partiellement fait** : la suppression par API renvoie 404 (l'API Airtable n'expose pas la suppression de champ dans cette version). Les deux colonnes (`produits.photo`, `commandes.ticket_pdf`) restent à supprimer à la main, deux clics. |
| 6 | Comparaison de modèles d'IA | **Fait** : `RAPPORT-COMPARAISON-MODELES.md`. `gemini-flash-lite-latest` 3,7 s, `gemini-flash-latest` plus de 100 s, `gemini-pro-latest` en 429 (quota gratuit nul). Le modèle utilisé est désormais lisible dans la réponse. |
| 7 | Dépôt GitHub | **Fait** : https://github.com/AlexisLD-DEV/qramen-soutenance (public, licence MIT, README réécrit, aucun secret dans l'historique). |
| 8 | Mentions « TableQR » dans n8n | **Fait** : credentials renommés `Airtable QRamen` et `PDF QRamen`, workflows repointés, anciens credentials supprimés, générateurs du dépôt mis à jour, lecture et écriture revérifiées. |
| 9 | Jeux d'essai en base | **Fait** : 3 commandes, 6 lignes et 1 avis supprimés. Base à 0 commande, 0 ligne, 0 avis. |
| 10 | Jeton DNS Cloudflare | Toujours à révoquer par Alexis. |

## 6. Ce que ce contrôle ne prouve pas

Aucun test de charge, aucun audit de sécurité complet, aucune vérification multi-navigateurs, aucune
mesure d'usage réel. Les parcours ont été rejoués par API, pas au doigt sur un téléphone : la répétition
manuelle (scan du QR, panier, paiement de démonstration) reste à faire et à chronométrer.
