hydro_std 0.16.0

Standard library of distributed systems building blocks for Hydro
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059


## v0.16.0 (2026-05-01)

<csr-id-2f38e7eddf0363f818aa4b204c7bf549c317428a/>
<csr-id-59f5216642e3f08eae896ea67cfc5b213ad86e4a/>
<csr-id-fcce19b958bbc39ccef94277ca146baafc98ce59/>
<csr-id-efaa8f61c124c4b3c691b92a58df1686751cf45c/>
<csr-id-502e26470cbc5f9c645d7907eb6addf95b5c5533/>
<csr-id-1b947b3dab7a93fcb83b732eca968c3f2b049301/>

### New Features

 - <csr-id-7fddc970b30538f2373007fab080d35444178fa5/> rename `interleave` to `merge_unordered` for symmetry with `merge_ordered`
   Added `merge_unordered` as the new primary method name on both `Stream`
   and `KeyedStream`, and updated all internal call sites and doc
   references to use it.
   
   To avoid a breaking change, the old `interleave` method is preserved as
   a deprecated forwarding wrapper on both types, marked with
   `#[deprecated(note = "use `merge_unordered` instead")]`.
   
   Files changed:
   - hydro_lang/src/live_collections/stream/mod.rs: New method + deprecated
   wrapper, updated docs/examples/tests
   - hydro_lang/src/live_collections/keyed_stream/mod.rs: New method +
   deprecated wrapper, updated docs/examples/tests
   - hydro_lang/src/live_collections/keyed_singleton.rs: Doc example
   - hydro_lang/src/location/cluster.rs: Call site
   - hydro_lang/src/location/mod.rs: Doc example
   - hydro_std/src/bench_client/mod.rs: Call site
   - hydro_test/src/external_client/http_counter.rs: Call sites
   - hydro_test/src/maelstrom/broadcast.rs: Call sites
   - hydro_test/src/cluster/paxos.rs: Call sites
   
   Closes hydro-project/hydro#2392.
 - <csr-id-fad81f0f79bac3d7524165df515fd746af148bfb/> allow passing runtime environment variables and use for benchmarking
   Binaries no longer need to be recompiled & uploaded when the number of
   virtual clients change. Should greatly reduce testing time.
 - <csr-id-08cb0ed12b213bc9a6ef449095cb89a69adc84ab/> add `manual_proof!` macro that accepts doc comments
 - <csr-id-1866677da0a5b71e48d7b1cdf9442ee66d0f1e23/> improve quality of error spans in `sliced!` macro
 - <csr-id-0b31dbbb079f4c4a3dd6445a4ac92af98aaab6f9/> introduce `Weaker{Ordering/Retries}Than` to simplify stream weakening
   Previously, the `weaken_*` APIs required an asymmetric `MinX` trait
   implementation, which would cause trouble when trying to weaken the
   `Other` stream to the same weaker guarantee. We introduce a
   `WeakerXThan` pair of traits which are implemented in both directions
   automatically if there is a `MinX` implementation in one direction,
   which allows weakening all streams explicitly to `MinX::Min`.
 - <csr-id-708e835452958120edce77cd693bd8fb1cb6c48c/> make network channels configurable with a generic `Stream::send` API
   This eliminates the hardcoding of networking APIs to specific
   serialzation formats, transport protocols, etc. Includes similar
   refactors across `demux` / `round_robin` / etc APIs.
 - <csr-id-b69438cc963f26a8109b227b2755ab9ba1817d51/> port `request_response` to use `sliced!` and add simulation tests
 - <csr-id-853db69e4487ae9c097fe838f05e9447c736ec98/> add `use::state` syntax for stateful `sliced!`
 - <csr-id-3f65882e04633cb92a2e6ac52edff81a26b35320/> add tagless member ids, add docker member id

### Bug Fixes

 - <csr-id-f104f2b3d4f78ccd05465d2af69b1be34d5ea7a5/> Virtual clients off-by-one error
   We created 1 more virtual client than specified.
 - <csr-id-661c72a402d0a9f102e73772e6cc377ae92c73fc/> bench_client realistic latency measurements
   Replaced `SystemTime` (which is NOT monotonic) with `Instant`. Expect
   reported latency for Paxos to 10x at 1 physical & virtual client (from
   0.07ms to 0.7ms).
 - <csr-id-117d617a76ef11a88df1c069bc2edac0067c080c/> Latency calculation fix
   The implementation works by subtracting start time from end time for
   each payload. The start time is measured whenever a new payload with the
   same key is created, which is effectively the moment the previous output
   is received. This overwrites the actual start time of the previous
   payload and results in unnaturally small latencies.

### Refactor

 - <csr-id-2f38e7eddf0363f818aa4b204c7bf549c317428a/> Generalize bench_client
   Previous behavior:
   - `bench_client` generates virtual client IDs. Payloads are assigned to
   each ID via `workload_generator`, then fed to the protocol via
   `transaction_cycle`. Both `workload_generator` and `transaction_cycle`
   are lambdas passed into `bench_client`.
   - This fixes the input/output streams of the protocol so it can only
   have 1 input and 1 output. Not ideal if
   - Multiple input streams types are more ergonomic. For example, a Put
   and a Get stream
   - Latencies aren't necessary bound by 1 round trip. For example, a lock
   request's latency may be the total of "acquire (success) + release" or
   "acquire (fail) + retry + release"
     - Multiple output streams that should get their own graphs
   
   New behavior:
   - `bench_client` outputs per-payload latency with the output payload
   attached, so the benchmark can choose to graph partition outputs onto
   separate graphs based on request type
   - Latency can be fed into `compute_throughput_latency` to generate part
   of the latency histogram and batched throughput numbers (`BenchResult`).
   - The protocol's benchmark client has flexibility on when to calculate
   latency (and any other metric), and which aggregator to feed the results
   to.
   - `BenchResult` is fed to `print_bench_results` so the aggregator prints
   throughput/latency once per second.
   
   ## Note
   `bench_client` contains an unused variable in `sliced!` because `sliced`
   requires at least 1 `use` statement. The error is currently suppressed
   but the requirement should probably be removed from `sliced`?
 - <csr-id-59f5216642e3f08eae896ea67cfc5b213ad86e4a/> port `bench_client` to use sliced!, introduce `Stream::merge_ordered`
   This also fixes a bug where the throughput reset timer would cause a
   batch of payloads to be not counted in the throughput.
   
   We add support for tick-cycles / `use::state` to `Optional` and
   `KeyedSingleton` to support this code more cleanly.
   
   To further simplify the code, we add `merge_ordered` to combine two
   streams while preserving order. This makes it possible to implement
   throughput windowing without slices.
 - <csr-id-fcce19b958bbc39ccef94277ca146baafc98ce59/> port quorum to use `sliced!`

## Note
   `bench_client` contains an unused variable in `sliced!` because `sliced`
   requires at least 1 `use` statement. The error is currently suppressed
   but the requirement should probably be removed from `sliced`?
 - <csr-id-59f5216642e3f08eae896ea67cfc5b213ad86e4a/> port `bench_client` to use sliced!, introduce `Stream::merge_ordered`
   This also fixes a bug where the throughput reset timer would cause a
   batch of payloads to be not counted in the throughput.
   
   We add support for tick-cycles / `use::state` to `Optional` and
   `KeyedSingleton` to support this code more cleanly.
   
   To further simplify the code, we add `merge_ordered` to combine two
   streams while preserving order. This makes it possible to implement
   throughput windowing without slices.
 - <csr-id-fcce19b958bbc39ccef94277ca146baafc98ce59/> port quorum to use `sliced!`

## Note
   `bench_client` contains an unused variable in `sliced!` because `sliced`
   requires at least 1 `use` statement. The error is currently suppressed
   but the requirement should probably be removed from `sliced`?
 - <csr-id-59f5216642e3f08eae896ea67cfc5b213ad86e4a/> port `bench_client` to use sliced!, introduce `Stream::merge_ordered`
   This also fixes a bug where the throughput reset timer would cause a
   batch of payloads to be not counted in the throughput.
   
   We add support for tick-cycles / `use::state` to `Optional` and
   `KeyedSingleton` to support this code more cleanly.
   
   To further simplify the code, we add `merge_ordered` to combine two
   streams while preserving order. This makes it possible to implement
   throughput windowing without slices.
 - <csr-id-fcce19b958bbc39ccef94277ca146baafc98ce59/> port quorum to use `sliced!`

### Chore (BREAKING)

 - <csr-id-efaa8f61c124c4b3c691b92a58df1686751cf45c/> update pinned rust to 1.92, add lints/fixes for redundant cloning, string handling
   Somewhat waiting on https://github.com/hydro-project/stageleft/pull/56
   to be published

