@popoverinstall/cli 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,175 +1,294 @@
1
- ---
2
- name: popover
3
- description: "Judgment for reaching a teammate's Claude Code agent *without being asked to* — when it is worth spending their tokens, and which of /popover:team, /popover:ask, /popover:tell and /popover:fork fits. Nothing to invoke by hand: use it when a question turns on what a colleague decided, ruled out, or is changing right now why the code is the way it is when the repo does not say, whether work about to start is already in flight, or why something nobody touched is broken."
4
- ---
5
-
6
- # popover
7
-
8
- Your teammates are running their own Claude Code sessions in this repo. Each one has
9
- accumulated context you do not have: the alternatives they rejected, the constraint that
10
- forced an awkward shape, what they changed twenty minutes ago and have not pushed. popover
11
- lets you reach those agents.
12
-
13
- **This skill is not a command, and there is nothing here for a user to invoke.** The five
14
- commands are the things a user types:
15
-
16
- | | |
17
- | --- | --- |
18
- | `/popover:team` | who is working in this repo right now |
19
- | `/popover:ask` | one question to one agent, and you wait for the answer |
20
- | `/popover:tell` | a heads-up into a teammate's live session; nothing comes back |
21
- | `/popover:fork` | hand this whole conversation to a teammate |
22
- | `/popover:vault` | publish this conversation to the team's archive, or ask one already there |
23
-
24
- This file is the judgment around them: when reaching for one is worth it, which one fits, and
25
- what each one spends. It exists because the moment to use popover rarely announces itself. The
26
- user asks why something is the way it is, and the honest answer is that the repo does not
27
- record it but a colleague's agent worked it out this morning. Nobody will type `/popover:ask`
28
- for you. Noticing is your job.
29
-
30
- ## The five tools
31
-
32
- They arrive as deferred MCP tools, so you have their names but not their schemas. Load them
33
- before use:
34
-
35
- ```
36
- ToolSearch("select:mcp__plugin_popover_popover__team_list,mcp__plugin_popover_popover__team_ask,mcp__plugin_popover_popover__team_tell,mcp__plugin_popover_popover__vault_search,mcp__plugin_popover_popover__vault_ask")
37
- ```
38
-
39
- Their own descriptions are detailed and authoritative on arguments and limits read them
40
- once loaded rather than guessing. In short:
41
-
42
- - **`team_list`** — who is active in this repo, what they are doing, and each one's short
43
- handle (`B1`). Takes nothing. Read-only and cheap.
44
- - **`team_ask`** — one question to one agent, and you wait for the answer. A read-only copy
45
- of their session answers from its full context. Their live session is not interrupted and
46
- cannot be changed by it. Takes up to ~90s by default.
47
- - **`team_tell`** a one- or two-sentence heads-up delivered into a teammate's live session
48
- before its next prompt. Nothing comes back, and their user is notified that you sent it.
49
- - **`vault_search`** — search the conversations your team has frozen and published. Free, no
50
- model, nothing resumed. Not limited to this repo, and not limited to people who are working
51
- right now. Always the first of the two.
52
- - **`vault_ask`** — one question to one vault, answered from its frozen context on *this*
53
- machine at your user's expense. Roughly $0.50 and up to 90 seconds. Never call it on a
54
- vault you have not seen in a search result.
55
-
56
- ## When to reach for it on your own
57
-
58
- Check the roster and consider an ask when:
59
-
60
- - **The user asks *why*** why a library was chosen, why a function is shaped oddly, why an
61
- obvious approach was not taken **and the repo does not answer it.** Read the code, the
62
- comments, `git log`, `git blame`, and `CLAUDE.md` first. If the reasoning is not written
63
- down anywhere, that is precisely the case popover was built for: it exists only in
64
- somebody's session.
65
- - **You are about to start something that may already be underway** a rename spanning many
66
- files, a dependency bump, a refactor of a shared module. One `team_list` costs almost
67
- nothing and can save the user an afternoon of conflicted work.
68
- - **You are blocked by something you did not break** a migration that appears unapplied, a
69
- failing build on untouched code, an endpoint that disagrees with its own types. Ask the
70
- person whose agent is in that area before you debug their in-flight change as if it were a
71
- bug.
72
- - **You are about to edit a file a teammate's agent is working in right now.** The roster
73
- often says what each agent is doing. Prefer a `tell` here it is a collision, not a
74
- question.
75
- - **The user names a colleague.** "Did Bob get the webhook working?", "what is Sarah doing to
76
- globals.css" that is a direct signal, and you do not need to be asked twice.
77
-
78
- Say what you are doing and why before you ask, in a line. The user should never be surprised
79
- that you spent a teammate's tokens.
80
-
81
- ## When not to
82
-
83
- - **When the repo can answer.** Reading is free and instant; an ask runs on someone else's
84
- machine at their expense. Exhaust local evidence first, always.
85
- - **For curiosity or completeness.** Do not ask because a second opinion would be tidy. Ask
86
- because you are stuck and they are not.
87
- - **More than one agent per question.** Never fan out across the roster to see who answers
88
- best. Pick the one that fits; if none obviously does, show the user the roster instead.
89
- - **To hand off work.** A `tell` is information, not a directive the receiving agent is
90
- explicitly told to treat it that way — and an ask talks to a read-only copy that cannot act.
91
- Neither one delegates. If the user wants a colleague to *do* something, say plainly that
92
- popover does not do that, and let them message the human.
93
- - **For anything outside this repo.** Only agents in the same repository are visible or
94
- reachable. An empty roster means nobody else is working *here* not that the team is idle.
95
- Phrase it that way, or you will imply something false about your user's colleagues.
96
-
97
- ## The cost asymmetry, which governs consent
98
-
99
- Three tools, three different things being spent:
100
-
101
- | | Costs | Ask the user first? |
102
- | --- | --- | --- |
103
- | `team_list` | Nothing meaningful | No — just do it |
104
- | `team_ask` | The teammate's tokens and compute, on their machine. Interrupts nobody. | No, but say you are doing it |
105
- | `team_tell` | A colleague's **attention**. It lands in their live session and notifies them. | **Yes, every time** |
106
-
107
- `team_tell` is the only thing in popover that reaches a running agent. Treat it as something
108
- the user should have deliberately meant to do, and confirm before sending. It is also rate
109
- limited to 10 messages an hour to any one agent, which is a hint about its intended frequency.
110
-
111
- If it is genuinely ambiguous whether to ask or tell, ask. It interrupts nobody.
112
-
113
- ## Writing an ask worth the money
114
-
115
- The answering agent has none of your conversation. It cannot see the file you are looking at
116
- or the error you just read. So make the question stand alone:
117
-
118
- - Expand every pronoun and vague reference. "that bug" "the token refresh bug in the auth
119
- service".
120
- - Name files by path, and say what you are trying to do, not only what you want to know.
121
- - Ask one well-formed question, not three exploratory ones. You get one round trip for the
122
- price.
123
-
124
- A poor ask *"why is it done this way?"* — comes back useless and you have spent a
125
- colleague's tokens to learn nothing. A good one *"`apps/web/src/lib/auth-redirect.ts`
126
- derives the origin from the request Host header, with a comment saying
127
- `NEXT_PUBLIC_APP_URL` still points at the old Vercel domain. Is that variable going to be
128
- corrected, or is reading Host the intended long-term approach?"* — comes back with the
129
- reasoning, because that is knowledge about shared state that lives in a person's head rather
130
- than in the repo.
131
-
132
- Never invent a handle. Use only what `team_list` returned, and note that a handle from
133
- earlier in this conversation may have gone out of scope since. If the tool says it does not
134
- match, relay that instead of trying a different agent.
135
-
136
- ## Forks are a different thing
137
-
138
- A fork hands over **this entire conversation**, frozen, and the recipient continues it in
139
- their own session. Nothing comes back. That includes the contents of every file read into the
140
- context, so it is a far larger disclosure than an ask.
141
-
142
- **Creating one is the user's alone.** It happens when they ask for it in as many words, never
143
- on their behalf and "that would be useful" is not a yes.
144
-
145
- Saying that a fork would fit is a different act from making one, and it is worth doing once.
146
- The moment for a fork is one the user is usually too deep in the work to notice: they are going
147
- off shift, or about to re-explain an hour of debugging to a colleague by hand, or trading asks
148
- back and forth on what was never really one question. Say so plainly, say what the fork would
149
- include, and leave it there. If they pass, do not raise it again.
150
-
151
- When the user wants an *answer* rather than to hand over the whole conversation, an ask is the
152
- cheaper and more private thing. Offer that instead.
153
-
154
- ## When it does not work
155
-
156
- The tools return errors as text; relay them rather than retrying with different arguments.
157
-
158
- - **"the popover daemon is not running"** teammate agents are unreachable from this machine.
159
- `popover daemon start`, or `popover doctor` to diagnose. Do not treat it as an empty roster.
160
- - **Empty roster** print what the tool returned verbatim; it knows whether the answer is
161
- "nobody is working here" or something else. Do not paraphrase it into "your team is idle".
162
- - **Handle does not match** relay it. Do not guess at another agent.
163
- - **Ask times out** say so. Their machine may be busy or the session may have ended. Do not
164
- silently re-ask.
165
-
166
- ## The user-facing commands
167
-
168
- The four commands carry the full flows for when the user drives this explicitly how to
169
- present a roster, how to word an ask, how to take delivery of a fork. Do not restate their
170
- steps here or work around them: **when the user invokes a command, follow that command.** This
171
- skill is for the other case, where nobody invoked anything and you noticed the moment yourself.
172
-
173
- When you act on your own, prefer naming the command you are standing in for — "I'll run the
174
- equivalent of `/popover:ask B1`" so the user learns the surface they can drive directly next
175
- time.
1
+ ---
2
+ name: popover
3
+ description: "Judgment for reaching a teammate's Claude Code agent *without being asked to*, and for keeping this conversation where the team can ask it later — when it is worth spending their tokens, and which of /popover:team, /popover:message, /popover:fork and /popover:vault fits. Nothing to invoke by hand. **Standing rule: when you finish a task, vault this conversation before you report completion.** That is the moment and it does not come back — you have just built the thing, your grasp of it is as good as it is ever going to get, the user is about to move on to something else, and a conversation nobody vaults is deleted when the session ends. Vault a decision and the reasons behind it, an approach tried and rejected, an investigation that ended in an answer. Do not vault a session that only did what its diff says, one that concluded nothing, or one carrying secrets or a customer's data — an index full of everything is one nobody trusts, and fails the same way as vaulting nothing. Read this skill too when a question turns on what a colleague decided, ruled out, or is changing right now: why the code is the way it is when the repo does not say, whether work about to start is already in flight, or why something nobody touched is broken."
4
+ ---
5
+
6
+ # popover
7
+
8
+ Your teammates are running their own Claude Code sessions in this repo. Each one has
9
+ accumulated context you do not have: the alternatives they rejected, the constraint that
10
+ forced an awkward shape, what they changed twenty minutes ago and have not pushed. popover
11
+ lets you reach those agents.
12
+
13
+ **This skill is not a command, and there is nothing here for a user to invoke.** The commands
14
+ are the things a user types:
15
+
16
+ | | |
17
+ | --- | --- |
18
+ | `/popover:team` | who is working in this repo right now |
19
+ | `/popover:message` | say something to one agent, and carry on the thread they reply on |
20
+ | `/popover:fork` | hand this whole conversation to a teammate |
21
+ | `/popover:vault` | publish this conversation to the team's archive, or ask one already there |
22
+ | `/popover:ask` | deprecated `/popover:message` does this |
23
+ | `/popover:tell` | deprecated — `/popover:message` does this |
24
+
25
+ The last two still work and are still carried out when a user types them; they are deprecated
26
+ because the difference between them was never a user's to decide. Whether a message is
27
+ answered by a live session or by a read-only copy turns on what that agent is doing at this
28
+ second, which the daemon knows and the sender does not — so the system picks, and no argument
29
+ lets a caller override it (`docs/messages.md` §1).
30
+
31
+ This file is the judgment around them: when reaching for one is worth it, which one fits, and
32
+ what each one spends. It exists because the moment to use popover rarely announces itself. The
33
+ user asks why something is the way it is, and the honest answer is that the repo does not
34
+ record it — but a colleague's agent worked it out this morning. Nobody will type
35
+ `/popover:message` for you. Noticing is your job.
36
+
37
+ ## The eight tools
38
+
39
+ They arrive as deferred MCP tools, so you have their names but not their schemas. Load them
40
+ before use a name that is missing from this line is a tool you cannot call, so it lists
41
+ every one that exists, deprecated ones included:
42
+
43
+ ```
44
+ ToolSearch("select:mcp__plugin_popover_popover__team_list,mcp__plugin_popover_popover__team_message,mcp__plugin_popover_popover__team_ask,mcp__plugin_popover_popover__team_tell,mcp__plugin_popover_popover__vault_search,mcp__plugin_popover_popover__vault_ask,mcp__plugin_popover_popover__vault_create,mcp__plugin_popover_popover__team_receipts")
45
+ ```
46
+
47
+ Their own descriptions are detailed and authoritative on arguments and limits read them
48
+ once loaded rather than guessing. In short:
49
+
50
+ - **`team_list`** who is active in this repo, what they are doing, and each one's short
51
+ handle (`B1`). Takes nothing. Read-only and cheap.
52
+ - **`team_message`** — the one verb for reaching an agent. You give it a target and a body;
53
+ it decides on its own whether that lands in the teammate's live session or is answered by
54
+ a read-only copy of it, and tells you which afterwards. An answer may come back on the
55
+ call, or later, or not at all — none of the three means it failed. Replies run on a thread
56
+ in both directions, so pass the `thread_id` it returned to carry on rather than opening
57
+ something new.
58
+ - **`team_ask`** deprecated; `team_message` covers it. Still works, unchanged: one question
59
+ to one agent, answered by a read-only copy of their session from its full context, ~90s.
60
+ - **`team_tell`** deprecated; `team_message` covers it. Still works, unchanged: a short
61
+ heads-up into a teammate's live session, with nothing coming back.
62
+ - **`team_receipts`** everything that came in for *this* session while nobody was watching.
63
+ Read-only and cheap, and it now carries two kinds, so read the `kind` on each. `asks` is a
64
+ finished exchange: a copy of this conversation answered and whoever asked already has the
65
+ answer, so nobody is waiting on you. `thread` is a teammate's reply on an open thread, and
66
+ that one may be a live turn with a person waiting answer it with `team_message` on the
67
+ same `thread_id`, which needs no fresh consent because the thread is already open. You
68
+ learn something is waiting from a line your own daemon prints, which carries a count and a
69
+ kind and never any of the text; this is how you read the text itself. Worth calling when
70
+ you finish a task being asked about something is the clearest evidence the team wants it,
71
+ which makes it the best reason to vault.
72
+ - **`vault_search`** search the conversations your team has frozen and published. Free, no
73
+ model, nothing resumed. Not limited to this repo, and not limited to people who are working
74
+ right now. Always the first of the two.
75
+ - **`vault_ask`** one question to one vault, answered from its frozen context on *this*
76
+ machine at your user's expense. Roughly $0.50 and up to 90 seconds. Never call it on a
77
+ vault you have not seen in a search result.
78
+ - **`vault_create`** publish *this* conversation into the archive the other two read.
79
+ The only one here that writes something permanent: the whole conversation goes to
80
+ everyone on the team, it does not expire, and it cannot be edited afterwards. You may call
81
+ it on your own judgement — see *Vaults are a different thing again* below — but say plainly
82
+ that a vault is **readable by the popover service**, which a fork is not.
83
+
84
+ ## When to reach for it on your own
85
+
86
+ Check the roster and consider messaging someone when:
87
+
88
+ - **The user asks *why*** why a library was chosen, why a function is shaped oddly, why an
89
+ obvious approach was not taken **and the repo does not answer it.** Read the code, the
90
+ comments, `git log`, `git blame`, and `CLAUDE.md` first. If the reasoning is not written
91
+ down anywhere, that is precisely the case popover was built for: it exists only in
92
+ somebody's session.
93
+ - **You are about to start something that may already be underway** a rename spanning many
94
+ files, a dependency bump, a refactor of a shared module. One `team_list` costs almost
95
+ nothing and can save the user an afternoon of conflicted work.
96
+ - **You are blocked by something you did not break** — a migration that appears unapplied, a
97
+ failing build on untouched code, an endpoint that disagrees with its own types. Ask the
98
+ person whose agent is in that area before you debug their in-flight change as if it were a
99
+ bug.
100
+ - **You are about to edit a file a teammate's agent is working in right now.** The roster
101
+ often says what each agent is doing. This is a collision rather than a question, and it is
102
+ still one `team_message` you no longer have to decide that it is a "tell", and you never
103
+ had the information to decide it well.
104
+ - **The user names a colleague.** "Did Bob get the webhook working?", "what is Sarah doing to
105
+ globals.css" that is a direct signal, and you do not need to be asked twice.
106
+
107
+ Say what you are doing and why before you send, in a line. The user should never be surprised
108
+ that you spent a teammate's tokens or their attention.
109
+
110
+ ## When not to
111
+
112
+ - **When the repo can answer.** Reading is free and instant; a message spends either someone
113
+ else's machine or someone else's attention. Exhaust local evidence first, always.
114
+ - **For curiosity or completeness.** Do not reach for someone because a second opinion would
115
+ be tidy. Message them because you are stuck and they are not.
116
+ - **More than one agent per question.** Never fan out across the roster to see who answers
117
+ best. Pick the one that fits; if none obviously does, show the user the roster instead.
118
+ - **To hand off work.** A message is information, not a directive: the receiving agent is
119
+ explicitly told to treat it that way, and the copy that may answer it has no tools at all.
120
+ Threads do not change this, and being able to reply is not being able to delegate. If the
121
+ user wants a colleague to *do* something, say plainly that popover does not do that, and
122
+ let them message the human.
123
+ - **For anything outside this repo.** Only agents in the same repository are visible or
124
+ reachable. An empty roster means nobody else is working *here*not that the team is idle.
125
+ Phrase it that way, or you will imply something false about your user's colleagues.
126
+
127
+ ## The cost asymmetry, which governs consent
128
+
129
+ | | Costs | Ask the user first? |
130
+ | --- | --- | --- |
131
+ | `team_list` | Nothing meaningful | No — just do it |
132
+ | `team_message`, **opening** a thread | A teammate's tokens or their attention, and you do not learn which until after | **Yes, once** |
133
+ | `team_message`, **continuing** one | The same, on a channel their human already agreed to | No — say what you sent |
134
+
135
+ **Consent is per thread, not per message** (`docs/messages.md` §2). Opening a channel into a
136
+ colleague's work is the deliberate act worth your user's say-so; each sentence inside a
137
+ conversation they already agreed to is not, and humans do not re-consent to a conversation
138
+ per utterance. So confirm at the open, and then stop asking. Re-confirming every reply is the
139
+ old habit wearing a thread as a hat, and it makes the surface unusable for the exchange it
140
+ exists to support.
141
+
142
+ There is no longer a numeric cap, and its removal was the point rather than an oversight. A
143
+ count is a proxy for consent: it guesses a number on the recipient's behalf and then severs,
144
+ mid-sentence and at an arbitrary total, a conversation their human already agreed to. What
145
+ replaces it is a human with a kill switch either party can close a thread with `popover
146
+ thread close <id>`, which is landing alongside this. Nothing else throttles you, so the bar
147
+ you carry at the open *is* the protection. If the tool refuses a message, relay the refusal
148
+ rather than retrying it.
149
+
150
+ ### The number you can see is the wrong half of the bill
151
+
152
+ `team_message` may report a cost. Read it, and read what it leaves out, because the omission
153
+ runs the opposite way to intuition (§8):
154
+
155
+ > The transport we can bill looks expensive, and the one we cannot bill looks free. Routing
156
+ > prefers the unbillable one exactly when the target is busiest.
157
+
158
+ A read-only copy runs headless on the recipient's machine and reports a dollar figure and
159
+ it is chosen when they are **idle**, which is the cheapest moment to interrupt anybody. Live
160
+ injection reports nothing, because it spends the teammate's own session inside their own
161
+ Claude usage where popover cannot see it and it is chosen when they are **working**, which
162
+ is the most disruptive moment there is. So a thread showing a low number may have been the
163
+ expensive one. Never tell a user a thread was cheap for the person on the other end; say
164
+ what the figure covers, which is the copies and not the interruptions.
165
+
166
+ ## Writing a message worth the money
167
+
168
+ First, the thing most often got wrong: an agent that believes it has one shot writes a
169
+ paragraph it did not need. You are not spending your only round trip, and that is now
170
+ literally true rather than encouragement the reply is repliable. Send the smallest thing
171
+ that unblocks you and follow up if what comes back opens something. Two exchanges beat one
172
+ padded one, and they beat one padded one that timed out.
173
+
174
+ No length is prescribed, in either direction, and none will be. The verbosity this replaced
175
+ was compliance, not bad judgement: doctrine said you got one round trip, so agents wrote as
176
+ if they did. A word count would be the same instruction in cruder form, making a short
177
+ message pad out to look thorough and a long one stop mid-reasoning. Write at whatever length
178
+ the thing takes; six words is a good message when six words are the message.
179
+
180
+ The first message on a thread has none of your conversation behind it. The recipient cannot
181
+ see the file you are looking at or the error you just read. So make it stand alone:
182
+
183
+ - Expand every pronoun and vague reference. "that bug" → "the token refresh bug in the auth
184
+ service".
185
+ - Name files by path, and say what you are trying to do, not only what you want to know.
186
+ - One question. Not three, and not one question with three others hanging off it.
187
+
188
+ A poor ask — *"why is it done this way?"* — comes back useless and you have spent a
189
+ colleague's tokens to learn nothing. A good one is barely longer: *"Is `NEXT_PUBLIC_APP_URL`
190
+ going to be corrected, or is reading the Host header in `apps/web/src/lib/auth-redirect.ts`
191
+ the intended long-term approach?"* Two lines, self-contained, and it comes back with the
192
+ reasoning — because that is knowledge about shared state which lives in a person's head
193
+ rather than in the repo.
194
+
195
+ Later messages on the same thread are a different matter: they arrive with the thread's own
196
+ history behind them, so a reply can be as short as a reply naturally is. Pass the `thread_id`
197
+ the tool returned. Restating context the thread already carries is the padding habit finding
198
+ somewhere new to live, and it is also expensive — the thread is replayed to whatever answers
199
+ it, under a budget that drops the oldest turns first.
200
+
201
+ Never invent a handle, and never invent a thread id. Use only what `team_list` returned and
202
+ what a previous call handed back; a handle from earlier in this conversation may have gone
203
+ out of scope since, and an id you did not receive is not a thread you are on. If the tool
204
+ says it does not match, relay that instead of trying a different agent.
205
+
206
+ ## Forks are a different thing
207
+
208
+ A fork hands over **this entire conversation**, frozen, and the recipient continues it in
209
+ their own session. Nothing comes back. That includes the contents of every file read into the
210
+ context, so it is a far larger disclosure than a message.
211
+
212
+ **Creating one is the user's alone.** It happens when they ask for it in as many words, never
213
+ on their behalf — and "that would be useful" is not a yes.
214
+
215
+ Saying that a fork would fit is a different act from making one, and it is worth doing once.
216
+ The moment for a fork is one the user is usually too deep in the work to notice: they are going
217
+ off shift, or about to re-explain an hour of debugging to a colleague by hand, or trading asks
218
+ back and forth on what was never really one question. Say so plainly, say what the fork would
219
+ include, and leave it there. If they pass, do not raise it again.
220
+
221
+ When the user wants an *answer* rather than to hand over the whole conversation, a message is
222
+ the cheaper and more private thing. Offer that instead.
223
+
224
+ ## Vaults are a different thing again
225
+
226
+ A vault is this conversation published to the **team**, permanently, and asked later by
227
+ whoever needs it. Nobody has to be online for it, nobody has to still be at the company, and
228
+ the person asking pays rather than the person who wrote it.
229
+
230
+ **Unlike a fork, creating one is yours to decide.** Not to offer and wait on — to decide. The
231
+ rule differs from the fork rule deliberately: a fork discloses one conversation to one named
232
+ individual, while a vault goes to a team that already shares the repository and the work, so
233
+ the disclosure is smaller and the cost of missing the moment is higher.
234
+
235
+ And the moment is not vague. It is **the completion of a task**: you have just finished
236
+ building something, your grasp of the work is as good as it is ever going to get, and the user
237
+ is about to move on to something else. So the default runs the other way from every other
238
+ proactive act in popover — when you finish, vault before you report completion, rather than
239
+ finishing and waiting to see whether it occurs to anybody. `docs/vaults.md` §3 fixes that
240
+ as the trigger and says why it beat the obvious alternative of vaulting on compaction:
241
+ compaction fires on the longest sessions, and a session is usually long because it wandered
242
+ rather than because it concluded anything worth asking later.
243
+
244
+ Which leaves the exception carrying all the weight, so hold it honestly rather than as a
245
+ formality. It is stated in full at the end of this section.
246
+
247
+ It is still a real disclosure, and two things must be said plainly when you make one:
248
+
249
+ - **A vault is readable by the popover service.** A fork is end-to-end and this is not.
250
+ Anyone who has internalized the first will assume the second unless you say otherwise.
251
+ - **It cannot be edited or withdrawn.** A correction is a *note* appended beside the original;
252
+ `popover vault archive` retires a vault without erasing the record that it was made.
253
+
254
+ Vault a conversation that worked something out the team will want and the repo will not
255
+ record — a decision and its reasons, an approach tried and rejected, an investigation into why
256
+ something is the way it is. Do not vault a session that only did what its diff says, one that
257
+ concluded nothing, or one carrying secrets or a customer's data. Both failure modes here are
258
+ real and you should be watching for both in yourself: vaulting everything produces an index
259
+ nobody trusts, and vaulting nothing is the older ask-first habit wearing a different hat.
260
+ Reversing the default is what makes the archive exist at all; the exception is what keeps it
261
+ worth asking.
262
+
263
+ ## When it does not work
264
+
265
+ The tools return errors as text; relay them rather than retrying with different arguments.
266
+
267
+ - **"the popover daemon is not running"** — teammate agents are unreachable from this machine.
268
+ `popover daemon start`, or `popover doctor` to diagnose. Do not treat it as an empty roster.
269
+ - **Empty roster** — print what the tool returned verbatim; it knows whether the answer is
270
+ "nobody is working here" or something else. Do not paraphrase it into "your team is idle".
271
+ - **Handle does not match** — relay it. Do not guess at another agent.
272
+ - **It times out** — say so. Their machine may be busy. A timeout does not end a thread and
273
+ does not mean the target is gone, so do not silently re-send and do not report the thread
274
+ as dead.
275
+ - **The target is offline** — their session has ended, and this is also what a thread returns
276
+ once its peer has gone and something is still undelivered. Say it could not be sent now.
277
+ **Do not say the thread is closed**, because it is not: it goes live again by itself when
278
+ that session resumes (§7.1). Refusing is deliberate — the alternative is a pile of messages
279
+ landing at once on a person returning from lunch.
280
+ - **The thread is closed** — a human used the kill switch. Closing bars new sends; it does
281
+ not retract anything already filed, so a reply produced before the close still reaches the
282
+ other side when they resume. Do not describe a close as having undone something, and do not
283
+ reopen by dropping the `thread_id` — that opens a new thread, which needs consent again.
284
+
285
+ ## The user-facing commands
286
+
287
+ The commands carry the full flows for when the user drives this explicitly — how to present
288
+ a roster, how to word a message, how to take delivery of a fork. Do not restate their
289
+ steps here or work around them: **when the user invokes a command, follow that command.** This
290
+ skill is for the other case, where nobody invoked anything and you noticed the moment yourself.
291
+
292
+ When you act on your own, prefer naming the command you are standing in for — "I'll run the
293
+ equivalent of `/popover:message B1`" — so the user learns the surface they can drive
294
+ directly next time.