@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.
- package/CHANGELOG.md +91 -0
- package/README.md +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/threads.d.ts +163 -0
- package/dist/threads.d.ts.map +1 -0
- package/dist/threads.js +576 -0
- package/dist/threads.js.map +1 -0
- package/dist/vaults.d.ts +1 -102
- package/dist/vaults.d.ts.map +1 -1
- package/dist/vaults.js +15 -294
- package/dist/vaults.js.map +1 -1
- package/package.json +47 -47
- package/plugin/.claude-plugin/plugin.json +19 -19
- package/plugin/commands/ask.md +18 -9
- package/plugin/commands/message.md +152 -0
- package/plugin/commands/team.md +9 -7
- package/plugin/commands/tell.md +12 -3
- package/plugin/commands/vault.md +34 -13
- package/plugin/hooks/hooks.json +25 -1
- package/plugin/mcp/index.mjs +1081 -585
- package/plugin/scripts/_ipc.mjs +49 -1
- package/plugin/scripts/announce-roster.mjs +5 -4
- package/plugin/scripts/deliver-messages.mjs +7 -5
- package/plugin/scripts/emit-event.mjs +11 -2
- package/plugin/scripts/inject-message.mjs +297 -0
- package/plugin/scripts/nudge-vault.mjs +517 -0
- package/plugin/skills/popover/SKILL.md +294 -175
|
@@ -1,175 +1,294 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: popover
|
|
3
|
-
description: "Judgment for reaching a teammate's Claude Code agent *without being asked to
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
| | |
|
|
17
|
-
| --- | --- |
|
|
18
|
-
| `/popover:team` | who is working in this repo right now |
|
|
19
|
-
| `/popover:
|
|
20
|
-
| `/popover:
|
|
21
|
-
| `/popover:
|
|
22
|
-
| `/popover:
|
|
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
|
-
that
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
##
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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.
|