@joe-broadhead/messaging 0.7.1 → 0.8.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.
Files changed (89) hide show
  1. package/CHANGELOG.md +214 -2
  2. package/dist/bin/messaging-mcp.js +5043 -4054
  3. package/dist/bin/messaging-relay.js +8263 -5425
  4. package/dist/bin/messaging.js +5982 -4906
  5. package/dist/bin/messagingd.js +19956 -13716
  6. package/dist/lib/modules/core/agent/operations.js +19 -327
  7. package/dist/lib/modules/core/agent/present.js +15 -55
  8. package/dist/lib/modules/core/agent-tools.js +23 -139
  9. package/dist/lib/modules/core/consent.js +1 -1
  10. package/dist/lib/modules/core/conversation/event.js +29 -4
  11. package/dist/lib/modules/core/conversation/guest-invitation.js +42 -0
  12. package/dist/lib/modules/core/conversation/log.js +287 -65
  13. package/dist/lib/modules/core/conversation/request-log.js +158 -0
  14. package/dist/lib/modules/core/conversation/request-seal.js +41 -0
  15. package/dist/lib/modules/core/conversation/requests.js +87 -0
  16. package/dist/lib/modules/core/conversation/seal.js +90 -37
  17. package/dist/lib/modules/core/conversation-agent-tools.js +69 -0
  18. package/dist/lib/modules/core/federation/directory-proof.js +83 -0
  19. package/dist/lib/modules/core/federation/proof-state.js +167 -0
  20. package/dist/lib/modules/core/federation/roster-proof.js +74 -0
  21. package/dist/lib/modules/core/index.js +8 -3
  22. package/dist/lib/modules/core/jelly-host.js +5 -5
  23. package/dist/lib/modules/core/schema/common.js +31 -5
  24. package/dist/lib/modules/core/schema/consent.js +5 -4
  25. package/dist/lib/modules/core/schema/contact-request.js +22 -0
  26. package/dist/lib/modules/core/schema/conv-frames.js +94 -0
  27. package/dist/lib/modules/core/schema/conversation.js +67 -33
  28. package/dist/lib/modules/core/schema/envelope.js +8 -24
  29. package/dist/lib/modules/core/schema/errors.js +4 -3
  30. package/dist/lib/modules/core/schema/guest-invitation.js +13 -0
  31. package/dist/lib/modules/core/schema/index.js +5 -0
  32. package/dist/lib/modules/core/schema/ipc/consent.js +13 -9
  33. package/dist/lib/modules/core/schema/ipc/conversation-views.js +80 -0
  34. package/dist/lib/modules/core/schema/ipc/conversations.js +128 -0
  35. package/dist/lib/modules/core/schema/ipc/device.js +2 -0
  36. package/dist/lib/modules/core/schema/ipc/jelly.js +3 -38
  37. package/dist/lib/modules/core/schema/ipc/shapes.js +14 -72
  38. package/dist/lib/modules/core/schema/ipc/surfaces.js +12 -195
  39. package/dist/lib/modules/core/schema/ipc/tasks.js +31 -0
  40. package/dist/lib/modules/core/schema/ipc.js +18 -44
  41. package/dist/lib/modules/core/testing.js +1 -1
  42. package/dist/lib/modules/core/version.js +1 -1
  43. package/dist/lib/modules/ipc/client.js +10 -2
  44. package/dist/lib/modules/ipc/server.js +14 -5
  45. package/dist/lib/modules/ipc/testing.js +13 -23
  46. package/dist/spec/messaging-v1.md +546 -409
  47. package/dist/third-party-notices.md +1 -1
  48. package/dist/third-party.json +1 -1
  49. package/dist/types/core/agent/operations.d.ts +5 -52
  50. package/dist/types/core/agent/present.d.ts +6 -21
  51. package/dist/types/core/agent-tools.d.ts +263 -442
  52. package/dist/types/core/conversation/event.d.ts +6 -6
  53. package/dist/types/core/conversation/guest-invitation.d.ts +8 -0
  54. package/dist/types/core/conversation/log.d.ts +28 -13
  55. package/dist/types/core/conversation/request-log.d.ts +24 -0
  56. package/dist/types/core/conversation/request-seal.d.ts +6 -0
  57. package/dist/types/core/conversation/requests.d.ts +14 -0
  58. package/dist/types/core/conversation/seal.d.ts +32 -9
  59. package/dist/types/core/conversation-agent-tools.d.ts +918 -0
  60. package/dist/types/core/federation/directory-proof.d.ts +8 -0
  61. package/dist/types/core/federation/proof-state.d.ts +114 -0
  62. package/dist/types/core/federation/roster-proof.d.ts +7 -0
  63. package/dist/types/core/index.d.ts +10 -5
  64. package/dist/types/core/jelly-host.d.ts +1 -1
  65. package/dist/types/core/schema/common.d.ts +31 -6
  66. package/dist/types/core/schema/consent.d.ts +7 -7
  67. package/dist/types/core/schema/contact-request.d.ts +264 -0
  68. package/dist/types/core/schema/conv-frames.d.ts +1200 -0
  69. package/dist/types/core/schema/conversation.d.ts +1410 -264
  70. package/dist/types/core/schema/envelope.d.ts +83 -130
  71. package/dist/types/core/schema/errors.d.ts +3 -1
  72. package/dist/types/core/schema/guest-invitation.d.ts +51 -0
  73. package/dist/types/core/schema/index.d.ts +5 -0
  74. package/dist/types/core/schema/ipc/consent.d.ts +89 -49
  75. package/dist/types/core/schema/ipc/conversation-views.d.ts +1023 -0
  76. package/dist/types/core/schema/ipc/conversations.d.ts +3987 -0
  77. package/dist/types/core/schema/ipc/device.d.ts +4 -0
  78. package/dist/types/core/schema/ipc/jelly.d.ts +2 -105
  79. package/dist/types/core/schema/ipc/shapes.d.ts +13 -95
  80. package/dist/types/core/schema/ipc/surfaces.d.ts +25 -427
  81. package/dist/types/core/schema/ipc/tasks.d.ts +208 -0
  82. package/dist/types/core/schema/ipc.d.ts +2671 -525
  83. package/dist/types/core/schema/relay.d.ts +8 -4
  84. package/dist/types/core/testing.d.ts +1 -1
  85. package/dist/types/core/version.d.ts +1 -1
  86. package/dist/types/ipc/client.d.ts +4 -1
  87. package/dist/types/ipc/server.d.ts +10 -1
  88. package/dist/types/ipc/testing.d.ts +21 -8
  89. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,218 @@ Versions follow [Semantic Versioning](https://semver.org); see
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.0] - 2026-11-10
10
+
11
+ **Conversations replace chat and mail.** A dm, a group, a channel and a mail between two agents are now all one
12
+ thing: a conversation, a signed, hash-chained log that the relay sequences and stores encrypted, and that each member
13
+ verifies (spec §6.8, §16). Each sender device encrypts to the conversation with a sender key, so each line is one
14
+ ciphertext, stored once (spec §16.5, §16.6). Tasks and delegation keep their envelopes and work as before.
15
+
16
+ **Upgrade the relay first, then every daemon of a realm together** (docs/distribution.md, "Upgrading from 0.7.1 to
17
+ the conversations release"). Stores only grow: nothing resets, and a rollback keeps the data.
18
+
19
+ ### Breaking
20
+
21
+ - **0.7.1 and 0.8.0 daemons cannot exchange chat, mail or message requests** (spec §8.3, "Mixed versions"). Tasks,
22
+ presence and the directory still work in both directions.
23
+ - **0.8.0 → 0.7.1.** Before it creates a dm, group or channel with a person, adds a person, or sends a message
24
+ request, a 0.8.0 daemon asks the relay (the new `conv.caps` frame, spec §7). If every device of that person with
25
+ current presence lacks the `conversations` feature, the call fails with the new error `peer_outdated`, "<handle>
26
+ needs to update Messaging", and nothing is created or sent, so no contact is left half-open. A person with no
27
+ presence within the envelope TTL gives the relay no evidence, and the call goes ahead.
28
+ - **0.7.1 → 0.8.0.** A 0.8.0 daemon refuses a 0.7.1 chat line, plain mail or message request with a `rejected`
29
+ receipt, code `refused`. 0.7.1 shows only `refused` and its hint "do not retry; tell your person": **to a 0.7.1
30
+ user, `refused` from an updated colleague means "update Messaging".**
31
+ - **Rollout.** The relay first: it opens a 0.7.1 database in place and still serves every frame 0.7.1 uses, so 0.7.1
32
+ daemons keep working through it. Then every daemon of a realm, in one window.
33
+ - **Message requests pending at the upgrade must be sent again.** A request you sent from 0.7.1 that was not yet
34
+ answered is not carried over: it no longer shows in `request.waiting`, so send it again once both sides run 0.8.0.
35
+ A request you received and had not answered shows in `request.list` with state `resend`; it cannot be accepted,
36
+ because 0.7.1 requests carry no sender-signed proof, so ask its sender to send it again. Nothing is re-signed from
37
+ copied text.
38
+ - **IPC methods removed, with no aliases** (spec, "Conversation IPC cut-over"; design §14): `msg.send`, `person.send`,
39
+ `channel.create`, `channel.invite`, `channel.leave`, `channel.remove`, `search`, `conv.subscribe`, `agents.list` and
40
+ `agents.read`. `conv.list`, `conv.read` and `people.get` (now a batch of 1–100 ids) keep their names with the
41
+ conversation shapes. The chat `conv.markRead` is gone from the live API; its conversation form is staged (below).
42
+ - Plain mail is a `conv.send` line. A task is `task.create`, and an answer to a task waiting for input is
43
+ `task.continue`, both on the agent tier; `task.list/get/update/cancel` are unchanged.
44
+ - A daemon refuses plain agent-mail envelopes, including mail held before the upgrade and released after it. The
45
+ rows stay in the store but are not served.
46
+ - **New live methods** (`LIVE_CONVERSATION_METHODS`, spec §8.2):
47
+ - agent and human tier: `conv.list`, `conv.read`, `conv.send`, `conv.react`, `conv.edit`, `conv.delete` (an agent
48
+ edits or deletes only its own lines), `conv.search`, `conv.context`, `conv.access`, `conv.sync`;
49
+ - human tier (admin socket only): `conv.get`, `conv.members`, `conv.threads`, `conv.pin`, `conv.create`,
50
+ `conv.add`, `conv.remove`, `conv.role`, `conv.seat`, `conv.settings`, `conv.meta`, `conv.archive`, `conv.leave`,
51
+ `conv.join`, `conv.accept`, `conv.policy`, `conv.backfill`, `people.get`, `sessions.list`, `request.waiting`.
52
+ - **Staged, not live.** These contracts are in `@messaging/core` with no handler and no tier; a call to one is refused
53
+ (design, "Lane 4 live boundary"):
54
+ - read state and preferences: `conv.markRead`, `conv.markUnread`, `conv.prefs`, `conv.follow`, `conv.save`,
55
+ `conv.saved`, `conv.draft`, `conv.localRetention`;
56
+ - history as context: `context.get`, `context.set`, `context.set.preview`;
57
+ - the channel catalogue: `conv.catalogue`, `conv.publish`;
58
+ - files: `file.get`;
59
+ - typing and activity: `conv.typing`, `session.activity`, `turn.cancel`;
60
+ - scheduled lines: `conv.schedule`, `conv.scheduled`, `conv.unschedule`.
61
+
62
+ Until read state lands, views carry no read positions, unread counts, preferences or follow state, and the filters
63
+ that need them (`conv.list` `unread` and `mentions`, `conv.threads` `unread` and `following`) are refused with
64
+ `invalid_request`, never answered with an empty page. `conv.backfill` verifies the relay history it can fetch and
65
+ answers `complete: false`.
66
+ - **CLI.**
67
+ - `messaging message-status` is removed. `messaging status --help` points to `chat read` and `task`.
68
+ - `messaging send <participant|cid> [text…]` sends a conversation line as the person (`conv.send`). It creates the
69
+ dm when there is none, and prints `Pending <id> in <cid>` or `Waiting for consent.`. `--task` and `--continue`
70
+ send to one agent session, as before.
71
+ - `messaging chat list/read/post/search` take conversation ids (`cid`) and opaque `--cursor`s, not room names.
72
+ `chat search --room` is now `--cid`. `chat read` no longer changes read state, and `--keep-unread` is gone.
73
+ - `messaging listen` follows `conv.sync`. It prints conversation metadata and stream gaps, never the text.
74
+ - **MCP** (`messaging-mcp`, spec §11). Ten tools: `contacts`, `conversations`, `send`, `inbox`, `read`, `search`,
75
+ `context`, `tasks`, `task_update` and `task_cancel` (0.7.1 had eight, without `conversations` and `context`).
76
+ `--channel` is removed: the daemon decides which conversations an agent may read. Addresses are participants and
77
+ `cid`s, not `person:`, `agent:` or `channel:` names.
78
+ - **Package exports** (`@joe-broadhead/messaging/core`; a breaking change for the OpenCode plugin):
79
+ - removed: `AgentSummary`, `ChannelConv`, `ChatLine`, `ChatSeq`, `ChatText`, `ConvCursor`, `ConvEntry`,
80
+ `ConvPlace`, `ConvSummary`, `ConversationRef`, `RoomRef`, `conversationOf`, `conversationOfPeer`,
81
+ `decodeToolCursor`, `encodeToolCursor`, `presentConvEntry`, `presentLine`, `presentMail`, `presentSent` and
82
+ `sealKeyShares` (now `sealKeyShare`, one recipient); in `./core/testing`, `sealKeySharesWith` (now
83
+ `sealKeyShareWith`);
84
+ - changed: `AGENT_METHODS`, `HUMAN_METHODS` and `IPC_METHODS` (the method lists above), `TOOL_VERBS` (now only
85
+ `contacts`, `tasks`, `task_update` and `task_cancel`; all ten tools are `CONVERSATION_TOOL_VERBS`, with
86
+ `ConversationTools`), `AgentTool`,
87
+ `TOOL_DESCRIPTIONS`, `TOOL_REMEDIES`, `ErrorCode` (adds `peer_outdated`), `LIMITS`, `DOMAIN`, and the consent,
88
+ device, Jelly and surface method tables;
89
+ - `./ipc`, `./ipc/testing`, `./testing/jelly-id` and `./zod` export the same names as 0.7.1.
90
+
91
+ ### Conversations
92
+
93
+ - **Dms, groups, channels and threads** (spec §6.8, §16). One log per conversation. Membership, roles and policy
94
+ are ops in the log, so every member computes the same participants at every position. A reply names its root.
95
+ Edits, deletes, reactions and pins are events that name their target. A dm starts with no shared history. Channels
96
+ share their history with new members, and groups and dms rekey when someone is added.
97
+ - **Agents are participants.** A participant is a person or one agent of a person (`person/agent`). Mail between two
98
+ agents is a line in their dm.
99
+ - **An agent can start a dm with another agent.** `conv.send {to: "person/agent"}` with no dm makes the person's
100
+ device sign the create, with only the two agents as participants. The daemon relies on the client's first-send
101
+ confirmation, as 0.7.1 mail did. The agent's lines wait on the sending device until the recipient seats its agent,
102
+ keep the id the send returned, and lapse after 7 days (at most 50 waiting per dm). An agent still cannot start a dm
103
+ with a person, or add or seat anyone.
104
+ - **Consent on invitations.** The recipient person's `ask` decides an agent-dm invitation: `open` seats the agent,
105
+ `request` holds it for the person, and `no` declines it silently. Until it is accepted, the relay serves an invitee
106
+ only the signed ops and digests: no ciphertext, no key shares, and only op pushes (spec §7, "Conversation frames").
107
+ - **Message requests on conversations** (spec §16.11). A first message to a person of another org is a signed,
108
+ portable request: the sender's device signs a descriptor that commits to the sealed opening text. The relay refuses
109
+ an external dm without request admission. Accepting signs a decision, activates the dm once, and imports the
110
+ opening as its first line, under its original author and id. `request.waiting` shows `held` only from an
111
+ authenticated hold, and `pending-delivery` while delivery is unconfirmed. Requests pending at the upgrade must be sent
112
+ again (Breaking, above). Crossed requests make one dm.
113
+ - **Guests.** A person of another org joins a conversation as a guest. A guest cannot invite, cannot change role out
114
+ of guest, and an agent of a guest inherits the guest's role. Keys and content reach a guest only after acceptance
115
+ (and, where history is not shared, after a rekey). These rules are enforced by the log and the relay. The daemon
116
+ does not yet create the inviter's signed preview that a guest's acceptance needs, so inviting a guest end to end
117
+ is not available in 0.8.0.
118
+ - **The inbox is a projection.** `inbox.list/get/ack` and `item.read` return task items and verified lines in accepted
119
+ agent dms addressed to that session. A line's id is its event id, with its `cid`. Acknowledgements belong to the
120
+ participant and survive an agent restart with a new session key. Plain mail stored before the upgrade is not
121
+ returned.
122
+ - **Own-person wakes on lines.** A person's line to their own agent (the other end of the dm, or a mention) wakes a
123
+ sleeping Jelly host, as mail did in 0.7.1 (spec §7, "Wake tickets"; §16.2). The relay takes the author's person from
124
+ the authenticated device, never from the event, and uses the existing ticket, gap and budget rules. Another person's
125
+ line never wakes your host.
126
+ - **`contacts.list`** returns accepted conversations only: `cid`, `kind`, optional `name` and `dmWith`. No transcript,
127
+ read position or unread count.
128
+ - **Blocks.** A blocked person's events are hidden from reads, search, previews and replay. The verified log stays
129
+ intact.
130
+ - **Maintenance.** The daemon retries the conversation outbox, schedules due epoch rekeys, answers new members'
131
+ channel history after a random 0–30 s delay, and expires local message text and search rows after retention, keeping
132
+ digests and ops so the chain stays verifiable. Ops never expire (design §4.4, D2).
133
+ - **Key shares go one per recipient device and are not entries of the log**; the relay serves each only to its
134
+ recipient (design §4.4, D1).
135
+ - **Relay frames** (spec §7): `conv.append`, `conv.share`, `conv.fetch`, `conv.head` and `conv.caps`, with `conv.ok`,
136
+ `conv.shared`, `conv.entries`, `conv.heads`, `conv.capabilities` and `conv.push`; and the request mailbox
137
+ `request.settle`, `request.state` and `request.settled`. The relay sequences each log and checks appends against its
138
+ copy (membership, the author's current device, op heads, epochs, orgs), and members verify everything it serves.
139
+ - **Presence** advertises the `conversations` feature.
140
+
141
+ ### Security
142
+
143
+ - **New entries need the author's current device.** A conversation entry from a device that is no longer the author's
144
+ current binding is held: it keeps the chain but adds no state and no text, and is re-checked when the realm view
145
+ changes. Accepted history keeps its historical verification.
146
+ - **Rejected entries leave bounded evidence**: at most 128 rejected wire entries, and at most 512 junk and held
147
+ alarms, deduplicated across retries and restarts.
148
+ - **A message an author was not allowed to send is quarantined**, not shown.
149
+ - **HTTP response bodies are bounded while they stream** (daemon: Jelly environment, device login, directory home;
150
+ relay: Jelly directory). A response over the limit is cancelled, not buffered.
151
+ - **Relay error text stays out of the daemon's logs**: `relay.disconnected` no longer logs the relay's message.
152
+ - **Consent races.** A block made while a request's directory work is in flight is checked again before the request is
153
+ sent. Request pacing is reserved before any asynchronous work, so concurrent requests cannot pass the limit.
154
+ Answering a held request settles the request and the grant (`always` or `block`) in one transaction.
155
+ - **Agents are bound to their session.** The daemon binds every agent call to a session registered on that
156
+ connection, and rechecks membership and session ownership after rendering. Cursors bind to the query and session.
157
+ Peer text, author names and conversation names in MCP output are fenced, and long text carries a truncation marker.
158
+ - **Interim projection bounds**: projection refuses logs above 10,000 entries and responses above 512 KiB, pending
159
+ load tests.
160
+
161
+ ### Fixed
162
+
163
+ - **A sync that overlaps the daemon's own append is accepted.** A page that repeats an entry the flush path just stored
164
+ failed with "entry does not extend head N"; repeated entries are now checked by seq and dropped, and a different
165
+ entry is `conv_conflict`.
166
+ - **`conv.add` and `conv.remove` no longer fail with "a conversation event is still pending"** while maintenance key
167
+ shares are queued: the control path drains them first.
168
+ - **Removing a person while history shares to them are queued no longer stalls the outbox.** A queued share is dropped
169
+ only when the conversation's own verified log removes its device (`conversation.share.dropped`, ids only). An explicit
170
+ device rekey goes ahead of queued events.
171
+ - **Reads no longer re-verify whole logs.** Verified event signatures are remembered (16,384 successes, never
172
+ failures), which removed the main CPU cost of reads and the timeouts it caused under load.
173
+ - **A line that becomes readable when its key arrives late streams as a new event.**
174
+ - **`messaging listen` fixes its stream position before it says it is ready**, so no event is missed at start.
175
+ - **`messaging daemon stop` waits for the home lock to be released**, and checks that an older daemon has exited.
176
+ - **Contact requests whose delivery is unconfirmed stay visible as pending.**
177
+
178
+ ### Federation foundation (not live)
179
+
180
+ Groundwork for messaging between realms (docs/design/federation.md). **Nothing is wired into the daemon or the relay,
181
+ and nothing in 0.8.0 talks to another realm.**
182
+
183
+ - `@messaging/core` verifies another realm's identity proofs: its directory and full roster histories, including
184
+ complete epoch rotation chains.
185
+ - The daemon has a journal of foreign pins (trust on first use), proof results and human key reviews, with bounded
186
+ evidence that never drops an authenticated removal. Its durable storage is not built yet.
187
+ - The relay has a roster discovery handler (`/.well-known/messaging.json`) that is not installed in its HTTP server.
188
+ - An isolated two-realm e2e fixture.
189
+
190
+ ### Stores
191
+
192
+ **Stores only grow** (spec §8.8). Every migration is additive; the generation stays 2 and `min_reader` stays 1, so a
193
+ 0.7.x messagingd or relay still opens what 0.8.0 writes.
194
+
195
+ - **Daemon store, schema 4** (`packages/daemon/store-schemas/2.json`–`4.json`): schema 2 adds `conv_logs`,
196
+ `conv_entries`, `conv_shares`, `conv_cursors`, `conv_outbox`, `conv_keys`, `conv_alarms` and `conv_fts`; schema 3
197
+ `conv_held`; schema 4 `conv_evidence`. Message requests use rows in the existing `kv` table.
198
+ - **Relay database, schema 3** (`packages/relay/store-schemas/2.json`, `3.json`): schema 2 adds `conv_logs`,
199
+ `conv_entries`, `conv_members` and `conv_shares`; schema 3 `conv_request_decisions`.
200
+ - **The old chat and mail tables stay**, unused. No table is dropped.
201
+ - **Rollback keeps the data**, measured for both stores. A 0.7.1 relay database opens in 0.8.0, and 0.7.1 reopens
202
+ it. A 0.7.1 home opens in the 0.8.0 daemon (schema 4); 0.7.1's `messagingd` then starts on it, keeps the team and
203
+ its identity, logs no error and leaves the conversation tables alone, and 0.8.0 reads the same conversations
204
+ again afterwards. Conversations sent on 0.8.0 are not visible on 0.7.1. Spec §8.8 states both schemas.
205
+
206
+ ### Documentation
207
+
208
+ - `packages/daemon/docs/messagingd.md` and `cli.md` describe conversations; docs/distribution.md has "Upgrading from
209
+ 0.7.1 to the conversations release".
210
+ - The spec names the MCP server's ten tools; tests check the spec against the error codes, stream record kinds,
211
+ `request.waiting` states, tool names and staged methods.
212
+ - A test fails when any CLI help names a command that does not exist.
213
+
214
+ ### Tests
215
+
216
+ - An opt-in mixed-version e2e against a real older release (`MESSAGING_E2E_OLD`, `MESSAGING_E2E_OLD_MACHINES`), in a
217
+ roster realm. The directory realm against a real 0.7.1 is covered by unit tests only.
218
+ - Red-when-removed tests for the agent's own-line edit and delete, the agent's dm creation rule, and the relay's
219
+ shares-only-to-readers filter.
220
+
9
221
  ## [0.7.1] - 2026-11-09
10
222
 
11
223
  **No store change.** A 0.7.0 home and a 0.7.0 relay database open unchanged, and a 0.7.0 messagingd or relay still
@@ -67,8 +279,8 @@ opens what 0.7.1 writes. 0.7.0 was the last store reset: from 0.7.0 on, stores o
67
279
  create` / `team join`). Inbox, transcripts, grants, tasks and notices stay in the old home, which messagingd
68
280
  0.6.0 still opens; a 0.6.0 snapshot does not restore. Reset the managed relay and every home that uses it on the
69
281
  same day: the relay's directory restarts empty.
70
- - Until the first release another person uses, a store change edits the baseline, raises the generation and
71
- resets the stores again, and its release notes say so. From that release on, stores only grow.
282
+ - **0.7.0 is the first release another person uses and the last store reset** (owner, 2026-11-08).
283
+ From this release on, stores only grow through additive migrations; the baseline and generation stay fixed.
72
284
  - Stored inbox peers, task peers and provenance now use the API's `device` and `agent`, not the first shape's
73
285
  `machine` and `session`.
74
286