### New Features (BREAKING)

 - <csr-id-0a8ae174c0752eca16e13ca5ac9d40d4ae3ebd37/> refactor atomic() to generate tick IDs internally with union-find unification
   Breaking Change: Previously, `.atomic(&tick)` required passing an
   existing `Tick` reference. Now `.atomic()` takes no arguments and
   internally generates a fresh `ClockId`. When performing `batch_atomic`
   or `snapshot_atomic`, you must pass in a `Tick` where the output will be emitted.
   
   Before emitting DFIR, a union-find pass traverses the IR to unify tick
   IDs connected through `Batch` and `YieldConcat` nodes at atomic
   boundaries, then rewrites all `LocationId`s to use the representative
   tick ID.
   
   Key changes:
   
   1. **atomic() signatures** (Stream, Singleton, Optional, KeyedSingleton,
   KeyedStream): Removed `tick: &Tick<L>` parameter; each now calls
   `self.location.flow_state().borrow_mut().next_clock_id()` to generate a
   fresh tick internally.
   
   2. **Union-find pass** (`unify_atomic_ticks` in compile/ir/mod.rs):
   - Pass 1: traverses IR bottom-up, unifying tick IDs on both sides of
   `Batch` and `YieldConcat` nodes where both sides have ticks.
   - Pass 2: rewrites all `LocationId`s to use the representative tick ID.
   Called from both `ir::emit()` and `sim::flow` before DFIR generation.
   
   3. **Sliced macro** (sliced/style.rs): Removed `assert_eq!(tick.id(),
   ...)` assertions from all atomic `Slicable::slice()` impls since tick
   unification now handles matching.
   
   4. **Call site updates**: All `.atomic(&tick)` calls updated to
   `.atomic()`. Unused tick variables removed where they were only used for
   atomic().
   
   5. **Documentation updates**: Updated doc comments on `Atomic` struct,
   atomicity.mdx reference docs, single-counter.mdx quickstart, and
   slices-atomicity index. Removed references to `atomic(&tick)` pattern.
   
   6. **Compile-fail tests**: Updated source and regenerated stderr for
   `sliced_missing_arg` test (both nightly and stable variants).
 - <csr-id-e91d1584f29d04cf4778c911127f80bb53059ff8/> Refactor filter_is_some/none to filter_is_true/false, added boolean support operators (equals, and, or)
   Breaking Changes: All references to `filter_is_some` and
   `filter_is_none` replaced with `filter_if`. Use negation `!` to flip a
   singleton from true to false & vice versa.
 - <csr-id-4d628dc323c14a8ca08cc68ef782da515dc64150/> implement support for clusters and cluster networking in embedded mode
   Breaking Change: cluster networking APIs in `Deploy` trait now take the
   `InstantiateEnv`, and `cluster_membership_stream` takes the location
   where the stream is being materialized. Also eliminates `D: Deploy` type
   parameter for IR emit logic.
 - <csr-id-83a1221e04be1aad10679ae41ae041a247db44bb/> require explicit failure policy for TCP channels
   Currently, we only offer `fail_stop` as a policy, which was the implicit
   default TCP guarantees thus far.
 - <csr-id-3f8e1c7c91037f98971989d5e0f2c65b65326ddb/> bench_client time series
   Instead of outputting throughput and latency aggregated across time
   (which hides any blips in throughput/latency), output metrics based that
   only contain data for that time interval.
 - <csr-id-30167649b29b1c199a14daabc796950d1a588297/> Join consistent naming
   Create operations to `join` and `lookup` between Stream, KeyedSingleton,
   and KeyedStream, and rename confusing operations.
   
   - `get_many`: Now `join_keyed_singleton`
   - `get_many_if_present`: Now `join_keyed_stream`
   - `get_from`: Now `lookup_keyed_singleton` (and also
   `lookup_keyed_stream`)
 - <csr-id-d8ebb19948c65e13276539a3e6b99041407b64e9/> unify remaining stream / keyed stream APIs using properties
   Breaking Changes:
   - All `_commutative` and `_idempotent` APIs have been removed. You
   should now directly use `.fold` or `.reduce ` with property annotations
   - All deprecated `fold_keyed` / `reduce_keyed` APIs have been removed
 - <csr-id-101c7c70c3381d181241ce7c648e4f70e12f589b/> unify `fold` API by using Stageleft properties to track commutativity and idempotence
   With support for property annotations in Stageleft, we can now eliminate
   the `_commutative` and `_idempotent` variations of `fold` and instead
   require a `commutative = ...` or `idempotent = ...` annotation next to
   the UDF. This also paves the path for configurable verification methods
   such as Kani.

