mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-06 11:48:24 +00:00
Batched Adds ------------ MDK — and therefore both White Noise clients — turns a `create_group` with N invitees into ONE Commit: N Add proposals and one Welcome carrying N `EncryptedGroupSecrets`, keyed by KeyPackage reference (RFC 9420 §12.4.3.1). We staged one Add per commit, so the same group landed at epoch N instead of epoch 1 and cost a round trip per invitee. `MlsGroup.addMembers` / `MlsGroupManager.stageAddMembers` propose-N then commit once; `MarmotManager.addMembers` publishes that single commit and fans the same Welcome bytes out to each invitee. The singular entry points delegate, so no caller changes. Scenario vectors: two shapes, one of them unread ------------------------------------------------ The conformance vectors state their expectations two ways — `expected_trace.observations` and `expected_outcomes` — and the parser only read the first. Seven of the nine vectors here use the second, so they parsed to ZERO expectations, replayed their steps and reported green without checking anything. `in_group` was also treated as a leaf, which silently skipped every step nested inside it, and `send_app_message` built a message the runner never queued for delivery. Now parsed and checked: `client_state`, `clients_converged`, `pending_resolution`, `no_pending_work`, inline `assert`/`payload_count` (the forward-secrecy and isolation assertions), `added_members`, `clear_events`, and multi-group clients. `convergence_decision` has no counterpart in our engine, so `convergence-committer-selected` is now REFUSED via `UnsupportedScenarioOutcome` rather than passed on the parts that happen to be modelled. A new guard test fails any vector that parses to nothing to check. three-client-message-exchange and conversation now replay for real. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016kCuA6tc4JQzHPCDd39GHq