# P1 Merise v0.2 (prod-like) reecrit + migration vers Forgejo auto-heberge **Date** : 2026-06-04 (seconde session du jour, suite de `conception-prodlike-revision`) **Branche** : `feat/p1-conception` **PR** : commits directs sur la branche ; PR `feat/p1-conception -> dev` a ouvrir apres l'UML **Duree estimee** : session longue (decisions + execution + infra) --- ## Ce qui a ete fait Trois chantiers enchaines. ### 1. Decisions de conception restantes tranchees (D4-D8 + stock + Maxi) - **D4 - Roles / RBAC / workflow** : seed de 5 roles `admin / manager / kitchen / counter / drive`. RBAC dynamique (roles + matrice role-permission editables en UI). Attributs sur `role` pour rendre les comportements dynamiques sans hardcode : `default_route`, `order_source`, et table `role_visible_source` (filtre du dashboard par canal). Machine a etats reduite de 6 a **4 etats** : `pending_payment -> paid -> delivered` (+ `cancelled`). La cuisine est en lecture seule ; counter/drive font la livraison en un geste. - **D5 - Permissions** : catalogue fige de 23 codes `resource.action` + matrice par defaut. Correction appliquee : `admin` recoit `order.create`/`order.deliver` ; `manager` ne recoit pas `order.cancel`. - **D6 - service_day** : coupure a 10h00, calcul applicatif (`CASE WHEN HOUR(created_at) < 10 ...`), la colonne generee buguee a 4h30 du MLD v0.1 est abandonnee. - **D7 - Subnet Docker** : retour a l'auto-allocation (IP liberees sur le serveur), le subnet explicite n'est plus necessaire. - **D8 - Numero de commande** : prefixe par canal `K`/`C`/`D`. - **Stock numerique** par ingredient : colonnes `unit`, `stock_quantity`, `pack_size`, `pack_label`, `low_stock_threshold` sur `ingredient` ; decrement automatique a la transition `paid`, re-credit a l'annulation, reconciliation manuelle (inventaire), journal `stock_movement` append-only, permissions `stock.read`/`stock.count`/`stock.manage`. - **Format Maxi** : multiplicateur de recette. `product_ingredient` porte `quantity_normal` et `quantity_maxi` ; le decrement suit `order_item.format`. Le Maxi agrandit l'accompagnement et la boisson uniquement (burger et sauce invariants). Decisions consignees dans `docs/notes/revue-alignement-p1.md` section 7 (non versionne). ### 2. Reecriture des 5 docs Merise en prod-like v0.2 (19 entites, anglais) Delegation a l'agent `expert-merise-agile`, en deux lots (donnees : dictionary/MCD/MLD ; traitements : MCT/MLT), chaque sortie verifiee contre le tableau de decision puis recalee a la main (matrice de permissions, multiplicateur Maxi). Resultat : `dictionary.md`, `mcd.md`, `mld.md`, `mct.md`, `mlt.md` reecrits, 19 entites, vocabulaire anglais `snake_case`, `commande_event` et `menu_produit` supprimes au profit du configurateur d'ingredients, des allergenes, des slots de menu et du journal de stock. Cinq commits (un par doc) sur `feat/p1-conception`. ### 3. Migration du depot vers Forgejo auto-heberge + gouvernance PR - Nouveau depot `https://git.acadenice.com/AcadeNice/corentin_wakdo` (Forgejo sur le serveur). - **Dual-push** configure : `git push origin` pousse desormais sur GitHub ET Forgejo, les deux en HTTPS via des tokens lus dans `.env` (gitignore). Aucun token persiste dans `.git/config` (credential helper qui lit `.env` au moment du push). - **Reconciliation** d'un desalignement decouvert au passage : `dev` sur GitHub (`a3eae01`) etait le vrai tronc integre (PR #4 front, #5 conception, #6 admin shell mergees), tandis que `dev` local et Forgejo etaient restes a `68db2ee`. Forgejo a ete resynchronise sur l'etat GitHub complet, sans perte. - **Template de PR** (`.gitea/PULL_REQUEST_TEMPLATE.md`, conventions BYAN) ajoute sur `dev`. - **Protections de branche** sur `main` et `dev` (API Forgejo) : push direct interdit (PR obligatoire), force-push bloque, 0 approbation requise (adapte au travail solo). --- ## Pourquoi - decisions et alternatives - **Machine a 4 etats au lieu de 6** : en fast-food, le KDS cuisine est un affichage visuel ; `preparing` et `ready` ajoutaient des transitions sans valeur metier proportionnelle. La livraison fusionne `ready`+`delivered` en un clic. Le KPI reste le temps total `delivered_at - paid_at`. - **Stock Maxi via multiplicateur de recette** (alternative ecartee : produits de taille distincte Moyenne/Grande) : l'auteur a prefere un seul produit par choix avec `quantity_normal`/`quantity_maxi`, plus simple a saisir au seed tout en gardant un stock realiste. - **Forgejo auto-heberge** (alternative : rester sur GitHub) : GitHub facture les depots prives, et l'auto-hebergement apporte Forgejo Actions et un controle fin des regles de PR. Cela ajoute un argument infra (Bloc 5) puisque la chaine forge + CI est maitrisee de bout en bout. - **Tout en HTTPS + token plutot que SSH** : la cle SSH GitHub (`~/.ssh/git_wakdo`) est protegee par passphrase et inutilisable depuis le shell non-interactif de l'assistant. Les tokens HTTPS stockes dans `.env` permettent un push automatise des deux cotes. - **0 approbation sur les protections** : en solo, exiger une approbation bloquerait le merge (on ne peut pas approuver sa propre PR). La protection conserve l'essentiel : PR obligatoire et pas de force-push. --- ## Comment - points techniques cles - **Credential helper lisant `.env`** : `git config credential.https://.helper` pointe vers un script qui extrait le token de `.env` au moment du push. Avantage : roter un token = editer `.env`, sans reconfiguration git, et aucun secret dans `.git/config`. - **Reconciliation `dev`** : `git branch -f dev origin/dev` pour reprendre l'etat GitHub reel, template ajoute par-dessus dans un worktree dedie (working tree principal preserve), push fast-forward sur GitHub et push force sur Forgejo (lignee perimee remplacee, depot neuf donc sans risque). - **Protections via API** : `POST /api/v1/repos/.../branch_protections` avec `enable_push=false` et `required_approvals=0` pour `main` et `dev`. --- ## Criteres RNCP couverts - **Bloc 2 - Cr 3.a / 3.b** : modelisation des donnees prod-like (dictionnaire, MCD, MLD), polymorphisme, snapshots, configurateur d'ingredients, journal de stock. - **Bloc 2 - Cr 3.d** : TVA portee par le produit et calculee ligne par ligne. - **Bloc 5** : forge auto-hebergee, gouvernance de branches (protections + template PR), socle pour la CI Forgejo Actions a venir. --- ## Questions anticipees du jury - **Q** : "Pourquoi heberger votre propre forge plutot qu'un service gere ?" **R** : Maitrise de la chaine (depot, CI via Forgejo Actions, regles de PR), depots prives sans cout, et coherence avec l'infra deja en place sur le serveur. GitHub est conserve comme copie synchronisee. - **Q** : "Comment gerez-vous le stock d'un menu Maxi ?" **R** : Un multiplicateur de recette : `product_ingredient` porte une quantite Normale et une quantite Maxi, le decrement suit le format de la ligne. Le Maxi n'agrandit que l'accompagnement et la boisson. - **Q** : "Vos secrets sont-ils exposes dans le depot ?" **R** : Non. Les tokens vivent dans `.env` (gitignore) ; `.git/config` ne contient que des scripts qui les lisent. Le credential helper evite de stocker un token en clair dans la config git. --- ## Points d'amelioration conscients - **UML pas encore reecrit** : `state-commande.md`, `use-cases.md`, `sequence-passer-commande.md` sont encore en v0.1 (6 etats, ancien vocabulaire). A reecrire pour 4 etats / 5 roles / slots+modifiers avant d'ouvrir la PR conception. - **PROJECT_CONTEXT sections 7 et 11** : a mettre a jour (retirer "MVP", passer a ~19 entites, rechiffrer le planning). - **Diagrammes drawio** (MCD/MLD) : a regenerer pour 19 entites ; les `.md` utilisent du Mermaid inline en attendant. - **SESSION_RESUME.md** : perime (Session 7), a rafraichir avec le nouveau remote dual-push et l'etat v0.2. - **Synchronisation des merges Forgejo vers GitHub** : un merge fait dans l'UI Forgejo ne remonte pas tout seul sur GitHub ; un push-mirror Forgejo -> GitHub serait la reponse propre, a decider. - **Token Forgejo expose dans le chat** : il a transite en clair pendant la mise en place ; le roter quand pratique (il est dedie au push, donc impact limite). --- ## Etat a la reprise - Conception v0.2 **committee** (dictionnaire + MCD/MLD/MCT/MLT) et **deja presente dans `dev`** (`971ce0c`) via la PR #5 mergee puis resynchronisee. - `feat/p1-conception` est a `392ba9a` ; une PR vers `dev` serait vide tant que l'UML + PROJECT_CONTEXT ne sont pas produits. - **Prochaine action** : reecrire l'UML + PROJECT_CONTEXT sur `feat/p1-conception`, committer (un commit par doc), pousser (dual), puis ouvrir la PR `feat/p1-conception -> dev` avec le template. --- ## Liens vers artefacts - Commits Merise v0.2 : `6ceebf7` (dictionary), `6c1cede` (MCD), `36332b4` (MLD), `6057ef9` (MCT), `392ba9a` (MLT) - Template PR + sync dev : `971ce0c` - Depots : `https://git.acadenice.com/AcadeNice/corentin_wakdo` (Forgejo) + `https://github.com/AcadeNice/wakdo_corentin` (GitHub, miroir synchronise) - Docs reecrits : `docs/merise/{dictionary,mcd,mld,mct,mlt}.md` - Tableau de decision : `docs/notes/revue-alignement-p1.md` section 7 (non versionne) - Journal precedent du jour : `docs/journal/2026-06-04--conception-prodlike-revision.md`