What's Changed
- feat(examples): add :examples module with tic-tac-toe and chat by @keddie in #478
- docs: update README coordinates to 0.5.0 by @github-actions[bot] in #472
- examples: tic-tac-toe + chat integration over real raft and SeamReplicator by @keddie in #481
- feat(raft): leader-forwarding for propose() + two-player tic-tac-toe example by @keddie in #486
- docs: design spec — RaftNode.propose leader-forwarding by @keddie in #482
- docs: design spec + plan — kuilt-raft exactly-once forwarded proposals by @keddie in #487
- feat(kuilt-raft): exactly-once forwarded proposals (client-serial dedup, §8) by @keddie in #493
- docs: design spec + plan — server-cluster topology (epic #485) by @keddie in #497
- docs: convert G4 CRDT map snippets to source includes by @keddie in #499
- docs: convert G5 CRDT composite/ephemeral snippets to source includes by @keddie in #503
- docs: convert G1 CRDT snippets to source includes by @keddie in #501
- docs: convert G3 CRDT register snippets to source includes by @keddie in #500
- docs: convert G2 CRDT set snippets to source includes by @keddie in #504
- docs: formalize server-cluster topology vocabulary (epic #485) by @keddie in #506
- docs: pull snippets from source via Writerside include (spike on gcounter) by @keddie in #498
- feat(session): ServerClusterReconnect helper — S1a of server-cluster topology (#485) by @keddie in #514
- examples: PNCounter pilot + SeamReplicator convenience API by @keddie in #491
- test(examples): S1b relay-room integration — RaftNode over KtorRoomHost by @keddie in #521
- feat(crdt)!: split :kuilt-crdt (dependency-free) + :kuilt-quilter; rename SeamReplicator→Quilter by @keddie in #522
- docs: how to set up multi-node / consensus virtual-time tests by @keddie in #526
- publish
MultiNodeRaftSimin:kuilt-raft-test, S1c-0 of epic #485 by @keddie in #527 - M=3 leader-change + entry-server-kill, no double-apply (done-when), epic #485 by @keddie in #530
- M=1 exactly-once done-when, epic #485 by @keddie in #529
- test(examples): strengthen M=3 done-when — prove duplicate is actually committed by @keddie in #533
- docs: reframe library around three axes; add getting-started tutorial by @keddie in #473
- docs: sync CLAUDE.md module table after #522 kuilt-crdt/quilter split by @keddie in #536
- test(examples): real-transport failover — ResumeToken degrades to fresh-join on entry-server change (O4) by @keddie in #537
- fix(core): make CompositeSeam ply announces close-safe (#535) by @keddie in #538
- feat: :kuilt-cluster scaffold + ClusterClient API + tier-(a) tests (S3a) by @keddie in #539
- feat: ManagedRaftTransport + wire CoroutineScope.clusterClient (S3b-1, #513) by @keddie in #540
- feat(cluster): S3b-2 — ServerCluster facade + M=3 voter mesh by @keddie in #541
- feat(cluster): S3b-3 — real-socket E2E for ServerCluster + ClusterClient by @keddie in #543
- docs: server-cluster topology — architecture + usage + guide by @keddie in #546
- docs: diagnosing the UncaughtExceptionsBeforeTest leak class (#535) by @keddie in #547
- feat(websocket): injectable selfPeerId on KtorClientLoom (#544) by @keddie in #548
- feat(websocket): injectable selfPeerId on KtorClientLoom (#544) by @keddie in #549
- feat(cluster): production-path clusterClient over real sockets (#544) by @keddie in #550
- fix(core): CompositeSeam send paths tolerate a ply tearing mid-send (#542) by @keddie in #551
- feat(core)!: rename Conn → Connection (no abbreviations) by @keddie in #552
- fix(cluster): route learner→leader in LearnerRouter — M=3 real-socket E2E (#545) by @keddie in #553
- fix(core): register a ply in
livebefore launching its pumps (#554) by @keddie in #555 - fix(cluster): ManagedRaftTransport addresses its single relay peer (#544) by @keddie in #556
- feat(cluster): multi-relay ServerCluster + real-socket cross-relay failover E2E (#544) by @keddie in #557
- docs(cluster): S2a sub-spec — per-server star relay (#511) by @keddie in #558
- docs: convert backtick-blocked snippets via camelCase sample aliases by @keddie in #534
- test(cluster): N-client hardening E2E — leader transfer + relay kill + no-double-apply by @keddie in #560
- fix(cluster): retry changeMembership on concurrent admission race by @keddie in #562
- test(core): close() CompositeSeam in composite tests by @keddie in #564
- docs(kuilt-raft): dedup GC v2 sub-spec — supersession prune by @keddie in #566
- docs(kuilt-game): one-call gameNode bootstrap — design sub-spec by @keddie in #567
- feat(kuilt-raft): dedup GC v2 — supersession prune + closeSession by @keddie in #568
- docs(kuilt-game): resolve gameNode bootstrap-enumeration (#480) by @keddie in #569
- docs(kuilt-game): gameNode bootstrap implementation plan (#480) by @keddie in #573
- test(kuilt-raft): wire closeSession() end-to-end on committed close op (#570) by @keddie in #572
- test(kuilt-game): Seam-based virtual-time bootstrap harness (#480) by @keddie in #574
- feat(kuilt-game): gameNode(seam, voterIds) roster-given bootstrap (#480) by @keddie in #575
- feat(kuilt-game): gameHost/gameJoin appoint-the-host bootstrap (#480) by @keddie in #576
- test(kuilt-game): latecomer admission after first commit (#480) by @keddie in #577
- feat(kuilt-game): EphemeralMap host-declaration presence layer (#480) by @keddie in #578
- feat(kuilt-game): fail fast on duplicate gameHost (#480) by @keddie in #579
- feat(kuilt-game): gameNode samples, incoming-guard + virtual-time test hygiene (#480) by @keddie in #581
- docs(kuilt-raft): decision — no index-horizon idle TTL valve (#571) by @keddie in #582
- feat(kuilt-game): bounded presence-convergence wait for duplicate-host check (#580) by @keddie in #583
- feat(kuilt-game): deterministic lowest-NodeId host arbitration (#584) by @keddie in #585
- feat(kuilt-game): gameHost return-at-quorum mode (#586) by @keddie in #588
- docs(testing): advanceTimeBy over an always-on timer is O(span/interval) work by @keddie in #591
- feat(kuilt-core): NamedMux — string-keyed multiplexer over a Seam (#589) by @keddie in #590
- feat(kuilt-game): GameSession return type with named app channels (#589) by @keddie in #592
- docs: add :kuilt-cluster to the module table by @keddie in #595
- docs: refresh module table — game bootstrap API, Conn→Connection by @keddie in #596
- docs(kuilt-raft,kuilt-cluster): currency pass for dedup-GC/closeSession + cluster surface by @keddie in #597
- docs(writerside): consistency pass — module table + NamedMux + game bootstrap by @keddie in #601
- docs(kuilt-game): bootstrap API doc completeness + samples by @keddie in #598
- docs(guide): note kuilt-stream/kuilt-tcp in fabric-kit by @keddie in #605
- docs(guide): kuilt-game bootstrap topic by @keddie in #606
- docs(kuilt-core): NamedMux + multiplexing surface + freshness pass by @keddie in #599
- feat(kuilt-game): gameJoin fails loud with RosterFullException when roster is full (#587) by @keddie in #602
- refactor(kuilt-liveness): extract HeartbeatPartitionDetector into a shared module (#600) by @keddie in #607
- feat(kuilt-game): gameSpectate admits a permanent non-voting learner (#593) by @keddie in #608
- feat(kuilt-game): freed-seat replacement after a voter departs (#594) by @keddie in #609
- refactor(examples): modernize tic-tac-toe+chat onto gameNode facade; add examples README by @keddie in #610
- docs: fix gameNode description + steer game consumers to the facade by @keddie in #612
- docs(kuilt-game): @sample for convergent CRDT chat over GameSession.appChannel by @keddie in #611
- docs: simplify Writerside onboarding wording by @keddie in #613
- build: bump version line to 0.6 for the 0.6.0 release by @keddie in #614
New Contributors
- @github-actions[bot] made their first contribution in #472
Full Changelog: v0.5.0...v0.6.0