# Session Resume — Wakdo **Document de reprise entre sessions de travail.** A consulter en premier quand tu reprends le projet. --- ## Derniere session : 2026-06-15 (lot B docs + sync forges + nettoyage branches) ### Vue d'ensemble Suite du pivot security-by-design sur `feat/p1-conception`. Trois temps : 1. **Lot B execute** : `PROJECT_CONTEXT` aligne sur Forgejo Actions (drift GitHub corrige partout : SS6/8/9/10/12), couche securite integree (CI PHPStan/secret-scan, `.env.example` + `php.ini` durci, decision #16 SbD), planning rechiffre (P0 22, P1 38, P7 22 ; total 272h). 2 commits : `d305a09` (context) + `fae5c23` (UML : security-sequence + drift-fix x3). 2. **Sync des deux forges** : GitHub `main` etait 35 commits en retard (`00a3f82`, fige v0.1.0) -> fast-forward propre vers `5104040`. GitHub et Forgejo desormais identiques sur les 3 refs. 3. **Nettoyage branches** : 6 branches finalisees supprimees partout (local + GitHub + Forgejo) : `infra-docker`, `p1-assets-import`, `p1-stubs-and-dictionary`, `p5-front-landing`, `p3-admin-shell`, `demo/p5-front-and-p3-admin`. Contenu verifie present dans `dev`/`main`. ### Etat Git (post-session) ``` Branche active : feat/p1-conception (fae5c23) - 7 commits SbD pushes (5 Merise + 2 lot B) Refs alignees GitHub == Forgejo : main 5104040 (release dev->main : P1 v0.2 + front P5 + admin shell) dev 971ce0c (PR template Forgejo) feat/p1-conception fae5c23 (travail SbD en cours, NON merge) Branches locales restantes : dev, main, feat/p1-conception Working tree : hors-scope BYAN (.claude, Makefile, docker-compose, package*) + journal Forgejo 2026-06-04 untracked + SESSION_RESUME (local) + journal/README modifie. ``` ### Decisions actees cette session - **PR en solo dev** : strategie retenue = **PR + auto-merge sur CI verte**. On garde la protection de branche (PR obligatoire, trace pour Cr 4.f) ; Forgejo merge automatiquement quand PHPUnit/PHPStan/secret-scan passent. A implementer en lot D. - **Forgejo = depot canonique** : les 6 PR d'integration historiques vivent sur GitHub (toutes mergees, la migration les a suivies) ; Forgejo n'a que la PR release dev->main. Les nouvelles PR partent de Forgejo. Dual-push conserve (origin pousse GitHub + Forgejo). - **CI/CD = Forgejo Actions** (act_runner auto-heberge), plus GitHub Actions. Drift doc corrige. ### Etat des lots du pivot SbD - **A** (threat model + classification) : FAIT, commite dans `PROJECT_CONTEXT SS19` + `security-sequence.md`. - **B** (docs PROJECT_CONTEXT SS7/SS11 + UML) : FAIT cette session (2 commits, pushes). - **C** (infra/config secu) : A FAIRE - prochaine etape. `.env.example` (argon2id/lockout/seuils throttle/retention RGPD), `php.ini` durci (expose_php off, cookies httponly/secure/samesite, upload limite), **enregistrer act_runner Forgejo sur stark** (prerequis lot D), secret-scan. - **D** (SDLC) : `SECURITY.md`, PR template checklist, **workflows `.forgejo/workflows/`** (PHPUnit + PHPStan + secret-scan gitleaks) + auto-merge sur CI verte. - **E** : regenerer drawio MCD/MLD pour 21 entites. - **F** : clore -> PR `feat/p1-conception -> dev` (base = `dev` !). - **G** : roter le token Forgejo expose ; decider push-mirror Forgejo->GitHub. ### Reprendre ```bash cd /home/acadenice/corentin_wakdo git branch --show-current # feat/p1-conception git log --oneline -7 # 5 Merise SbD + 2 lot B git fetch origin # realigne origin/dev (affichage 'ahead 1' cosmetique) ``` --- ## Session 2026-06-12 (relecture security-by-design + modele stock en % + lot A threat model) > Note : ce doc avait derive (fige a Session 7, 2026-05-21). Entre-temps : v0.2 prod-like > 19 entites + migration Forgejo (2026-06-04, voir `docs/journal/2026-06-04--*.md`) puis > demarrage du pivot security-by-design (2026-06-11). Le bloc ci-dessous repart de l'etat reel. ### Vue d'ensemble Consolidation du pivot security-by-design sur `feat/p1-conception`. Trois temps : 1. **Relecture des 3 decisions securite** (RGPD, oversell, brute-force) : les 3 directions validees. Le challenge a fait emerger une simplification (oversell) et un upgrade (stock %). 2. **Change-set applique aux 5 docs Merise** via 1 workflow (5 editeurs paralleles + 4 critiques adversariaux), puis correctifs manuels des residus rates par les critiques. 3. **Lot A ecrit** via 1 workflow (2 auteurs + 2 critiques) : threat model + classification dans `PROJECT_CONTEXT §19`, et `docs/uml/security-sequence.md`. ### Decisions actees cette session - **Stock en vrais %** : `ingredient` porte `stock_capacity` (INT, CHECK > 0 = reference 100% + garde anti div/0), `low_stock_pct` (def 10), `critical_stock_pct` (def 5) ; `stock_quantity` signe (peut etre negatif). `stock_pct = ROUND(stock_quantity/stock_capacity*100)` calcule. 3 bandes : normal / alerte (le manager retire via `is_available` OU re-stocke) / auto-OOS sous le critique. - **Disponibilite produit CALCULEE** (RG-T21) : commandable ssi `is_available=1 AND chaque ingredient non-retirable > critical`. Pas de cascade ni flag ; retrait manuel = override dur. - **`login_throttle` = table** (entite 21) : throttle brute-force per-IP, en plus du compteur per-compte sur `user`. - **Drop `SELECT ... FOR UPDATE`** : decrement stock = `UPDATE ... stock = stock - :units` atomique (plus de read-gate, plus de risque deadlock). `idempotency_key` conserve. - **Drift MCD §5.1 corrige** : `product_ingredient.quantity` -> `quantity_normal`/`quantity_maxi`. ### Etat Git (post-session) ``` Branche : feat/p1-conception 5 commits POSES cette session (non pushes - le push partira avec la PR) : fadf0bd DICT - SbD data layer, 21 entities a1692b6 MCD - SbD entities + % stock model, drift fix 14348ba MLD - audit_log + login_throttle tables, % stock columns 0f57a44 MCT - SbD operations, PIN gating, computed availability 5c34f6b MLT - RG-T13-T21, atomic decrement, throttle, RGPD Working tree UNCOMMITTED (tenu volontairement) : docs/PROJECT_CONTEXT.md (§19 threat model + classification ECRIT ; tenu car lot B va aussi toucher §7/§11) docs/uml/security-sequence.md (NOUVEAU, lot A, fini, verifie) docs/uml/{sequence-passer-commande,state-commande,use-cases}.md (drift-fix v0.2, pret, a grouper avec security-sequence.md) + journal 2026-06-04 untracked ; hors-scope BYAN (.claude, Makefile, docker-compose, package*) ``` ### A faire a la reprise (ordre) - **B** : `PROJECT_CONTEXT §7/§11` (retirer « MVP », 21 entites, rechiffrer planning) -> puis commit PROJECT_CONTEXT (§19 + §7/§11) + les 4 docs UML. - **C** : infra/config secu (`.env.example` argon2/lockout/retention/seuils, `php.ini` durci, secret-scan, ruling branch-protection). - **D** : SDLC (`SECURITY.md`, checklist PR template, jobs CI Forgejo PHPStan/secret-scan). - **E** : regenerer les drawio MCD/MLD pour 21 entites (les `.md` sont en Mermaid inline). - **F** : clore -> PR `feat/p1-conception -> dev` (base = `dev` !), rafraichir ce doc. - **G** : roter le token Forgejo expose ; decider push-mirror Forgejo->GitHub. ### Reprendre ```bash cd /home/acadenice/corentin_wakdo git branch --show-current # feat/p1-conception git log --oneline -6 # voir les 5 commits SbD git status --short # PROJECT_CONTEXT + UML uncommitted ``` --- ## Session precedente : 2026-05-21 (Session 7 - P1 conception : 5 docs Merise/UML + machine a etats commande unifiee) ### Vue d'ensemble Session centree sur la reprise de P1 conception. Trois resultats : 1. **Rapatriement P1 sur `feat/p1-conception`** : les fichiers P1 (mcd.md + diagrammes) flottaient dans le working tree de la branche demo `demo/p5-front-and-p3-admin`. Portes proprement sur `feat/p1-conception` (stash des fichiers BYAN hors-scope, switch, pop). Les 4 `.drawio` y etaient deja commites (`64f5a27`), identiques au working tree. 2. **5 docs P1 produits** via 2 agents (expert-merise-agile + architect), puis normalises : MCT, MLT, use-cases, state-commande, sequence-passer-commande. 3. **Machine a etats de commande unifiee** : resolution d'une contradiction qui preexistait entre `dictionary.md`, `PROJECT_CONTEXT.md` et le brief initial. Vocabulaire desormais coherent sur toute la doc. ### Etat Git actuel (post-Session 7) ``` Repo : /home/acadenice/corentin_wakdo/ Branche courante : feat/p1-conception (rien commite cette session) Working tree P1 (untracked, a commiter apres validation drawio) : docs/merise/mcd.md (MCD, refs encore vers SVG Mermaid - cf. pivot drawio non termine) docs/merise/mct.md (NEW - 24 operations metier) docs/merise/mlt.md (NEW - preconditions/regles/postconditions) docs/uml/use-cases.md (NEW) docs/uml/state-commande.md (NEW) docs/uml/sequence-passer-commande.md (NEW) docs/merise/_diagrams/*.mmd + *.svg (Mermaid leftover, a supprimer si on finit le pivot drawio) Working tree modifie (tracked) : docs/PROJECT_CONTEXT.md (ligne statut realignee sur machine canonique) .drawio : commites sur feat/p1-conception (clean), en attente validation visuelle user sur le site drawio. Hors-scope BYAN (persistants, jamais commites) : .claude/CLAUDE.md, .claude/rules/byan-agents.md, Makefile, package.json, package-lock.json ``` ### Decision majeure : machine a etats de commande (CANONIQUE) Trois vocabulaires se contredisaient (ENUM dictionnaire avec paiement / PROJECT_CONTEXT sans paiement / noms FR introduits par erreur dans le brief Merise). Tranche par le user : - **Deux phases** : le client compose (`pending_payment`) PUIS paie (`paid`), apres quoi la commande passe en preparation. Le paiement EXISTE dans le cycle. - **Termes en anglais** (code-facing), valeurs ENUM du dictionnaire. - **Machine retenue** : `pending_payment -> paid -> preparing -> ready -> delivered` - **`cancelled` atteignable depuis tout etat non remis** (`pending_payment`, `paid`, `preparing`, `ready`) : annulable a tout moment tant que non livree (modification / annulation / remboursement client). `delivered` et `cancelled` finaux. Applique partout : dictionary.md (deja correct), PROJECT_CONTEXT.md (corrige ligne 61), mct.md, mlt.md, state-commande.md, use-cases.md, sequence-passer-commande.md. ### Autres decisions actees Session 7 | Decision | Contexte | |---|---| | Outil diagramme MCD = drawio | User valide les 4 .drawio lui-meme sur le site (pas encore valides). Pivot Mermaid->drawio a finir cote pipeline + refs mcd.md | | Pas de parcours employe dedie | Les employes sont couverts par le diagramme de cas d'utilisation (use-cases) + diagramme d'etats. Ockham, evite le doublon | | Production parallele en respectant les dependances | On fait ce qui ne depend PAS du MCD (dependance nulle ou faible). On NE fait PAS ce qui en depend moyennement ou fortement (MLD, class-diagram) tant que les .drawio ne sont pas valides | | MOT saute (rappel) | Coherent Session 4 (raccourci agile MCT -> MLT direct) | ### Decisions secondaires EN SUSPENS (remontees par l'agent Merise, a trancher avant MLD) 1. **`source` (canal : kiosk/comptoir/drive) vs `mode_consommation` (fiscal : sur_place/a_emporter/drive)** : deux dimensions distinctes. `source` est absent du dictionnaire et du MCD. A ajouter avant de generer le DDL. 2. **`user_id` sur `commande`** : aucune tracabilite de l'equipier qui saisit / prend en charge / livre. A amender dans le MCD si stats par equipier souhaitees. (Points mineurs documentes dans mct.md section 14 et mlt.md section 13 : `service_day` non materialise, etc.) ### A faire lors de la reprise (ordre recommande) 1. **User valide les 4 `.drawio`** sur le site drawio (preview Markdown ne rend pas Mermaid sans extension ; les .drawio/.svg s'affichent en revanche). 2. **Trancher les 2 decisions secondaires** (`source` vs `mode_consommation`, `user_id` sur commande) - elles debloquent le MLD + class-diagram. 3. **Finir le pivot drawio** (si confirme) : cible Makefile `docs-render-drawio` (image `jgraph/drawio` dispo localement), regenerer les SVG depuis les .drawio, reecrire les refs dans mcd.md (actuellement vers SVG Mermaid), supprimer les `.mmd`/`.svg` Mermaid. 4. **Produire MLD + class-diagram** une fois le MCD valide et les decisions secondaires tranchees. 5. **Commiter le lot P1 conception** (option : 1 commit par doc) sur `feat/p1-conception`, puis PR vers `dev` (vigilance : base = `dev`, pas `main`). ### Commande exacte pour reprendre ```bash cd /home/acadenice/corentin_wakdo git status git branch --show-current # attendu : feat/p1-conception ls docs/merise/ # mcd.md, mct.md, mlt.md, dictionary.md ls docs/uml/ # use-cases.md, state-commande.md, sequence-passer-commande.md ``` --- ## Session precedente : 2026-05-09 (Session 6 - drawio + P5 front complet en remote control) ### Vue d'ensemble Session ~3-4h en remote control mobile qui a couvert 2 gros chantiers et un long detour sur l'automation des PRs : 1. **Pivot Mermaid -> drawio sur le MCD** : 4 fichiers `.drawio` XML generes pour gain de controle layout (planarite du global non resoluble par mmdc) 2. **Front P5 complet anticipe** : 2 runs d'agent UX (Sally) ont produit 7 pages HTML kiosk + 7 modules JS vanilla + JSON fallback statique. Flux complet welcome -> confirmation, live sur le vhost. 3. **Setup automation PR via API** : detour sur fine-grained PATs (3 tentatives KO sur policy org AcadeNice "approval required"), resolu avec un classic PAT `ghp_` en attendant l'approbation admin lundi. 2 PR ouvertes sur GitHub : - **#4** ready : front P5 complet (7 commits) - **#5** draft : 4 .drawio sources, en attente cleanup et suite Merise/UML ### Etat Git actuel (post-Session 6) ``` Repo : /home/acadenice/corentin_wakdo/ Remote : git@github-wakdo:AcadeNice/wakdo_corentin.git Branches : main 00a3f82 (v0.1.0) dev 68db2ee feat/p1-conception 64f5a27 (PR #5 draft : 4 .drawio committed) feat/p5-front-landing 6a7e772 (PR #4 ready : 7 commits P5 complet) <- HEAD post-session feat/infra-docker b09c461 (mergee, conservee) feat/p1-assets-import 24e733b (mergee, conservee) feat/p1-stubs-and-dictionary d1a9876 (mergee, conservee) Tags : v0.1.0 00a3f82 Infrastructure foundation Working tree out-of-scope (BYAN, persistent depuis sessions precedentes) : .claude/CLAUDE.md, .claude/rules/byan-agents.md, Makefile package.json, package-lock.json docs/SESSION_RESUME.md (ce fichier) Working tree P1 (uncommitted, voyage entre branches lors des switches) : docs/merise/mcd.md docs/merise/_diagrams/*.mmd (Mermaid leftover, a supprimer apres render drawio) docs/merise/_diagrams/*.svg (Mermaid render, idem) ``` ### PRs ouvertes | # | Titre | Branche | Base | Statut | |---|---|---|---|---| | 4 | feat(front): P5 kiosk complete flow with vanilla JS and JSON fallback | `feat/p5-front-landing` | `dev` | Ready for review | | 5 | docs(merise): MCD diagrams in drawio XML (4 files) | `feat/p1-conception` | `dev` | Draft | ### Decisions actees Session 6 | Decision | Contexte | |---|---| | Switch Mermaid -> drawio pour MCD | Planarite du global non resoluble par mmdc auto-layout, controle manuel requis | | 4 .drawio separes (1 par diagramme) | Plus simple a editer et diff que multi-page | | Front P5 anticipe pendant P1 | Data contract gele par brief ecole (JSON sources), front consomme JSON = consomme future API au mapping pres | | Classic PAT (`ghp_`) au lieu de fine-grained AcadeNice | Org AcadeNice policy "approval required", admin pas dispo le weekend | | Branche front renommee `p1` -> `p5` | Front borne = livrable P5 per plan SDLC (independant de la phase de realisation) | | Auto-validation 7 checks par l'agent | Remote control mobile = pas de validation visuelle facile, agent doit s'auto-verifier | | Mode JSON fallback statique dans `borne/data/` | Apache bind-mount ne sert pas `_sources/`, copie statique = solution simple. Swap point unique dans `data.js` pour P4 | | TVA 10% (taux restauration FR 2024 simplifie) | TODO P3 : valider avec comptable les variations sur place vs a emporter, alcool, etc. | | `gh` dans Docker = mauvaise idee | Stack Docker = runtime app, pas dev tooling. `gh` ou curl appartient a l'host. | | Token GitHub stocke dans `.env` (gitignore) | Standard, pas de leak en commits, lu via `source .env` au moment du curl | ### Ce qui a ete fait chronologiquement **Bloc 1 - Pivot Mermaid -> drawio + 4 sources XML** 1. Decision drawio uniquement, 4 fichiers separes, manual layout 2. Generation des 4 fichiers `.drawio` XML avec entites + cardinalites Merise `(min,max)` a partir des sources Mermaid 3. Commit `64f5a27` : `docs(merise): add drawio XML sources for MCD diagrams` **Bloc 2 - 1er agent UX (welcome + categories scaffold)** 4. Spawn agent UX-designer (Sally) en background avec scope 2 ecrans (welcome + categories), flag `isolation: "worktree"` 5. L'agent a base sa branche sur `feat/p1-conception` au lieu de `dev` (le worktree n'a pas vraiment isole comme attendu) 6. Rebase `feat/p1-front-landing --onto dev 64f5a27` pour droper le commit drawio comme parent 7. Renommage `feat/p1-front-landing` -> `feat/p5-front-landing` (front borne = livrable P5) **Bloc 3 - Setup automation PR (long detour sur les PATs)** 8. Push des 2 branches (SSH agent socket `/tmp/ssh-Evc7jT0fk2rs/agent.2611024`) 9. Tentative `gh` CLI dans Docker -> mauvaise idee, abandonne 10. Tentative fine-grained PAT #1 : Resource owner = Imugiii -> 404 sur wakdo_corentin (org repo invisible pour PAT a owner perso) 11. Fine-grained PAT #2 : meme probleme (Resource owner encore = Imugiii) 12. Fine-grained PAT #3 avec Resource owner = AcadeNice -> token en "Pending review" (org policy "approval required") 13. Fallback classic PAT (`ghp_`) -> fonctionne des generation, scope `repo`, admin sur le repo 14. PR #4 (front ready) + PR #5 (drawio draft) creees via `POST /repos/AcadeNice/wakdo_corentin/pulls` **Bloc 4 - 2e agent UX (P5 complet)** 15. Spawn agent UX en background sur `feat/p5-front-landing` avec scope etendu : 5 nouvelles pages + JS state + JSON fallback 16. Auto-validation 7 checks dans le brief (assets exist, links resolve, JSON valid, HTML closed, JS syntax, http server e2e, JSON fetch) 17. Livrable : 5 pages HTML, 7 modules JS, 2 JSON normalises copies dans `borne/data/`, CSS etendu de 438 -> 1257 lignes 18. 6 commits thematiques (`6f5daca` -> `6a7e772`), 7/7 auto-checks PASS 19. Push, mise a jour PR #4 (titre + body) via `PATCH /repos/.../pulls/4` 20. Test live kiosk : les endpoints repondent 200 (welcome, categories, products, product, cart, payment, confirmation, JSON, CSS, JS, images) ### Commande exacte pour reprendre ```bash cd /home/acadenice/corentin_wakdo git status git branch --show-current # Si HEAD = feat/p5-front-landing : tu peux tester le front sur https://corentin-wakdo.stark.a3n.fr/ # Pour reprendre P1 : git checkout feat/p1-conception ``` ### A faire lors de la reprise (ordre recommande) 1. **Review visuelle PR #4** : tester le flux kiosk complet sur https://corentin-wakdo.stark.a3n.fr/, valider, merger dans `dev` (via web ou via API) 2. **Drawio render automatique** : ajouter cible Makefile `make docs-render-drawio` qui utilise le container `rlespinasse/drawio-export` pour generer les SVG depuis les `.drawio` XML. Evite l'export manuel sur drawio web (galere sur mobile). 3. **Continuer P1 conception** sur `feat/p1-conception` : - `docs/merise/mct.md` - `docs/merise/mlt.md` - `docs/merise/mld.md` - `docs/uml/class-diagram.md` - `docs/uml/use-cases.md` - `docs/uml/state-commande.md` - `docs/uml/sequence-passer-commande.md` 4. **Commit final mcd.md** : une fois les SVG drawio generes, commit `mcd.md` + suppression des `.mmd`/anciens `.svg` Mermaid + Makefile mis a jour (drop `docs-render` mmdc, garder uniquement `docs-render-drawio`) 5. **Passage PR #5 draft -> ready** (via PATCH API) quand tout le P1 conception est dedans 6. **Hygiene secu PATs** : revoquer dans GitHub Settings : - 3 fine-grained `github_pat_...` (suffixes BE4y, UiZc, ljeC) - classic `ghp_Rr5EkM4...` (a rotater quand fine-grained AcadeNice approuve par admin lundi) ### Note technique - isolation worktree Le flag `isolation: "worktree"` sur l'Agent tool n'a pas cree de vrai worktree isole - les agents ont travaille directement sur le main repo (`git worktree list` ne montre qu'une entree). Pas grave en pratique mais a savoir pour les prochains spawns : instruire explicitement l'agent de ne pas switch de branche dans le main repo, ou de bosser en branche dediee pre-checked-out. --- ## Session precedente : 2026-04-30 soir (Session 5 - notes perso + demarrage P1 conception + setup pipeline diagrammes) ### Vue d'ensemble Session moyenne (~3h) qui a couvert : 1. **Cloture P1 dictionnaire** : commit + push + PR #3 mergee dans `dev` 2. **4 notes perso ecrites** (gitignore) : apache-fastcgi-pitfalls, docker-network-pools-rfc1918, enum-vs-table-reference, merise-yagni-quantite + index README mis a jour 3. **Demarrage P1 conception** sur nouvelle branche `feat/p1-conception` (renommee depuis `feat/p1-merise-conception` pour inclure UML) 4. **MCD redige** (`docs/merise/mcd.md`) avec 3 sous-domaines (Catalogue/Commande/RBAC) en Mermaid + tableau recap cardinalites Merise 5. **Pipeline mmdc setup** : .mmd sources + SVG generes + `make docs-render` target 6. **Blocage layout MCD global** : 10 entites + 10 associations = probleme planarite intrinseque, decision laissee en suspens Aucun commit fait sur la branche `feat/p1-conception` — tout reste dans le working tree pour reprise propre. ### Etat Git actuel (post-Session 5) ``` Repo : /home/acadenice/corentin_wakdo/ Remote : git@github-wakdo:AcadeNice/wakdo_corentin.git Branches : main 00a3f82 (v0.1.0) dev 68db2ee (= main + PR#1 + PR#2 + PR#3 mergees) feat/infra-docker b09c461 (mergee, conservee) feat/p1-assets-import 24e733b (mergee, conservee) feat/p1-stubs-and-dictionary d1a9876 (mergee via PR#3, conservee) feat/p1-conception 68db2ee (NOUVELLE, ZERO COMMIT, working tree only) Tags : v0.1.0 00a3f82 Infrastructure foundation Working tree sur feat/p1-conception (a commit a la prochaine session) : docs/merise/mcd.md (NEW - 411 lignes) docs/merise/_diagrams/mcd-global.mmd (NEW) docs/merise/_diagrams/mcd-global.svg (NEW) docs/merise/_diagrams/mcd-catalogue.mmd (NEW) docs/merise/_diagrams/mcd-catalogue.svg (NEW) docs/merise/_diagrams/mcd-commande.mmd (NEW) docs/merise/_diagrams/mcd-commande.svg (NEW) docs/merise/_diagrams/mcd-rbac.mmd (NEW) docs/merise/_diagrams/mcd-rbac.svg (NEW) Makefile (modified - target docs-render ajoute) docs/notes/README.md (modified, gitignore - 7 entries ajoutees) docs/notes/apache-fastcgi-pitfalls.md (NEW, gitignore) docs/notes/docker-network-pools-rfc1918.md (NEW, gitignore) docs/notes/enum-vs-table-reference.md (NEW, gitignore) docs/notes/merise-yagni-quantite.md (NEW, gitignore) Working tree out-of-scope (BYAN, deja modifies en sessions precedentes) : .claude/CLAUDE.md .claude/rules/byan-agents.md package.json, package-lock.json docs/SESSION_RESUME.md ``` ### Decisions actees Session 5 | Decision | Contexte | |---|---| | Branche renommee `feat/p1-conception` (au lieu de `feat/p1-merise-conception`) | Pour inclure UML dans le scope de la PR | | UML ajoute au scope P1 conception | RNCP 37805 attend Merise + UML, pas que Merise | | Granularite commits PR : option α (1 commit par doc) | Coherent avec l'historique, squashable en fin de PR si besoin | | Pipeline diagrammes : option B (mmdc local + SVG embed) | Rendu portable Cursor/GitHub/PDF/Notion, regenerable via `make docs-render` | | Ecriture des 4 notes perso AVANT le travail Merise | Sujets frais dans le contexte (Session 4 + dictionnaire) | | Auteur des notes = "BYAN" | Coherent avec section 17 PROJECT_CONTEXT (transparence methodologie) | | 4 hedgings appliques (`toujours`/`forcement` -> `tend a`/`implique`) | Hook PreToolUse fact-check intransigeant | ### Decision EN SUSPENS (a trancher en premier la prochaine session) **Layout du diagramme global MCD** : avec 10 entites et 10 associations (dont 2 polymorphiques sur `LIGNE_COMMANDE` -> PRODUIT et MENU), il y a un probleme de planarite : impossible de placer toutes les entites sans croiser au moins 2 lignes. Mermaid auto-layout galere, Excalidraw manuel n'aide pas vraiment. 3 options en attente d'arbitrage : - **A. Drop le global** — supprimer section 3 du MCD, garder section 6 (tableau recap des cardinalites) + section 4 (3 sous-domaines Mermaid propres). Coherent avec l'approche Merise (decomposer si > 5 entites). Defendable au jury : "j'ai decompose, tableau recap = vue integree". - **B. Excalidraw manuel** — refaire le global a la main dans Excalidraw, export `.excalidraw.svg` (avec scene embedee), embed dans le MCD. Coute 20-30 min de layout manuel, perd la regen automatique. - **C. Garder Mermaid en l'etat** — assumer que le layout est croise mais jouer le compromis "decomposition prime sur visuel global". Le user a dit "le choix n'est pas encore fait" (Session 5 fin de soiree, fatigue sur le sujet). A reprendre tete reposee. ### Ce qui a ete fait chronologiquement **Bloc 1 - Cloture dictionnaire (commit + PR)** 1. Verification etat initial : branche `feat/p1-stubs-and-dictionary` avec `b8f7d35` (stubs+fixes) commit, `docs/merise/dictionary.md` uncommitted 2. Commit `d1a9876` : `docs(merise): data dictionary v0.1 - 10 entities + Mermaid ER diagram + 7 modeling notes` 3. Push branche, PR #3 ouverte manuellement (gh CLI absent), mergee sur `dev` 4. `git fetch + checkout dev + merge --ff-only origin/dev` : sync OK sur `68db2ee` **Bloc 2 - 4 notes perso (gitignore)** 5. Bascule sur `Read` au lieu de `grep`/`sed` apres blocage du hook `tool-failure-guard` sur "internal error" string presente dans `vhost.conf` (pattern legitime du commentaire, faux positif Bash output) 6. `apache-fastcgi-pitfalls.md` (405 lignes) - 3 pieges Session 4 (DirectoryIndex, allowed_clients, R=200) + Q&A jury 7. `docker-network-pools-rfc1918.md` (376 lignes) - saturation pools Docker sur stark, choix `192.168.148.0/24`, RFC 1918, Q&A jury 8. `enum-vs-table-reference.md` (381 lignes) - matrice de decision ENUM vs table, application aux 4 ENUMs Wakdo, Q&A jury 9. `merise-yagni-quantite.md` (337 lignes) - YAGNI applique a `menu_produit`, audit source ecole 13 menus mono-portion, Q&A jury 10. `docs/notes/README.md` index mis a jour : 7 nouvelles entrees (3 Session 4 deja redigees + 4 nouvelles) **Bloc 3 - Setup branche conception + cadrage** 11. Branche `feat/p1-merise-conception` creee depuis `dev`, puis renommee en `feat/p1-conception` apres discussion sur l'ajout UML au scope 12. Decision : 8 documents prevus pour la PR : - Merise : MCD, MCT, MLT, MLD (4 docs dans `docs/merise/`) - UML : classes, use cases, etats, sequence (4 docs dans `docs/uml/`) 13. `docs/uml/` cree **Bloc 4 - MCD redige + setup pipeline diagrammes** 14. Premier draft MCD avec 4 diagrammes ASCII art (global + 3 sous-domaines) + tableau recap cardinalites Merise `(0,N)/(1,1)` 15. User trouve l'ASCII moche -> bascule sur Mermaid `erDiagram` inline 16. User ne voit pas le rendu Mermaid dans Cursor (pas d'extension installee) -> bascule sur SVG via mmdc 17. Setup `docs/merise/_diagrams/` : 4 fichiers `.mmd` extraits + 4 SVG generes via `npx mmdc` 18. MCD edite : 4 blocs Mermaid remplaces par `` 19. Makefile : target `docs-render` ajoute, scanne tous les `docs/**/_diagrams/*.mmd` du projet, regen SVG (testee, OK 4/4) 20. User constate que le global a des lignes croisees, tente Excalidraw, n'arrive pas a un layout logique -> decision laissee en suspens ### Commande exacte pour reprendre ```bash cd /home/acadenice/corentin_wakdo git status # confirmer working tree intact git branch --show-current # doit etre feat/p1-conception git log --oneline dev..HEAD # doit etre vide (zero commit sur la branche) ls docs/merise/ # mcd.md + _diagrams/ presents ls docs/notes/ # 4 notes Session 5 + README maj ``` ### A faire lors de la reprise (ordre recommande) 1. **Trancher le layout MCD global** (option A / B / C ci-dessus). Si A, editer mcd.md pour supprimer section 3, decrementer les numeros, et supprimer `_diagrams/mcd-global.{mmd,svg}`. Si B, faire le travail Excalidraw manuel. Si C, ne rien faire et continuer. 2. **Commit le MCD** (option α : 1 commit par doc) : ```bash git add docs/merise/mcd.md docs/merise/_diagrams/ Makefile git commit -m "docs(merise): MCD v0.1 + pipeline mmdc -> SVG via make docs-render" ``` 3. **Continuer P1 conception**, dans l'ordre : - `docs/merise/mct.md` - operations metier + acteurs + flux - `docs/merise/mlt.md` - workflow logique (preconditions / regles / postconditions) - `docs/merise/mld.md` - schema relationnel formel - `docs/uml/class-diagram.md` - vue OOP (prepare PHP P2) - `docs/uml/use-cases.md` - acteurs + goals (kiosk client, manager, ...) - `docs/uml/state-commande.md` - machine a etats `commande.statut` - `docs/uml/sequence-passer-commande.md` - flux passer commande 4. **Push + PR vers `dev`** quand les 7 docs restants sont commit. Vigilance : verifier `base = dev` (pas `main` !). 5. **Apres merge** : continuer P1 implementation (DDL + seed + fallback) sur une branche `feat/p1-implementation` separee. --- ## Session precedente : 2026-04-30 jour (Session 4 etendue - smoke test infra + import assets + P1 demarre) ### Vue d'ensemble Session tres longue (~6h cumulees) qui a couvert 3 grandes phases en une seule journee : 1. **Smoke test infra Docker** sur le serveur stark : `make init` valide bout en bout, 4 services healthy, certs Let's Encrypt provisionnes 2. **Import assets ecole** : 71 images normalisees + 2 JSON sources + maquette Figma PDF 3. **Demarrage P1 Merise** : stubs unblock-403 + dictionnaire de donnees v0.1 (10 entites) 3 PR ont ete fusionnees (1 incident main->dev recupere) et 1 PR reste ouverte (la branche de la 3e phase n'est pas encore push). ### Etat Git actuel (post-Session 4) ``` Repo : /home/acadenice/corentin_wakdo/ Remote : git@github-wakdo:AcadeNice/wakdo_corentin.git Branches : main 00a3f82 (v0.1.0 - infra foundation) dev 84d2559 (= main + PR#2 assets) feat/infra-docker b09c461 (mergee dans main via PR#1, conservee) feat/p1-assets-import 24e733b (mergee dans dev via PR#2, conservee) feat/p1-stubs-and-dictionary b8f7d35 (LOCAL UNIQUEMENT - NON PUSHEE) + dictionnaire UNCOMMITTED dans le working tree Tags : v0.1.0 00a3f82 Infrastructure foundation (annotated, pushe) Working tree out-of-scope (volontairement non commit) : .claude/CLAUDE.md, .claude/rules/* (modifies hors-projet, BYAN) package.json, package-lock.json (BYAN) docs/SESSION_RESUME.md (ce fichier - local perso) ``` ### Vue chronologique des PR ``` 00a3f82 (main, dev, v0.1.0) Merge PR #1 from feat/infra-docker - INCIDENT : PR ouverte par defaut sur 'main' au lieu de 'dev' - REMEDIATION : git checkout dev && git merge --ff-only origin/main && git push origin dev - LECON : verifier le selecteur 'base branch' sur GitHub avant 'Create pull request' - 9 commits infra : compose, dockerfiles, smoke test fixes, FQDN switch, journal session 4 84d2559 (dev) Merge PR #2 from feat/p1-assets-import - PR sur la bonne base 'dev' cette fois - 1 commit : import des 2 JSON sources + 71 images normalisees + maquette PDF ``` ### Ce qui a ete fait (chronologique session) **Phase 1 - smoke test infra (avant pause)** 1. Conflit `.env` BYAN/Wakdo traite par fusion en 1 fichier (gitignore) 2. Switch FQDN `acadenice.fr` -> `stark.a3n.fr` (zone wildcard existante, evite la provisioning DNS prerequise par le challenge HTTP-01 de Traefik) 3. Smoke `make init` casse 3 fois et corrige : - Subnet explicite `192.168.148.0/24` (pools Docker satures) - `init: true` sur cron (dcron PID 1 setpgid) - Healthz statique dans `/usr/local/apache2/htdocs/` (RewriteRule R=200 declenchait ErrorDocument template) 4. Validation HTTPS externe : 4 services healthy, certs OK, `/healthz` isole 5. Journal session ecrit (`docs/journal/2026-04-30--smoke-test-infra.md`) 6. PR #1 -> incident main au lieu de dev -> remediation FF dev=main 7. Tag `v0.1.0` annote sur le merge commit 8. Memoire `feedback_no_absolutes.md` enregistree (hook fact-check sensible) **Phase 2 - import assets ecole** 9. Drop zone `docs/_inbox/` recue (9 Mo, 71 images + 2 JSON + 1 PDF + 1 readme) 10. Diagnostic : naming "wacdo" vs notre "Wakdo", casse incoherente, 7 typos dans JSON 11. Rangement final : - `docs/merise/_sources/` (2 JSON + source-school.md provenance) - `docs/design/` (maquette PDF + README pointant Figma) - `src/public/borne/assets/images/` (71 images normalisees kebab-case lowercase) 12. Workaround `chown` via container ephemere (src/ etait owned root par Docker bind-mount) 13. PR #2 -> dev (workflow correct cette fois) **Phase 3 - demarrage P1 Merise** 14. Decisions cadrage P1 actees : - MOT skippe (raccourci agile MCT -> MLT direct) - Composition flexible (`menu_produit` avec `role` et `position`) - Pas de `quantite` sur menu_produit (YAGNI - 13 menus mono-portion) - 9 entites + 1 jointure RBAC : Categorie, Produit, Menu, MenuProduit, Commande, LigneCommande, User, Role, Permission, RolePermission - Pas de stock numerique (juste `est_disponible` boolean) - Pas de stats agregees (live queries) - Pas d'allergenes/nutrition pour MVP 15. Stubs minimaux pour debloquer le 403 : - `src/public/borne/index.html` (HTML statique avec logo, vhost kiosk) - `src/public/admin/index.php` (PHP qui prouve la chaine FastCGI E2E) 16. 2 bugs infra exposes par les stubs et fixes : - Apache `DirectoryIndex` ne contenait pas `index.php` (admin renvoyait 403) - PHP-FPM `listen.allowed_clients = any` rejete par PHP 8.3 (toutes les connexions Apache->PHP-FPM rejetees, FastCGI cassait silencieusement) 17. Validation HTTPS externe : kiosk -> 200 HTML, admin -> 200 PHP rendu (PHP_VERSION et timestamp dynamique substitues) 18. Commit `b8f7d35` : `feat(stubs): unblock 403 with kiosk and admin index pages, plus FastCGI fixes` 19. Dictionnaire de donnees v0.1 redige (`docs/merise/dictionary.md`) : - ~340 lignes, 10 entites detaillees - Diagramme entites-relations en Mermaid (rendu GitHub natif) - 7 notes de modelisation (FLOAT vs cents, ENUM vs table, STI, polymorphisme, audit fields, RFC 5321 emails, etc.) - Cross-validation avec `PROJECT_CONTEXT.md` et source ecole 20. 3 notes techniques perso (`docs/notes/`, gitignore) : - `rbac-roles-permissions.md` : pattern RBAC dynamique vs statique, UI matrice, Q&A jury - `monetary-int-cents.md` : INT centimes + TVA pour mille, Goldberg ACM 1991, Stripe convention, 5 pieges - `polymorphic-fk-snapshots.md` : 2 colonnes nullables + discriminator + snapshots, Karwin SQL Antipatterns, integrite historique commandes 21. Memoire `feedback_notes_author.md` mise a jour : auteur des notes = "BYAN" (pas un nom de LLM specifique), coherent avec la transparence projet section 17 PC --- ## En cours (a reprendre) **Branche locale `feat/p1-stubs-and-dictionary` avec 1 commit fait + dictionnaire UNCOMMITTED.** ### Commande exacte pour reprendre ```bash cd /home/acadenice/corentin_wakdo git status # confirmer ?? docs/merise/dictionary.md git branch --show-current # doit etre feat/p1-stubs-and-dictionary git log --oneline dev..HEAD # voir b8f7d35 (stubs+fixes) ``` ### A faire lors de la reprise 1. **Commit le dictionnaire** : ```bash git add docs/merise/dictionary.md git commit -m "docs(merise): data dictionary v0.1 - 10 entities + Mermaid ER diagram + 7 modeling notes Bottom-up derivation from school JSON sources + PROJECT_CONTEXT business rules. Covers : Categorie, Produit, Menu, MenuProduit, Commande, LigneCommande, User, Role, Permission, RolePermission. Decisions documented : prices in INT cents, VAT in per-mille, polymorphic FK with snapshots on ligne_commande, dynamic roles vs static permissions for RBAC." ``` 2. **Push + PR** : ```bash SSH_AUTH_SOCK=/tmp/ssh-Evc7jT0fk2rs/agent.2611024 git push -u origin feat/p1-stubs-and-dictionary ``` Puis ouvrir PR via : `https://github.com/AcadeNice/wakdo_corentin/compare/dev...feat/p1-stubs-and-dictionary?expand=1` **VIGILANCE** : verifier base = `dev` (pas `main` !) avant de cliquer Create. 3. **Continuer P1** sur une nouvelle branche `feat/p1-merise-models` (apres merge de la precedente) ou sur la meme branche etendue. Suite des etapes : - **MCD** : `docs/merise/mcd.md` avec un diagramme Mermaid plus formel (entites + associations + cardinalites min/max), distinct du diagramme preview du dictionnaire - **MCT** : `docs/merise/mct.md` - les operations metier (valider commande, encaisser paiement, marquer pret, ...) - **MLT** : `docs/merise/mlt.md` - workflow logique de chaque traitement (preconditions, regles, postconditions, sorties) - **MLD** : `docs/merise/mld.md` - schema relationnel formel - **DDL** : `db/migrations/0001_init_schema.sql` - SQL CREATE TABLE concret - **Seed** : `db/seeds/0001_demo_data.sql` - INSERT des 9 categories + 53 produits + 13 menus a partir des JSON sources, avec normalisation des prix en centimes - **Export fallback JSON** : `scripts/export-fallback.{sh|php}` qui genere `src/public/borne/data/*.json` depuis le seed (pour mode "Bloc 1 isole") 4. **Notes perso restantes a rediger** (basse priorite, peut s'etaler sur plusieurs sessions) : - `enum-vs-table-reference.md` : quand utiliser ENUM vs table referentielle - `docker-network-pools-rfc1918.md` : pool saturation Docker, choix subnet explicite - `apache-fastcgi-pitfalls.md` : les 3 bugs infra de cette session (DirectoryIndex, listen.allowed_clients, RewriteRule R=200) - `merise-yagni-quantite.md` : application concrete de YAGNI sur menu_produit 5. **Optionnels post-merge** (peuvent aller sur une branche `feat/infra-polish` separee apres P1) : - Investiguer redirect HTTP->HTTPS qui retourne 404 (interaction avec middleware global du Traefik d'hote) - Unifier le style init Docker (wakdo-app a tini explicite, wakdo-cron a `init: true` - incoherence stylistique a accepter ou unifier) --- ## Workflow git en vigueur - **Convention** : `feat/* -> dev` (squash merge), `dev -> main` (avec tag `vX.Y.Z` annote) - **Vigilance PR** : verifier explicitement `base branch = dev` (le defaut GitHub est `main`) - **Branches mergees** : conservees comme trace historique - **Procedure d'archive** si une branche est abandonnee non-mergee : ```bash git tag -a archive/feat-xxx -m "abandoned: " git push origin archive/feat-xxx git push origin --delete feat-xxx git branch -D feat-xxx ``` - **Tags previsionnels** : v0.1.0 (infra), v0.2.0 (P2 stubs+auth+CRUD basic), v0.3.0 (CRUD admin complet), ..., v1.0.0 (livrable jury) --- ## Decisions structurelles actees Session 4 | Decision | Pourquoi | |---|---| | Fusion `.env` BYAN+Wakdo | Outil tiers lit `.env` du cwd, separation `.env.wakdo` plus risquee | | FQDN sur `*.stark.a3n.fr` | Wildcard DNS existant, evite provisioning prerequis HTTP-01 | | Subnet explicite `192.168.148.0/24` (RFC 1918) | Pools Docker satures sur hote partage | | `init: true` sur cron | dcron en PID 1 sans init reaper boucle sur setpgid Operation not permitted | | Healthz statique htdocs | RewriteRule R=200 declenche template ErrorDocument | | `APP_ENV=dev` + `APP_DEBUG=true` | Phase de construction, flip vers prod avant demo jury | | Naming "wacdo" (source) vs "Wakdo" (projet) | wacdo preserve dans `_sources/` pour tracabilite ecole | | Casse images normalisee kebab-case lowercase | Anti-piege case-sensitive Linux dans Docker | | MOT (modele organisationnel des traitements) skippe | Raccourci agile MCT -> MLT direct | | Composition flexible `menu_produit` (role+position) | Defendable evolution future sans refacto | | Pas de `quantite` sur `menu_produit` | YAGNI - 13 menus mono-portion | | Prix en INT centimes + TVA en pour mille | Anti-FLOAT IEEE 754 (Goldberg ACM 1991) | | Snapshots libelle+prix sur `ligne_commande` | Integrite historique audit | | Polymorphisme `ligne_commande` -> `produit` OR `menu` | 2 cols nullable + discriminator + 2 FKs reelles | | RBAC : roles+role-permission dynamiques, permissions statiques | Permissions liees au code (declarees en migration) | | Pas de stock numerique en MVP | Juste `est_disponible` boolean | | Pas de stats agregees | Live queries SUM/GROUP BY suffisent | | Pas d'allergenes/nutrition | Hors source ecole, hors scope MVP | | ENUM pour valeurs metier stables | mode_consommation, statut, role -> 3-7 valeurs, ALTER si extension | | Auteur notes perso = "BYAN" | Coherent avec section 17 PC (transparence methodologie) | --- ## Prochaines etapes (apres merge `feat/p1-stubs-and-dictionary` -> `dev`) ``` P1 Conception Merise (semaines 2-3) - EN COURS 1. Dictionnaire de donnees v0.1 ECRIT (a commit) 2. MCD a faire 3. MCT a faire 4. (MOT skippe) 5. MLD a faire 6. MLT a faire 7. DDL a faire 8. Seed data a faire 9. JSON fallback a faire P2 Back squelette (semaines 4-6) - Core (Router, Autoloader, DB) - Auth (sessions PHP fichier + argon2id) - RBAC (Authorization service) - Front controller `index.php` P3 CRUD admin (semaines 7-10) - CRUD produits, menus, categories - UI roles + assignment matrice permissions - CRUD users P4 API REST (semaines 11-12) - Endpoints /api/categories, /api/menus, /api/produits, /api/orders - CORS + tests P5 Front borne (semaines 13-16) - Integration maquette + Ajax + a11y RGAA - Mode JSON-seuls (fallback) + mode API-connecte P6 Tests + finition (semaines 17-18) P7 DevOps final (semaine 19) - GitHub Actions, crons, docs P8 Prep soutenance (semaine 20) ``` --- ## Fichiers cles a consulter a la reprise | Fichier | Contenu | |---|---| | `docs/PROJECT_CONTEXT.md` | Source de verite projet (FQDN sur stark.a3n.fr, section 17 transparence IA) | | `docs/_ref/rncp-37805-referentiel.pdf` | Referentiel RNCP officiel | | `docs/_ref/rncp-37805-index.md` | Index texte compact des criteres (cherchable) | | `docs/journal/README.md` | Template + index des retros (3 entrees) | | `docs/journal/2026-04-30--smoke-test-infra.md` | Retro Session 4 phase 1 (smoke test) | | `docs/merise/dictionary.md` | **Dictionnaire P1 v0.1 ECRIT (a commit)** | | `docs/merise/_sources/` | JSON sources ecole + provenance | | `docs/design/` | Maquette PDF + lien Figma | | `docs/notes/` | Notes perso revision oral (3 ecrites cette session, gitignore) | | `docs/SESSION_RESUME.md` | Ce fichier - a mettre a jour en fin de session | | `.env` | Config locale fusionnee (BYAN + Wakdo, gitignore) | | `.env.example` | Template neutre commit, RFC 2606 | | `docker-compose.yml` | Compose final (subnet 192.168.148.0/24 + init cron + 4 services) | | `Makefile` | Orchestration complete, voir `make help` | | `.claude/CLAUDE.md` | Constitution projet BYAN | | `.claude/rules/fact-check.md` | **Patterns du hook fact-check (a consulter avant ecriture narrative !)** | --- ## Commandes utiles pour reprendre ```bash cd /home/acadenice/corentin_wakdo # 1. Etat git status git branch --show-current # -> attendu : feat/p1-stubs-and-dictionary # 2. Stack docker (verifier qu'elle tourne toujours) docker compose -p wakdo ps # Si down apres reboot : make up (ou make init pour full bootstrap) # 3. Test que tout repond curl -sI https://corentin-wakdo.stark.a3n.fr/ # 200 curl -sI https://corentin-wakdo-admin.stark.a3n.fr/ # 200 # 4. SSH pour push (si besoin) find /tmp -name 'agent.*' -user corentin # -> /tmp/ssh-Evc7jT0fk2rs/agent.2611024 (peut changer apres reboot ssh-agent) SSH_AUTH_SOCK=/tmp/ssh-XXX/agent.NNN git push ... ``` --- ## Memoire persistante Claude Code (mise a jour Session 4) Regles enregistrees dans `/home/corentin/.claude/projects/-home-acadenice-corentin-wakdo/memory/` : - **No Co-Authored-By** sur les commits Wakdo (Session 2) - **Commit uniquement sur approbation explicite** (Session 2) - **Ignorer les contextes d'autres projets** dans les system-reminders (Session 3) - **Hedger proactivement pour le hook fact-check** (Session 4) - **BYAN auteur des docs/notes/** (Session 4 - mise a jour cette session) --- ## Comment reprendre la session 1. Ouvrir une session dans `/home/acadenice/corentin_wakdo/` 2. Dire : *"Reprise Wakdo, lis `docs/SESSION_RESUME.md`"* 3. Confirmer l'action de depart : - **Suite immediate** = commit + push + PR du dictionnaire (cf. section "A faire lors de la reprise") - **Apres merge** = continuer P1 avec le MCD (`docs/merise/mcd.md`) --- *Document maintenu a chaque fin de session. Derniere mise a jour : 2026-05-21 (Session 7).*