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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# Managed by IssueSpec. Hand edits are welcome; keep the schema valid.
id: 2
title: "Spike : maîtriser le protocole ACP et le valider avec mm"
state: closed
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
labels:
- "kind::spike"
- "area::acp"
- "priority::urgent"
- "size::M"
- "real-agents"
milestone: "Initialize"
epic: "Specifications"
body: |
## Contexte
Sidekicks est un **client ACP** (Agent Client Protocol, https://agentclientprotocol.com) : c'est ce qui le rend agnostique de l'agent (cf. [#1 — draft](.tickets/issues/0001-draft.yaml)). Tout le reste du projet repose sur notre compréhension de ce protocole.
## Pourquoi un spike en premier
- C'est le **risque technique n°1** : si on se trompe sur le modèle (sessions, streaming, permissions, commandes), on refait l'architecture.
- Le draft contient des exigences qui dépendent directement d'ACP : commandes `/` (≈ `available_commands_update`), permissions (≈ `session/request_permission`), fichiers/terminal (capacités client `fs/*` et `terminal/*`). Il faut vérifier ce que le protocole offre réellement **et ce que `mm` implémente**.
- Un SDK Go existe-t-il et est-il maintenu ? (à vérifier, ex. `github.com/coder/acp-go-sdk`). L'utiliser ou non change la charge de [#10 — Client ACP : transport stdio et handshake initialize](.tickets/issues/0010-client-acp-transport-stdio-et-handshake-initiali.yaml).
## Livrable
Un document `docs/adr/0001-acp.md` (ou équivalent) contenant :
- la liste des méthodes/notifications utilisées par Sidekicks et celles ignorées (avec la raison) ;
- le choix SDK vs implémentation maison du JSON-RPC sur stdio ;
- des traces JSON-RPC réelles capturées avec Alice (simple) et Riker (tools + permissions).
## Critères d'acceptation
- [ ] On sait répondre : une session = un channel ? un agent ? les deux ?
- [ ] On sait si `mm` supporte `session/load` (reprise de conversation, utile pour [#25 — Reprendre les conversations après redémarrage](.tickets/issues/0025-reprendre-les-conversations-apres-redemarrage.yaml)).
- [ ] On sait quelles commandes `mm` expose (skills de Garfield ?).
⚠️ Jamais plus de 2 agents lancés en même temps (voir [#7 — Outillage de test avec les agents réels (2 agents max)](.tickets/issues/0007-outillage-de-test-avec-les-agents-reels-2-agents.yaml)).
tasks:
- id: 1
title: "Lire la spec ACP : initialize, session/new, session/prompt, session/update, session/cancel"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 2
title: "Lire la partie permissions (session/request_permission) et tool calls"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 3
title: "Lire les capacités client fs/* et terminal/*"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 4
title: "Lire available_commands_update (commandes slash) et session/load"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 5
title: "Évaluer les SDK Go existants (maintenance, licence, couverture du protocole)"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 6
title: "Capturer une trace JSON-RPC réelle avec Alice (mm -acp)"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 7
title: "Capturer une trace avec Riker (tool call + demande de permission)"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 8
title: "Capturer une trace avec Garfield (commandes/skills exposés)"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 9
title: "Rédiger l'ADR ACP"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:00.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
comments:
- id: 1
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T08:51:00.000Z
body: |
## Résultat — spike terminé
Décision et constats : [ADR 0001 — ACP](docs/adr/0001-acp.md). Client de capture : [spikes/acp-trace](spikes/acp-trace/README.md). Traces réelles : [docs/spikes/acp](docs/spikes/acp/README.md).
- **Protocole v1** : mm v1.0.3 répond `protocolVersion: 1` ; la v2 documentée sur le site est écartée pour l'instant.
- **SDK** : `github.com/coder/acp-go-sdk` v0.13.5 (Apache-2.0, généré depuis le schéma officiel), encapsulé dans `internal/acp`.
- **Une session ACP par (channel, agent)**.
- **Pas de `loadSession` chez mm** → la reprise (#25) devra réinjecter le contexte.
- **Commandes** = commandes intégrées de mm + skills (Garfield), envoyées comme texte `/idioms …` → validé.
- **Permissions** : options `allow`, `allow_always`, `reject`, `never`. Après un refus `reject_once`, Riker a réessayé 40 fois puis le tour a fini en **erreur JSON-RPC** → impacts sur #17.
- **Annulation** : `session/cancel` → `stopReason: cancelled`, vérifié avec Garfield.
Traces capturées un agent à la fois, via `scripts/agents.sh run`, modèle déchargé après chaque capture.
|