corentin_wakdo/docs/SESSION_RESUME.md
Imugiii 46832a17ce
All checks were successful
CI / secret-scan (push) Successful in 7s
CI / php-lint (push) Successful in 17s
CI / static-tests (push) Successful in 3s
ci: add Forgejo Actions pipeline and gitleaks secret-scan config
2026-06-15 09:56:39 +00:00

45 KiB
Executable file
Raw Blame History

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

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

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

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)

  1. Spawn agent UX-designer (Sally) en background avec scope 2 ecrans (welcome + categories), flag isolation: "worktree"
  2. L'agent a base sa branche sur feat/p1-conception au lieu de dev (le worktree n'a pas vraiment isole comme attendu)
  3. Rebase feat/p1-front-landing --onto dev 64f5a27 pour droper le commit drawio comme parent
  4. Renommage feat/p1-front-landing -> feat/p5-front-landing (front borne = livrable P5)

Bloc 3 - Setup automation PR (long detour sur les PATs)

  1. Push des 2 branches (SSH agent socket /tmp/ssh-Evc7jT0fk2rs/agent.2611024)
  2. Tentative gh CLI dans Docker -> mauvaise idee, abandonne
  3. Tentative fine-grained PAT #1 : Resource owner = Imugiii -> 404 sur wakdo_corentin (org repo invisible pour PAT a owner perso)
  4. Fine-grained PAT #2 : meme probleme (Resource owner encore = Imugiii)
  5. Fine-grained PAT #3 avec Resource owner = AcadeNice -> token en "Pending review" (org policy "approval required")
  6. Fallback classic PAT (ghp_) -> fonctionne des generation, scope repo, admin sur le repo
  7. PR #4 (front ready) + PR #5 (drawio draft) creees via POST /repos/AcadeNice/wakdo_corentin/pulls

Bloc 4 - 2e agent UX (P5 complet)

  1. Spawn agent UX en background sur feat/p5-front-landing avec scope etendu : 5 nouvelles pages + JS state + JSON fallback
  2. Auto-validation 7 checks dans le brief (assets exist, links resolve, JSON valid, HTML closed, JS syntax, http server e2e, JSON fetch)
  3. Livrable : 5 pages HTML, 7 modules JS, 2 JSON normalises copies dans borne/data/, CSS etendu de 438 -> 1257 lignes
  4. 6 commits thematiques (6f5daca -> 6a7e772), 7/7 auto-checks PASS
  5. Push, mise a jour PR #4 (titre + body) via PATCH /repos/.../pulls/4
  6. Test live kiosk : les endpoints repondent 200 (welcome, categories, products, product, cart, payment, confirmation, JSON, CSS, JS, images)

Commande exacte pour reprendre

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)

  1. 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)
  2. apache-fastcgi-pitfalls.md (405 lignes) - 3 pieges Session 4 (DirectoryIndex, allowed_clients, R=200) + Q&A jury
  3. docker-network-pools-rfc1918.md (376 lignes) - saturation pools Docker sur stark, choix 192.168.148.0/24, RFC 1918, Q&A jury
  4. enum-vs-table-reference.md (381 lignes) - matrice de decision ENUM vs table, application aux 4 ENUMs Wakdo, Q&A jury
  5. merise-yagni-quantite.md (337 lignes) - YAGNI applique a menu_produit, audit source ecole 13 menus mono-portion, Q&A jury
  6. docs/notes/README.md index mis a jour : 7 nouvelles entrees (3 Session 4 deja redigees + 4 nouvelles)

Bloc 3 - Setup branche conception + cadrage

  1. Branche feat/p1-merise-conception creee depuis dev, puis renommee en feat/p1-conception apres discussion sur l'ajout UML au scope
  2. 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/)
  3. docs/uml/ cree

Bloc 4 - MCD redige + setup pipeline diagrammes

  1. Premier draft MCD avec 4 diagrammes ASCII art (global + 3 sous-domaines)
    • tableau recap cardinalites Merise (0,N)/(1,1)
  2. User trouve l'ASCII moche -> bascule sur Mermaid erDiagram inline
  3. User ne voit pas le rendu Mermaid dans Cursor (pas d'extension installee) -> bascule sur SVG via mmdc
  4. Setup docs/merise/_diagrams/ : 4 fichiers .mmd extraits + 4 SVG generes via npx mmdc
  5. MCD edite : 4 blocs Mermaid remplaces par <img src="_diagrams/*.svg">
  6. Makefile : target docs-render ajoute, scanne tous les docs/**/_diagrams/*.mmd du projet, regen SVG (testee, OK 4/4)
  7. 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

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) :

    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

  1. Drop zone docs/_inbox/ recue (9 Mo, 71 images + 2 JSON + 1 PDF + 1 readme)
  2. Diagnostic : naming "wacdo" vs notre "Wakdo", casse incoherente, 7 typos dans JSON
  3. 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)
  4. Workaround chown via container ephemere (src/ etait owned root par Docker bind-mount)
  5. PR #2 -> dev (workflow correct cette fois)

Phase 3 - demarrage P1 Merise

  1. 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
  2. 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)
  3. 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)
  4. Validation HTTPS externe : kiosk -> 200 HTML, admin -> 200 PHP rendu (PHP_VERSION et timestamp dynamique substitues)
  5. Commit b8f7d35 : feat(stubs): unblock 403 with kiosk and admin index pages, plus FastCGI fixes
  6. 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
  7. 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
  8. 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

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 :

    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 :

    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 :
    git tag -a archive/feat-xxx <branch-tip-sha> -m "abandoned: <reason>"
    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

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).