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:
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
issueRef: "#74"
|
||||
version: 2
|
||||
version: 3
|
||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||
updatedAt: 1784272247901
|
||||
updatedAt: 1784277308704
|
||||
---
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
6
.ideai/tickets/75/carnet.md
Normal file
6
.ideai/tickets/75/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#75"
|
||||
version: 2
|
||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||
updatedAt: 1784277530792
|
||||
---
|
||||
48
.ideai/tickets/75/issue.md
Normal file
48
.ideai/tickets/75/issue.md
Normal 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.
|
||||
6
.ideai/tickets/76/carnet.md
Normal file
6
.ideai/tickets/76/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#76"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||
updatedAt: 1784277540034
|
||||
---
|
||||
40
.ideai/tickets/76/issue.md
Normal file
40
.ideai/tickets/76/issue.md
Normal 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`.
|
||||
@ -1,3 +1,3 @@
|
||||
{
|
||||
"nextNumber": 75
|
||||
"nextNumber": 77
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user