docs: initial project context and methodology scaffold
Bootstrap commit pour le projet Wakdo (borne de commande RNCP 37805). Contenu : - docs/PROJECT_CONTEXT.md : source de verite du projet (scope, stack, architecture 2 FQDN, mapping critere RNCP/feature, planning, conventions) - .claude/CLAUDE.md : constitution du projet (methodologie BYAN) - .claude/rules/ : protocoles applique (fact-check scientifique, ELO trust, merise-agile, hermes-dispatcher, byan-api, byan-agents) - .gitignore : scope Option C (moteur BYAN ignore, methodologie visible) Stack : PHP 8.3 + MariaDB 11 + Apache Alpine + Docker + Traefik + GitHub Actions. Strategie B unifiee (front vanilla + back POO MVC from scratch + DevOps containerise). Deadline septembre 2026.
This commit is contained in:
commit
c044d9b48c
9 changed files with 1209 additions and 0 deletions
75
.claude/CLAUDE.md
Normal file
75
.claude/CLAUDE.md
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
# BYAN - Builder of YAN
|
||||
|
||||
> Projet propulse par BYAN (Merise Agile + TDD + 64 Mantras)
|
||||
> Installer: `npx create-byan-agent`
|
||||
> GitHub: https://github.com/Yan-Acadenice/BYAN
|
||||
|
||||
## Hermes - Dispatcher Universel
|
||||
|
||||
**Hermes est le point d'entree universel de ton ecosysteme BYAN.**
|
||||
Avant de chercher un agent specifique, demande a Hermes. Il connait tous les agents,
|
||||
workflows et contextes, et te route vers le bon specialiste.
|
||||
|
||||
Pour invoquer Hermes, tape: `@hermes` ou demande simplement "quel agent pour [ta tache]?"
|
||||
|
||||
Voir @.claude/rules/hermes-dispatcher.md pour les commandes Hermes.
|
||||
|
||||
## Architecture BYAN
|
||||
|
||||
```
|
||||
{project-root}/
|
||||
_byan/ # Plateforme BYAN
|
||||
_config/ # Manifestes (agents, workflows, tasks)
|
||||
bmb/ # Module Builder (BYAN, agents, workflows)
|
||||
_memory/ # Memoire persistante des agents
|
||||
_output/ # Artefacts generes
|
||||
.claude/ # Integration Claude Code
|
||||
CLAUDE.md # Ce fichier (instructions projet)
|
||||
rules/ # Regles modulaires par domaine
|
||||
.github/agents/ # Agents Copilot CLI (si installe)
|
||||
```
|
||||
|
||||
## Regles de Code
|
||||
|
||||
- Pas d'emojis dans le code, commits, ou specs techniques (Mantra IA-23)
|
||||
- Code auto-documente, commentaires uniquement pour le POURQUOI (Mantra IA-24)
|
||||
- Format commits: `type: description` (feat, fix, docs, refactor, test, chore)
|
||||
- Simplicite d'abord - Rasoir d'Ockham (Mantra #37)
|
||||
- Challenge Before Confirm - Valider avant d'accepter (Mantra IA-16)
|
||||
|
||||
## Commandes Utiles
|
||||
|
||||
- `@hermes` → Dispatcher universel (recommandations, routage, pipelines)
|
||||
- Agent disponibles: voir @.claude/rules/byan-agents.md
|
||||
- Methodologie: voir @.claude/rules/merise-agile.md
|
||||
- Systeme de confiance epistemique: voir @.claude/rules/elo-trust.md
|
||||
- Protocol fact-check scientifique: voir @.claude/rules/fact-check.md
|
||||
- Systeme API byan_web: voir @.claude/rules/byan-api.md
|
||||
|
||||
## API byan_web
|
||||
|
||||
BYAN expose une API REST via `$BYAN_API_URL` avec authentification par token (`ApiKey` ou `Bearer`).
|
||||
26 tools MCP sont disponibles pour Claude Code — a preferer au curl direct.
|
||||
Voir @.claude/rules/byan-api.md pour le detail.
|
||||
|
||||
## ELO Trust System
|
||||
|
||||
BYAN calibre l'intensite de ses challenges selon votre score ELO par domaine.
|
||||
Score bas → explications pedagogiques et scaffolding. Score eleve → aller droit au but.
|
||||
|
||||
Commandes CLI:
|
||||
- `node bin/byan-v2-cli.js elo summary` — voir tous les scores par domaine
|
||||
- `node bin/byan-v2-cli.js elo dashboard {domain}` — detail d'un domaine
|
||||
- `node bin/byan-v2-cli.js elo declare {domain} {level}` — declarer son expertise (junior/mid/senior/lead/expert)
|
||||
|
||||
Dans l'agent BYAN, tapez `[ELO]` pour acceder au menu ELO.
|
||||
|
||||
## Fact-Check Scientifique
|
||||
|
||||
BYAN applique Zero Trust sur lui-meme : tout claim doit etre demonstrable, quantifiable, reproductible.
|
||||
4 types d'assertions : `[REASONING]` `[HYPOTHESIS]` `[CLAIM Ln]` `[FACT USER-VERIFIED]`
|
||||
5 niveaux de preuve : L1 (spec officielle, 95%) → L5 (opinion, 20%)
|
||||
Domaines stricts : security/performance/compliance → LEVEL-2 minimum sinon BLOCKED.
|
||||
|
||||
Agent dédié: `@fact-checker` — analyse assertions, audits de documents, chaines de raisonnement.
|
||||
Dans BYAN: tapez `[FC]` pour le sous-menu fact-check.
|
||||
74
.claude/rules/byan-agents.md
Normal file
74
.claude/rules/byan-agents.md
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
# Agents BYAN - Ecosysteme Complet
|
||||
|
||||
## Core Module (Foundation)
|
||||
|
||||
| Agent | Persona | Role |
|
||||
|-------|---------|------|
|
||||
| **hermes** | Dispatcher | Routeur universel, point d'entree |
|
||||
| **bmad-master** | Orchestrateur | Execute workflows et tasks |
|
||||
| **yanstaller** | Installeur | Installation intelligente BYAN |
|
||||
| **expert-merise-agile** | Expert | Conception Merise Agile + MCD/MCT |
|
||||
|
||||
## BMB Module (Builders)
|
||||
|
||||
| Agent | Persona | Role |
|
||||
|-------|---------|------|
|
||||
| **byan** | Builder | Createur d'agents via interview (12 questions, 64 mantras) — [FC] + [ELO] intégrés |
|
||||
| **fact-checker** | Scientifique | Fact-check: assertions, audits de documents, chaines de raisonnement |
|
||||
| **agent-builder** | Constructeur | Expert en construction d'agents |
|
||||
| **marc** | Specialiste | Integration GitHub Copilot |
|
||||
| **rachid** | Specialiste | Deploiement NPM/NPX |
|
||||
| **carmack** | Optimiseur | Optimisation tokens |
|
||||
| **patnote** | Gestionnaire | Mises a jour et conflits |
|
||||
|
||||
## BMM Module (SDLC - Software Development Lifecycle)
|
||||
|
||||
| Agent | Persona | Role |
|
||||
|-------|---------|------|
|
||||
| **analyst** | Mary | Analyse business, etude de marche, brief |
|
||||
| **architect** | Winston | Design systeme, tech stack, architecture |
|
||||
| **dev** | Amelia | Implementation, coding, ultra-succincte |
|
||||
| **pm** | John | Product management, PRD, roadmap |
|
||||
| **sm** | Bob | Scrum master, sprint planning, backlog |
|
||||
| **quinn** | Quinn | QA engineer, tests, couverture |
|
||||
| **tech-writer** | Paige | Documentation, guides, clarity |
|
||||
| **ux-designer** | Sally | UX/UI design, empathie utilisateur |
|
||||
| **quick-flow-solo-dev** | Barry | Dev rapide brownfield |
|
||||
|
||||
## CIS Module (Creative Innovation & Strategy)
|
||||
|
||||
| Agent | Persona | Role |
|
||||
|-------|---------|------|
|
||||
| **brainstorming-coach** | Carson | Ideation, "YES AND" energy |
|
||||
| **creative-problem-solver** | Dr. Quinn | Resolution de problemes |
|
||||
| **design-thinking-coach** | Maya | Design thinking |
|
||||
| **innovation-strategist** | Victor | Strategie innovation |
|
||||
| **presentation-master** | Caravaggio | Presentations, slides |
|
||||
| **storyteller** | Sophia | Storytelling, narratives |
|
||||
|
||||
## TEA Module (Test Engineering & Architecture)
|
||||
|
||||
| Agent | Persona | Role |
|
||||
|-------|---------|------|
|
||||
| **tea** | Murat | Master test architect (ATDD, NFR, CI/CD) |
|
||||
|
||||
## Workflows Cles
|
||||
|
||||
| Workflow | Description |
|
||||
|----------|-------------|
|
||||
| `create-prd` | Creer un Product Requirements Document |
|
||||
| `create-architecture` | Concevoir l'architecture technique |
|
||||
| `create-epics-and-stories` | Decouper en epics et user stories |
|
||||
| `sprint-planning` | Planifier un sprint |
|
||||
| `dev-story` | Developper une story |
|
||||
| `code-review` | Revoir du code |
|
||||
| `quick-spec` | Spec rapide conversationnelle |
|
||||
| `quick-dev` | Dev rapide (brownfield) |
|
||||
| `elo-workflow` | Consulter et gerer le score ELO (via menu [ELO] du BYAN) |
|
||||
|
||||
## Comment Invoquer un Agent
|
||||
|
||||
Dans Claude Code, demande simplement:
|
||||
- "Je veux creer une architecture" → Hermes recommande `architect`
|
||||
- "Analyse ce projet" → Hermes recommande `analyst`
|
||||
- "Cree un nouvel agent" → Hermes recommande `byan`
|
||||
121
.claude/rules/byan-api.md
Normal file
121
.claude/rules/byan-api.md
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
# API byan_web — Reference Compacte
|
||||
|
||||
## 1. Base URL
|
||||
|
||||
Base URL dans `$BYAN_API_URL` env. Dev par defaut : `http://localhost:3737`. Prod exemple : `https://byan-api.stark.a3n.fr`. Ne pas inclure `/api` dans `$BYAN_API_URL` — les endpoints le contiennent deja.
|
||||
|
||||
## 2. Authentification
|
||||
|
||||
| Scheme | Quand | Exemple |
|
||||
|--------|-------|---------|
|
||||
| `ApiKey <key>` | Token commence par `byan_` | `Authorization: ApiKey byan_xxx` |
|
||||
| `Bearer <jwt>` | JWT recu via /api/auth/login | `Authorization: Bearer eyJ...` |
|
||||
|
||||
## 3. Format reponse
|
||||
|
||||
```json
|
||||
{ "data": "<payload>", "total": "<optionnel>", "error": "<si echec>", "code": "ERR_CODE" }
|
||||
```
|
||||
|
||||
## 4. Codes d'erreur critiques
|
||||
|
||||
| HTTP | Code | Cause |
|
||||
|------|------|-------|
|
||||
| 401 | AUTH_REQUIRED | Token absent ou invalide |
|
||||
| 403 | FORBIDDEN | Action non autorisee |
|
||||
| 403 | FORBIDDEN_RBAC | Role insuffisant |
|
||||
| 404 | NOT_FOUND | Ressource introuvable |
|
||||
| 409 | SLUG_EXISTS | Slug de projet deja utilise |
|
||||
| 409 | USERNAME_EXISTS | Username deja pris |
|
||||
|
||||
## 5. MCP tools disponibles (PREFERER ces tools au curl)
|
||||
|
||||
### Tools de base
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_ping` | Verifier que l'API repond | Non |
|
||||
| `byan_list_projects` | Lister les projets de l'utilisateur | Oui |
|
||||
| `byan_import_project` | Importer un projet local dans BYAN | Oui |
|
||||
|
||||
### Projets
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_projects_get` | Obtenir le detail d'un projet par ID/slug | Oui |
|
||||
| `byan_api_projects_create` | Creer un nouveau projet | Oui |
|
||||
|
||||
### Workflows
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_workflows_list` | Lister les workflows d'un projet | Oui |
|
||||
| `byan_api_workflows_get` | Detail d'un workflow par ID | Oui |
|
||||
| `byan_api_workflows_run` | Declencher l'execution d'un workflow | Oui |
|
||||
| `byan_api_workflow_runs_list` | Lister les executions d'un workflow | Oui |
|
||||
| `byan_api_workflow_runs_get` | Detail d'une execution par ID | Oui |
|
||||
|
||||
### Knowledge
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_knowledge_list` | Lister les articles de la base de connaissance | Oui |
|
||||
| `byan_api_knowledge_get` | Obtenir un article par ID | Oui |
|
||||
|
||||
### Memoire
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_memory_list` | Lister les entrees memoire d'un agent | Oui |
|
||||
| `byan_api_memory_search` | Recherche semantique dans la memoire | Oui |
|
||||
|
||||
### Agents personnalises
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_custom_agents_list` | Lister les agents custom du projet | Oui |
|
||||
| `byan_api_custom_agents_get` | Detail d'un agent custom par ID | Oui |
|
||||
| `byan_api_custom_agents_clone_system` | Cloner un agent systeme en agent custom | Oui |
|
||||
|
||||
### Sessions
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_sessions_list` | Lister les sessions actives | Oui |
|
||||
| `byan_api_sessions_get` | Detail d'une session par ID | Oui |
|
||||
| `byan_api_sessions_history` | Historique des messages d'une session | Oui |
|
||||
|
||||
### Chat
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_chat_conversations_list` | Lister les conversations | Oui |
|
||||
| `byan_api_chat_messages_list` | Lister les messages d'une conversation | Oui |
|
||||
| `byan_api_chat_send` | Envoyer un message dans une conversation | Oui |
|
||||
|
||||
### Recherche et import
|
||||
|
||||
| Tool | Usage | Auth requise |
|
||||
|------|-------|--------------|
|
||||
| `byan_api_search` | Recherche globale (projets, agents, knowledge) | Oui |
|
||||
| `byan_api_import_scan` | Scanner un dossier local avant import | Non |
|
||||
| `byan_api_import_dry_run` | Simuler un import sans l'executer | Oui |
|
||||
|
||||
## 6. Fallback curl (si un tool MCP manque)
|
||||
|
||||
```bash
|
||||
curl -H "Authorization: ApiKey $BYAN_API_TOKEN" "$BYAN_API_URL/api/projects"
|
||||
|
||||
curl -X POST -H "Authorization: ApiKey $BYAN_API_TOKEN" -H "Content-Type: application/json" \
|
||||
-d '{"trigger":"..."}' "$BYAN_API_URL/api/workflows/<id>/run"
|
||||
```
|
||||
|
||||
## 7. Patterns courants
|
||||
|
||||
| Je veux... | Tool MCP a appeler |
|
||||
|------------|--------------------|
|
||||
| Lister mes projets | `byan_list_projects` |
|
||||
| Detail d'un projet | `byan_api_projects_get` |
|
||||
| Lancer un workflow | `byan_api_workflows_run` |
|
||||
| Chercher dans la memoire | `byan_api_memory_search` |
|
||||
| Importer un projet local | `byan_import_project` |
|
||||
78
.claude/rules/elo-trust.md
Normal file
78
.claude/rules/elo-trust.md
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
# ELO Trust System — Epistemic Trust Protocol
|
||||
|
||||
## Principe
|
||||
|
||||
BYAN mesure la fiabilite des assertions de l'utilisateur par domaine technique
|
||||
en utilisant un algorithme Glicko-2 simplifie (echelle 0-1000).
|
||||
Plus le score est eleve, moins le challenge est intense et plus la reponse est concise.
|
||||
|
||||
## Domaines suportees
|
||||
|
||||
| Domaine | K-factor |
|
||||
|---------|----------|
|
||||
| security | ×1.5 |
|
||||
| compliance | ×1.5 |
|
||||
| performance | ×1.2 |
|
||||
| javascript, typescript, nodejs, python, rust, go | ×1.0 |
|
||||
| algorithms | ×0.8 |
|
||||
|
||||
## Paliers ELO
|
||||
|
||||
| Plage | Label | Comportement BYAN |
|
||||
|-------|-------|-------------------|
|
||||
| 0-200 | Apprenti | Explications completes, analogies, scaffold maximal |
|
||||
| 201-450 | Debutant | Guide pas-a-pas, verification frequente |
|
||||
| 450-550 | Zone morte | Challenge intense (Dunning-Kruger peak) |
|
||||
| 551-750 | Intermediaire | Challenge modere, hypotheses testees |
|
||||
| 751-900 | Avance | Challenge minimal, discussion paire-a-paire |
|
||||
| 901-1000 | Expert | Reponses courtes, pas d'explications basiques |
|
||||
|
||||
## Routage LLM (experimental)
|
||||
|
||||
| ELO max | Modele |
|
||||
|---------|--------|
|
||||
| 0-200 | claude-opus (raisonnement profond) |
|
||||
| 201-600 | claude-sonnet (equilibre) |
|
||||
| 601+ | claude-haiku (concis, expert autonome) |
|
||||
|
||||
## Protocole de challenge
|
||||
|
||||
Quand l'agent BYAN evalue un claim sur un domaine:
|
||||
1. Recupere le score ELO du domaine via `node bin/byan-v2-cli.js elo context {domain}`
|
||||
2. Applique le `promptInstructions` retourne (ton, profondeur, scaffold)
|
||||
3. Ton invariant: TOUJOURS curieux, JAMAIS accusatoire ("qu'est-ce qui t'a amene a ca?" vs "c'est faux")
|
||||
4. Apres echange: enregistre le resultat `VALIDATED | BLOCKED | PARTIAL` via CLI
|
||||
5. Ce protocole est silencieux — l'utilisateur voit seulement le challenge, pas les mecaniques ELO
|
||||
|
||||
## Mecaniques speciales (V2)
|
||||
|
||||
- **Tilt detector**: 3 BLOCKED consecutifs → BYAN propose une pause pedagogique
|
||||
- **First blood**: premier claim dans un domaine vierge = toujours challenge (Zero Trust)
|
||||
- **Zone morte 450-550**: incertitude maximale, challenge le plus nuance
|
||||
- **ELO farming protection**: claims trop faciles → K-factor reduit automatiquement
|
||||
- **Hot hand**: 3 corrects consecutifs → petit boost de K (puis regression vers la moyenne)
|
||||
- **Shadow challenger**: expert (750+) peut activer un alter-ego adversarial opt-in
|
||||
|
||||
## Commandes CLI
|
||||
|
||||
```bash
|
||||
node bin/byan-v2-cli.js elo summary # tous les domaines
|
||||
node bin/byan-v2-cli.js elo dashboard {domain} # detail d'un domaine
|
||||
node bin/byan-v2-cli.js elo context {domain} # contexte pour un challenge
|
||||
node bin/byan-v2-cli.js elo record {domain} {VALIDATED|BLOCKED|PARTIAL}
|
||||
node bin/byan-v2-cli.js elo declare {domain} {junior|mid|senior|lead|expert}
|
||||
```
|
||||
|
||||
## Menu BYAN
|
||||
|
||||
Dans l'agent BYAN, tapez `[ELO]` pour acceder au sous-menu ELO:
|
||||
- Dashboard par domaine
|
||||
- Enregistrer un claim
|
||||
- Declarer son expertise
|
||||
- Voir le routage LLM recommande
|
||||
|
||||
## Philosophie
|
||||
|
||||
Le score ELO n'est pas une punition — c'est un outil de calibration.
|
||||
Un score bas signifie "BYAN va t'expliquer plus, pas moins".
|
||||
La pedagogie s'adapte au niveau, le ton reste constant: bienveillant et curieux.
|
||||
109
.claude/rules/fact-check.md
Normal file
109
.claude/rules/fact-check.md
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
# Fact-Check Protocol — Demonstrable, Quantifiable, Reproducible
|
||||
|
||||
## Principe fondateur
|
||||
|
||||
Tout claim emis par un agent BYAN doit satisfaire les trois criteres :
|
||||
|
||||
| Critere | Definition | Exemple |
|
||||
|---------|-----------|---------|
|
||||
| **Demonstrable** | Source primaire verifiable | RFC 7234, redis.io/benchmarks |
|
||||
| **Quantifiable** | Precis, pas vague | "Redis > 100k ops/sec" pas "Redis est rapide" |
|
||||
| **Reproductible** | L'utilisateur peut le tester | `redis-benchmark -n 100000` |
|
||||
|
||||
Un claim sans ces trois criteres = opinion ou hypothese, presente comme tel.
|
||||
|
||||
## Les 4 types d'assertions
|
||||
|
||||
Tout output d'agent BYAN est prefixe par son type :
|
||||
|
||||
```
|
||||
[REASONING] Deduction logique — pas de garantie de verite
|
||||
[HYPOTHESIS] Plausible dans ce contexte — a verifier avant action
|
||||
[CLAIM L{n}] Assertion sourced — niveau n (1-5)
|
||||
[FACT USER-VERIFIED date] Valide par l'utilisateur avec artefact
|
||||
```
|
||||
|
||||
## Les 5 niveaux de preuve
|
||||
|
||||
| Niveau | Score | Sources |
|
||||
|--------|-------|---------|
|
||||
| LEVEL-1 | 95% | RFC, W3C, ECMAScript, POSIX, spec officielle |
|
||||
| LEVEL-2 | 80% | Benchmark executable, CVE reference, docs produit officielles |
|
||||
| LEVEL-3 | 65% | Article peer-reviewed, livre technique reconnu |
|
||||
| LEVEL-4 | 50% | Consensus communaute (StackOverflow > 1000 votes) |
|
||||
| LEVEL-5 | 20% | Opinion / experience personnelle |
|
||||
|
||||
## Domaines stricts
|
||||
|
||||
| Domaine | Niveau minimum | Sous le seuil |
|
||||
|---------|---------------|---------------|
|
||||
| security | LEVEL-2 | BLOCKED — CVE ou benchmark requis |
|
||||
| performance | LEVEL-2 | BLOCKED — profiler output ou benchmark requis |
|
||||
| compliance | LEVEL-1 | BLOCKED — texte reglementaire requis |
|
||||
|
||||
## Bloc FACT-CHECK standard
|
||||
|
||||
```
|
||||
┌─ FACT-CHECK ──────────────────────────────────────────────────┐
|
||||
│ Claim : [assertion mot pour mot] │
|
||||
│ Domain : [security | performance | javascript | general] │
|
||||
│ Verdict : [BLOCKED | CLAIM L1 | CLAIM L2 | CLAIM L3 │
|
||||
│ | HYPOTHESIS | REASONING | UNVERIFIED] │
|
||||
│ Source : [nom exact depuis _byan/knowledge/sources.md │
|
||||
│ ou "aucune — preuve requise: [type exact]"] │
|
||||
│ Confiance : [score % selon niveau] │
|
||||
│ Challenge : [question manquante — source? reproductible?] │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Trust Score (audit de document)
|
||||
|
||||
```
|
||||
Trust Score = (assertions CLAIM + FACT) / total × 100
|
||||
Badge : A ≥ 90% | B ≥ 75% | C ≥ 60% | D ≥ 40% | F < 40%
|
||||
```
|
||||
|
||||
## Regles invariantes
|
||||
|
||||
- NEVER generate a URL — cite only sources in `_byan/knowledge/sources.md` or user-provided
|
||||
- ZERO TRUST ON SELF — training data = starting point, not the source
|
||||
- TONE INVARIANT — always curious, never accusatory
|
||||
- CHAIN WARNING — chain > 3 steps → compute multiplicative confidence; if < 60%, warn
|
||||
|
||||
## Commandes CLI
|
||||
|
||||
```bash
|
||||
node bin/byan-v2-cli.js fc check "Redis is always faster than PostgreSQL"
|
||||
node bin/byan-v2-cli.js fc parse "This is obviously the best approach"
|
||||
node bin/byan-v2-cli.js fc verify "claim text" "proof artifact"
|
||||
node bin/byan-v2-cli.js fc graph
|
||||
node bin/byan-v2-cli.js fc sheet [session-id]
|
||||
```
|
||||
|
||||
## Agent dedié
|
||||
|
||||
```
|
||||
@fact-checker # Agent Copilot CLI dédié
|
||||
[FC] # Sous-menu dans l'agent @byan
|
||||
```
|
||||
|
||||
## Worker npm
|
||||
|
||||
```javascript
|
||||
const FactCheckWorker = require('./_byan/workers/fact-check-worker');
|
||||
const fc = new FactCheckWorker({ verbose: true });
|
||||
|
||||
const result = fc.check("Redis is always faster than PostgreSQL");
|
||||
// → { assertionType: 'HYPOTHESIS', level: 5, score: 20, status: 'OPINION' }
|
||||
|
||||
const claims = fc.parse("This is obviously the best approach for security");
|
||||
// → [{ matched: 'obviously', ... }]
|
||||
```
|
||||
|
||||
## Auto-detection patterns
|
||||
|
||||
Declencheurs automatiques (patterns BYAN) :
|
||||
- Mots absolus : `toujours, jamais, forcement, always, never, obviously`
|
||||
- Superlatifs : `plus rapide, mieux, optimal, faster, better, superior`
|
||||
- Best-practices non sourcees : `bonne pratique, best practice, industry standard`
|
||||
- Affirmations certaines : `il est clair que, prouve que, it is well known that`
|
||||
53
.claude/rules/hermes-dispatcher.md
Normal file
53
.claude/rules/hermes-dispatcher.md
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
# Hermes - Dispatcher Universel BYAN
|
||||
|
||||
Hermes est le routeur intelligent de l'ecosysteme BYAN. Il ne fait pas le travail
|
||||
lui-meme, il invoque le bon specialiste.
|
||||
|
||||
## Commandes Hermes
|
||||
|
||||
| Commande | Action |
|
||||
|----------|--------|
|
||||
| `[LA]` | Lister tous les agents par module |
|
||||
| `[LW]` | Lister les workflows disponibles |
|
||||
| `[LC]` | Lister les contextes projet |
|
||||
| `[REC]` | Recommandation: decris ta tache, Hermes trouve le bon agent |
|
||||
| `[PIPE]` | Pipelines multi-agents pour taches complexes |
|
||||
| `[?agent]` | Quick help sur un agent sans le charger |
|
||||
| `[@agent]` | Invoquer directement un agent |
|
||||
| `[HELP]` | Reafficher le menu |
|
||||
| `[EXIT]` | Quitter Hermes |
|
||||
|
||||
## Routage Intelligent
|
||||
|
||||
Quand un utilisateur decrit une tache, Hermes recommande le bon agent:
|
||||
|
||||
| Mots-cles | Agent recommande |
|
||||
|-----------|------------------|
|
||||
| analyser, requirements, brief, etude | analyst (Mary) |
|
||||
| architecture, design, tech stack | architect (Winston) |
|
||||
| coder, implementer, dev, feature | dev (Amelia) |
|
||||
| tester, QA, coverage, bugs | quinn (QA) / tea (Murat) |
|
||||
| planifier, sprint, backlog, scrum | sm (Bob) |
|
||||
| documenter, guide, readme | tech-writer (Paige) |
|
||||
| UX, design, mockup, interface | ux-designer (Sally) |
|
||||
| PRD, produit, roadmap, specs | pm (John) |
|
||||
| creer agent, workflow, module | byan (Builder) |
|
||||
| brainstorm, idees, innovation | brainstorming-coach (Carson) |
|
||||
| optimiser, tokens, performance | carmack (Optimizer) |
|
||||
|
||||
## Pipelines Predefinies
|
||||
|
||||
1. **Feature Complete**: PM → Architect → UX → SM → Dev → Tea
|
||||
2. **Idea to Code**: PM → Architect → SM → Quick Flow
|
||||
3. **New Agent**: BYAN (handles entire flow)
|
||||
4. **Refactoring**: Architect → Dev → Tea
|
||||
5. **Bug Fix**: Dev → Quinn
|
||||
6. **Documentation**: Analyst → Tech Writer
|
||||
7. **Quality Complete**: Tea → Quinn → code-review
|
||||
|
||||
## Manifestes
|
||||
|
||||
Hermes lit les manifestes CSV a l'execution:
|
||||
- `_byan/_config/agent-manifest.csv` - Tous les agents installes
|
||||
- `_byan/_config/workflow-manifest.csv` - Tous les workflows
|
||||
- `_byan/_config/task-manifest.csv` - Toutes les tasks standalone
|
||||
48
.claude/rules/merise-agile.md
Normal file
48
.claude/rules/merise-agile.md
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
# Methodologie Merise Agile + TDD
|
||||
|
||||
BYAN utilise la methodologie Merise Agile enrichie de 64 mantras.
|
||||
|
||||
## Principes Fondamentaux
|
||||
|
||||
1. **Data Dictionary First** (Mantra #33): Definir les entites de donnees avant toute modelisation
|
||||
2. **MCD-MCT Cross-Validation** (Mantra #34): Coherence entre modeles de donnees et traitements
|
||||
3. **Bottom-Up from User Stories**: Les entites emergent des user stories
|
||||
4. **Incremental Design**: Sprint 0 = MCD squelettique, enrichi sprint par sprint
|
||||
5. **Test-Driven at All Levels**: Tests conceptuels avant implementation
|
||||
|
||||
## Mantras Cles
|
||||
|
||||
| ID | Mantra | Application |
|
||||
|----|--------|-------------|
|
||||
| #37 | Rasoir d'Ockham | Simplicite d'abord, approche MVP |
|
||||
| #39 | Consequences | Evaluer avant d'executer |
|
||||
| IA-1 | Trust But Verify | Challenger toutes les exigences |
|
||||
| IA-16 | Challenge Before Confirm | Jouer l'avocat du diable |
|
||||
| IA-23 | No Emoji Pollution | Zero emoji dans code, commits, specs |
|
||||
| IA-24 | Clean Code | Auto-documente, commentaires minimaux |
|
||||
|
||||
## Cycle de Developpement BYAN
|
||||
|
||||
```
|
||||
Phase 0: Document Project (brownfield)
|
||||
Phase 1: Analyse (Brief → PRD)
|
||||
Phase 2: Planning (Architecture → Epics/Stories)
|
||||
Phase 3: Solutioning (Sprint Planning)
|
||||
Phase 4: Implementation (Dev → Test → Review)
|
||||
```
|
||||
|
||||
## Niveaux de Test
|
||||
|
||||
Priorite (preferer les niveaux bas):
|
||||
1. **Unit** > **Integration** > **E2E**
|
||||
2. Les tests API sont first-class citizens
|
||||
3. Tout nouveau code necessite des tests unitaires
|
||||
4. Chemins critiques: tests d'integration
|
||||
5. Parcours utilisateur: tests E2E
|
||||
|
||||
## Convention Commits
|
||||
|
||||
Format: `type: description`
|
||||
- Types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`
|
||||
- PAS d'emojis dans les commits
|
||||
- Description claire et concise en anglais
|
||||
67
.gitignore
vendored
Normal file
67
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# === Secrets ===
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
*.pem
|
||||
*.key
|
||||
|
||||
# === BYAN — plateforme (moteur), masquee ===
|
||||
# Le code moteur des agents n'est pas part du rendu RNCP.
|
||||
# La methodologie appliquee (CLAUDE.md + rules + hooks) reste dans .claude/
|
||||
# pour transparence vis-a-vis du jury.
|
||||
_byan/
|
||||
_byan-output/
|
||||
|
||||
# === Claude Code — on garde UNIQUEMENT la methodologie ===
|
||||
# VISIBLE : .claude/CLAUDE.md (constitution projet)
|
||||
# VISIBLE : .claude/rules/ (fact-check, merise-agile, ELO trust, etc.)
|
||||
# IGNORE : tout le reste (agents, skills, hooks, config perso, etat local)
|
||||
.claude/*
|
||||
!.claude/CLAUDE.md
|
||||
!.claude/rules/
|
||||
|
||||
# === MCP config (potentiellement tokens) ===
|
||||
.mcp.json
|
||||
|
||||
# === PHP / Composer (non utilise mais safety) ===
|
||||
vendor/
|
||||
composer.lock
|
||||
composer.phar
|
||||
|
||||
# === Tests ===
|
||||
.phpunit.result.cache
|
||||
/tests/_output/
|
||||
/tests/_support/_generated/
|
||||
|
||||
# === OS ===
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# === IDE ===
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# === Logs ===
|
||||
*.log
|
||||
/logs/
|
||||
|
||||
# === Data / Uploads / Backups ===
|
||||
/backups/
|
||||
/src/public/uploads/
|
||||
/data/
|
||||
|
||||
# === Build artifacts ===
|
||||
/dist/
|
||||
/build/
|
||||
/public/build/
|
||||
|
||||
# === Node (au cas ou) ===
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
# === Docker volumes locaux ===
|
||||
/docker-data/
|
||||
584
docs/PROJECT_CONTEXT.md
Normal file
584
docs/PROJECT_CONTEXT.md
Normal file
|
|
@ -0,0 +1,584 @@
|
|||
# Wakdo — Project Context
|
||||
|
||||
**Source de verite du projet.** Ce document est injecte comme contexte dans tous les agents BYAN utilises pour ce projet (expert-merise-agile, architect, dev, ux-designer, tea, quinn, etc.). Il doit etre mis a jour des qu'une decision structurante change.
|
||||
|
||||
---
|
||||
|
||||
## 1. Identite projet
|
||||
|
||||
| Champ | Valeur |
|
||||
|---|---|
|
||||
| Nom du projet | **Wakdo** — borne de commande fictive (pastiche McDonald's) |
|
||||
| Auteur | Corentin |
|
||||
| Cadre | Epreuve RNCP 37805 — Titre Developpeur Web, B2, option **DevOps** |
|
||||
| Centre | Acadenice |
|
||||
| Contexte pro | Alternance en tant qu'admin sys + etudiant B2 DevOps |
|
||||
| Deadline soutenance | **Septembre 2026** |
|
||||
| Budget heures | 10-15 h/semaine — cible ~240 h effectives |
|
||||
| Mode de travail | Solo |
|
||||
| Date de creation du doc | 2026-04-23 |
|
||||
|
||||
---
|
||||
|
||||
## 2. Contexte metier
|
||||
|
||||
Wakdo est une **borne de commande tactile** pour un restaurant de restauration rapide. L'utilisateur final (client) compose sa commande sur ecran tactile, valide, recupere un numero, puis retire son produit au comptoir.
|
||||
|
||||
### Acteurs
|
||||
|
||||
| Acteur | Role | Interface |
|
||||
|---|---|---|
|
||||
| **Client** | Passe sa commande sur la borne | Borne tactile (Bloc 1) |
|
||||
| **Accueil** | Saisit commandes au **comptoir** (client au guichet) ou au **drive** (client en voiture via intercom + casque equipier), remet les commandes livrees aux clients | Back-office (Bloc 2) |
|
||||
| **Preparation** | Voit les commandes a preparer triees par heure croissante, les declare "preparees" | Back-office (Bloc 2) |
|
||||
| **Administration** | CRUD sur donnees (produits, menus, prix, images) + gestion utilisateurs + stats | Back-office (Bloc 2) |
|
||||
|
||||
### Processus metier cle
|
||||
|
||||
```
|
||||
Client Borne (Bloc 1) API (Bloc 2) BDD
|
||||
│ │ │ │
|
||||
│─compose panier──────▶│ │ │
|
||||
│ │─GET menus,produits───▶│───SELECT──────────▶│
|
||||
│ │◀──────────JSON────────│◀───────────────────│
|
||||
│─valide────────────────│ │ │
|
||||
│─saisit numero─────────│ │ │
|
||||
│ │─POST /api/orders─────▶│───INSERT──────────▶│
|
||||
│ │◀──────────201─────────│ │
|
||||
│─recupere au comptoir │ │ │
|
||||
Preparation voit commande pending
|
||||
→ declare "preparee"
|
||||
Accueil voit commande prete
|
||||
→ declare "livree"
|
||||
```
|
||||
|
||||
### Regles metier (MCT - a modeliser en Merise)
|
||||
|
||||
- Un **menu** = burger + accompagnement (frites OU salade) + boisson + sauce
|
||||
- Les **accompagnements** et **boissons** ont **2 tailles** (normale / grande)
|
||||
- **Grande taille** = +0,50 € sur le prix de base
|
||||
- Une **commande** a un **numero** saisi par le client (remplace le paiement dans le cadre de l'exam)
|
||||
- Statuts commande : `pending` -> `preparing` -> `ready` -> `delivered` (ou `cancelled`)
|
||||
- **Source commande** (trace sur chaque commande) : `kiosk` (borne autonome) | `counter` (comptoir) | `drive` (drive-thru)
|
||||
- La preparation voit les commandes triees par **heure de livraison croissante** (tous canaux confondus)
|
||||
- **Horaires service** : 10h00 → 01h00 du matin (service continu 15h, pas de fermeture intermediaire)
|
||||
- **Pas de notion de "session de service" a modeliser** : les equipiers se relaient, chacun se connecte a sa prise de poste et se deconnecte a la fin. Pas de "shift" a tracer dans la BDD (hors scope RNCP)
|
||||
- **Fenetre de maintenance systeme** : 01h30 → 09h30 (crons lourds, backups, agregations) — evite toute interference avec le service actif
|
||||
- **Notion de "jour de service"** (important pour les stats et l'agregation) :
|
||||
- Un jour de service J = toutes les commandes creees entre **J 10h00** et **J+1 01h00**
|
||||
- Exemple : la soiree du 22/04 = commandes `22/04 10:00 → 23/04 01:00`, regroupees sous `service_day = 2026-04-22`
|
||||
- Une commande creee a 23h55 le 22/04 et livree a 00h30 le 23/04 appartient au meme jour de service (22/04)
|
||||
- **Implementation** : colonne `service_day` calculee sur la table `orders`, ou vue SQL :
|
||||
```sql
|
||||
service_day = CASE
|
||||
WHEN HOUR(created_at) < 10 THEN DATE(created_at - INTERVAL 1 DAY)
|
||||
ELSE DATE(created_at)
|
||||
END
|
||||
```
|
||||
- Les requetes de stats (CA jour, produits top, etc.) utilisent `service_day` et non `DATE(created_at)` brut
|
||||
|
||||
---
|
||||
|
||||
## 3. Contexte academique — RNCP 37805
|
||||
|
||||
**Referentiel** : [certifpro.francecompetences.fr](https://certifpro.francecompetences.fr/api/fiches/refActivity/24345/472313)
|
||||
|
||||
### Blocs couverts
|
||||
|
||||
| Bloc | Nom | Statut | Activites |
|
||||
|---|---|---|---|
|
||||
| **Bloc 1** | Developpement Front-End | Tronc commun obligatoire | A1 (integration), A2 (fonctionnalites JS) |
|
||||
| **Bloc 2** | Developpement Back-End | Tronc commun obligatoire | A3 (data/BDD), A4 (back-end) |
|
||||
| **Bloc 5** | DevOps (option 3) | Option choisie | A7 (automatisation + conteneurisation + CI/CD) |
|
||||
|
||||
### Validation
|
||||
|
||||
- **50 % minimum par bloc** pour le valider
|
||||
- **50 % moyenne globale** pour valider le titre
|
||||
- **Stage** = 20 % de la note finale (couvert par l'alternance)
|
||||
- **Controle continu** 30 % + **Examens jurys** 50 %
|
||||
|
||||
---
|
||||
|
||||
## 4. Strategie de projet
|
||||
|
||||
### Strategie B — unifiee
|
||||
|
||||
**Un seul codebase, deux FQDN d'exposition publique.** Le front Bloc 1 et le back Bloc 2 coexistent dans la meme arborescence. Une bascule mode JSON-seuls (Bloc 1 isole) vs mode API-connecte doit rester possible via configuration.
|
||||
|
||||
**Pourquoi pas strategie A (deux rendus isoles)** : le Bloc 5 DevOps impose une conteneurisation **unique** qui lance la stack complete avec `make init` en une commande (Cr 7.c.4). Deux codebases isolees seraient incoherentes avec cette exigence.
|
||||
|
||||
### Compatibilite evaluation par bloc
|
||||
|
||||
- **Jury Bloc 1** : voit le front seul ; le front peut tomber en fallback sur JSON statiques fournis (`src/public/borne/data/*.json`) si l'API est indisponible.
|
||||
- **Jury Bloc 2** : voit le back-office + teste l'API via curl/Postman de maniere autonome, sans dependre du front.
|
||||
- **Jury Bloc 5** : lance `make init` ou `docker compose up`, verifie la CI/CD, les crons, l'archi, les scripts.
|
||||
|
||||
---
|
||||
|
||||
## 5. Architecture
|
||||
|
||||
### 2 FQDN exposes
|
||||
|
||||
| FQDN | Role | Bloc | Auth |
|
||||
|---|---|---|---|
|
||||
| `corentin-wakdo.acadenice.fr` | Borne client (kiosk tactile) | Bloc 1 | Public |
|
||||
| `corentin-wakdo-admin.acadenice.fr` | Back-office + API REST (sous `/api/*`) | Bloc 2 | Sessions (back-office) + tokens (API ecriture) |
|
||||
|
||||
**CORS** : la borne (`corentin-wakdo.acadenice.fr`) consomme l'API (`corentin-wakdo-admin.acadenice.fr/api/*`). Headers CORS explicites avec origine precise (pas de wildcard `*`), argumentable comme durcissement securite face au jury.
|
||||
|
||||
### Services Docker
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ Traefik (existant) │
|
||||
│ (admin_proxy network) │
|
||||
└──────────┬────────────────────────────┬─────────────────────────┘
|
||||
│ │
|
||||
wakdo.acadenice.fr wakdo-admin.acadenice.fr
|
||||
│ │
|
||||
▼ ▼
|
||||
┌──────────────────────────────────────────┐
|
||||
│ wakdo-web (Apache Alpine) │
|
||||
│ Front controller + reverse vers FPM │
|
||||
└──────────┬───────────────────────────────┘
|
||||
│ FastCGI :9000
|
||||
▼
|
||||
┌──────────────────────────────────────────┐
|
||||
│ wakdo-app (PHP 8.3-fpm Alpine) │
|
||||
│ POO MVC — borne.php, admin.php, api.php │
|
||||
└──────────┬───────────────────────────────┘
|
||||
│ PDO MySQL
|
||||
▼
|
||||
┌──────────────────────────────────────────┐
|
||||
│ wakdo-db (MariaDB 11) │
|
||||
│ volume persistant │
|
||||
└──────────────────────────────────────────┘
|
||||
|
||||
┌──────────────────────────────────────────┐
|
||||
│ wakdo-cron (Alpine + PHP CLI) │
|
||||
│ crond — backup BDD, purge sessions, ... │
|
||||
└──────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
Reseaux :
|
||||
- `admin_proxy` (external) — expose `wakdo-web` a Traefik
|
||||
- `wakdo_internal` (bridge, interne) — isole `wakdo-app`, `wakdo-db`, `wakdo-cron`
|
||||
|
||||
---
|
||||
|
||||
## 6. Stack technique lockee
|
||||
|
||||
| Couche | Choix | Version | Raison |
|
||||
|---|---|---|---|
|
||||
| Front langages | HTML5 + CSS3 + JavaScript | Standards 2024+ | Exigence Bloc 1 (vanilla) |
|
||||
| Front framework | **Aucun** | — | Sujet Bloc 1 impose |
|
||||
| Front dep JS | **Aucune** | — | Exigence explicite |
|
||||
| Back langage | PHP | **8.3** LTS | Moderne, support jusqu'a 2027 |
|
||||
| Back framework | **Aucun** | — | Sujet Bloc 2 "from scratch" |
|
||||
| Autoloader | **Manuel** (spl_autoload_register, PSR-4) | — | Defend "from scratch", Cr 4.c.3 compatible |
|
||||
| Tests | **PHPUnit** via `.phar` autonome | 11.x | Cr 4.g.2 sans Composer |
|
||||
| Composer | **Non utilise** | — | Colle au "from scratch" |
|
||||
| BDD | MariaDB | **11** LTS | Compatible MySQL, LTS 2028 |
|
||||
| Driver BDD | PDO (prepared statements uniquement) | natif PHP | Cr 4.e.1 anti-injection |
|
||||
| Serveur web | Apache httpd | Alpine latest | Reverse proxy vers PHP-FPM |
|
||||
| Serveur app | PHP-FPM | 8.3-fpm-alpine | Contenairisation propre |
|
||||
| Reverse proxy | Traefik (deja en place) | existant | `admin_proxy` network |
|
||||
| TLS | Let's Encrypt via Traefik | auto | `acme.json` existant |
|
||||
| Conteneurisation | Docker + docker compose | v2 | Cr 7.c |
|
||||
| Orchestration locale | Makefile | — | Cr 7.b (script) + Cr 7.c.4 (une commande) |
|
||||
| CI/CD | GitHub Actions | — | Cr 7.d |
|
||||
| Versioning | Git + GitHub | — | Cr 4.f (collaboration) |
|
||||
| Hooks Git | pre-commit + commit-msg | versionnes dans `.githooks/` | Conventional Commits |
|
||||
|
||||
---
|
||||
|
||||
## 7. Scope fonctionnel
|
||||
|
||||
### Bloc 1 — Borne client (Front)
|
||||
|
||||
**IN scope :**
|
||||
- Affichage dynamique menus + produits (charges par Ajax depuis API ou JSON fallback)
|
||||
- Composition panier : produits unitaires OU menus (burger + accompagnement + boisson + sauce)
|
||||
- Options taille (normale / grande, +0,50 € sur grande) pour accompagnements et boissons
|
||||
- Options de personnalisation simples (ex : sans oignon, avec fromage)
|
||||
- Recapitulatif panier (ajout, modification quantite, suppression)
|
||||
- Validation commande + saisie numero (remplace paiement)
|
||||
- Envoi POST JSON de la commande vers l'API
|
||||
- Ecran de confirmation avec numero
|
||||
- Responsive cible 1920x1080 portrait (borne) **+ adaptatif** autres resolutions
|
||||
- **Accessibilite RGAA** : police OpenDys pour dyslexiques, navigation clavier, contrastes, alts, pas d'info via couleur seule
|
||||
- **SEO / semantique** : balises HTML5 (`article`, `aside`, `nav`), schema.org, meta tags uniques, canonical, favicon
|
||||
|
||||
**OUT scope :**
|
||||
- Paiement reel (remplace par numero de commande)
|
||||
- Authentification client (pas de compte fidelite)
|
||||
- Multi-langue (FR uniquement)
|
||||
- Offline mode
|
||||
|
||||
### Bloc 2 — Back-office + API (Back)
|
||||
|
||||
**IN scope — Back-office :**
|
||||
- Authentification sessions securisees (hash bcrypt/argon2, protection CSRF, fixation session) — duree de session adaptee a un poste complet d'equipier (idle timeout 4h, absolute timeout 10h)
|
||||
- 3 roles RBAC : `admin`, `preparation`, `accueil`
|
||||
- **Admin** : CRUD categories, produits (nom, description, prix, image, dispo), menus (composition + options), utilisateurs
|
||||
- **Preparation** : liste commandes a preparer triees par heure livraison croissante, bouton "declarer preparee"
|
||||
- **Accueil** : saisir commande manuellement (comptoir ou drive-thru via casque/intercom), bouton "declarer livree" ; champ `source` enregistre sur chaque commande (`counter` ou `drive`)
|
||||
- Upload images produits (validation type MIME + taille + stockage dans volume `wakdo_uploads`)
|
||||
- Historique commandes par statut
|
||||
- Stats de base (commandes du jour, CA jour, produits top)
|
||||
|
||||
**IN scope — API REST :**
|
||||
- `GET /api/categories` — liste categories produits
|
||||
- `GET /api/products` — liste produits (filtrable par categorie)
|
||||
- `GET /api/menus` — liste menus avec compositions et options
|
||||
- `POST /api/orders` — creer une commande (body JSON, retour `{id, number, status}`)
|
||||
- `GET /api/orders/{number}` — recuperer statut commande
|
||||
- Headers CORS explicites pour l'origine borne
|
||||
- Reponses JSON standardisees : `{data: ..., error: null}` ou `{data: null, error: {code, message}}`
|
||||
|
||||
**IN scope — Transverse :**
|
||||
- Architecture **MVC** stricte (Models / Views / Controllers)
|
||||
- **Heritage** entre classes (ex : `BaseController` -> `AdminController` -> `ProductController`)
|
||||
- **Namespaces** + autoloader PSR-4 manuel
|
||||
- **Anti-injection** : PDO prepared statements exclusivement
|
||||
- **RGPD** : hash mdp, droit consultation/modif/suppr user, info stockage/utilisation donnees
|
||||
|
||||
**OUT scope :**
|
||||
- Paiement reel, systeme comptable
|
||||
- Multi-restaurants / multi-bornes
|
||||
- Fidelite client
|
||||
- Rapports avances / exports CSV
|
||||
|
||||
### Bloc 5 — DevOps
|
||||
|
||||
**IN scope :**
|
||||
- Dockerfile custom PHP-FPM avec extensions
|
||||
- `docker-compose.yml` orchestrant les 4 services (web, app, db, cron)
|
||||
- `Makefile` avec cible `make init` qui lance tout en une commande (Cr 7.c.4)
|
||||
- Scripts Bash d'automatisation (backup, deploy, migrate)
|
||||
- **Cron tab** avec au moins 3 jobs planifies dans la fenetre de maintenance (01h30-09h30) :
|
||||
- `0 3 * * *` — backup BDD quotidien a 03h00 (entre fin service 01h et ouverture 10h)
|
||||
- `*/15 * * * *` — purge sessions expirees toutes les 15 min (leger, peut tourner en service)
|
||||
- `30 4 * * *` — agregation stats commandes a 04h30 sur le **jour de service** ecoule (10h J-1 → 01h J)
|
||||
- **CI GitHub Actions** : lint PHP + PHPUnit sur PR -> dev
|
||||
- **CD GitHub Actions** : deploy auto sur merge main (SSH + pull + `make rebuild`)
|
||||
- `.env.example` documente, secrets hors du repo
|
||||
- Healthcheck Traefik + readiness probes
|
||||
- Logs centralises (stdout des conteneurs)
|
||||
- Documentation deploiement + architecture (schemas dans `docs/`)
|
||||
|
||||
**OUT scope :**
|
||||
- Kubernetes / Swarm
|
||||
- Monitoring complet type Prometheus/Grafana (trop chronophage)
|
||||
- Multi-environnements (pre-prod, staging)
|
||||
- Blue-green deployment
|
||||
|
||||
---
|
||||
|
||||
## 8. Criteres RNCP — mapping feature
|
||||
|
||||
### Bloc 1
|
||||
|
||||
| Critere | Libelle court | Feature Wakdo couvrant |
|
||||
|---|---|---|
|
||||
| Cr 1.a.1 | Integration conforme maquette | Integration HTML/CSS fidele au prototype |
|
||||
| Cr 1.a.2 | Normes W3C + accessibilite | Validator W3C vert + RGAA |
|
||||
| Cr 1.a.3 | Tests validator passent | Test en soutenance via W3C validator |
|
||||
| Cr 1.a.4 | Code commente, indente | Conventions de code appliquees partout |
|
||||
| Cr 1.a.5 | Balises semantiques | `<article>`, `<aside>`, `<nav>`, `<header>`, `<main>`, `<section>` |
|
||||
| Cr 1.b.1-3 | Responsive + multi-navigateurs | Media queries + @supports + tests Chrome/FF/Safari |
|
||||
| Cr 1.c.1-4 | Accessibilite RGAA/OpenDys | alt, aria-label, navigation clavier, police OpenDys, pas d'info via couleur seule |
|
||||
| Cr 1.d.1-4 | Classes CSS reutilisables | Convention BEM ou similaire, regroupe par theme, sans repetition |
|
||||
| Cr 1.e.1-11 | SEO + meta + semantique | hierarchie titres, schema.org, canonical, alt images, favicon, temps chargement |
|
||||
| Cr 2.a.1-5 | JS ES6+ + DOM + animations | Modules ES6, classes, async/await, pas de jQuery |
|
||||
| Cr 2.b.1-3 | Validation formulaires | Validation client temps reel (regex) + validation serveur |
|
||||
| Cr 2.c.1-4 | Ajax async | `fetch()` avec gestion erreurs, pas d'exposition donnees sensibles |
|
||||
| Cr 2.d.1-3 | Librairies externes | **Non applicable** (zero dep JS) — argumenter "developpement sans lib externe" |
|
||||
|
||||
### Bloc 2
|
||||
|
||||
| Critere | Libelle court | Feature Wakdo couvrant |
|
||||
|---|---|---|
|
||||
| Cr 3.a.1-4 | Analyse + modele donnees | Dictionnaire + MCD + cardinalites |
|
||||
| Cr 3.a.3 | Exploiter donnees externes d'API | API interne consommee par le front (auto-consommation) |
|
||||
| Cr 3.b.1-3 | Construction BDD | MCD → MLD → DDL MariaDB, FK + typage coherent |
|
||||
| Cr 3.c.1-3 | Requetes SQL optimisees | PDO prepared, index sur FK, LIMIT/tri explicites |
|
||||
| Cr 3.d.1-4 | RGPD | hash mdp, droit acces/modif/suppr, info utilisation donnees |
|
||||
| Cr 4.a.1-4 | Conceptualisation | Schema fonctionnel des vues + interactions |
|
||||
| Cr 4.b.1-6 | Syntaxe + indentation + erreurs | PSR-12 style, try/catch cibles, logs |
|
||||
| Cr 4.c.1-3 | POO + heritage + namespaces | `BaseModel` -> `Product`, `BaseController` -> `AdminController`, PSR-4 |
|
||||
| Cr 4.d.1-3 | MVC | `src/Models/`, `src/Views/`, `src/Controllers/`, separation stricte |
|
||||
| Cr 4.e.1-3 | Securite | PDO prepared (anti-SQLi), sessions regeneration, role-based middleware |
|
||||
| Cr 4.f.1-4 | Git + collaboration | Commits Conventional, branches feat/*, PR descriptions, squash merge |
|
||||
| Cr 4.g.1-4 | Preparation livraison | PHPUnit tests verts, pas d'erreur en prod, testee deployee |
|
||||
|
||||
### Bloc 5
|
||||
|
||||
| Critere | Libelle court | Feature Wakdo couvrant |
|
||||
|---|---|---|
|
||||
| Cr 7.a.1-3 | Analyse infra + securite | Audit code + proposition automatisation documentee |
|
||||
| Cr 7.b.1 | Langage de script | Bash (deploy, backup) + Makefile |
|
||||
| Cr 7.b.2 | Automatisation fiabilisee | Makefile avec exit codes, retries, logs |
|
||||
| Cr 7.b.3 | **Cron tab** | `wakdo-cron` service avec crontab : backup BDD, purge sessions, stats |
|
||||
| Cr 7.c.1 | VM operationnelle | Serveur existant Acadenice |
|
||||
| Cr 7.c.2 | OS conteneur installe | Docker Engine |
|
||||
| Cr 7.c.3 | App conteneurisee complete | 4 services (web, app, db, cron) |
|
||||
| Cr 7.c.4 | **Une ligne de commande** | `make init` lance toute la stack + migrate + seed |
|
||||
| Cr 7.d.1 | Architecture serveur | Traefik reverse + reseaux segmentes documentes |
|
||||
| Cr 7.d.2 | Tests avant deploy | CI PHPUnit + lint sur PR |
|
||||
| Cr 7.d.3 | Integration/deploiement continus | GitHub Actions deploy automatique sur merge main |
|
||||
|
||||
---
|
||||
|
||||
## 9. Conventions
|
||||
|
||||
### Git
|
||||
|
||||
**Branches :**
|
||||
```
|
||||
main ← production (tag vX.Y.Z sur chaque release)
|
||||
dev ← integration
|
||||
feat/* ← nouvelles features
|
||||
fix/* ← corrections
|
||||
refactor/* ← refactos
|
||||
docs/* ← doc seulement
|
||||
ci/* ← GitHub Actions
|
||||
db/* ← migrations / schema BDD
|
||||
chore/* ← tooling, config
|
||||
test/* ← ajout de tests
|
||||
```
|
||||
|
||||
Les branches `main` et `dev` sont **protegees** cote GitHub. Pas de commit direct autorise. Hook pre-commit local les bloque egalement.
|
||||
|
||||
**Flow :**
|
||||
1. `git checkout -b feat/menu-composition` (depuis `dev`)
|
||||
2. Commits atomiques Conventional Commits
|
||||
3. Push + PR vers `dev`
|
||||
4. Merge squash
|
||||
5. Periodiquement `dev` -> `main` via PR avec tag semver
|
||||
|
||||
**Commits** — Conventional Commits, en anglais :
|
||||
|
||||
```
|
||||
<type>(<scope>): <description imperative min 5 chars>
|
||||
|
||||
<body optionnel si changement complexe>
|
||||
```
|
||||
|
||||
- **Types** : `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `ci`, `db`, `perf`, `style`
|
||||
- **Scopes Wakdo** : `front`, `back`, `api`, `admin`, `auth`, `db`, `docker`, `ci`, `docs`
|
||||
- **Interdits** : emoji (Mantra IA-23), description en francais, WIP commits
|
||||
- **Exemples :**
|
||||
- `feat(front): add menu composition screen with size options`
|
||||
- `fix(api): correct order total calculation with large size`
|
||||
- `db: add migration 003 orders with fk to users`
|
||||
- `docker: add cron service with daily backup job`
|
||||
- `ci: add phpunit workflow on pull_request`
|
||||
|
||||
### Code PHP
|
||||
|
||||
- **PSR-12** style (indentation 4 espaces, namespaces 1 classe par fichier, `{` sur nouvelle ligne pour classes/methodes)
|
||||
- **Namespaces** : `App\Controllers`, `App\Models`, `App\Core`, `App\Services`
|
||||
- **1 classe = 1 fichier**, nom fichier == nom classe (PascalCase)
|
||||
- **Proprietes typees** (PHP 8.3) : `private int $id`, `private string $name`
|
||||
- **Retours typees** : `public function find(int $id): ?Product`
|
||||
- **Commentaires** : pour le **pourquoi** (Mantra IA-24), pas le quoi
|
||||
- **Docblocks** : sur methodes publiques uniquement, concis
|
||||
|
||||
### Code JavaScript
|
||||
|
||||
- **Vanilla ES6+** : `const`/`let`, arrow functions, destructuring, modules `import`/`export`
|
||||
- **Pas de `var`**
|
||||
- **Modules** : fichiers `.js` avec `export` explicite
|
||||
- **Async** : `async/await` prefere au chaining `.then()` complexe
|
||||
- **Event delegation** : sur conteneurs parents plutot que listener par element
|
||||
- **Aucune lib externe** (pas jQuery, pas Lodash)
|
||||
|
||||
### Code CSS
|
||||
|
||||
- **BEM** naming : `.block__element--modifier`
|
||||
- **Variables CSS** dans `:root` (palette couleurs, spacings, fonts)
|
||||
- **Mobile-first** : `min-width` media queries
|
||||
- **1 fichier par composant** dans `src/public/assets/css/components/`, assemble via `@import` ou concat build
|
||||
|
||||
### BDD
|
||||
|
||||
- **Tables** : `snake_case`, pluriel (`products`, `orders`, `order_items`)
|
||||
- **Colonnes** : `snake_case`
|
||||
- **PK** : `id` BIGINT UNSIGNED AUTO_INCREMENT
|
||||
- **FK** : `<table_singulier>_id` (ex : `product_id`, `user_id`)
|
||||
- **Timestamps** : `created_at`, `updated_at` (DATETIME default CURRENT_TIMESTAMP)
|
||||
- **Soft delete** : `deleted_at` DATETIME NULL quand applicable
|
||||
- **Index** systematique sur FK + colonnes de recherche frequente
|
||||
- **Collation** : `utf8mb4_unicode_ci`
|
||||
|
||||
---
|
||||
|
||||
## 10. Decisions techniques lockees — recap
|
||||
|
||||
| # | Decision | Justification |
|
||||
|---|---|---|
|
||||
| 1 | Strategie B unifiee | Cr 7.c.4 impose une stack unique lancable en 1 commande |
|
||||
| 2 | PHP 8.3 LTS | Moderne, supporte jusqu'en 2027 |
|
||||
| 3 | Pas de framework PHP | Sujet Bloc 2 "from scratch" explicite |
|
||||
| 4 | Pas de Composer | Colle au "from scratch", autoloader manuel autorise par Cr 4.c.3 |
|
||||
| 5 | PHPUnit via .phar | Tests unitaires requis Cr 4.g.2, sans dep Composer |
|
||||
| 6 | MariaDB 11 LTS | LTS 2028, compatible MySQL |
|
||||
| 7 | Apache Alpine + PHP-FPM Alpine | Demande utilisateur (admin sys), images legeres |
|
||||
| 8 | 2 FQDN | Separation claire borne publique / admin+API interne, defensible jury |
|
||||
| 9 | API sous `/api` sur le FQDN admin | Simplicite d'exploitation, CORS explicite gere |
|
||||
| 10 | Service cron dedie | Cr 7.b.3 explicite + realiste prod |
|
||||
| 11 | Makefile avec `make init` | Cr 7.c.4 + demonstration DevOps |
|
||||
| 12 | Conventional Commits + hooks | Cr 4.f.x + discipline de versioning |
|
||||
| 13 | Branches feat/* -> dev -> main | Pipeline propre pour jury, GitHub PR trace |
|
||||
| 14 | CI/CD GitHub Actions | Cr 7.d explicite dans referentiel |
|
||||
| 15 | RGPD implemente minimal | Cr 3.d.1-4 evaluees meme projet ecole |
|
||||
|
||||
---
|
||||
|
||||
## 11. Planning — budget heures
|
||||
|
||||
| Phase | Scope | Budget (h) | Deadline intermediaire |
|
||||
|---|---|---|---|
|
||||
| **P0 - Setup** | PC, arborescence, Docker, hooks, CI squelette, init Git/GitHub | 20 | Semaine 1 |
|
||||
| **P1 - Conception Merise** | Dictionnaire, MCD, MCT, MLD, schemas fonctionnels, DDL | 30 | Semaine 3 |
|
||||
| **P2 - Back squelette** | POO base (Core, Router, Autoloader, DB), auth + roles | 30 | Semaine 6 |
|
||||
| **P3 - Back CRUD admin** | Produits, menus, utilisateurs, views | 40 | Semaine 10 |
|
||||
| **P4 - API REST** | Endpoints + CORS + tests | 20 | Semaine 12 |
|
||||
| **P5 - Front borne** | Integration maquette, Ajax, accessibilite, responsive | 60 | Semaine 16 |
|
||||
| **P6 - Tests + finition** | PHPUnit, tests E2E borne, corrections | 25 | Semaine 18 |
|
||||
| **P7 - DevOps finalisation** | CI/CD deploy auto, crons, docs argumentation | 20 | Semaine 19 |
|
||||
| **P8 - Prep soutenance** | README pour jury, schemas finaux, repetitions, modifs en direct | 15 | Semaine 20 |
|
||||
| **TOTAL** | | **260** | **Semaine 20 = fin aout 2026** |
|
||||
|
||||
Buffer : ~20 h pour imprevus. Cible effective : ~240 h sur 20 semaines = **12 h/semaine**.
|
||||
|
||||
---
|
||||
|
||||
## 12. Livrables
|
||||
|
||||
### Par bloc
|
||||
|
||||
**Bloc 1 :**
|
||||
- App front deployee et fonctionnelle sur `https://corentin-wakdo.acadenice.fr`
|
||||
- Code source Git accessible au jury
|
||||
- Validator W3C screenshot (HTML + CSS verts)
|
||||
- Checklist RGAA auto-evaluee
|
||||
|
||||
**Bloc 2 :**
|
||||
- **Dictionnaire de donnees** (`docs/merise/dictionary.md`)
|
||||
- **MCD** schema (`docs/merise/mcd.md` + image)
|
||||
- **MCT** schemas (`docs/merise/mct.md` + diagrammes)
|
||||
- **MLD** (`docs/merise/mld.md`)
|
||||
- **Schema fonctionnel** de l'app (`docs/architecture/functional-schema.md`)
|
||||
- **BDD** deployee (dump SQL dans `db/migrations/` + script init)
|
||||
- App back-office deployee sur `https://corentin-wakdo-admin.acadenice.fr`
|
||||
- Documentation API (OpenAPI minimal ou README API)
|
||||
|
||||
**Bloc 5 :**
|
||||
- `docker-compose.yml` commente
|
||||
- Dockerfiles customs commentes
|
||||
- `Makefile` avec `make help`
|
||||
- `.github/workflows/` avec CI + CD
|
||||
- Crontab documente
|
||||
- Script de backup/restore teste
|
||||
- Architecture serveur decrite (`docs/architecture/deployment.md`)
|
||||
|
||||
### Pour la soutenance (tous blocs)
|
||||
|
||||
- **README.md** synthetique (quick start + liens docs)
|
||||
- **Presentation** (slides ou live) argumentant les choix
|
||||
- **Demo** live : borne + back-office + API (Postman/curl) + `make init`
|
||||
- **Capacite modification en direct** (Cr 4.a.1) : code structure pour permettre modifs sans casser
|
||||
|
||||
---
|
||||
|
||||
## 13. Risques et mitigations
|
||||
|
||||
| Risque | Probabilite | Impact | Mitigation |
|
||||
|---|---|---|---|
|
||||
| Sous-estimation temps front (accessibilite RGAA stricte) | Haute | Moyen | 60 h budgetees + tests W3C/axe-core pendant le dev, pas a la fin |
|
||||
| Complexite MCT (statuts commande) mal modelisee | Moyenne | Fort | Valider MCT avec un pair ou prof avant d'implementer Bloc 2 |
|
||||
| Dockerfile PHP extensions manquantes decouvert tard | Moyenne | Faible | Tester `make up` + un vrai appel BDD des P0 |
|
||||
| Conflit reseau Docker `wakdo_internal` existant | Faible | Faible | Verifie au setup, fallback nom `wakdo_backend` |
|
||||
| CORS mal configure bloque la borne | Moyenne | Moyen | Test immediat apres setup 2 FQDN |
|
||||
| Performance borne sur ecran tactile reel | Faible | Fort | Optimiser images + lazy loading + tests sur device tactile si possible |
|
||||
| Scope creep (ajout fonctionnalites non RNCP) | Haute | Fort | Sticker le scope, OUT scope documente ici, refuser les ajouts |
|
||||
| Gestion secrets (`.env`) leaked sur Git | Faible | Tres fort | `.env` liste dans `.gitignore` des P0, pre-commit hook check secrets futur |
|
||||
|
||||
---
|
||||
|
||||
## 14. Glossaire metier (fast-food)
|
||||
|
||||
| Terme | Definition |
|
||||
|---|---|
|
||||
| **Menu** | Combinaison burger + accompagnement + boisson + sauce |
|
||||
| **Combo** | Synonyme menu (terme marketing US) |
|
||||
| **Borne** | Ecran tactile autonome dans le restaurant, le client compose lui-meme (canal `kiosk`) |
|
||||
| **Comptoir** | Guichet physique, equipier saisit la commande pour le client (canal `counter`) |
|
||||
| **Drive** | Piste drive-thru : client en voiture, borne intercom + haut-parleur, equipier avec casque + tablette saisit la commande (canal `drive`) |
|
||||
| **Jour de service** | Periode d'activite 10h J -> 01h J+1 (15h continu), unite d'agregation pour toutes les stats commerciales |
|
||||
| **Fenetre de maintenance** | Periode 01h30 -> 09h30 reservee aux taches systeme (backups, stats, purges) |
|
||||
| **Accompagnement** | Frite, salade, potatoes — option avec taille |
|
||||
| **Supplement** | Ajout optionnel sur un produit (fromage, bacon) — peut impacter prix |
|
||||
| **Option** | Retrait ou modif produit (sans oignon, sans sauce) — neutre prix |
|
||||
| **Panier** | Liste des produits/menus selectionnes par le client avant validation |
|
||||
| **Commande** | Panier valide, dote d'un numero, en attente de preparation |
|
||||
| **Preparation** | Etat "en cuisine" |
|
||||
| **Livraison** | Remise au client au comptoir |
|
||||
| **Ticket** | Numero de commande (remplace paiement dans l'exam) |
|
||||
|
||||
## 15. Glossaire technique
|
||||
|
||||
| Terme | Definition |
|
||||
|---|---|
|
||||
| **Borne** | Interface tactile publique pour client final (Bloc 1) |
|
||||
| **Back-office** | Interface interne pour employes (Bloc 2) |
|
||||
| **API interne** | API consommee par la borne, non publique a tiers |
|
||||
| **PSR-4** | Standard PHP d'autoloading classes par namespace |
|
||||
| **PDO** | Abstraction BDD PHP avec prepared statements (anti-SQLi) |
|
||||
| **BEM** | Convention naming CSS Block__Element--Modifier |
|
||||
| **RGAA** | Referentiel General d'Amelioration de l'Accessibilite (France) |
|
||||
| **OpenDys** | Police de caractere pour personnes dyslexiques |
|
||||
|
||||
---
|
||||
|
||||
## 16. Points d'attention jury (prep argumentation)
|
||||
|
||||
Le jury Bloc 2 demande **capacite a modifier le code en direct** (Cr 4.a.1). Il faut donc :
|
||||
|
||||
- **Connaitre son code** : pouvoir expliquer chaque fichier et la raison de sa presence
|
||||
- **Argumenter les choix** : pas Laravel ? pourquoi pas. POO + heritage ? demontrer l'arbre. MVC ? montrer qu'une route traverse un controller puis un model puis une vue
|
||||
- **Justifier l'archi Docker** : pourquoi 4 services, pourquoi Alpine, pourquoi Traefik
|
||||
- **Comprendre la BDD** : defendre les cardinalites, les contraintes, les index
|
||||
- **Expliquer les choix securite** : PDO prepared, bcrypt, CSRF, sessions, CORS
|
||||
- **Avoir un plan B** : savoir repondre "si le jury vous demande d'ajouter X, par ou commencer"
|
||||
|
||||
Preparer des **questions frequentes** :
|
||||
- "Pourquoi pas Laravel/Symfony ?" → Sujet impose from scratch + demo maitrise des fondamentaux
|
||||
- "Pourquoi pas Composer ?" → Criteres Cr 4.c.3 autorise manuel, plus defendable "from scratch"
|
||||
- "Comment gerez-vous l'injection SQL ?" → PDO prepared statements exclusivement, montrer exemple dans Models
|
||||
- "Votre API ne gere pas X role" → Fallback : middleware RBAC par role, montrer code
|
||||
- "Comment deploieriez-vous en prod vrai ?" → Ajouter monitoring, blue-green, IaC, secrets manager
|
||||
|
||||
---
|
||||
|
||||
## 17. Regles invariantes
|
||||
|
||||
Ces regles tiennent lieu de garde-fous pendant toute la duree du projet. Les enfreindre demande une mise a jour explicite de ce document.
|
||||
|
||||
1. **Zero emoji** dans code, commits, docs techniques (Mantra IA-23)
|
||||
2. **Zero Composer, zero vendor/** dans le repo
|
||||
3. **Zero dep JS front** (pas jQuery, pas Bootstrap)
|
||||
4. **Zero secret en clair dans Git** (`.env` liste dans `.gitignore`)
|
||||
5. **Zero commit direct sur `main` ou `dev`** (hook bloque)
|
||||
6. **Zero requete SQL sans prepared statement** (anti-SQLi)
|
||||
7. **Zero hash mdp en clair** (bcrypt ou argon2)
|
||||
8. **Zero CORS `*`** (origine explicite uniquement)
|
||||
9. **Zero deployment manuel** en condition normale (CI/CD)
|
||||
10. **Zero feature hors scope** sans mise a jour de ce document
|
||||
|
||||
---
|
||||
|
||||
*Document vivant — version 1.0 — 2026-04-23. A mettre a jour a chaque decision structurante.*
|
||||
Loading…
Add table
Reference in a new issue