1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
# Managed by IssueSpec. Hand edits are welcome; keep the schema valid.
id: 20
title: "Persister channels et messages avec Pebble"
state: closed
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
labels:
- "kind::feature"
- "area::persistence"
- "priority::high"
- "size::M"
milestone: "M3 · Channels & multi-agents"
epic: "Channels & multi-agents"
related:
- 5
body: |
## Contexte
Consigne du draft : Pebble si besoin de persistance. Ce besoin apparaît avec les channels : l'utilisateur s'attend à retrouver ses conversations.
## Pourquoi pas d'epic « Persistence » séparé
Pebble ne sert qu'aux channels et à leur historique (la config reste en YAML) ; un epic à une seule issue serait du bruit. L'issue est donc rattachée à « Channels & multi-agents » avec le label `area::persistence`.
## Périmètre
- Schéma de clés défini dans [#5 — Définir l'architecture et le modèle de données](.tickets/issues/0005-definir-l-architecture-et-le-modele-de-donnees.yaml) (ex. `channel/<id>`, `msg/<channelId>/<ts>/<id>`, `membership/<channelId>/<agent>`).
- API `internal/store` : CRUD channels, append/scan messages paginé.
- Emplacement : `os.UserDataDir`/sidekicks/db, **lié à la config** (deux configs ≠ deux historiques mélangés).
- Versionnement du schéma pour les migrations futures.
## Critères d'acceptation
- [ ] Tests unitaires sur une base temporaire.
- [ ] Chargement des 100 derniers messages d'un channel < 50 ms.
tasks:
- id: 1
title: "Schéma de clés et encodage"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
closedAt: 2026-10-29T16:35:01.000Z
- id: 2
title: "API store : channels"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
closedAt: 2026-10-29T16:35:01.000Z
- id: 3
title: "API store : messages (append, scan paginé)"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
closedAt: 2026-10-29T16:35:01.000Z
- id: 4
title: "Emplacement de la base lié à la config"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
closedAt: 2026-10-29T16:35:01.000Z
- id: 5
title: "Version de schéma"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
closedAt: 2026-10-29T16:35:01.000Z
- id: 6
title: "Tests unitaires"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:18.000Z
updatedAt: 2026-10-29T16:35:01.000Z
closedAt: 2026-10-29T16:35:01.000Z
comments:
- id: 1
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T16:35:01.000Z
body: |
## Résultat
`internal/store` : Pebble v2 (v2.1.7), une base par fichier de configuration sous `<dossier de config utilisateur>/sidekicks/data/<empreinte du chemin>/`. Clés de l'ADR 0003 plus `direct/<agent>` (conversations directes) et `value/<clé>` (dernières commandes annoncées par chaque agent). Version de schéma (`meta/version`, une base plus récente est refusée), ids triables par date, pagination arrière des messages. Après `Close`, les opérations renvoient `ErrClosed` au lieu de laisser Pebble paniquer (une réponse peut se terminer pendant qu'on quitte). Une base déjà ouverte par un autre Sidekicks est remplacée par une base en mémoire, et l'interface le signale.
Mesure (`go test -bench . ./internal/store`, base en mémoire, messages de 2000 octets) : les 100 derniers messages d'un channel de 5000 messages en ~0,02 ms (critère : < 50 ms) ; sur disque, Pebble lit depuis son cache de blocs, du même ordre de grandeur. Décisions : [ADR 0006](docs/adr/0006-channels.md).
|