mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-06 11:48:24 +00:00
Three related pieces. **The pinning was approximate.** Expiry was pinned from the group's CURRENT retention at persist time, which is right for a message delivered under the current epoch and wrong for one delivered under an older one — a kind:445 held back as a retained candidate, or replayed after a restart, is decrypted under an epoch the group has since moved past. Pinning that to today's setting is precisely what the component forbids. The store now keeps a small epoch → retention history, written wherever the epoch may have advanced, and the pin reads the delivering epoch's value. The fallback to the current value is not a shrug: a group whose setting never changed has one value at every epoch, which is the overwhelmingly common case. MDK carries `source_epoch` on its rows for the same reason. **`amy` can set it.** `marmot group create --disappearing-secs N`, on both profiles: component `0x8005` for a current-profile group, and the legacy blob for `--legacy`, where asking for it bumps the version to 3 because v1/v2 deliberately omit the field to stay byte-compatible with MDK's older parser. **Interop test 26.** Nothing proved MDK accepts a GroupContext that REQUIRES `0x8005` with our bytes, and retention has the nastiest encoding in the set: eight big-endian bytes with no length prefix, unlike almost every other Marmot field, and MIP-01 spelled it differently. amy creates such a group, wn joins it, and messaging round-trips. It asserts acceptance rather than read-back, because wn's CLI `group_json` does not surface the retention value — that field is on the uniffi struct the apps consume, not this surface. Acceptance is still the encoding test: a required component whose bytes wn cannot decode leaves the group unreadable, so `groups show` returning it at all means the eight bytes parsed. The direction is one-way for the same reason as push — `wn groups` has no command that sets retention. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016kCuA6tc4JQzHPCDd39GHq