diff --git a/.ideai/sprints/1bb8bdf2-9c35-4f53-9a31-1390a47bec63/sprint.md b/.ideai/sprints/1bb8bdf2-9c35-4f53-9a31-1390a47bec63/sprint.md new file mode 100644 index 0000000..85b50ce --- /dev/null +++ b/.ideai/sprints/1bb8bdf2-9c35-4f53-9a31-1390a47bec63/sprint.md @@ -0,0 +1,11 @@ +--- +id: "1bb8bdf2-9c35-4f53-9a31-1390a47bec63" +order: 2 +name: "Exercice editor enhancement" +status: "planned" +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1784449859008 +updatedAt: 1784449859008 +version: 1 +--- diff --git a/.ideai/sprints/index.json b/.ideai/sprints/index.json index c12a843..f6734fb 100644 --- a/.ideai/sprints/index.json +++ b/.ideai/sprints/index.json @@ -9,6 +9,15 @@ "status": "planned", "updatedAt": 1784329015766, "version": 1 + }, + { + "id": "1bb8bdf2-9c35-4f53-9a31-1390a47bec63", + "path": "1bb8bdf2-9c35-4f53-9a31-1390a47bec63", + "order": 2, + "name": "Exercice editor enhancement", + "status": "planned", + "updatedAt": 1784449859008, + "version": 1 } ] } \ No newline at end of file diff --git a/.ideai/tickets/50/carnet.md b/.ideai/tickets/50/carnet.md index 3e46a85..b684b25 100644 --- a/.ideai/tickets/50/carnet.md +++ b/.ideai/tickets/50/carnet.md @@ -1,6 +1,7 @@ --- issueRef: "#50" -version: 1 -updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"} -updatedAt: 1784412001974 +version: 3 +updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} +updatedAt: 1784449447058 --- +Endpoints `POST /sync/push`, `GET /sync/pull`, `POST /sync/exchange` implémentés, protégés par le middleware Bearer. LWW rendu atomique côté SQL (CTE `INSERT ... ON CONFLICT ... WHERE client_updated_at < EXCLUDED.client_updated_at` + fallback pour `ignoredOlder`), relu manuellement et jugé correct. Tests unitaires avec fakes en mémoire verts (15/15), `dart analyze` clean. Non vérifié : aucun test de bout en bout contre un vrai PostgreSQL (pas d'accès Docker dans le sandbox Main). À faire avant mise en prod : une fois #52 livré, tester `push`/`pull`/`exchange` via curl contre le serveur réel + vérifier la concurrence de l'upsert LWW sous charge. \ No newline at end of file diff --git a/.ideai/tickets/50/issue.md b/.ideai/tickets/50/issue.md index ba2c8c9..af63bcb 100644 --- a/.ideai/tickets/50/issue.md +++ b/.ideai/tickets/50/issue.md @@ -2,15 +2,15 @@ id: "983aa02b-7577-4fde-b77a-12355df0efdb" number: 50 title: "[Server] API de synchronisation incrémentale LWW" -status: "open" +status: "qa" priority: "low" sprint: null links: [{"target":"#46","kind":"relatesTo"},{"target":"#48","kind":"dependsOn"},{"target":"#49","kind":"dependsOn"}] agentRefs: [] createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"} -updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"} +updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784412001974 -updatedAt: 1784412001974 -version: 1 +updatedAt: 1784449447058 +version: 3 --- Implémenter les ports/use cases et endpoints de sync incrémentale authentifiée. Endpoints : `POST /sync/push`, `GET /sync/pull?since=...`, optionnel `POST /sync/exchange`. Stratégie v1 last-write-wins basée sur `clientUpdatedAt` puis tie-breaker `serverUpdatedAt`/`serverId`. Supporter upsert, soft delete, réponses par item (`accepted`, `ignoredOlder`, `conflictLwwApplied`, `error`) et cursor serveur monotone. Ne pas intégrer le client Flutter dans ce ticket. \ No newline at end of file diff --git a/.ideai/tickets/54/carnet.md b/.ideai/tickets/54/carnet.md new file mode 100644 index 0000000..e385c35 --- /dev/null +++ b/.ideai/tickets/54/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#54" +version: 2 +updatedBy: {"kind":"user"} +updatedAt: 1784449895057 +--- diff --git a/.ideai/tickets/54/issue.md b/.ideai/tickets/54/issue.md new file mode 100644 index 0000000..dd1ad52 --- /dev/null +++ b/.ideai/tickets/54/issue.md @@ -0,0 +1,15 @@ +--- +id: "7e6894d5-36ad-413b-9fda-be3ba26db6cb" +number: 54 +title: "Exercice à plusieurs étapes" +status: "open" +priority: "medium" +sprint: "1bb8bdf2-9c35-4f53-9a31-1390a47bec63" +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1784449895047 +updatedAt: 1784449895057 +version: 2 +--- diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index fadf2d9..5db1edc 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 54 + "nextNumber": 55 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index 3f650fb..e4fec3a 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -567,11 +567,11 @@ "issueRef": "#50", "path": "50", "title": "[Server] API de synchronisation incrémentale LWW", - "status": "open", + "status": "qa", "priority": "low", "sprint": null, "assignedAgentIds": [], - "updatedAt": 1784412001974 + "updatedAt": 1784449447058 }, { "issueRef": "#51", @@ -602,6 +602,16 @@ "sprint": null, "assignedAgentIds": [], "updatedAt": 1784412015509 + }, + { + "issueRef": "#54", + "path": "54", + "title": "Exercice à plusieurs étapes", + "status": "open", + "priority": "medium", + "sprint": "1bb8bdf2-9c35-4f53-9a31-1390a47bec63", + "assignedAgentIds": [], + "updatedAt": 1784449895057 } ] } \ No newline at end of file