chore(ideai): clôture de #74 et #68, ouverture de #75 et #76

Enregistre l'état du registre de tickets : #74 et #68 passent en closed
après la validation live de l'intégration web, #75 (ce fix) entre en QA
et #76 ouvre la dette de casse du code d'appairage côté serveur.

État runtime uniquement : aucun code de feature n'est touché.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 10:40:26 +02:00
parent 120d0d1ac2
commit 481a7e2498
11 changed files with 215 additions and 17 deletions

View File

@ -1,8 +1,8 @@
---
issueRef: "#68"
version: 7
version: 8
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1784238387151
updatedAt: 1784277313706
---
# Ticket #68 — Serveur embarqué activable depuis le desktop : carnet de chantier

View File

@ -2,7 +2,7 @@
id: "13821b24-f566-402e-bc10-02ac6e8a5f7c"
number: 68
title: "Ajouter dans l'app desktop, la possibilité d'activer le serveur"
status: "qa"
status: "closed"
priority: "medium"
sprint: "028179b1-eaf4-41e9-9c1f-7c37125117e6"
links: [{"target":"#65","kind":"dependsOn"}]
@ -10,7 +10,7 @@ agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}
createdBy: {"kind":"user"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1784193318419
updatedAt: 1784238387151
version: 7
updatedAt: 1784277313706
version: 8
---
J'iamerais que depuis l'app desktop, on puisse quand même embarquer le serveur. Comme ça un utilisateur pourrait continuer son travail en cours en remote

View File

@ -1,6 +1,6 @@
---
issueRef: "#74"
version: 2
version: 3
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1784272247901
updatedAt: 1784277308704
---

View File

@ -2,7 +2,7 @@
id: "249bb0de-118f-4d6f-b0c4-1d4e2aadd83f"
number: 74
title: "Le serveur embarqué sert le bundle desktop (Tauri) au navigateur — __TAURI_INTERNALS__ undefined"
status: "qa"
status: "closed"
priority: "high"
sprint: null
links: [{"target":"#68","kind":"relatesTo"},{"target":"#66","kind":"relatesTo"},{"target":"#13","kind":"relatesTo"}]
@ -10,8 +10,8 @@ agentRefs: []
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1784271086298
updatedAt: 1784272247901
version: 2
updatedAt: 1784277308704
version: 3
---
## Symptôme (constaté live, exposition derrière reverse proxy)

View File

@ -0,0 +1,6 @@
---
issueRef: "#75"
version: 2
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1784277530792
---

View File

@ -0,0 +1,48 @@
---
id: "d54a1f20-03e6-4925-982b-923a37331749"
number: 75
title: "Écran d'appairage web : clavier numérique sur mobile alors que le code contient des lettres"
status: "qa"
priority: "medium"
sprint: null
links: [{"target":"#69","kind":"relatesTo"},{"target":"#74","kind":"relatesTo"}]
agentRefs: []
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1784277353320
updatedAt: 1784277530792
version: 2
---
## Symptôme (constaté live, téléphone)
Sur l'écran d'appairage web (`PairingScreen`), le clavier virtuel qui s'ouvre est un pavé **numérique uniquement**, alors que le code d'appairage à saisir contient des **lettres**. Impossible de saisir le code sans changer de clavier à la main.
## Cause racine (confirmée)
Le code généré côté serveur est **hexadécimal, 8 caractères, majuscules** (`0-9A-F`) :
```rust
// crates/web-server/src/lib.rs:2220
fn new_pairing_code() -> String {
Uuid::new_v4().simple().to_string().chars().take(8)
.collect::<String>().to_ascii_uppercase()
}
```
Or `frontend/src/features/web/PairingScreen.tsx:79` force `inputMode="numeric"` (introduit par #69 en supposant un code purement chiffré), et le placeholder `p. ex. 4821-93` (ligne 74) décrit un format qui n'existe pas.
## Attendu
- Le clavier mobile permet de saisir lettres **et** chiffres.
- Le placeholder reflète le format réel (hex 8 caractères majuscules).
- La saisie reste sans autocorrection ni capitalisation surprise ; le code étant en majuscules, la casse ne doit pas être un piège pour l'utilisateur.
## Périmètre
Frontend pur. Le format du code côté serveur n'est pas remis en cause par ce ticket.
## DoD
- Saisie possible au clavier mobile standard, lettres incluses.
- Placeholder cohérent avec `new_pairing_code()`.
- Test de non-régression sur le champ.

View File

@ -0,0 +1,6 @@
---
issueRef: "#76"
version: 1
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1784277540034
---

View File

@ -0,0 +1,40 @@
---
id: "c91f547f-96f0-4c9c-9fde-dbe7d2772dbc"
number: 76
title: "Appairage : la comparaison du code est sensible à la casse côté serveur"
status: "open"
priority: "low"
sprint: null
links: [{"target":"#75","kind":"relatesTo"}]
agentRefs: []
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1784277540034
updatedAt: 1784277540034
version: 1
---
## Constat
`crates/web-server/src/lib.rs:1612` compare le code d'appairage reçu au code attendu par égalité stricte :
```rust
if request.code != state.pairing_code() { }
```
Or `new_pairing_code()` (ligne 2220) génère le code en majuscules. Un client qui envoie `3f7a9c21` au lieu de `3F7A9C21` est donc rejeté.
## Pourquoi c'est une dette et pas un bug bloquant
Le fix #75 rend l'écran web tolérant en normalisant la saisie en majuscules avant `POST /api/pair`. La tolérance vit donc **côté client** : tout autre client de l'API (curl, un futur client mobile natif, un test manuel) échouera encore sur une saisie minuscule, avec un message d'erreur qui n'explique pas pourquoi.
## Attendu
La comparaison serveur normalise la casse (et les espaces) avant égalité. La normalisation côté UI de #75 devient alors redondante mais inoffensive — pas besoin de la retirer.
## Vigilance
La comparaison doit rester en temps constant si elle l'est aujourd'hui : normaliser ne doit pas introduire de court-circuit exploitable en timing. À vérifier lors de l'implémentation.
## Périmètre
Backend pur, `crates/web-server`.

View File

@ -1,3 +1,3 @@
{
"nextNumber": 75
"nextNumber": 77
}

View File

@ -707,13 +707,13 @@
"issueRef": "#68",
"path": "68",
"title": "Ajouter dans l'app desktop, la possibilité d'activer le serveur",
"status": "qa",
"status": "closed",
"priority": "medium",
"sprint": "028179b1-eaf4-41e9-9c1f-7c37125117e6",
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1784238387151
"updatedAt": 1784277313706
},
{
"issueRef": "#69",
@ -773,11 +773,31 @@
"issueRef": "#74",
"path": "74",
"title": "Le serveur embarqué sert le bundle desktop (Tauri) au navigateur — __TAURI_INTERNALS__ undefined",
"status": "qa",
"status": "closed",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
"updatedAt": 1784272247901
"updatedAt": 1784277308704
},
{
"issueRef": "#75",
"path": "75",
"title": "Écran d'appairage web : clavier numérique sur mobile alors que le code contient des lettres",
"status": "qa",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [],
"updatedAt": 1784277530792
},
{
"issueRef": "#76",
"path": "76",
"title": "Appairage : la comparaison du code est sensible à la casse côté serveur",
"status": "open",
"priority": "low",
"sprint": null,
"assignedAgentIds": [],
"updatedAt": 1784277540034
}
]
}