### Refactor (BREAKING)

 - <csr-id-502e26470cbc5f9c645d7907eb6addf95b5c5533/> Refactor client_aggregator so printing is a separate function
   Preparing for a custom throughput/latency printer in hydro_optimize so I
   can parse the results
 - <csr-id-1b947b3dab7a93fcb83b732eca968c3f2b049301/> convert locations (Cluster/Process/External) to use slotmaps, new key type
   This improves code quality by ensuring `LocationKey` types are
   explicitly locations intead of magic `usize` fields.

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 28 commits contributed to the release.
 - 156 days passed between releases.
 - 26 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 26 unique issues were worked on: [#2330](https://github.com/hydro-project/hydro/issues/2330), [#2373](https://github.com/hydro-project/hydro/issues/2373), [#2379](https://github.com/hydro-project/hydro/issues/2379), [#2381](https://github.com/hydro-project/hydro/issues/2381), [#2394](https://github.com/hydro-project/hydro/issues/2394), [#2400](https://github.com/hydro-project/hydro/issues/2400), [#2405](https://github.com/hydro-project/hydro/issues/2405), [#2412](https://github.com/hydro-project/hydro/issues/2412), [#2435](https://github.com/hydro-project/hydro/issues/2435), [#2465](https://github.com/hydro-project/hydro/issues/2465), [#2492](https://github.com/hydro-project/hydro/issues/2492), [#2508](https://github.com/hydro-project/hydro/issues/2508), [#2522](https://github.com/hydro-project/hydro/issues/2522), [#2525](https://github.com/hydro-project/hydro/issues/2525), [#2531](https://github.com/hydro-project/hydro/issues/2531), [#2550](https://github.com/hydro-project/hydro/issues/2550), [#2554](https://github.com/hydro-project/hydro/issues/2554), [#2558](https://github.com/hydro-project/hydro/issues/2558), [#2578](https://github.com/hydro-project/hydro/issues/2578), [#2607](https://github.com/hydro-project/hydro/issues/2607), [#2614](https://github.com/hydro-project/hydro/issues/2614), [#2619](https://github.com/hydro-project/hydro/issues/2619), [#2626](https://github.com/hydro-project/hydro/issues/2626), [#2669](https://github.com/hydro-project/hydro/issues/2669), [#2692](https://github.com/hydro-project/hydro/issues/2692), [#2700](https://github.com/hydro-project/hydro/issues/2700)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#2330](https://github.com/hydro-project/hydro/issues/2330)**
    - Add tagless member ids, add docker member id ([`3f65882`](https://github.com/hydro-project/hydro/commit/3f65882e04633cb92a2e6ac52edff81a26b35320))
 * **[#2373](https://github.com/hydro-project/hydro/issues/2373)**
    - Add `use::state` syntax for stateful `sliced!` ([`853db69`](https://github.com/hydro-project/hydro/commit/853db69e4487ae9c097fe838f05e9447c736ec98))
 * **[#2379](https://github.com/hydro-project/hydro/issues/2379)**
    - Port `request_response` to use `sliced!` and add simulation tests ([`b69438c`](https://github.com/hydro-project/hydro/commit/b69438cc963f26a8109b227b2755ab9ba1817d51))
 * **[#2381](https://github.com/hydro-project/hydro/issues/2381)**
    - Port quorum to use `sliced!` ([`fcce19b`](https://github.com/hydro-project/hydro/commit/fcce19b958bbc39ccef94277ca146baafc98ce59))
 * **[#2394](https://github.com/hydro-project/hydro/issues/2394)**
    - Port `bench_client` to use sliced!, introduce `Stream::merge_ordered` ([`59f5216`](https://github.com/hydro-project/hydro/commit/59f5216642e3f08eae896ea67cfc5b213ad86e4a))
 * **[#2400](https://github.com/hydro-project/hydro/issues/2400)**
    - Make network channels configurable with a generic `Stream::send` API ([`708e835`](https://github.com/hydro-project/hydro/commit/708e835452958120edce77cd693bd8fb1cb6c48c))
 * **[#2405](https://github.com/hydro-project/hydro/issues/2405)**
    - Unify `fold` API by using Stageleft properties to track commutativity and idempotence ([`101c7c7`](https://github.com/hydro-project/hydro/commit/101c7c70c3381d181241ce7c648e4f70e12f589b))
 * **[#2412](https://github.com/hydro-project/hydro/issues/2412)**
    - Unify remaining stream / keyed stream APIs using properties ([`d8ebb19`](https://github.com/hydro-project/hydro/commit/d8ebb19948c65e13276539a3e6b99041407b64e9))
 * **[#2435](https://github.com/hydro-project/hydro/issues/2435)**
    - Generalize bench_client ([`2f38e7e`](https://github.com/hydro-project/hydro/commit/2f38e7eddf0363f818aa4b204c7bf549c317428a))
 * **[#2465](https://github.com/hydro-project/hydro/issues/2465)**
    - Convert locations (Cluster/Process/External) to use slotmaps, new key type ([`1b947b3`](https://github.com/hydro-project/hydro/commit/1b947b3dab7a93fcb83b732eca968c3f2b049301))
 * **[#2492](https://github.com/hydro-project/hydro/issues/2492)**
    - Join consistent naming ([`3016764`](https://github.com/hydro-project/hydro/commit/30167649b29b1c199a14daabc796950d1a588297))
 * **[#2508](https://github.com/hydro-project/hydro/issues/2508)**
    - Introduce `Weaker{Ordering/Retries}Than` to simplify stream weakening ([`0b31dbb`](https://github.com/hydro-project/hydro/commit/0b31dbbb079f4c4a3dd6445a4ac92af98aaab6f9))
 * **[#2522](https://github.com/hydro-project/hydro/issues/2522)**
    - Refactor client_aggregator so printing is a separate function ([`502e264`](https://github.com/hydro-project/hydro/commit/502e26470cbc5f9c645d7907eb6addf95b5c5533))
 * **[#2525](https://github.com/hydro-project/hydro/issues/2525)**
    - Update pinned rust to 1.92, add lints/fixes for redundant cloning, string handling ([`efaa8f6`](https://github.com/hydro-project/hydro/commit/efaa8f61c124c4b3c691b92a58df1686751cf45c))
 * **[#2531](https://github.com/hydro-project/hydro/issues/2531)**
    - Improve quality of error spans in `sliced!` macro ([`1866677`](https://github.com/hydro-project/hydro/commit/1866677da0a5b71e48d7b1cdf9442ee66d0f1e23))
 * **[#2550](https://github.com/hydro-project/hydro/issues/2550)**
    - Require explicit failure policy for TCP channels ([`83a1221`](https://github.com/hydro-project/hydro/commit/83a1221e04be1aad10679ae41ae041a247db44bb))
 * **[#2554](https://github.com/hydro-project/hydro/issues/2554)**
    - Bench_client time series ([`3f8e1c7`](https://github.com/hydro-project/hydro/commit/3f8e1c7c91037f98971989d5e0f2c65b65326ddb))
 * **[#2558](https://github.com/hydro-project/hydro/issues/2558)**
    - Latency calculation fix ([`117d617`](https://github.com/hydro-project/hydro/commit/117d617a76ef11a88df1c069bc2edac0067c080c))
 * **[#2578](https://github.com/hydro-project/hydro/issues/2578)**
    - Implement support for clusters and cluster networking in embedded mode ([`4d628dc`](https://github.com/hydro-project/hydro/commit/4d628dc323c14a8ca08cc68ef782da515dc64150))
 * **[#2607](https://github.com/hydro-project/hydro/issues/2607)**
    - Add `manual_proof!` macro that accepts doc comments ([`08cb0ed`](https://github.com/hydro-project/hydro/commit/08cb0ed12b213bc9a6ef449095cb89a69adc84ab))
 * **[#2614](https://github.com/hydro-project/hydro/issues/2614)**
    - Allow passing runtime environment variables and use for benchmarking ([`fad81f0`](https://github.com/hydro-project/hydro/commit/fad81f0f79bac3d7524165df515fd746af148bfb))
 * **[#2619](https://github.com/hydro-project/hydro/issues/2619)**
    - Refactor filter_is_some/none to filter_is_true/false, added boolean support operators (equals, and, or) ([`e91d158`](https://github.com/hydro-project/hydro/commit/e91d1584f29d04cf4778c911127f80bb53059ff8))
 * **[#2626](https://github.com/hydro-project/hydro/issues/2626)**
    - Bench_client realistic latency measurements ([`661c72a`](https://github.com/hydro-project/hydro/commit/661c72a402d0a9f102e73772e6cc377ae92c73fc))
 * **[#2669](https://github.com/hydro-project/hydro/issues/2669)**
    - Rename `interleave` to `merge_unordered` for symmetry with `merge_ordered` ([`7fddc97`](https://github.com/hydro-project/hydro/commit/7fddc970b30538f2373007fab080d35444178fa5))
 * **[#2692](https://github.com/hydro-project/hydro/issues/2692)**
    - Refactor atomic() to generate tick IDs internally with union-find unification ([`0a8ae17`](https://github.com/hydro-project/hydro/commit/0a8ae174c0752eca16e13ca5ac9d40d4ae3ebd37))
 * **[#2700](https://github.com/hydro-project/hydro/issues/2700)**
    - Virtual clients off-by-one error ([`f104f2b`](https://github.com/hydro-project/hydro/commit/f104f2b3d4f78ccd05465d2af69b1be34d5ea7a5))
 * **Uncategorized**
    - Release dfir_pipes v0.0.1, example_test v0.0.1, sinktools v0.1.0, hydro_deploy_integration v0.16.0, lattices_macro v0.6.0, variadics_macro v0.7.0, lattices v0.7.0, multiplatform_test v0.7.0, dfir_rs v0.16.0, copy_span v0.1.1, hydro_deploy v0.16.0, hydro_lang v0.16.0, hydro_std v0.16.0 ([`118b356`](https://github.com/hydro-project/hydro/commit/118b356447d92e778313d72a351e5a8d2814aa1a))
    - Release hydro_build_utils v0.1.0, dfir_lang v0.16.0, dfir_macro v0.16.0, variadics v0.1.0, dfir_pipes v0.0.1, example_test v0.0.1, sinktools v0.1.0, hydro_deploy_integration v0.16.0, lattices_macro v0.6.0, variadics_macro v0.7.0, lattices v0.7.0, multiplatform_test v0.7.0, dfir_rs v0.16.0, copy_span v0.1.1, hydro_deploy v0.16.0, hydro_lang v0.16.0, hydro_std v0.16.0, safety bump 13 crates ([`c20757a`](https://github.com/hydro-project/hydro/commit/c20757ae0e9e10463b2a499de4b7d37ab02269d0))
</details>

## v0.15.0 (2025-11-25)

<csr-id-0be5729dd87a91a70001f88283b380d3da8df7d0/>
<csr-id-057192afde1373caedbbfc24516c28a96d12928c/>
<csr-id-2e2cd770fd18cd219ec1acdd2c74d46a5ee1b2de/>
<csr-id-1fc751515d5fd4b6ec07fec8e83b4aff70b3acca/>
<csr-id-b256cba932a8d6d7a6be7b1c98c2f8c20b299375/>
<csr-id-fa4e9d9914ed52aa5a7237c32a0dc57d713ec14a/>
<csr-id-a4d8af603e6ad14659d1d43ca168495c883a58eb/>
<csr-id-537309f9aac44498aa617c8517fdbc21616cbebf/>
<csr-id-5f8a4da212eba8b673f9c7a464c9e92d7c0602cd/>
<csr-id-4bf1c05583c838e7e4d183382fd72743402f889d/>
<csr-id-05145bf191bf0fcc794d282c3b18c0bd378a20ac/>
<csr-id-4925e2c77a8e57d45d200c98a31859571a04d150/>
<csr-id-628c1c870f1833dd05b3f57ee3e2e1235183cecb/>
<csr-id-1c26bc7899f29cb5b75446381ac5545f7ce017d8/>
<csr-id-381be86c8729403d60575bbd7297b852b6b09ec0/>
<csr-id-804f9955dfc9ea64cb0f5177bcda5b9347fafe80/>
<csr-id-1a344a98fce99d004e0ba86a67c7509d807c37bb/>

### Documentation

 - <csr-id-3fd84aa8812fa027db293727d8e304708db66916/> new template and walkthrough

### New Features

 - <csr-id-98b899baa342617bc8634220324849b1067f6233/> add cluster-membership ir node
 - <csr-id-194280baf21d554e2deb3c225ed9fdad197c3db2/> introduce `sliced!` syntax for processing with anonymous ticks
 - <csr-id-1fbd6e05d782388aa3542023b685172e6275baf8/> replay failed simulation instances and show logs
   Previously, a failed simulation would only show the backtrace, and would
   have to be re-run with `HYDRO_SIM_LOG=1` to display the simulation
   steps. This would result in lots of log pollution since logging would
   also be enabled for passing instances.
   
   Now, we've made some tweaks to bolero so that it re-executes the test
   after finding a failing input, passing an `is_replay` flag. We use this
   to enable rich logging, so that the failure is displayed with all the
   simulation steps that led to it.
 - <csr-id-a4bdf399f90581f409c89a72ae960405998fb33b/> add APIs for unordered stream assertions and tests for `collect_quorum`
   AI Disclosure: all the tests were generated using Kiro (!)
   
   Currently, the core functionality test has to be split up into several
   exhaustive units because otherwise the search space becomes too large
   for CI (~400s). Eventually, keyed streams may help but splitting up the
   test is a reasonable short-term fix.
 - <csr-id-224b2db7dc7e7c5cbd4c6ce024e0410957ce6747/> deterministic simulator for Hydro programs
   This introduces a deterministic simulator for Hydro that can simulate
   various asynchronous scenarios to identify bugs in code that use
   non-deterministic operators, such as `batch`. This PR focuses on just
   the infrastructure and support for simulating `batch` on a
   totally-ordered, exactly-once stream. Support for additional
   non-deterministic operators will follow in separate PRs (currently, an
   exception is thrown to prevent use of the simulator on programs that use
   such operators).
   
   The simulator's job is to explore the space of potential asynchronous
   executions. Because "top-level" operators guarantee "eventual
   determinism" (per Flo), we do not need to simulate every possible
   interleaving of message arrivals and processing. Instead, we only need
   to simulate sources of non-determinism at the points in the program
   where a user intentionally observes them (such as `batch` or
   `assume_ordering`).
   
   When compiling a Hydro program for the simulator, we emit several DFIR
   programs. One of these is the `async_dfir`, which contains all
   asynchronously executed top-level operators in the Hydro program. Again,
   thanks to Flo semantics, we do not need to simulate the behavior of
   executing these operators on different prefixes of the input, since we
   know that none of the downstream operators change their behavior based
   on the provided prefix (this is somewhat more complicated for unbounded
   singletons, whose intermediate states are affected by the set of
   elements processed in each batch, but we will address this separately).
   
   Because each tick relies on a set of decisions being made to select
   their inputs (`batch`, `snapshot`), we emit each tick's code into a
   separate DFIR graph. The top-level simulator then schedules
   (`LaunchedSim::scheduler`) the async graph and tick graphs by always
   trying to make progress with the async graph first (so that we have the
   full set of possible inputs at each batch boundary), and when the async
   graph cannot make any further progress it selects one of the ticks,
   makes a batching decision for each of its inputs
   (`autonomous_decision`), and then executes the tick.
   
   The selection of which tick to run and which elements to release in each
   batch are driven by a source of non-determinism, which is either:
   a) libfuzzer (if using `.sim().fuzz` and running with `cargo sim`)
   b) a RNG with 8192 iterations (if using `.sim().fuzz` and running with
   `cargo test` and no reproducer is available)
   c) a static input of decisions (if using `.sim().fuzz` and running with
   `cargo test` and a reproducer is available)
   d) an exhaustive, depth-first search algorithm (if using
   `.sim().exhaustive` and running with `cargo test`)
   
   Whenever a fuzzer finds a failure, it stores the sequence of decisions
   that leads to the crash in a `.bin` file as a reproducer, so that we can
   re-execute quickly in testing environments.
   
   Because Hydro uses a staged compilation model, our approach to compiling
   and executing the Hydro program is also a bit unique. Because the fuzzer
   needs to track branch coverage inside the Hydro program to be effective,
   and because we need low-latency interactions between the user assertions
   and the Hydro code, we cannot run the compiled program in a separate
   process. Instead, we compile the Hydro code into a _shared library_ and
   dynamically load it into the host process (which has the testing code).
   The shared library only provides the compiled DFIR graphs, so the
   simulator scheduler runs in the host process to enable low-latency
   switching between the DFIR and testing code.
   
   This PR includes a couple of toy examples testing the simulator's
   functionality. Of particular interest is
   `sim_crash_with_fuzzed_batching`, which takes forever with an exhaustive
   search but quickly finds a failure case with a fuzzer.
 - <csr-id-b412fa0af43d011c527eaa21d2343d57e1c941c2/> Generalize bench_client's workload generation
   Allow custom functions for generating bench_client workloads (beyond
   u32,u32).
 - <csr-id-920d9a394223a218ccbc077de61e2135886a2b15/> add keyed singletons and optionals to eliminate unsafety in membership tracking

### Bug Fixes

 - <csr-id-1c139772baa20d5c9aa8ab060cc6650d6f239ca0/> Staggered client
   Client initially outputs 1 message per tick instead of all messages in 1
   giant batch, so if downstream operators do not dynamically adjust the
   batch size, they are not overwhelmed
 - <csr-id-f9e595559b3dd9641ed6f413c2a729047ebf353e/> Client aggregator waits for all clients before outputting
   Outputs N/A as throughput and latency until all clients have responded
   with positive throughput.
 - <csr-id-c40876ec4bd3b31254d683e479b9a235f3d11f67/> refactor github actions workflows, make stable the default toolchain
 - <csr-id-ab22c44aaabf2140315ba26104d9155e357a34ac/> remove strange use of batching in bench_client

### Refactor

 - <csr-id-0be5729dd87a91a70001f88283b380d3da8df7d0/> reduce syntactic overhead of connecting test inputs / outputs
   Rather than having separate `source` / `sink` / `bytes` / `bincode`
   APIs, we use a single `connect` method that uses a trait to resolve the
   appropriate connection result.
 - <csr-id-057192afde1373caedbbfc24516c28a96d12928c/> reduce atomic pollution in quorum counting
   Also fixes a sync bug in Compartmentalized Paxos. Due to batching
   semantics, we could end up in a situation where responses have missing
   metadata (for example if the batch refuses to release any elements).
   
   The simulator would hopefully have caught this, we can use this as an
   example.
 - <csr-id-2e2cd770fd18cd219ec1acdd2c74d46a5ee1b2de/> remove uses of legacy `*_keyed` APIs
   Also adds missing doctests to the aggregation APIs on `KeyedStream`.

### Test

 - <csr-id-1fc751515d5fd4b6ec07fec8e83b4aff70b3acca/> add test for collecting unordered quorum

### Documentation (BREAKING)

 - <csr-id-1af3a666b1d0787f0c023411b7f88ad3f8da5423/> add docs for `for_each` / `dest_sink`, restrict to strict streams
   Breaking Change: `for_each` / `dest_sink` now require a totally-ordered,
   retry-free stream since the downstream may not tolerate such
   non-determinism. This helps highlight cases where the developer needs to
   reason carefully about the safety of their side effects.

### New Features (BREAKING)

 - <csr-id-6b1d66aa61056ffb4dd2896e98288489e64d654f/> add specialized `sim_input` / `sim_output` to reduce simulation boilerplate
 - <csr-id-5579acd1c7101a3f14c49236e1933398de0f0958/> cluster member ids are now clone instead of copy
   This is part one of a series of changes. The first part just changes
   MemberIds from being Copy to Clone, so that they can later support more
   use cases.
 - <csr-id-a15797058950245d9eb762d885d35e5326bcf8b3/> restrict `KeyedSingleton` to not allow asynchronous key removal
   Previously, `KeyedSingleton` supported `filter` on unbounded collections
   and `latest` to yield snapshots from a tick. Both of these APIs are
   problematic because they let developers asynchronously remove elements
   from the collection, which goes against the "Singleton" naming. We have
   reasonable alternatives for all these use-sites, so remove for now to
   minimize the semantic complexity (also for the simulator).
   
   Eventually, we will want to bring back `KeyedOptional` which permits
   such asynchronous removal.
 - <csr-id-e535156ceb7e83550b68a6ae6b5e925f57f1882f/> add `Ordering` and `Retries` traits with basic axioms
   Reduces the need to use `nondet!` inside broadcast APIs, and also
   prepares us for graph viz metadata by requiring these traits to be
   implemented for the type parameters in `Stream` / `KeyedStream`.
 - <csr-id-eadd7d0cfcbdc312bf336b8aec961f6d421c6551/> refine types when values of a `KeyedSingleton` are immutable
   There are many cases where once a value is released into a
   `KeyedSingleton`, it will never be changes. In such cases, we can permit
   APIs like `.entries` even if the set of entries is growing.
   
   We use this type to improve the API surface for looking up values for a
   request. Now, a `KeyedSingleton` of requests can look up values from
   another `KeyedSingleton`.

### Bug Fixes (BREAKING)

 - <csr-id-21ce30cdd04a25bf4a67e00ec16e592183748bf4/> fix cardinality for `Optional::or`
   Using `HydroNode::Chain` is very dangerous for singletons / optionals,
   because it can lead to cardinality > 1 within a single batch, which
   breaks a fundamental invariant.
   
   This introduces a new `HydroNode::ChainFirst` operator that only emits
   the first value from the chain. This is paired with a new DFIR operator
   `chain_first` for this behavior.
   
   We also rewrite some `Singleton` logic to use `Optional` under the hood,
   which reduces the places where we deal with chaining in the IR,
   hopefully avoiding future incidents.

### Refactor (BREAKING)

 - <csr-id-b256cba932a8d6d7a6be7b1c98c2f8c20b299375/> don't return results from `SimSender::send`
   Also makes the `assert_*` APIs on `SimReceiver` more general to support
   asymmetric `PartialEq`
 - <csr-id-fa4e9d9914ed52aa5a7237c32a0dc57d713ec14a/> allow `sim` feature without `deploy` feature
   Also removes leftover prototype "properties" code.
 - <csr-id-a4d8af603e6ad14659d1d43ca168495c883a58eb/> migrate Hydro IR to have Flo semantics at all levels
   Previously, the Hydro -> Hydro IR layer did a bunch of work to translate
   between Flo semantics and DFIR semantics, so that Hydro IR -> DFIR was
   generally 1:1. In preparation for the simulator and DFIR's migration to
   Flo semantics, we now use Flo semantics in the Hydro IR (top level
   operators do not reset their state on batch boundaries), and shift the
   Flo -> DFIR semantics translation to the IR -> DFIR layer.
   
   This also comes with a breaking API change to clean up naming and avoid
   function overloading. In particular, `batch` / `snapshot` are renamed to
   `batch_atomic` and `snapshot_atomic` for the case where the batched
   result is supposed to be in-sync with the atomic execution context.
   
   There were a couple of bugs during the transition to the new IR
   semantics that were not caught by existing unit tests, so I added
   additional tests that cover each of them.
   
   Also makes some minor improvements / bug fixes the way:
   - Restricts `KeyedSingleton::snapshot` to unbounded-value only, since
   bounded value keyed singletons do not replay their elements
   - Groups together definitions for `resolve_futures` and
   `resolve_futures_ordered`
   - Removes various unnecessary `NoAtomic` trait bounds
 - <csr-id-537309f9aac44498aa617c8517fdbc21616cbebf/> rename `continue_if*` to `filter_if*` and document
   Eventually, we will want to change these APIs to take a "Condition" live
   collection instead of an optional, but this at least improves the naming
   for now.
 - <csr-id-5f8a4da212eba8b673f9c7a464c9e92d7c0602cd/> clean up API for cycles / forward references, document
   Ongoing quest to reduce the public API surface. Moves the `DeferTick` IR
   node to be at the root of the output side of the cycle, rather than
   inserted at the sink.
 - <csr-id-4bf1c05583c838e7e4d183382fd72743402f889d/> move `boundedness` module under `live_collections`
   Type tags for boundedness are only used in the type parameters for live
   collections.
 - <csr-id-05145bf191bf0fcc794d282c3b18c0bd378a20ac/> set up prelude, move collections under `live_collections` module
   Bigger refactor to clean up the top-level namespace for `hydro_lang`.
   First, we move all the definitions for different live collections into
   the `live_collections` module.
   
   We also rename the `unsafety` module to `nondet`.
   
   Then, instead of having a bunch of types exported directly from
   `hydro_lang`, we instead create a `prelude` module that exports them.
   This reduces the pollution of the namespace when importing from
   `hydro_lang`.
 - <csr-id-4925e2c77a8e57d45d200c98a31859571a04d150/> reduce namespace pollution
 - <csr-id-628c1c870f1833dd05b3f57ee3e2e1235183cecb/> rename `ClusterId` to `MemberId`
   Will allow us to use this for external clients as well.
 - <csr-id-1c26bc7899f29cb5b75446381ac5545f7ce017d8/> adjust cluster membership APIs to allow dynamic clusters
 - <csr-id-381be86c8729403d60575bbd7297b852b6b09ec0/> remove `KeyedOptional`
   Keyed optionals don't make sense to distinguish from keyed singleton,
   since a null optional is equivalent to the key not being present at all.
   So we can capture all cases with just a keyed singleton.
   
   Eventually... we may want to re-distinguish these if we have keys with a
   null value. But right now we don't need that so avoid unnecessary code.
 - <csr-id-804f9955dfc9ea64cb0f5177bcda5b9347fafe80/> nondet instead of unsafe, snapshot instead of latest_tick, batch instead of tick_batch
   Pulled together into one big PR to avoid conflicts, this makes three
   significant changes to the core Hydro APIs. No semantic changes, only
   syntax and naming.
   
   1. Instead of non-deterministic functions being marked with the `unsafe`
   keyword, which conflates non-determinism with memory unsafety, we now
   pass around "non-determinism guards" that act as tokens forcing
   developers to be aware of the non-determinism. With the VSCode Highlight
   extension, we preserve highlighting of these instances.
   2. We unify naming for "collection-like" types (Stream, KeyedStream) to
   use `.batch` to batch elements
   3. We unify naming for "floating-value-like" types (Singleton, Optional,
   KeyedSingleton, KeyedOptional) to use `.snapshot` to grab an instance of
   the value (or its contents)
 - <csr-id-1a344a98fce99d004e0ba86a67c7509d807c37bb/> simplify networking APIs according to Process/Cluster types
   Breaking change: when sending to a cluster, you must use
   `demux_bincode`. The `*_anonymous` APIs have been removed in favor of
   the `.values()` API on keyed streams. This also eliminates the
   `send_bytes` APIs, in favor of the bidirectional external client APIs.
   
   This refactors the networking APIs to rely less on complex traits and
   instead use `Process` and `Cluster` types to determine the input /
   output type restrictions. We also now emit `KeyedStream` whenever the
   sender is a `Cluster`.

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 39 commits contributed to the release.
 - 117 days passed between releases.
 - 36 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 36 unique issues were worked on: [#1970](https://github.com/hydro-project/hydro/issues/1970), [#1975](https://github.com/hydro-project/hydro/issues/1975), [#1983](https://github.com/hydro-project/hydro/issues/1983), [#1984](https://github.com/hydro-project/hydro/issues/1984), [#1990](https://github.com/hydro-project/hydro/issues/1990), [#1995](https://github.com/hydro-project/hydro/issues/1995), [#2011](https://github.com/hydro-project/hydro/issues/2011), [#2016](https://github.com/hydro-project/hydro/issues/2016), [#2028](https://github.com/hydro-project/hydro/issues/2028), [#2032](https://github.com/hydro-project/hydro/issues/2032), [#2033](https://github.com/hydro-project/hydro/issues/2033), [#2035](https://github.com/hydro-project/hydro/issues/2035), [#2060](https://github.com/hydro-project/hydro/issues/2060), [#2067](https://github.com/hydro-project/hydro/issues/2067), [#2073](https://github.com/hydro-project/hydro/issues/2073), [#2075](https://github.com/hydro-project/hydro/issues/2075), [#2099](https://github.com/hydro-project/hydro/issues/2099), [#2104](https://github.com/hydro-project/hydro/issues/2104), [#2108](https://github.com/hydro-project/hydro/issues/2108), [#2111](https://github.com/hydro-project/hydro/issues/2111), [#2135](https://github.com/hydro-project/hydro/issues/2135), [#2136](https://github.com/hydro-project/hydro/issues/2136), [#2140](https://github.com/hydro-project/hydro/issues/2140), [#2158](https://github.com/hydro-project/hydro/issues/2158), [#2172](https://github.com/hydro-project/hydro/issues/2172), [#2173](https://github.com/hydro-project/hydro/issues/2173), [#2181](https://github.com/hydro-project/hydro/issues/2181), [#2209](https://github.com/hydro-project/hydro/issues/2209), [#2219](https://github.com/hydro-project/hydro/issues/2219), [#2227](https://github.com/hydro-project/hydro/issues/2227), [#2243](https://github.com/hydro-project/hydro/issues/2243), [#2256](https://github.com/hydro-project/hydro/issues/2256), [#2265](https://github.com/hydro-project/hydro/issues/2265), [#2272](https://github.com/hydro-project/hydro/issues/2272), [#2293](https://github.com/hydro-project/hydro/issues/2293), [#2304](https://github.com/hydro-project/hydro/issues/2304)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#1970](https://github.com/hydro-project/hydro/issues/1970)**
    - Generalize bench_client's workload generation ([`b412fa0`](https://github.com/hydro-project/hydro/commit/b412fa0af43d011c527eaa21d2343d57e1c941c2))
 * **[#1975](https://github.com/hydro-project/hydro/issues/1975)**
    - Simplify networking APIs according to Process/Cluster types ([`1a344a9`](https://github.com/hydro-project/hydro/commit/1a344a98fce99d004e0ba86a67c7509d807c37bb))
 * **[#1983](https://github.com/hydro-project/hydro/issues/1983)**
    - Add keyed singletons and optionals to eliminate unsafety in membership tracking ([`920d9a3`](https://github.com/hydro-project/hydro/commit/920d9a394223a218ccbc077de61e2135886a2b15))
 * **[#1984](https://github.com/hydro-project/hydro/issues/1984)**
    - Remove uses of legacy `*_keyed` APIs ([`2e2cd77`](https://github.com/hydro-project/hydro/commit/2e2cd770fd18cd219ec1acdd2c74d46a5ee1b2de))
 * **[#1990](https://github.com/hydro-project/hydro/issues/1990)**
    - Nondet instead of unsafe, snapshot instead of latest_tick, batch instead of tick_batch ([`804f995`](https://github.com/hydro-project/hydro/commit/804f9955dfc9ea64cb0f5177bcda5b9347fafe80))
 * **[#1995](https://github.com/hydro-project/hydro/issues/1995)**
    - Remove strange use of batching in bench_client ([`ab22c44`](https://github.com/hydro-project/hydro/commit/ab22c44aaabf2140315ba26104d9155e357a34ac))
 * **[#2011](https://github.com/hydro-project/hydro/issues/2011)**
    - Remove `KeyedOptional` ([`381be86`](https://github.com/hydro-project/hydro/commit/381be86c8729403d60575bbd7297b852b6b09ec0))
 * **[#2016](https://github.com/hydro-project/hydro/issues/2016)**
    - Adjust cluster membership APIs to allow dynamic clusters ([`1c26bc7`](https://github.com/hydro-project/hydro/commit/1c26bc7899f29cb5b75446381ac5545f7ce017d8))
 * **[#2028](https://github.com/hydro-project/hydro/issues/2028)**
    - Refactor github actions workflows, make stable the default toolchain ([`c40876e`](https://github.com/hydro-project/hydro/commit/c40876ec4bd3b31254d683e479b9a235f3d11f67))
 * **[#2032](https://github.com/hydro-project/hydro/issues/2032)**
    - Rename `ClusterId` to `MemberId` ([`628c1c8`](https://github.com/hydro-project/hydro/commit/628c1c870f1833dd05b3f57ee3e2e1235183cecb))
 * **[#2033](https://github.com/hydro-project/hydro/issues/2033)**
    - Refine types when values of a `KeyedSingleton` are immutable ([`eadd7d0`](https://github.com/hydro-project/hydro/commit/eadd7d0cfcbdc312bf336b8aec961f6d421c6551))
 * **[#2035](https://github.com/hydro-project/hydro/issues/2035)**
    - Client aggregator waits for all clients before outputting ([`f9e5955`](https://github.com/hydro-project/hydro/commit/f9e595559b3dd9641ed6f413c2a729047ebf353e))
 * **[#2060](https://github.com/hydro-project/hydro/issues/2060)**
    - Reduce namespace pollution ([`4925e2c`](https://github.com/hydro-project/hydro/commit/4925e2c77a8e57d45d200c98a31859571a04d150))
 * **[#2067](https://github.com/hydro-project/hydro/issues/2067)**
    - Set up prelude, move collections under `live_collections` module ([`05145bf`](https://github.com/hydro-project/hydro/commit/05145bf191bf0fcc794d282c3b18c0bd378a20ac))
 * **[#2073](https://github.com/hydro-project/hydro/issues/2073)**
    - Move `boundedness` module under `live_collections` ([`4bf1c05`](https://github.com/hydro-project/hydro/commit/4bf1c05583c838e7e4d183382fd72743402f889d))
 * **[#2075](https://github.com/hydro-project/hydro/issues/2075)**
    - Clean up API for cycles / forward references, document ([`5f8a4da`](https://github.com/hydro-project/hydro/commit/5f8a4da212eba8b673f9c7a464c9e92d7c0602cd))
 * **[#2099](https://github.com/hydro-project/hydro/issues/2099)**
    - Add `Ordering` and `Retries` traits with basic axioms ([`e535156`](https://github.com/hydro-project/hydro/commit/e535156ceb7e83550b68a6ae6b5e925f57f1882f))
 * **[#2104](https://github.com/hydro-project/hydro/issues/2104)**
    - Add docs for `for_each` / `dest_sink`, restrict to strict streams ([`1af3a66`](https://github.com/hydro-project/hydro/commit/1af3a666b1d0787f0c023411b7f88ad3f8da5423))
 * **[#2108](https://github.com/hydro-project/hydro/issues/2108)**
    - Fix cardinality for `Optional::or` ([`21ce30c`](https://github.com/hydro-project/hydro/commit/21ce30cdd04a25bf4a67e00ec16e592183748bf4))
 * **[#2111](https://github.com/hydro-project/hydro/issues/2111)**
    - Rename `continue_if*` to `filter_if*` and document ([`537309f`](https://github.com/hydro-project/hydro/commit/537309f9aac44498aa617c8517fdbc21616cbebf))
 * **[#2135](https://github.com/hydro-project/hydro/issues/2135)**
    - Staggered client ([`1c13977`](https://github.com/hydro-project/hydro/commit/1c139772baa20d5c9aa8ab060cc6650d6f239ca0))
 * **[#2136](https://github.com/hydro-project/hydro/issues/2136)**
    - Migrate Hydro IR to have Flo semantics at all levels ([`a4d8af6`](https://github.com/hydro-project/hydro/commit/a4d8af603e6ad14659d1d43ca168495c883a58eb))
 * **[#2140](https://github.com/hydro-project/hydro/issues/2140)**
    - Reduce atomic pollution in quorum counting ([`057192a`](https://github.com/hydro-project/hydro/commit/057192afde1373caedbbfc24516c28a96d12928c))
 * **[#2158](https://github.com/hydro-project/hydro/issues/2158)**
    - Deterministic simulator for Hydro programs ([`224b2db`](https://github.com/hydro-project/hydro/commit/224b2db7dc7e7c5cbd4c6ce024e0410957ce6747))
 * **[#2172](https://github.com/hydro-project/hydro/issues/2172)**
    - Reduce syntactic overhead of connecting test inputs / outputs ([`0be5729`](https://github.com/hydro-project/hydro/commit/0be5729dd87a91a70001f88283b380d3da8df7d0))
 * **[#2173](https://github.com/hydro-project/hydro/issues/2173)**
    - Add APIs for unordered stream assertions and tests for `collect_quorum` ([`a4bdf39`](https://github.com/hydro-project/hydro/commit/a4bdf399f90581f409c89a72ae960405998fb33b))
 * **[#2181](https://github.com/hydro-project/hydro/issues/2181)**
    - Replay failed simulation instances and show logs ([`1fbd6e0`](https://github.com/hydro-project/hydro/commit/1fbd6e05d782388aa3542023b685172e6275baf8))
 * **[#2209](https://github.com/hydro-project/hydro/issues/2209)**
    - Allow `sim` feature without `deploy` feature ([`fa4e9d9`](https://github.com/hydro-project/hydro/commit/fa4e9d9914ed52aa5a7237c32a0dc57d713ec14a))
 * **[#2219](https://github.com/hydro-project/hydro/issues/2219)**
    - Restrict `KeyedSingleton` to not allow asynchronous key removal ([`a157970`](https://github.com/hydro-project/hydro/commit/a15797058950245d9eb762d885d35e5326bcf8b3))
 * **[#2227](https://github.com/hydro-project/hydro/issues/2227)**
    - New template and walkthrough ([`3fd84aa`](https://github.com/hydro-project/hydro/commit/3fd84aa8812fa027db293727d8e304708db66916))
 * **[#2243](https://github.com/hydro-project/hydro/issues/2243)**
    - Don't return results from `SimSender::send` ([`b256cba`](https://github.com/hydro-project/hydro/commit/b256cba932a8d6d7a6be7b1c98c2f8c20b299375))
 * **[#2256](https://github.com/hydro-project/hydro/issues/2256)**
    - Introduce `sliced!` syntax for processing with anonymous ticks ([`194280b`](https://github.com/hydro-project/hydro/commit/194280baf21d554e2deb3c225ed9fdad197c3db2))
 * **[#2265](https://github.com/hydro-project/hydro/issues/2265)**
    - Cluster member ids are now clone instead of copy ([`5579acd`](https://github.com/hydro-project/hydro/commit/5579acd1c7101a3f14c49236e1933398de0f0958))
 * **[#2272](https://github.com/hydro-project/hydro/issues/2272)**
    - Add cluster-membership ir node ([`98b899b`](https://github.com/hydro-project/hydro/commit/98b899baa342617bc8634220324849b1067f6233))
 * **[#2293](https://github.com/hydro-project/hydro/issues/2293)**
    - Add test for collecting unordered quorum ([`1fc7515`](https://github.com/hydro-project/hydro/commit/1fc751515d5fd4b6ec07fec8e83b4aff70b3acca))
 * **[#2304](https://github.com/hydro-project/hydro/issues/2304)**
    - Add specialized `sim_input` / `sim_output` to reduce simulation boilerplate ([`6b1d66a`](https://github.com/hydro-project/hydro/commit/6b1d66aa61056ffb4dd2896e98288489e64d654f))
 * **Uncategorized**
    - Release copy_span v0.1.0, hydro_deploy v0.15.0, hydro_lang v0.15.0, hydro_std v0.15.0 ([`bdfd6e0`](https://github.com/hydro-project/hydro/commit/bdfd6e0d10a49f1b6c45f9514982a1c60da80b9f))
    - Release sinktools v0.0.1, hydro_deploy_integration v0.15.0, lattices_macro v0.5.11, variadics_macro v0.6.2, lattices v0.6.2, multiplatform_test v0.6.0, dfir_rs v0.15.0, copy_span v0.1.0, hydro_deploy v0.15.0, hydro_lang v0.15.0, hydro_std v0.15.0 ([`ac88df1`](https://github.com/hydro-project/hydro/commit/ac88df1e98af9fa2027488252f6014efa7bef229))
    - Release hydro_build_utils v0.0.1, dfir_lang v0.15.0, dfir_macro v0.15.0, variadics v0.0.10, sinktools v0.0.1, hydro_deploy_integration v0.15.0, lattices_macro v0.5.11, variadics_macro v0.6.2, lattices v0.6.2, multiplatform_test v0.6.0, dfir_rs v0.15.0, copy_span v0.1.0, hydro_deploy v0.15.0, hydro_lang v0.15.0, hydro_std v0.15.0, safety bump 5 crates ([`092de25`](https://github.com/hydro-project/hydro/commit/092de252238dfb9fa6b01e777c6dd8bf9db93398))
</details>

## v0.14.0 (2025-07-31)

<csr-id-5ab815f3567d51e9bd114f90af8e837fe0732cd8/>

### New Features

 - <csr-id-17f4a832dac816902eebd19118dc2c4902953261/> Aggregate client throughput/latency
   Co-authored with @shadaj
   
   ---------
 - <csr-id-b333b45e0936bbe481d7fbc285790d942779c494/> upgrade Stageleft to eliminate `__staged` compilation during development
   Before Stageleft 0.9, we always compiled the `__staged` module in stage
   0, which resulted in significant compilation penalties and Rust Analyzer
   thrashing since any file changes triggered a re-run of the `build.rs`.
   With Stageleft 0.9, we can defer compiling this module to the trybuild
   stage 1.
   
   Stageleft 0.9 also cleans up how paths are rewritten to use the
   `__staged` module, so we can simplify our logic as well. The only
   significant rewrite remaining is when running unit tests, where we have
   to regenerate `__staged` to access test-only module, and therefore have
   to rewrite all paths to use that module.
   
   Finally, in the spirit of improving compilation efficiency, we disable
   incremental builds for trybuild stage 1. We generate files with hash
   based on contents, so we were never benefitting from incremental
   compilation anyways. This reduces the disk space used significantly.

### Refactor

 - <csr-id-5ab815f3567d51e9bd114f90af8e837fe0732cd8/> use `async-ssh2-russh` (instead of `libssh2` bindings), fix #1463

### New Features (BREAKING)

 - <csr-id-45bd6e9759410dcb747c9224758c82f9874378d2/> add stream markers for tracking non-deterministic retries
   This introduces an additional type paramter to `Stream` called
   `Retries`, which tracks the presence (or lack) of non-determinstic
   retries in the stream. `ExactlyOnce` means that each element has
   deterministic order, while `AtLeastOnce` means that there may be
   non-deterministic duplicates.
   
   A `TotalOrder, AtLeastOnce` stream describes elements with consecutive
   duplication, but deterministic order if we ignore those immediate
   elements. A `NoOrder, AtLeastOnce` stream has set semantics.
   
   Also fixes a bug in the return type for `*_keyed_*`, where the output
   type was previously `TotalOrder` but now is `NoOrder`. We stream the
   results of a keyed aggregation out of a `HashMap`, so the order will
   indeed be non-deterministic.

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 6 commits contributed to the release.
 - 110 days passed between releases.
 - 4 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 4 unique issues were worked on: [#1803](https://github.com/hydro-project/hydro/issues/1803), [#1900](https://github.com/hydro-project/hydro/issues/1900), [#1907](https://github.com/hydro-project/hydro/issues/1907), [#1910](https://github.com/hydro-project/hydro/issues/1910)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#1803](https://github.com/hydro-project/hydro/issues/1803)**
    - Use `async-ssh2-russh` (instead of `libssh2` bindings), fix #1463 ([`5ab815f`](https://github.com/hydro-project/hydro/commit/5ab815f3567d51e9bd114f90af8e837fe0732cd8))
 * **[#1900](https://github.com/hydro-project/hydro/issues/1900)**
    - Aggregate client throughput/latency ([`17f4a83`](https://github.com/hydro-project/hydro/commit/17f4a832dac816902eebd19118dc2c4902953261))
 * **[#1907](https://github.com/hydro-project/hydro/issues/1907)**
    - Upgrade Stageleft to eliminate `__staged` compilation during development ([`b333b45`](https://github.com/hydro-project/hydro/commit/b333b45e0936bbe481d7fbc285790d942779c494))
 * **[#1910](https://github.com/hydro-project/hydro/issues/1910)**
    - Add stream markers for tracking non-deterministic retries ([`45bd6e9`](https://github.com/hydro-project/hydro/commit/45bd6e9759410dcb747c9224758c82f9874378d2))
 * **Uncategorized**
    - Release example_test v0.0.0, dfir_rs v0.14.0, hydro_deploy v0.14.0, hydro_lang v0.14.0, hydro_optimize v0.13.0, hydro_std v0.14.0 ([`5f69ee0`](https://github.com/hydro-project/hydro/commit/5f69ee080a9e257bc07cdc4deda90ce5525a3d0e))
    - Release dfir_lang v0.14.0, dfir_macro v0.14.0, hydro_deploy_integration v0.14.0, lattices_macro v0.5.10, variadics_macro v0.6.1, dfir_rs v0.14.0, hydro_deploy v0.14.0, hydro_lang v0.14.0, hydro_optimize v0.13.0, hydro_std v0.14.0, safety bump 6 crates ([`0683595`](https://github.com/hydro-project/hydro/commit/06835950c12884d661100c13f73ad23a98bfad9f))
</details>

## v0.13.0 (2025-04-11)

### New Features

 - <csr-id-5ac247ca2006bbb45c5511c78dc6d9028f7451da/> update Stageleft and reduce reliance on DFIR re-exports
 - <csr-id-e0c4abb02054fc3d5dc866286b18f3f2bcd2ad36/> update Stageleft to reduce viral dependencies
   Now that Stageleft handles quoted snippets that refer to local
   dependencies, we do not need to duplicate deps into downstream crates.

### New Features (BREAKING)

 - <csr-id-dfb7a1b5ad47f03822e9b7cae7dae81914b305e2/> don't pull in dfir_rs during the compilation stage
   Because `hydro_lang` is responsible for _generating_ DFIR code, it
   doesn't actually need to depend on the runtime (`dfir_rs`), other than
   when it is used in the (legacy) macro mode or when we want to include
   utilities for runtime logic (`resource_measurement`). This sticks those
   pieces under feature flags and makes `dfir_rs` an optional dependency,
   which reduces the compile tree for crates like `hydro_test`.

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 4 commits contributed to the release.
 - 27 days passed between releases.
 - 3 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 3 unique issues were worked on: [#1791](https://github.com/hydro-project/hydro/issues/1791), [#1796](https://github.com/hydro-project/hydro/issues/1796), [#1797](https://github.com/hydro-project/hydro/issues/1797)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#1791](https://github.com/hydro-project/hydro/issues/1791)**
    - Update Stageleft to reduce viral dependencies ([`e0c4abb`](https://github.com/hydro-project/hydro/commit/e0c4abb02054fc3d5dc866286b18f3f2bcd2ad36))
 * **[#1796](https://github.com/hydro-project/hydro/issues/1796)**
    - Update Stageleft and reduce reliance on DFIR re-exports ([`5ac247c`](https://github.com/hydro-project/hydro/commit/5ac247ca2006bbb45c5511c78dc6d9028f7451da))
 * **[#1797](https://github.com/hydro-project/hydro/issues/1797)**
    - Don't pull in dfir_rs during the compilation stage ([`dfb7a1b`](https://github.com/hydro-project/hydro/commit/dfb7a1b5ad47f03822e9b7cae7dae81914b305e2))
 * **Uncategorized**
    - Release dfir_lang v0.13.0, dfir_datalog_core v0.13.0, dfir_datalog v0.13.0, dfir_macro v0.13.0, hydro_deploy_integration v0.13.0, dfir_rs v0.13.0, hydro_deploy v0.13.0, hydro_lang v0.13.0, hydro_std v0.13.0, hydro_cli v0.13.0, safety bump 8 crates ([`400fd8f`](https://github.com/hydro-project/hydro/commit/400fd8f2e8cada253f54980e7edce0631be70a82))
</details>

## v0.12.1 (2025-03-15)

<csr-id-38e6721be69f6a41aa47a01a9d06d56a01be1355/>

### Chore

 - <csr-id-38e6721be69f6a41aa47a01a9d06d56a01be1355/> remove stageleft from repo, fix #1764
   They grow up so fast 🥹

### Documentation

 - <csr-id-b235a42a3071e55da7b09bdc8bc710b18e0fe053/> demote python deploy docs, fix docsrs configs, fix #1392, fix #1629
   Running thru the quickstart in order to write more about Rust
   `hydro_deploy`, ran into some confusion due to feature-gated items not
   showing up in docs.
   
   `rustdocflags = [ '--cfg=docsrs', '--cfg=stageleft_runtime' ]` uses the
   standard `[cfg(docrs)]` as well as enabled our
   `[cfg(stageleft_runtime)]` so things `impl<H: Host + 'static>
   IntoProcessSpec<'_, HydroDeploy> for Arc<H>` show up.
   
   Also set `--all-features` for the docsrs build

### New Features

 - <csr-id-7f0a9e8ef59adf462ddd4b798811ec32e61bcb47/> add benchmarking utilities

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 5 commits contributed to the release.
 - 7 days passed between releases.
 - 3 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 3 unique issues were worked on: [#1765](https://github.com/hydro-project/hydro/issues/1765), [#1774](https://github.com/hydro-project/hydro/issues/1774), [#1787](https://github.com/hydro-project/hydro/issues/1787)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#1765](https://github.com/hydro-project/hydro/issues/1765)**
    - Add benchmarking utilities ([`7f0a9e8`](https://github.com/hydro-project/hydro/commit/7f0a9e8ef59adf462ddd4b798811ec32e61bcb47))
 * **[#1774](https://github.com/hydro-project/hydro/issues/1774)**
    - Remove stageleft from repo, fix #1764 ([`38e6721`](https://github.com/hydro-project/hydro/commit/38e6721be69f6a41aa47a01a9d06d56a01be1355))
 * **[#1787](https://github.com/hydro-project/hydro/issues/1787)**
    - Demote python deploy docs, fix docsrs configs, fix #1392, fix #1629 ([`b235a42`](https://github.com/hydro-project/hydro/commit/b235a42a3071e55da7b09bdc8bc710b18e0fe053))
 * **Uncategorized**
    - Release include_mdtests v0.0.0, dfir_rs v0.12.1, hydro_deploy v0.12.1, hydro_lang v0.12.1, hydro_std v0.12.1, hydro_cli v0.12.1 ([`faf0d3e`](https://github.com/hydro-project/hydro/commit/faf0d3ed9f172275f2e2f219c5ead1910c209a36))
    - Release dfir_lang v0.12.1, dfir_datalog_core v0.12.1, dfir_datalog v0.12.1, dfir_macro v0.12.1, hydro_deploy_integration v0.12.1, lattices v0.6.1, pusherator v0.0.12, dfir_rs v0.12.1, hydro_deploy v0.12.1, hydro_lang v0.12.1, hydro_std v0.12.1, hydro_cli v0.12.1 ([`23221b5`](https://github.com/hydro-project/hydro/commit/23221b53b30918707ddaa85529d04cd7919166b4))
</details>

## v0.12.0 (2025-03-08)

<csr-id-49a387d4a21f0763df8ec94de73fb953c9cd333a/>
<csr-id-41e5bb93eb9c19a88167a63bce0ceb800f8f300d/>
<csr-id-80407a2f0fdaa8b8a81688d181166a0da8aa7b52/>
<csr-id-2fd6119afed850a0c50ecc69e5c4d8de61a2f4cb/>
<csr-id-524fa67232b54f5faeb797b43070f2f197c558dd/>
<csr-id-ec3795a678d261a38085405b6e9bfea943dafefb/>

### Chore

 - <csr-id-49a387d4a21f0763df8ec94de73fb953c9cd333a/> upgrade to Rust 2024 edition
   - Updates `Cargo.toml` to use new shared workspace keys
   - Updates lint settings (in workspace `Cargo.toml`)
   - `rustfmt` has changed slightly, resulting in a big diff - there are no
   actual code changes
   - Adds a script to `rustfmt` the template src files

### Refactor (BREAKING)

 - <csr-id-2fd6119afed850a0c50ecc69e5c4d8de61a2f4cb/> rename `_interleaved` to `_anonymous`
   Also address docs feedback for streams.
 - <csr-id-524fa67232b54f5faeb797b43070f2f197c558dd/> rename timestamp to atomic and provide batching shortcuts

### Chore

 - <csr-id-ec3795a678d261a38085405b6e9bfea943dafefb/> upgrade to Rust 2024 edition
   - Updates `Cargo.toml` to use new shared workspace keys
   - Updates lint settings (in workspace `Cargo.toml`)
   - `rustfmt` has changed slightly, resulting in a big diff - there are no
   actual code changes
   - Adds a script to `rustfmt` the template src files

### Documentation

 - <csr-id-73444373dabeedd7a03a8231952684fb01bdf895/> add initial Rustdoc for some Stream APIs
 - <csr-id-d7741d55a3ea9b172e962e7398f0414d0427c3f9/> add initial Rustdoc for some Stream APIs

### New Features

 - <csr-id-eee28d3a17ea542c69a2d7e535c38333f42d4398/> Add metadata field to HydroNode
 - <csr-id-6d77db9e52ece0b668587187c59f2862670db7cf/> send_partitioned operator and move decoupling
   Allows specifying a distribution policy (for deciding which partition to
   send each message to) before networking. Designed to be as easy as
   possible to inject (so the distribution policy function definition takes
   in the cluster ID, for example, even though it doesn't need to, because
   this way we can avoid project->map->join)
 - <csr-id-69831f9dc724ba7915b8ade8134839c42786ac76/> Add metadata field to HydroNode
 - <csr-id-ca291dd618fc4065c4e30097c5ea605226383cec/> send_partitioned operator and move decoupling
   Allows specifying a distribution policy (for deciding which partition to
   send each message to) before networking. Designed to be as easy as
   possible to inject (so the distribution policy function definition takes
   in the cluster ID, for example, even though it doesn't need to, because
   this way we can avoid project->map->join)

### Bug Fixes

 - <csr-id-75eb323a612fd5d2609e464fe7690bc2b6a8457a/> use correct `__staged` path when rewriting `crate::` imports
   Previously, a rewrite would first turn `crate` into `crate::__staged`,
   and another would rewrite `crate::__staged` into `hydro_test::__staged`.
   The latter global rewrite is unnecessary because the stageleft logic
   already will use the full crate name when handling public types, so we
   drop it.
 - <csr-id-48b275c1247f4f6fe7e6b63a5ae184c5d85b6fa1/> use correct `__staged` path when rewriting `crate::` imports
   Previously, a rewrite would first turn `crate` into `crate::__staged`,
   and another would rewrite `crate::__staged` into `hydro_test::__staged`.
   The latter global rewrite is unnecessary because the stageleft logic
   already will use the full crate name when handling public types, so we
   drop it.

### Bug Fixes (BREAKING)

 - <csr-id-c49a4913cfdae021404a86e5a4d0597aa4db9fbe/> reduce where `#[cfg(stageleft_runtime)]` needs to be used
   Simplifies the logic for generating the public clone of the code, which
   eliminates the need to sprinkle `#[cfg(stageleft_runtime)]` (renamed
   from `#[stageleft::runtime]`) everywhere. Also adds logic to pass
   through `cfg` attrs when re-exporting public types.
 - <csr-id-a7e22cdd312b8483163aa89751833e1657703b8d/> reduce where `#[cfg(stageleft_runtime)]` needs to be used
   Simplifies the logic for generating the public clone of the code, which
   eliminates the need to sprinkle `#[cfg(stageleft_runtime)]` (renamed
   from `#[stageleft::runtime]`) everywhere. Also adds logic to pass
   through `cfg` attrs when re-exporting public types.

### Refactor (BREAKING)

 - <csr-id-41e5bb93eb9c19a88167a63bce0ceb800f8f300d/> rename `_interleaved` to `_anonymous`
   Also address docs feedback for streams.
 - <csr-id-80407a2f0fdaa8b8a81688d181166a0da8aa7b52/> rename timestamp to atomic and provide batching shortcuts

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 9 commits contributed to the release.
 - 74 days passed between releases.
 - 8 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 8 unique issues were worked on: [#1632](https://github.com/hydro-project/hydro/issues/1632), [#1650](https://github.com/hydro-project/hydro/issues/1650), [#1652](https://github.com/hydro-project/hydro/issues/1652), [#1657](https://github.com/hydro-project/hydro/issues/1657), [#1681](https://github.com/hydro-project/hydro/issues/1681), [#1695](https://github.com/hydro-project/hydro/issues/1695), [#1721](https://github.com/hydro-project/hydro/issues/1721), [#1747](https://github.com/hydro-project/hydro/issues/1747)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#1632](https://github.com/hydro-project/hydro/issues/1632)**
    - Add metadata field to HydroNode ([`69831f9`](https://github.com/hydro-project/hydro/commit/69831f9dc724ba7915b8ade8134839c42786ac76))
 * **[#1650](https://github.com/hydro-project/hydro/issues/1650)**
    - Add initial Rustdoc for some Stream APIs ([`d7741d5`](https://github.com/hydro-project/hydro/commit/d7741d55a3ea9b172e962e7398f0414d0427c3f9))
 * **[#1652](https://github.com/hydro-project/hydro/issues/1652)**
    - Send_partitioned operator and move decoupling ([`ca291dd`](https://github.com/hydro-project/hydro/commit/ca291dd618fc4065c4e30097c5ea605226383cec))
 * **[#1657](https://github.com/hydro-project/hydro/issues/1657)**
    - Use correct `__staged` path when rewriting `crate::` imports ([`48b275c`](https://github.com/hydro-project/hydro/commit/48b275c1247f4f6fe7e6b63a5ae184c5d85b6fa1))
 * **[#1681](https://github.com/hydro-project/hydro/issues/1681)**
    - Rename timestamp to atomic and provide batching shortcuts ([`524fa67`](https://github.com/hydro-project/hydro/commit/524fa67232b54f5faeb797b43070f2f197c558dd))
 * **[#1695](https://github.com/hydro-project/hydro/issues/1695)**
    - Rename `_interleaved` to `_anonymous` ([`2fd6119`](https://github.com/hydro-project/hydro/commit/2fd6119afed850a0c50ecc69e5c4d8de61a2f4cb))
 * **[#1721](https://github.com/hydro-project/hydro/issues/1721)**
    - Reduce where `#[cfg(stageleft_runtime)]` needs to be used ([`a7e22cd`](https://github.com/hydro-project/hydro/commit/a7e22cdd312b8483163aa89751833e1657703b8d))
 * **[#1747](https://github.com/hydro-project/hydro/issues/1747)**
    - Upgrade to Rust 2024 edition ([`ec3795a`](https://github.com/hydro-project/hydro/commit/ec3795a678d261a38085405b6e9bfea943dafefb))
 * **Uncategorized**
    - Release dfir_lang v0.12.0, dfir_datalog_core v0.12.0, dfir_datalog v0.12.0, dfir_macro v0.12.0, hydroflow_deploy_integration v0.12.0, lattices_macro v0.5.9, variadics v0.0.9, variadics_macro v0.6.0, lattices v0.6.0, multiplatform_test v0.5.0, pusherator v0.0.11, dfir_rs v0.12.0, hydro_deploy v0.12.0, stageleft_macro v0.6.0, stageleft v0.7.0, stageleft_tool v0.6.0, hydro_lang v0.12.0, hydro_std v0.12.0, hydro_cli v0.12.0, safety bump 10 crates ([`973c925`](https://github.com/hydro-project/hydro/commit/973c925e87ed78344494581bd7ce1bbb4186a2f3))
</details>

## v0.11.0 (2024-12-23)

<csr-id-03b3a349013a71b324276bca5329c33d400a73ff/>
<csr-id-162e49cf8a8cf944cded7f775d6f78afe4a89837/>
<csr-id-a6f60c92ae7168eb86eb311ca7b7afb10025c7de/>
<csr-id-54f461acfce091276b8ce7574c0690e6d648546d/>

### Chore

 - <csr-id-03b3a349013a71b324276bca5329c33d400a73ff/> bump versions manually for renamed crates, per `RELEASING.md`
 - <csr-id-162e49cf8a8cf944cded7f775d6f78afe4a89837/> Rename HydroflowPlus to Hydro

### Chore

 - <csr-id-a6f60c92ae7168eb86eb311ca7b7afb10025c7de/> bump versions manually for renamed crates, per `RELEASING.md`
 - <csr-id-54f461acfce091276b8ce7574c0690e6d648546d/> Rename HydroflowPlus to Hydro

### Documentation

 - <csr-id-28cd220c68e3660d9ebade113949a2346720cd04/> add `repository` field to `Cargo.toml`s, fix #1452
   #1452 
   
   Will trigger new releases of the following:
   `unchanged = 'hydroflow_deploy_integration', 'variadics',
   'variadics_macro', 'pusherator'`
   
   (All other crates already have changes, so would be released anyway)
 - <csr-id-6ab625273d822812e83a333e928c3dea1c3c9ccb/> cleanups for the rename, fixing links
 - <csr-id-204bd117ca3a8845b4986539efb91a0c612dfa05/> add `repository` field to `Cargo.toml`s, fix #1452
   #1452 
   
   Will trigger new releases of the following:
   `unchanged = 'hydroflow_deploy_integration', 'variadics',
   'variadics_macro', 'pusherator'`
   
   (All other crates already have changes, so would be released anyway)
 - <csr-id-987f7ad8668d9740ceea577a595035228898d530/> cleanups for the rename, fixing links

### Commit Statistics

<csr-read-only-do-not-edit/>

 - 6 commits contributed to the release.
 - 4 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 4 unique issues were worked on: [#1501](https://github.com/hydro-project/hydro/issues/1501), [#1617](https://github.com/hydro-project/hydro/issues/1617), [#1624](https://github.com/hydro-project/hydro/issues/1624), [#1627](https://github.com/hydro-project/hydro/issues/1627)

### Commit Details

<csr-read-only-do-not-edit/>

<details><summary>view details</summary>

 * **[#1501](https://github.com/hydro-project/hydro/issues/1501)**
    - Add `repository` field to `Cargo.toml`s, fix #1452 ([`204bd11`](https://github.com/hydro-project/hydro/commit/204bd117ca3a8845b4986539efb91a0c612dfa05))
 * **[#1617](https://github.com/hydro-project/hydro/issues/1617)**
    - Rename HydroflowPlus to Hydro ([`54f461a`](https://github.com/hydro-project/hydro/commit/54f461acfce091276b8ce7574c0690e6d648546d))
 * **[#1624](https://github.com/hydro-project/hydro/issues/1624)**
    - Cleanups for the rename, fixing links ([`987f7ad`](https://github.com/hydro-project/hydro/commit/987f7ad8668d9740ceea577a595035228898d530))
 * **[#1627](https://github.com/hydro-project/hydro/issues/1627)**
    - Bump versions manually for renamed crates, per `RELEASING.md` ([`a6f60c9`](https://github.com/hydro-project/hydro/commit/a6f60c92ae7168eb86eb311ca7b7afb10025c7de))
 * **Uncategorized**
    - Release stageleft_macro v0.5.0, stageleft v0.6.0, stageleft_tool v0.5.0, hydro_lang v0.11.0, hydro_std v0.11.0, hydro_cli v0.11.0 ([`7633c38`](https://github.com/hydro-project/hydro/commit/7633c38c4a56acf7e5b3b6f2a72ccc1d6e6eeba1))
    - Release dfir_lang v0.11.0, dfir_datalog_core v0.11.0, dfir_datalog v0.11.0, dfir_macro v0.11.0, hydroflow_deploy_integration v0.11.0, lattices_macro v0.5.8, variadics v0.0.8, variadics_macro v0.5.6, lattices v0.5.9, multiplatform_test v0.4.0, pusherator v0.0.10, dfir_rs v0.11.0, hydro_deploy v0.11.0, stageleft_macro v0.5.0, stageleft v0.6.0, stageleft_tool v0.5.0, hydro_lang v0.11.0, hydro_std v0.11.0, hydro_cli v0.11.0, safety bump 6 crates ([`361b443`](https://github.com/hydro-project/hydro/commit/361b4439ef9c781860f18d511668ab463a8c5203))
</details>