)]}'
{
  "log": [
    {
      "commit": "140f3c5f16c20991e675f55417bdadf0e8ab3f0d",
      "tree": "21232c715bb8b2cf5f67f6eebac178341907cb05",
      "parents": [
        "c18c56ba21a7489d511fc0fba237ea9bbc4a2922"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Wed May 06 06:07:32 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 13:07:32 2026 +0200"
      },
      "message": "fix(go): return error instead of panic on S2 decode failure (#3166)"
    },
    {
      "commit": "c18c56ba21a7489d511fc0fba237ea9bbc4a2922",
      "tree": "de424118b11593b7b610cff6da1b7172d3aedde9",
      "parents": [
        "5556d30a6d7390bee89a60153c657aeeb0eb55a1"
      ],
      "author": {
        "name": "oscarArismendi",
        "email": "58527817+oscarArismendi@users.noreply.github.com",
        "time": "Wed May 06 05:18:17 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 12:18:17 2026 +0200"
      },
      "message": "fix(node): deserialize void response now ignores payload length for all void commands (#3182)"
    },
    {
      "commit": "5556d30a6d7390bee89a60153c657aeeb0eb55a1",
      "tree": "35a8f21933f92d1669b5775f7e4be8148e79d99b",
      "parents": [
        "3899e9497b25113755c7eb702e9cfa23cf4c6e61"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Wed May 06 05:07:27 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 12:07:27 2026 +0200"
      },
      "message": "feat(cli): add context show and session status commands (#3096)"
    },
    {
      "commit": "3899e9497b25113755c7eb702e9cfa23cf4c6e61",
      "tree": "301633d1b27ab2884e516f4be9e3ab9561a8e221",
      "parents": [
        "78f447e682c0d55b0efc41bb1edf3f1174355d86"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed May 06 11:16:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 11:16:51 2026 +0200"
      },
      "message": "chore(deps): bump uuid and @cucumber/cucumber in /foreign/node (#3216)"
    },
    {
      "commit": "78f447e682c0d55b0efc41bb1edf3f1174355d86",
      "tree": "de789cca6da52fc9af3bf2ef89b45720f5222798",
      "parents": [
        "fbf3885f6e61d84ee50503858fadbaf33ba6d843"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Wed May 06 13:45:48 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 10:15:48 2026 +0200"
      },
      "message": "feat(shard): add v2 consumer-offset commands with AckLevel (#3151)\n\n- Introduce `AckLevel { NoAck, Quorum }` and v2 wire commands\n`StoreConsumerOffset2` / `DeleteConsumerOffset2` that carry an explicit\nack byte; v1 commands and wire format are untouched.\n- Unify the server\u0027s two offset-write paths so `PollMessages`\nauto-commit and explicit stores share a single shard entry point, with\n`AckLevel` selecting the policy."
    },
    {
      "commit": "fbf3885f6e61d84ee50503858fadbaf33ba6d843",
      "tree": "72937b9e2baa9cdc748c425ddc71c2303eb14d64",
      "parents": [
        "e93785249bdaadfd39bd2f0153abcb2efd83bb1c"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue May 05 17:54:34 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 14:24:34 2026 +0200"
      },
      "message": "chore(deps): bump workspace deps + migrate ctor 1.0 (#3214)"
    },
    {
      "commit": "e93785249bdaadfd39bd2f0153abcb2efd83bb1c",
      "tree": "f17c858494b4602db88b9442144dae65da352c2a",
      "parents": [
        "f02a43a8dbe1c89f3c6170faa501943be3d89c38"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon May 04 14:20:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 14:20:59 2026 +0200"
      },
      "message": "feat(message_bus): add QUIC, TCP-TLS, WS, WSS transports for SDK clients (#3192)\n\nReplica plane stays TCP forever: VSR FIFO + view-change timing,\nfd-delegation, writev batching all rely on plaintext between trusted\nreplicas. SDK-client plane gains four transports alongside TCP:\n\n- QUIC: shard-0 terminal (compio-quic CID demux), 1 bidi stream per\n  peer, 0-RTT off + listener defense-in-depth reject.\n- TCP-TLS: rustls 1.3, no client auth, 0-RTT off, compio-tls behind\n  unified TransportConn::run with bounded close_grace shutdown.\n- WS: compio-ws over plaintext TCP; pre-upgrade fd cross-shard\n  handover keeps fd-delegation on plain TCP only.\n- WSS: WebSocketStream over TlsStream; both handshakes run on the\n  per-connection install task.\n\nShared: TransportListener / TransportConn trait family; WebSocketConfig\n+ close_grace threaded through MessageBusConfig and applied uniformly\nacross TCP-TLS, WS, WSS; bounded safe-shutdown (no select! over\nstream.shutdown); single-task pump per WS/WSS using compio-ws\ncancel-safe read. Bus auth thin: both planes connect unauthenticated;\nserver-ng gates via LOGIN_USER / LOGIN_WITH_PAT and future\nLOGIN_REPLICA. Ping announces replica_id only; no subprotocol, no\nALPN, no MAC. Per-connection metadata flows via\nIggyMessageBus::client_meta; ShardFramePayload setup variants carry\nClientConnMeta end to end."
    },
    {
      "commit": "f02a43a8dbe1c89f3c6170faa501943be3d89c38",
      "tree": "7ee02d66302706bc27c3b01251f9ce13b939b69f",
      "parents": [
        "93227c17d4ebe830752b323e6a5f8a85d6b7d004"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon May 04 12:52:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 12:52:07 2026 +0200"
      },
      "message": "ci: allow node and common scopes in PR titles (#3209)"
    },
    {
      "commit": "93227c17d4ebe830752b323e6a5f8a85d6b7d004",
      "tree": "48a1651953bb8abac3228ed946db1395b492176c",
      "parents": [
        "55705f3954647a959da7a02d3338af938de1051a"
      ],
      "author": {
        "name": "Anurag",
        "email": "58452562+explise@users.noreply.github.com",
        "time": "Mon May 04 14:27:50 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 10:57:50 2026 +0200"
      },
      "message": "test(server): add QUIC transport coverage to consumer group scenarios (#3207)"
    },
    {
      "commit": "55705f3954647a959da7a02d3338af938de1051a",
      "tree": "0bf41652acff042f9169d9e034974b56b8be84f5",
      "parents": [
        "5fbeddca49375c35096a38dadde3c164f175820a"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Sun May 03 09:24:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 03 09:24:49 2026 +0200"
      },
      "message": "chore(repo): add ASF incubator status and update readme (#3208)\n\nPer ASF Incubator distribution policy, every artifact published under\napache/iggy must carry the standard incubation disclaimer. Added it\nto 10 publishable READMEs (4 Rust crates + 6 foreign SDKs) and 17\nDockerfiles, plus dedicated READMEs for `iggy`, `iggy_common`,\n`iggy_binary_protocol`, and `iggy-cli`."
    },
    {
      "commit": "5fbeddca49375c35096a38dadde3c164f175820a",
      "tree": "b4673535355cb60a7dbdba7b4db0d251a36a4f05",
      "parents": [
        "87e22a1cc532f401e910ea728164f8a153520595"
      ],
      "author": {
        "name": "Mukunda Rao Katta",
        "email": "mukunda.vjcs6@gmail.com",
        "time": "Fri May 01 05:29:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 14:29:43 2026 +0200"
      },
      "message": "fix(connectors): reject duplicate iggy_sink_open and iggy_source_open (#3179)\n\nThe `sink_connector!` and `source_connector!` macros silently overwrote\nan existing `INSTANCES` entry when `iggy_sink_open` or\n`iggy_source_open` was called twice with the same id. Any in-flight\nbuffered data and the prior task were lost without any signal to the\ncaller. Returning -1 on a duplicate id surfaces the mistake so callers\ndrain or close explicitly first.\nCloses #3168"
    },
    {
      "commit": "87e22a1cc532f401e910ea728164f8a153520595",
      "tree": "9a942eaab3a7a4907ef60469e1822065fbfd2f60",
      "parents": [
        "4f55e95638a721c4c992129379ee4b9b0a1002a8"
      ],
      "author": {
        "name": "matanper",
        "email": "matanper@gmail.com",
        "time": "Fri May 01 15:16:08 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 14:16:08 2026 +0200"
      },
      "message": "feat(go): add delete segments support (#3191)\n\nExpose the delete segments command in the Go SDK so clients can manage\npartition segment cleanup over TCP. Closes #3190"
    },
    {
      "commit": "4f55e95638a721c4c992129379ee4b9b0a1002a8",
      "tree": "66ce6134b3fa03435d8c3fa9af5b4789c7bef486",
      "parents": [
        "842538572f74dca08ad36372102d2856078d3ce1"
      ],
      "author": {
        "name": "Tyooughtul",
        "email": "yooughtul@126.com",
        "time": "Fri May 01 20:09:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 14:09:38 2026 +0200"
      },
      "message": "feat(connectors): implement Avro payload support with separate encoder, decoder and transform crates (#3141)\n\nCloses #1846"
    },
    {
      "commit": "842538572f74dca08ad36372102d2856078d3ce1",
      "tree": "3d03b9875a5011a103fd56bbf79f138679e9a6bb",
      "parents": [
        "611fca04ea63d5087785537add4269a7dbf1f75d"
      ],
      "author": {
        "name": "Anurag",
        "email": "58452562+explise@users.noreply.github.com",
        "time": "Fri May 01 15:20:17 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 11:50:17 2026 +0200"
      },
      "message": "test(csharp): add leader_redirection scenario to BDD tests (#3193)"
    },
    {
      "commit": "611fca04ea63d5087785537add4269a7dbf1f75d",
      "tree": "0f6559f1377301de3bfeb3e450e0af967ee0b288",
      "parents": [
        "9a9254a3aa3c069c81017086c4a4c5c67de7a753"
      ],
      "author": {
        "name": "Alan Tang",
        "email": "jmtangcs@gmail.com",
        "time": "Wed Apr 29 20:43:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 14:43:38 2026 +0200"
      },
      "message": "fix(ci): honor staged file scope in lint hooks (#3188)\n\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e\nd"
    },
    {
      "commit": "9a9254a3aa3c069c81017086c4a4c5c67de7a753",
      "tree": "6204da7c2de20693f43449b2f6d053117e011eed",
      "parents": [
        "57646b233bc0b4f378c8f0c60924fa2bed75efa4"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Apr 29 12:58:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 12:58:06 2026 +0200"
      },
      "message": "ci: bump GitHub Actions to Node.js 24-compatible versions (#3086)"
    },
    {
      "commit": "57646b233bc0b4f378c8f0c60924fa2bed75efa4",
      "tree": "ae070748332b365933acb76c3f9f347a56201ab8",
      "parents": [
        "eb20ac5ae723a2e11b4989342cccfb69706141a3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 29 12:29:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 12:29:24 2026 +0200"
      },
      "message": "chore(deps): bump mako from 1.3.10 to 1.3.11 in /bdd/python (#3137)"
    },
    {
      "commit": "eb20ac5ae723a2e11b4989342cccfb69706141a3",
      "tree": "f06866ca4ab13257126d8ea20298b84cef88be24",
      "parents": [
        "cca0e04e7e2aa17b3abc32228ae8cef8cccfcca8"
      ],
      "author": {
        "name": "Rimuksh Kansal",
        "email": "nihonrk@gmail.com",
        "time": "Wed Apr 29 02:36:00 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 19:36:00 2026 +0200"
      },
      "message": "feat(java): Implement CLI and resource provisioner for pinned producer benchmark (#3159)"
    },
    {
      "commit": "cca0e04e7e2aa17b3abc32228ae8cef8cccfcca8",
      "tree": "8d4406aff6d79d7a03165135fb4e005545f4e7d1",
      "parents": [
        "48a297dfa98eac99525f0129dbde98fb1a5995df"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 28 14:02:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 14:02:05 2026 +0200"
      },
      "message": "feat(configs): add ServerNgConfig schema with message_bus section (#3189)\n\nIntroduces a new on-disk config type ServerNgConfig parallel to the\nlegacy ServerConfig, mirroring its full section surface (consumer_group,\ndata_maintenance, message_saver, personal_access_token, heartbeat,\nsystem, quic, tcp, http, websocket, telemetry, cluster) and adding a\nnew [message_bus] section that captures the runtime tunables previously\nhardcoded in core::message_bus::config::MessageBusConfig.\n\nSection types are reused verbatim from server_config::* (operator-facing\nschema is identical between server and server-ng); only the new\nMessageBusConfig and the top-level composer are net-new code.\n\nThe type defines a loader following ServerConfig::load()\u0027s shape\n(FileConfigProvider + TypedEnvProvider, IGGY_ env prefix,\ninclude_str!(server-ng/config.toml) embedded default) and a Validatable\nimpl that asserts the runtime invariants (max_batch \u003c\u003d IOV_MAX_LIMIT,\npeer_queue_capacity \u003e 0, listen-addr parse-ability) without depending\non core/message_bus.\n\nScaffolding only. No binary calls ServerNgConfig::load(); the wiring\nPR for core/server-ng\u0027s bootstrap and the message_bus crate\u0027s runtime\ntype is intentionally a separate change.\n\ncore/server-ng/config.toml gains a [message_bus] block with defaults\nmatching MessageBusConfig::default() in the runtime crate."
    },
    {
      "commit": "48a297dfa98eac99525f0129dbde98fb1a5995df",
      "tree": "4991b8691b01114ff9d168d1a40a2c42298dda79",
      "parents": [
        "499a26d882efde2c8b41192caea29c03eeb0ed38"
      ],
      "author": {
        "name": "Maciej Modzelewski",
        "email": "maciej@modzelewski.dev",
        "time": "Tue Apr 28 10:06:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 10:06:34 2026 +0200"
      },
      "message": "chore(web): update dependencies (#3185)\n\nCo-authored-by: Grzegorz Koszyk \u003c112548209+numinnex@users.noreply.github.com\u003e"
    },
    {
      "commit": "499a26d882efde2c8b41192caea29c03eeb0ed38",
      "tree": "8f1e619aa63d1bd1ffd52d607a96ea0abfc87991",
      "parents": [
        "e1b1b22a749d44f3550b15535d3da1f8ab5fa0e9"
      ],
      "author": {
        "name": "Kriti Kathuria",
        "email": "38242933+kriti-sc@users.noreply.github.com",
        "time": "Tue Apr 28 01:53:06 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 22:23:06 2026 +0200"
      },
      "message": "feat(connectors): implement Delta Lake Sink Connector (#2889)"
    },
    {
      "commit": "e1b1b22a749d44f3550b15535d3da1f8ab5fa0e9",
      "tree": "03f8b29af46d32ad6738bea43e5ccce422c5894e",
      "parents": [
        "7de9d093f5e5c664fa6dec011608fbe4eb30c2df"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Mon Apr 27 07:10:35 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 14:10:35 2026 +0200"
      },
      "message": "fix(go,csharp): remove duplicate consumer groups in DeserializeClient/MapClient (#3164)"
    },
    {
      "commit": "7de9d093f5e5c664fa6dec011608fbe4eb30c2df",
      "tree": "34449ec69b03c70b70212efd03514f92be1ab168",
      "parents": [
        "868ae629678650f7dd6b5e81d65651a1906fac7d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 27 12:50:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 12:50:10 2026 +0200"
      },
      "message": "chore(deps): bump python-dotenv from 1.2.1 to 1.2.2 in /foreign/python (#3150)"
    },
    {
      "commit": "868ae629678650f7dd6b5e81d65651a1906fac7d",
      "tree": "71cee3c0eb929913be3ceb36c9f8fc454e8495af",
      "parents": [
        "aa4762fd541b5f09771e0543403842f32d29f3e9"
      ],
      "author": {
        "name": "Kranti Parisa",
        "email": "kranti@laserdata.com",
        "time": "Sun Apr 26 14:34:26 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 26 11:04:26 2026 +0200"
      },
      "message": "docs: Add trendshift\u0027s github ranking badge to README (#3170)\n\nCloses #3169"
    },
    {
      "commit": "aa4762fd541b5f09771e0543403842f32d29f3e9",
      "tree": "827f9c80b8d43717624d141526680bdcf489f39f",
      "parents": [
        "037edec4c29ba388fdb2136ee746e1e3cfaa32b1"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Sat Apr 25 12:33:09 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 25 09:03:09 2026 +0200"
      },
      "message": "docs: redesign header with theme-aware logo and SDK badges (#3162)\n\nSummary\n- Replace the text title with a theme-aware logo (`\u003cpicture\u003e` serving\n`iggy-dark.svg` / `iggy-light.svg`)\n- Reorganize badges into an inverted-pyramid layout (build, release,\nper-SDK versions for Rust/npm/PyPI/Maven/NuGet, license, activity stats)\n- Add a LinkedIn social badge and update the Discord vanity URL to\n`discord.gg/apache-iggy`\n- Add a `\"What is Apache Iggy (Incubating)?\"` section heading above the\nintro"
    },
    {
      "commit": "037edec4c29ba388fdb2136ee746e1e3cfaa32b1",
      "tree": "e5a814bc6c6e7f788f186997cea48e4ca36ef527",
      "parents": [
        "0b290b00c5b1469fb3f776682901dfbd816da285"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Fri Apr 24 17:05:44 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 24 13:35:44 2026 +0200"
      },
      "message": "chore(deps): bump ctor, cucumber, libc, rustls + security patches (#3161)"
    },
    {
      "commit": "0b290b00c5b1469fb3f776682901dfbd816da285",
      "tree": "d18c1dee0b4b3c879d6416ebafcf6af2a6320fc4",
      "parents": [
        "9d513d770b680f899c0aeea5b4814938f7340f91"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Fri Apr 24 15:22:45 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 24 11:52:45 2026 +0200"
      },
      "message": "ci(csharp): auto-retry flaky integration tests (#3160)"
    },
    {
      "commit": "9d513d770b680f899c0aeea5b4814938f7340f91",
      "tree": "c469d2c4b300f41ccb112ea50dfdf80d86969699",
      "parents": [
        "7a22ed5b8680a5c872f23731340417e7ee45b812"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Apr 23 12:54:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 23 12:54:32 2026 +0200"
      },
      "message": "feat(message_bus): implement async fire-and-forget transport for VSR consensus (#3134)\n\nThe previous cache/connection.rs was a single-stream blob that\nheld a RefCell\u003cTcpStream\u003e across .await, awaited kernel write\ncompletion in the send path, and serialized fan-out through one\nshared lock. Under VSR pipelining a slow peer stalled sends to\nevery other peer in the same dispatch round, killing parallel\nquorum collection. Reentrant sends to the same peer would also\npanic on BorrowMutError.\n\nRebuilt the crate around a per-connection writer task that\ndrains a bounded async-channel mpsc and submits batches via a\nsingle write_vectored_all syscall, with the dup(2)-split read\nhalf handled by an independent reader task. send_to_* is now\nsync try_send under the async fn shell: zero awaits, returns\nSendError::Backpressure on full so VSR can recover via WAL\nretransmission or view-change timeouts.\n\nThe lifecycle module owns a root Shutdown / ShutdownToken plus\na ConnectionRegistry\u003cK\u003e that tracks the per-peer Sender and\nboth task handles for graceful drain. The directional rule\n(lower id dials, higher id accepts) eliminates the dialed-\nboth-ways race without a tiebreaker. TCP_NODELAY is set on\nevery socket, and Message::into_frozen() removes the per-send\nmemcpy. Three new integration tests prove the architectural\nproperties: backpressure, vectored batching, head-of-line\nfreedom under a saturated peer.\n\ntrack_background early-returns when the shutdown token is\nalready triggered: shutdown drains the background-task vec\nexactly once, so a handle pushed after the drain would be\nleaked. Tasks spawned post-shutdown have already observed the\ncancellation by the time they reach the tracker, so dropping\nthe handle is the right thing.\n\nConsensus, metadata, partitions, shard, and simulator are\nupdated to the new MessageBus shape; core/server is left\nuntouched as legacy code. Cluster config gains the per-node\nfields the bus needs to identify replicas (replica_id,\ntcp_replica port)."
    },
    {
      "commit": "7a22ed5b8680a5c872f23731340417e7ee45b812",
      "tree": "b7317ad32d18e0f2c7d06acbf86d26f0809f354e",
      "parents": [
        "c6ddfb44a2de242dc61fb929793a0bb023c9ae6a"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Thu Apr 23 13:02:56 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 23 09:32:56 2026 +0200"
      },
      "message": "fix(csharp): use OS ephemeral ports in IggyClusterFixture to fix flaky CI (#3155)"
    },
    {
      "commit": "c6ddfb44a2de242dc61fb929793a0bb023c9ae6a",
      "tree": "fc947e921529f90f3e0ecdaf108098349b632824",
      "parents": [
        "51594120992fde1f7a047fd4be9b09596d18cb5c"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Wed Apr 22 19:00:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 15:30:01 2026 +0200"
      },
      "message": "chore: bump Rust to 1.95 (#3153)"
    },
    {
      "commit": "51594120992fde1f7a047fd4be9b09596d18cb5c",
      "tree": "cce88dc0e003ae4840267a5a5a62e0fc0aa7c4e6",
      "parents": [
        "f4222f09c4ab6c54770433013c665d9dafa626ab"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Wed Apr 22 05:23:52 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 12:23:52 2026 +0200"
      },
      "message": "fix(connectors): increase poll budget in fetch_rows_as to fix flaky restart test (#3106)"
    },
    {
      "commit": "f4222f09c4ab6c54770433013c665d9dafa626ab",
      "tree": "8e370b272a72d5982da6e9fd52f476293724afe1",
      "parents": [
        "54fe2bb9f22b455bc29d25cc746c3d2a52469a97"
      ],
      "author": {
        "name": "Alan Tang",
        "email": "jmtangcs@gmail.com",
        "time": "Wed Apr 22 15:57:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 09:57:58 2026 +0200"
      },
      "message": "fix(configs): make environment variable name suggestions deterministic (#3142)"
    },
    {
      "commit": "54fe2bb9f22b455bc29d25cc746c3d2a52469a97",
      "tree": "90ebfd36184738f711f36bcce9601260ce051ad8",
      "parents": [
        "9b0540038533acbfc2eea4d4f4d06dca4f37dd5b"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Apr 21 19:50:29 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 16:20:29 2026 +0200"
      },
      "message": "chore(deps): update workspace dependencies (#3149)"
    },
    {
      "commit": "9b0540038533acbfc2eea4d4f4d06dca4f37dd5b",
      "tree": "292ff9683fc69c702cee2758185b7ccdb24f823c",
      "parents": [
        "ccb5f004d4613058449ea77cb18c609ff71e559e"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Tue Apr 21 14:17:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 14:17:40 2026 +0200"
      },
      "message": "fix(bench): fix mobile layout, compare URL, and shared branded loader (#3148)\n\nMobile detail view went blank because a desktop\n`.sidebar-collapsed` rule left the grid with two columns but only\none area; Compare URL reverted to `/benchmarks/:uuid` because\n`SingleChart` force-pushed history on prop change; loading states\nwere inconsistent and the pre-WASM splash jumped when the app\nmounted.\n\nMobile rules moved to end-of-file so they win the cascade, both\n`.detail-layout` and `.sidebar-collapsed` share one mobile grid,\nand below 768px html/body/app-shell drop their 100vh locks so the\npage scrolls naturally. `SingleChart` no longer writes history. A\nshared `IggyLoader` replaces the legacy spinner, and the boot\nsplash is a position-fixed overlay centered the same way the hero\nloading is. PNG logos (870 KB) swapped for SVG (21 KB). Row\nselect + compare are now sibling buttons, so clicking compare\nnever triggers the row\u0027s select handler."
    },
    {
      "commit": "ccb5f004d4613058449ea77cb18c609ff71e559e",
      "tree": "e26c6c738fbe8350268c29b30f6e069fa0f5afa8",
      "parents": [
        "832c34164f995dcb5d622213869c5a5e2527e296"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Tue Apr 21 11:57:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 11:57:54 2026 +0200"
      },
      "message": "fix(bench): anchor hero display to showcase pick, fix gitref links (#3147)\n\nHero headline read hardware from stale context and name from\nthe sweep\u0027s peak-throughput benchmark, so displayed fields\noften didn\u0027t match the tail chart or \"View details\" target.\n\nRoute all hero headline fields through a single\n`showcase_display` helper sourced from the same pick that\ndrives the chart and detail link. Gitref URL now prefixes\n`server-` only for parseable semver tags; raw commits link\nunmodified (iggy releases tag as `server-X.Y.Z`, commits do\nnot)."
    },
    {
      "commit": "832c34164f995dcb5d622213869c5a5e2527e296",
      "tree": "3f371f7de538cd4cf5720e9a3174ac3fb58bef68",
      "parents": [
        "572b5ba3a66ea178777645f651342bcb9bc67d8b"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Tue Apr 21 11:17:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 11:17:05 2026 +0200"
      },
      "message": "refactor(bench): unify benchmarks list and fix best-pick selection (#3146)\n\nThe dual-mode sidebar (Version vs Recent) bred a cascade of\nrouting bugs, and the hero picked a year-old run because\n`max_by(throughput)` had no time window.\n\nCollapse the two scopes into one `/api/recent`-backed list where\nhardware and gitref are plain filter dropdowns, AND-combined with\nkind chips, sort, search, and param ranges. No scope state means\nno race conditions: the sidebar fetches once, URL is authoritative.\n\nHero showcase now uses `latest_sweep`, which groups by\n(hardware, gitref) of the newest-timestamp run and ranks by lowest\nP99 → P99.9 → P99.99 → highest throughput (NaN-safe). While\nloading, a branded pulsing Iggy mark replaces placeholder copy.\nGitref pill links to apache/iggy at that commit, both on the\nlanding and the detail title. A top-bar share button copies the\ncurrent URL so users don\u0027t grab the address bar."
    },
    {
      "commit": "572b5ba3a66ea178777645f651342bcb9bc67d8b",
      "tree": "1ad3c90ee3c4cdfe55a4765446e5eb72937a4109",
      "parents": [
        "36307999b27c3904248d1a414d3706a25404e6cd"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Tue Apr 21 09:40:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 09:40:28 2026 +0200"
      },
      "message": "feat(bench): redesign benchmarks dashboard with landing + compare mode (#3145)\n\nThe previous dashboard was a flat tabs-and-list layout that buried\ninformation, had no side-by-side compare, rendered detail charts\nwith no landing context, and sometimes picked the worst run as\n\"best\" (max-by p99 instead of min-by p99).\n\nReshaped around URL-as-source-of-truth routing (`/`,\n`/benchmarks/:uuid`, `/compare/:a/:b`) with a CSS Grid app-shell:\nunified top bar, dense searchable sidebar (scope toggle, hardware/\ngitref, kind chips, sort, range filters), collapsible benchmark-\nmeta chips, and a hero landing with animated tail chart plus stat\ncards. Compare mode pins a second benchmark into side-by-side\npanes with swap/exit.\n\nAlong the way: best-run picker now takes lowest p99 within a ±2h\nwindow with throughput tiebreak and NaN-safe ordering; selection\nretention across hardware/gitref uses UUID to preserve compare\nURLs; a generation counter prevents stale route fetches from\nclobbering newer state; spawn_local tasks cancel on unmount;\npopups auto-close on selection change; sidebar reacts to window\nresize."
    },
    {
      "commit": "36307999b27c3904248d1a414d3706a25404e6cd",
      "tree": "9a77365fdb79d5aedb30fb055695cc9074b90c8b",
      "parents": [
        "2d6562b7fd242a36bdf57a231a836bc6b80d6107"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Mon Apr 20 11:38:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 11:38:07 2026 +0200"
      },
      "message": "feat(consensus): impl consensus group mechanism (#3138)\n\nAdd `consensus_group` field, required to distinguish between different\ninstances of consensus that are stored in `metadata` and `partition`."
    },
    {
      "commit": "2d6562b7fd242a36bdf57a231a836bc6b80d6107",
      "tree": "b14fb10c21f9de40f0a5f4e874dbc4506a5608fa",
      "parents": [
        "6d445213d83e779dda066a7eed68242910879e1f"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Fri Apr 17 12:45:44 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 09:15:44 2026 +0200"
      },
      "message": "feat(consensus): add session registration protocol with combined login+register (#3108)\n\n\n- Add `Operation::Register` as a VSR-level operation that goes through\nconsensus to create durable client sessions, giving each client a\ndeterministic session number (\u003d commit op number) agreed upon by all\nreplicas.\n- Add `session` field to `RequestHeader` with wire-layer validation:\nregister requires `session\u003d0, request\u003d0`; all other operations require\n`session\u003e0, request\u003e0`.\n- Split `ClientTable` into session-aware paths: `check_register()` /\n`commit_register()` for registration, and `check_request()` /\n`commit_reply()` with session + strict request monotonicity validation\n(`NoSession`, `SessionMismatch`, `RequestGap).\n- Add `ConsensusSession` (SDK) for client-side session lifecycle and\n`SessionManager` (server-ng) for transport-to-consensus bridging.\n- Add combined `login_register` handler: phase 1 verifies credentials\nlocally, phase 2 submits register through consensus.\n- Add `RequestFrame2`/`ResponseFrame2` with `request_id` for\nrequest-response correlation and pipelining support."
    },
    {
      "commit": "6d445213d83e779dda066a7eed68242910879e1f",
      "tree": "6fa71c83194f2e29358a2957768d49de22baf489",
      "parents": [
        "f5350d999d883fd3ca9dd33b3dc2754ddb0df049"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Apr 16 21:45:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 21:45:44 2026 +0200"
      },
      "message": "feat(partitions): add consensus per partition and extra (#3071)\n\nImplement `StoreConsumerOffset` and `DeleteConsumerOffset` as replicated\noperations on partition. Additionally move `partitions` to an consensus\nper partition model, rather than relying on one instance of consensus\nfor all of the partitions."
    },
    {
      "commit": "f5350d999d883fd3ca9dd33b3dc2754ddb0df049",
      "tree": "0d6dcaf544588d3c0a54fe131a6de78b025eef14",
      "parents": [
        "735e1fce1523f2b9ca24a958564fbd19b88080a1"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Tue Apr 14 21:32:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 21:32:22 2026 +0200"
      },
      "message": "chore(sdk): update rust client to 0.10.0 (#3126)"
    },
    {
      "commit": "735e1fce1523f2b9ca24a958564fbd19b88080a1",
      "tree": "a8d0ee3e31d52e42ebf19f55765c1e2ec19873e3",
      "parents": [
        "3e0c9e438fe30d63f33a2d3768be90cdd4848465"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 14 20:08:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 20:08:40 2026 +0200"
      },
      "message": "fix(ci): harden publish pipeline (#3125)\n\nFollow-up to #3124 plus review-round fixes on the release chain.\n\nNarrow cargo publish continue-on-error to the \"already uploaded\"\nclass; capture stderr to a tempfile instead of a process-sub tee\nthat raced the classifier. Make `commit` required in the rust\npublish reusable workflow and re-verify master-ancestry so direct\nworkflow_call callers cannot bypass the check. Bring wait-for-crate\ncurl up to wait-for-url parity and switch to `jq -Rr \u0027fromjson?\u0027`\nso malformed NDJSON survives pipefail. Fail-fast on wrong-target\ntags; render them distinctly and keep rendering under\nskip_tag_creation\u003dtrue, gating only exit 1. Cache cargo metadata\nonce per job via \\$GITHUB_ENV so the four post-merge composite\nValidate steps reuse it. Consolidate the pre-release vocabulary\nbehind \\`extract-version.sh --is-pre-release\\` so post-merge.yml and\npublish.yml no longer diverge on \\`.devN\\` / bare \\`rcN\\`. Retune the\nidempotency pre-check to initial_sleep\u003d1 and rewrite the two-layer\nwait comment with correct budgets (~8 min inner, ~28 min outer).\nIncludes the Maven \\`continue-on-error\\` carve-out on publish.yml\u0027s\nCentral wait step, rationale documented in-tree above the step."
    },
    {
      "commit": "3e0c9e438fe30d63f33a2d3768be90cdd4848465",
      "tree": "3019d469ba5d3398b5b7383895776473b050709d",
      "parents": [
        "01d4dd94e324c3fee60b958404b2a13431ad0977"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Tue Apr 14 09:23:19 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 16:23:19 2026 +0200"
      },
      "message": "fix(go): correct buffer size for CreateUser and UpdatePermissions serialization (#3097)\n\nThe Go SDK\u0027s `CreateUser` and `UpdatePermissions` commands had incorrect\nbuffer size calculations for the `has_permissions` flag byte, causing a\n1-byte over-allocation in `CreateUser` (non-nil path) and an\nindex-out-of-bounds panic in `UpdatePermissions` (nil path).\n\nCloses #2981"
    },
    {
      "commit": "01d4dd94e324c3fee60b958404b2a13431ad0977",
      "tree": "6c9a8b891be447bce0bc35a4f5148c435b20e5f4",
      "parents": [
        "170bbee1615e4ddf29a38aefc0c1214de2d64d12"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 14 12:48:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 12:48:35 2026 +0200"
      },
      "message": "fix(ci): gate release tags on proven registry availability (#3124)\n\nReleases must not push a git tag until the target registry is\nactually serving the artifact, and reruns must converge instead\nof leaving half-published state behind. Today cargo search is\nthe availability oracle (rate-limited, laggy, and --limit 1\nreturns a relevance-ranked hit rather than an exact match),\nthe foreign-SDK matrix pushes tags with no wait gate at all,\nand create-git-tag\u0027s early-skip silently accepts a pre-existing\ntag at the wrong commit.\n\nA new wait-for-crate composite queries the crates.io sparse\nindex directly (CDN-fronted, unrate-limited, authoritative as\nof cargo publish return) and is reused at max_attempts\u003d1 as\nthe rust/post-merge idempotency pre-check so reruns skip\nalready-published crates cleanly. A new wait-for-url composite\ngates every foreign-SDK tag step on HTTP 200 from its registry\n(PyPI, npm, Maven Central with ~25 min propagation budget,\nNuGet); Go stays tag-only. create-git-tag\u0027s early-skip now\npeels the remote ref and compares against the requested commit,\nso a wrong-target tag is a hard failure with recovery commands\ninline. The tag input regex now accepts semver build metadata.\n\nPlus smaller tightenings: env: indirection on every run block\nin rust/post-merge; dry_run kept there as a deprecated short-\ncircuiting input so forks pinning by SHA do not silently start\nreal-publishing; check-tags queries the remote; and\n_publish_rust_crates.yml requires non-empty inputs.commit\ninstead of bypassing master-ancestry via a github.sha fallback."
    },
    {
      "commit": "170bbee1615e4ddf29a38aefc0c1214de2d64d12",
      "tree": "8b453e066e2dbda53d4e6ec22f8853dd972e74ab",
      "parents": [
        "f2dbabdcc47bcdbb8660a6d7bad43f2534e0837f"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Apr 14 15:02:30 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 11:32:30 2026 +0200"
      },
      "message": "chore(deps): update workspace dependencies (#3123)"
    },
    {
      "commit": "f2dbabdcc47bcdbb8660a6d7bad43f2534e0837f",
      "tree": "53f1e388575c4643ee48acf43f91a2a565e1fa1c",
      "parents": [
        "b956a5d39deff9c212f4156ba2871b83540dd3b3"
      ],
      "author": {
        "name": "Paul Iyobo",
        "email": "34284755+pauliyobo@users.noreply.github.com",
        "time": "Tue Apr 14 10:56:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:56:10 2026 +0200"
      },
      "message": "fix(cli): Ensure home directory exists when writing contexts (#3069)"
    },
    {
      "commit": "b956a5d39deff9c212f4156ba2871b83540dd3b3",
      "tree": "40294bad525f3fe8d9bc6acc2b6d805921e4db1a",
      "parents": [
        "f551f5e97eda9876c106a26351189327002c3182"
      ],
      "author": {
        "name": "Ryan Huang",
        "email": "ryankert01@gmail.com",
        "time": "Tue Apr 14 16:39:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:39:11 2026 +0200"
      },
      "message": "fix(docs): remove unsupported verbosity in benchmark command examples (#3114)"
    },
    {
      "commit": "f551f5e97eda9876c106a26351189327002c3182",
      "tree": "af66fa58d892b0cc03553fce1a4b0d76770db97a",
      "parents": [
        "08be9a637dbf22af4978ff1e08e9a6acfb27c4d2"
      ],
      "author": {
        "name": "Maciej Modzelewski",
        "email": "maciej@modzelewski.dev",
        "time": "Tue Apr 14 10:29:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:29:28 2026 +0200"
      },
      "message": "deps(python): bump pytest minimum to 9.0.3 (#3122)\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "08be9a637dbf22af4978ff1e08e9a6acfb27c4d2",
      "tree": "d1358ac24bcaf27ffc86b4bab00f94430f97211f",
      "parents": [
        "8568bcbae71399453dc8423ef0d76f6151f6e308"
      ],
      "author": {
        "name": "Aviraj Khare",
        "email": "49766964+avirajkhare00@users.noreply.github.com",
        "time": "Tue Apr 14 13:47:22 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:17:22 2026 +0200"
      },
      "message": "feat(helm): add helm-docs, yamllint, and helmfmt for chart quality (#3070)"
    },
    {
      "commit": "8568bcbae71399453dc8423ef0d76f6151f6e308",
      "tree": "bd243439e2a75635a62c222283d2374006e0ae8f",
      "parents": [
        "54c60a827fc208ed6708a6f19c39d47125cc77e7"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 14 10:04:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:04:23 2026 +0200"
      },
      "message": "chore: bump iggy-web-ui to 0.3.0 (#3121)"
    },
    {
      "commit": "54c60a827fc208ed6708a6f19c39d47125cc77e7",
      "tree": "ed1d3f9bae00cd543ceb48b9c517197a223ff61b",
      "parents": [
        "35f6f06a4d05d607c553b5e2f6514b4253d32a98"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Apr 14 13:21:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 09:51:03 2026 +0200"
      },
      "message": "fix(test): replace log-based container readiness checks with HTTP healthcheck endpoints (#3093)"
    },
    {
      "commit": "35f6f06a4d05d607c553b5e2f6514b4253d32a98",
      "tree": "6e4cd0a95dbe7ef4dc13107ce49d256ed00d46df",
      "parents": [
        "5fef170dc7eaa48254265fb1f958e1741f9683e1"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 14 09:35:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 09:35:44 2026 +0200"
      },
      "message": "feat(ci): harden Rust crate publish chain after rc1 incident (#3111)\n\nApache Iggy 0.8.0 rc1 had to be cancelled because its crates.io\npublish failed in five compounding ways: a path-only workspace dep\nwithout a `version \u003d` field broke `cargo publish`; the publish\norder in CI was inverted (iggy_common ran before its dependency\niggy_binary_protocol); the wait-for-index loops silently fell\nthrough on timeout, racing later steps against an unresolved dep;\ngit tags were created inline with the publish job, leaving zombie\ntags whenever a mid-chain step failed; and PR CI had no mechanism\nto catch any of this before merge. Each one was load-bearing on\nits own; together they made the failure invisible until release\nday. This change closes every one of those gaps in a single PR\nso they cannot reappear independently.\n\nMark every workspace member that is not published to crates.io\nas `publish \u003d false`. Only four crates (iggy_binary_protocol,\niggy_common, iggy, iggy-cli) are uploaded by CI; the remaining\n36 are docker images, internal libraries, tests, examples and\nbenchmarking tools. Setting `publish \u003d false` documents the\nintent and protects against `cargo publish --workspace` and\nsimilar bulk tooling.\n\nAdd `scripts/verify-crates-publish.sh`, a self-contained shell\nscript invokable by both developers and CI. It spins up\ncargo-http-registry on 127.0.0.1, patches the four workspace\ndeps to target the local registry, and runs `cargo publish`\non each crate in topological order. A trap reverts the patch,\nremoves the scratch `.cargo/config.toml` and stops the registry\non exit. The script catches the exact rc1 bug class: a missing\n`version \u003d` on a path dep fails `cargo publish` with\n`dependency X does not specify a version`, exactly as crates.io\nwould reject it. Validated locally on both the success path and\na synthetic regression."
    },
    {
      "commit": "5fef170dc7eaa48254265fb1f958e1741f9683e1",
      "tree": "9026eaa2af2472cbee39ac9dcf90de67cffb74a9",
      "parents": [
        "56a40445a9fa2f839c30812d148aea820f285842"
      ],
      "author": {
        "name": "Chengxi Luo",
        "email": "chengxi.luo2004@gmail.com",
        "time": "Tue Apr 14 03:08:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 09:08:52 2026 +0200"
      },
      "message": "fix(go): update stats field and its deserialization logic to align with rust SDK (#3032)"
    },
    {
      "commit": "56a40445a9fa2f839c30812d148aea820f285842",
      "tree": "6d493c5494939a88149e1d2209160c63840d48c9",
      "parents": [
        "4f9d9ce7752b0cc381f1b36d25a32df82ceeaa78"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Tue Apr 14 09:01:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 09:01:33 2026 +0200"
      },
      "message": "chore(go): update sdk dependencies (#3115)"
    },
    {
      "commit": "4f9d9ce7752b0cc381f1b36d25a32df82ceeaa78",
      "tree": "2074998137f647985200358cd6fc47a5883dd1a6",
      "parents": [
        "aa34566031b48c3a51abe7387bb40fb3e19ac493"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Apr 14 12:08:10 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 08:38:10 2026 +0200"
      },
      "message": "fix(ci): fix DAG-scoped builds for connector plugins and multi-crate PRs (#3120)\n\nThe DAG-scoped build filter selected packages with `\"bin\"` targets but\nmissed `\"cdylib\"` targets, so connector plugin `.so` files (e.g.\n`libiggy_connector_http_sink.so`) were never compiled."
    },
    {
      "commit": "aa34566031b48c3a51abe7387bb40fb3e19ac493",
      "tree": "71f38c3a23455ebeeb08abcf97a5186163ce3a2e",
      "parents": [
        "d4cdfcaf883f91cd08b76a596977c63106ea771f"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Apr 14 02:43:26 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 23:13:26 2026 +0200"
      },
      "message": "fix(ci): include binary packages in DAG-scoped builds for CARGO_BIN_EXE support (#3113)"
    },
    {
      "commit": "d4cdfcaf883f91cd08b76a596977c63106ea771f",
      "tree": "55e7bfa5c6edea37c4627bcc45b9d9a192a2c076",
      "parents": [
        "5a2939a17c465612808a174f8ac4cc689dbcc5eb"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Apr 13 18:34:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 18:34:41 2026 +0200"
      },
      "message": "fix(sdk): inline iobuf into iggy_binary_protocol (#3110)\n\n0.8.0 rc1 passed both PPMC and IPMC votes, then cargo publish\nrevealed the iobuf crate could not reach crates.io: the name\n\"iobuf\" is already owned by an unrelated v5.8.1 crate.\n\nPublishing the workspace copy under a new name (iggy_iobuf) was\nrejected because it would commit the project to SemVer stability\non ~485 LoC of refcounted unsafe code with zero tests, zero docs,\nand a latent refcount-underflow UAF masked by debug_assert!.\n\nMove core/iobuf/src/lib.rs verbatim into\ncore/binary_protocol/src/consensus/iobuf.rs, delete the standalone\ncrate, and update every consumer to import through\niggy_binary_protocol::consensus::iobuf. The implementation is\nbyte-for-byte unchanged; the existing lint debt is suppressed at\nthe module declaration and tracked for a 0.9.x cleanup pass.\n\nAlso close the SemVer leak:\niobuf types were reachable through iggy_common\u0027s public API via\nFrozenBatchHeader and a `pub use send_messages2::*` wildcard\nre-export. Demote FrozenBatchHeader to pub(crate), drop the\nwildcard (no external consumers relied on it), and seal\nFragmentedBacking so downstream crates cannot implement it and\npull Frozen\u003cMESSAGE_ALIGN\u003e into their own signatures.\n\nThe publish chain drops from 5 crates to 4:\niggy_binary_protocol -\u003e iggy_common -\u003e iggy -\u003e iggy-cli."
    },
    {
      "commit": "5a2939a17c465612808a174f8ac4cc689dbcc5eb",
      "tree": "3aa8a55d6c9aeb3bc096427f61b411722730cdbb",
      "parents": [
        "44eea40972c345885b6ddfedfe81efedd146171f"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Mon Apr 13 20:08:24 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 16:38:24 2026 +0200"
      },
      "message": "feat(ci): dependency-DAG-based test scoping for Rust CI (#3095)\n\n## Which issue does this PR close?\n\nCloses #3094\n\n## Summary\n\n- Use `cargo-rail` to compute affected crates via the workspace\ndependency DAG, then scope cargo build and `cargo nextest` run to only\nthose crates\n- Fix two detection blind spots: `core/iobuf and `core/server-ng` were\nnot covered by any component in `components.yml`\n- Split `rust-simulator` out of `rust-cluster` so simulator-only changes\ndon\u0027t trigger Python/Node/Go/Java/C# SDK tests"
    },
    {
      "commit": "44eea40972c345885b6ddfedfe81efedd146171f",
      "tree": "26b477bf30ebdefc3b3bb5589f9597ddf9a7afac",
      "parents": [
        "afd328fcbe5be8133a460b202f927578ccb1872f"
      ],
      "author": {
        "name": "Maciej Modzelewski",
        "email": "maciej@modzelewski.dev",
        "time": "Mon Apr 13 15:48:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 15:48:04 2026 +0200"
      },
      "message": "chore: add third-party attribution for bundled Gradle Wrapper (#3109)\n\nApache License requires attributing bundled third-party\ncomponents. The Gradle Wrapper files shipped in the Java\nSDK and BDD/example projects were not listed.\n\nAppend a SUBCOMPONENTS section to both root and\nforeign/java LICENSE files crediting the Gradle Wrapper\nwith its upstream Apache 2.0 license."
    },
    {
      "commit": "afd328fcbe5be8133a460b202f927578ccb1872f",
      "tree": "dca3fb02a20d415f9d7df4ec5c0557228da0f6be",
      "parents": [
        "fcc5a447dcc2cca8f8823168eaca9760f558fd09"
      ],
      "author": {
        "name": "Tung To",
        "email": "72777913+tungtose@users.noreply.github.com",
        "time": "Mon Apr 13 17:30:34 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 12:30:34 2026 +0200"
      },
      "message": "fix(ci): fix comfy table problem when building WASM targets (#3107)"
    },
    {
      "commit": "fcc5a447dcc2cca8f8823168eaca9760f558fd09",
      "tree": "ad06af46447596fc4f23db7e14e70aef8a434cae",
      "parents": [
        "af9273081b6f0771a48e4b58ec08f1d513bb271c"
      ],
      "author": {
        "name": "Tung To",
        "email": "72777913+tungtose@users.noreply.github.com",
        "time": "Mon Apr 13 13:45:41 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 08:45:41 2026 +0200"
      },
      "message": "feat(bench): prettier table output (#3090)"
    },
    {
      "commit": "af9273081b6f0771a48e4b58ec08f1d513bb271c",
      "tree": "cd0615cd95b94a44378fa8560968ab36245e1ea9",
      "parents": [
        "27f0f11c65f5289bda2f67d9cf95526a87121aa3"
      ],
      "author": {
        "name": "omnitrix",
        "email": "gaobowei.ovo@gmail.com",
        "time": "Sat Apr 11 05:16:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 11 14:16:34 2026 +0200"
      },
      "message": "fix(connectors): support default credential provider chain for iceberg sink (#3045)"
    },
    {
      "commit": "27f0f11c65f5289bda2f67d9cf95526a87121aa3",
      "tree": "41e83eafad8679f3ae6cbd684c6639a503fdc399",
      "parents": [
        "e7be6ddd1f5dff848c0ccc087cfb37d4119e6aaa"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Fri Apr 10 16:38:24 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 13:08:24 2026 +0200"
      },
      "message": "feat(consensus): wire up view change protocol in simulator (#3092)\n\n- Dispatch all VsrAction variants (SVC/DVC/SV/PrepareOk/Commit from tick\nand incoming message handlers.\n- Add CommitMessage heartbeat: primary periodically sends commit point\nto backups.\n- Integrate consensus tick into Simulator::step().\n- Add RebuildPipeline action with primary self-ack so quorum be reached\nafter view change."
    },
    {
      "commit": "e7be6ddd1f5dff848c0ccc087cfb37d4119e6aaa",
      "tree": "7a00b1cbe7793086e245f96cf09068b9a94a6eb6",
      "parents": [
        "70b8d361d35b672c8c8fa6b7fd89d623fcd88160"
      ],
      "author": {
        "name": "Tyooughtul",
        "email": "yooughtul@126.com",
        "time": "Fri Apr 10 16:43:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 10:43:26 2026 +0200"
      },
      "message": "feat(server): support A2A protocol (#2656)\n\nA2A protocol requires JWKS support to enable secure agent authentication\nwith multiple identity providers. This change allows agents from\ndifferent tenants to authenticate using their own public keys, and\nsupports key rotation without requiring server restarts.\n\nCloses #1762"
    },
    {
      "commit": "70b8d361d35b672c8c8fa6b7fd89d623fcd88160",
      "tree": "71b3871d267e1ef97a98b75577f1cc2caa2b3afd",
      "parents": [
        "051475a765e5631e12e9323a0f08046dbd5205fe"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Apr 08 21:18:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 21:18:31 2026 +0200"
      },
      "message": "chore(security): fix Dependabot security vulnerabilities (#3087)\n\npicomatch \u003c4.0.4 allowed method injection in POSIX\ncharacter classes causing incorrect glob matching\n(GHSA alert #160). brace-expansion \u003c5.0.5 allowed\nzero-step sequences to hang the process.\n\nAlso bumps testcontainers-go v0.32.0 -\u003e v0.41.0\n(and transitives: docker/docker v28.5.2,\ngolang.org/x/crypto v0.48.0, klauspost/compress\nv1.18.2)."
    },
    {
      "commit": "051475a765e5631e12e9323a0f08046dbd5205fe",
      "tree": "0d9b63cb86300ff30a56278341e6f7deefc74a2b",
      "parents": [
        "52b19863732551c2f5087f8915a919d9f44abfa0"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 07 16:47:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 16:47:56 2026 +0200"
      },
      "message": "revert(test): remove shared_server, add nextest CI retries (#3088)"
    },
    {
      "commit": "52b19863732551c2f5087f8915a919d9f44abfa0",
      "tree": "c48ad13387bbb4343febb93353905cd8e3fbf67a",
      "parents": [
        "2afeaa3ff19bee422a4831713caaf97ed5be0243"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Apr 07 17:15:20 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:45:20 2026 +0200"
      },
      "message": "feat(consensus): add ClientTable with WAL-backed commit path and view-change safety (#3023)"
    },
    {
      "commit": "2afeaa3ff19bee422a4831713caaf97ed5be0243",
      "tree": "bd5bba80a535c2c91476bbc4e3471a79e9b472ef",
      "parents": [
        "a1e2cb95b7cdea994b308de9dd3ea8b5582b0ad5"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 07 13:32:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:32:26 2026 +0200"
      },
      "message": "feat(test): add shared_server to iggy_harness for server reuse across tests (#3085)\n\nConnector integration tests each spawn their own iggy-server,\ncausing resource contention and timing-sensitive CI failures\n(e.g. WireMock not receiving requests within retry limit).\n\nAdd a `shared_server \u003d \"key\"` attribute to #[iggy_harness]\nthat lets tests with the same key share a single iggy-server\nprocess. Tests within a group run serially via\n#[serial_test::serial(key)], groups run in parallel with\neach other. Each test still gets its own connector runtime,\nfixtures, and clients - only the server is shared.\n\nIdempotent seed functions (connector_stream_idempotent)\nskip creation if stream/topic already exists, allowing\nserial tests to safely reuse the same server state.\n\nInfrastructure:\n- SharedServerRegistry (DashMap + tokio::sync::OnceCell)\n  for thread-safe lazy server initialization\n- Atomic refcounting for lifecycle: last test stops server\n  and cleans up (preserved on failure for debugging)\n- TestHarness::from_shared() + start_shared_with_seed()\n- Compile-time validation rejects incompatible combinations\n  (\u0026mut TestHarness, config overrides, cluster, TLS)\n\nMigrates 113 connector tests across 18 files. Three restart\ntests using \u0026mut TestHarness remain on dedicated servers."
    },
    {
      "commit": "a1e2cb95b7cdea994b308de9dd3ea8b5582b0ad5",
      "tree": "1d04be86d4dff413729436178413e78b49ad3aa2",
      "parents": [
        "ac9342cb237155ded9a4c5d6ef92afb18dd8914f"
      ],
      "author": {
        "name": "Chengxi Luo",
        "email": "chengxi.luo2004@gmail.com",
        "time": "Tue Apr 07 04:32:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 10:32:55 2026 +0200"
      },
      "message": "chore(go): delete redundant script run_tcp_e2e.sh (#3065)"
    },
    {
      "commit": "ac9342cb237155ded9a4c5d6ef92afb18dd8914f",
      "tree": "3b377840083df16d96ed2bad853e35d1d174f126",
      "parents": [
        "b05ffa3985e2a2f5cc4f2a06766426d767ec4af1"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Apr 07 10:14:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 10:14:22 2026 +0200"
      },
      "message": "chore(deps): bump hwlocality and passterm, fix non-tty password read (#3084)"
    },
    {
      "commit": "b05ffa3985e2a2f5cc4f2a06766426d767ec4af1",
      "tree": "4e6a0d48baef916c60a5e5921438481158ab75bf",
      "parents": [
        "2284d0fd3cb2b53c89657d97d8ecf946f1654a06"
      ],
      "author": {
        "name": "Faisal Ahmed",
        "email": "42486737+felixfaisal@users.noreply.github.com",
        "time": "Tue Apr 07 12:48:16 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 09:18:16 2026 +0200"
      },
      "message": "fix(sdk): allow hostnames in server address configuration (#2923)"
    },
    {
      "commit": "2284d0fd3cb2b53c89657d97d8ecf946f1654a06",
      "tree": "392e1850fd889937e91cda46ebcbadc1a257929e",
      "parents": [
        "93443b17988731066c4ad6b715f05cd58056cdab"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Apr 07 08:29:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 08:29:43 2026 +0200"
      },
      "message": "chore(deps-dev): bump vite from 7.3.1 to 7.3.2 in /web (#3083)"
    },
    {
      "commit": "93443b17988731066c4ad6b715f05cd58056cdab",
      "tree": "82911edabded2a401ce342f090fe4e787dc3bfdf",
      "parents": [
        "55117986ef54c72833dec8b33f4509d042b6284b"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Mon Apr 06 16:42:26 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 13:12:26 2026 +0200"
      },
      "message": "fix(test): Fix Elasticsearch container readiness check to use HTTP health check (#3079)\n\nCloses #3078\n\n## Summary\n- Replace unreliable `WaitFor::message_on_stdout(\"started\")` with\n`HttpWaitStrategy` `on /_cluster/health`, matching the pattern from\n#3077 (Iceberg fix)\n- Remove redundant fixture health check loops in both sink and source\nfixtures, since the container startup now guarantees ES is healthy\n- Reduce excessive sleep durations and poll attempts in source tests"
    },
    {
      "commit": "55117986ef54c72833dec8b33f4509d042b6284b",
      "tree": "17a301118c9c3d8b403c9c4ef06f79b909df901a",
      "parents": [
        "7fca0f2d3a3c4a0f53b63e60af176c574683a3d2"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Mon Apr 06 11:53:58 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 08:23:58 2026 +0200"
      },
      "message": "fix(test): Fix Iceberg container readiness check to use HTTP health check (#3077)\n\nCloses #3076"
    },
    {
      "commit": "7fca0f2d3a3c4a0f53b63e60af176c574683a3d2",
      "tree": "4933e553ddf4e52ba22c703e3dffea07fdae05b7",
      "parents": [
        "e39d02850968ee17bda55ac2027275bf12e53f8b"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Fri Apr 03 23:25:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 23:25:43 2026 +0200"
      },
      "message": "chore(repo): bump all components minor version (#3073)"
    },
    {
      "commit": "e39d02850968ee17bda55ac2027275bf12e53f8b",
      "tree": "0eae2778d6abdcac5b9671cf1227bf4c4a69e79e",
      "parents": [
        "b19daa9fddba4672e8bf3236edf2328fb642bdf4"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Fri Apr 03 22:15:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 22:15:11 2026 +0200"
      },
      "message": "chore(deps): update workspace dependencies (#3072)"
    },
    {
      "commit": "b19daa9fddba4672e8bf3236edf2328fb642bdf4",
      "tree": "50283d76d83440913a3bd5791cd395acdd502696",
      "parents": [
        "cea344cd8837f75e32f24f2ad3aaa315b60b12f5"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Thu Apr 02 14:38:34 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 11:08:34 2026 +0200"
      },
      "message": "feat(server-ng): create iggy-server-ng binary crate (#3053)"
    },
    {
      "commit": "cea344cd8837f75e32f24f2ad3aaa315b60b12f5",
      "tree": "17909402b20dde3a261e1a3f4299e1564165291d",
      "parents": [
        "702c9b3e55c215d9578a0858e90d982977e68208"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Apr 02 09:41:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 09:41:12 2026 +0200"
      },
      "message": "refactor(server,sdk): replace ServerCommand/BytesSerializable with wire types (#3041)\n\nThe binary protocol layer had three redundant serialization\npaths: ServerCommand enum + binary_mapper (hand-rolled\ncommand dispatch), BytesSerializable trait (domain type\nserialization), and WireEncode/WireDecode (wire protocol\ntypes). All three did the same job with different APIs.\n\nThis PR collapses them into one: wire types flow from\ntransport through shard dispatch to handlers. The\nServerCommand enum, binary_mapper, 45+ command structs,\nand BytesSerializable trait are deleted entirely.\n\nChanges:\n- Route wire types through ShardRequestPayload and SDK\n  binary impls, eliminating ServerCommand dispatch\n- Delete 45+ command structs from iggy_common/commands/,\n  replace with thin HTTP DTOs in iggy_common/http/\n- Switch WAL (EntryCommand/StateEntry) to WireEncode/\n  WireDecode, delete BytesSerializable from WAL path\n- Remove all 21 BytesSerializable impls and delete the\n  trait itself\n- SDK poll/send now use PollMessagesRequest and\n  SendMessagesEncoder (zero-copy) instead of\n  intermediate BytesSerializable allocations\n- Add wire conversion functions and response-to-domain\n  conversions in wire_conversions.rs"
    },
    {
      "commit": "702c9b3e55c215d9578a0858e90d982977e68208",
      "tree": "9fff339389175a37b1c3414e7d10fbc9bf2efd32",
      "parents": [
        "50fe8ec7747ca149993687d9ad5f53d73023ca79"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Thu Apr 02 02:15:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 22:45:01 2026 +0200"
      },
      "message": "feat(simulator): wire Network into tick loop with per-replica outboxes and replica_crash (#3049)\n\n## Summary\n\n- Replace shared `MemBus` FIFO queue with per-replica `SimOutbox`\ninstances that stage outbound messages locally\n- Wire `PacketSimulator`-backed `Network` into the simulator tick loop\nfor delivery with configurable delay, loss, and partitioning\n- Add `replica_crash()` which disables network links, discards outbox,\ntracks crashed nodes via `HashSet\u003cu8\u003e`\n\nImplements the outbox-only architecture from #3017. `replica_restart` is\ndefered since it requires consensus durability support that does not yet\nexist.\n\nCloses #3048\n\n---------\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "50fe8ec7747ca149993687d9ad5f53d73023ca79",
      "tree": "6a1392c4316e728360371c74fced613b8d76fe31",
      "parents": [
        "e42a6eb35c179e7928659053ec6ef5f1cc5c4269"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Apr 01 17:01:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 17:01:41 2026 +0200"
      },
      "message": "feat(ci): add version bump tooling and consistency checks (#2990)"
    },
    {
      "commit": "e42a6eb35c179e7928659053ec6ef5f1cc5c4269",
      "tree": "3c375a0af8d9c72c88f8c99ce296ed9eee18e555",
      "parents": [
        "c9e40b6933f8543965b0f0b3644e6065124cfb79"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Wed Apr 01 12:32:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 12:32:20 2026 +0200"
      },
      "message": "chore(repo): update connectors versions and readme (#3066)"
    },
    {
      "commit": "c9e40b6933f8543965b0f0b3644e6065124cfb79",
      "tree": "1133d646c83cc11fec7eace96e8ea4a00ddb892f",
      "parents": [
        "3904ef3104575e26e8553a3456c9a4f6b2047625"
      ],
      "author": {
        "name": "Maxim Levkov",
        "email": "mlevkov@users.noreply.github.com",
        "time": "Wed Apr 01 01:46:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 10:46:27 2026 +0200"
      },
      "message": "feat(connectors): add generic HTTP sink connector (#2925)"
    },
    {
      "commit": "3904ef3104575e26e8553a3456c9a4f6b2047625",
      "tree": "742d23576ebd071dcc9cad36cc6ee393641b193d",
      "parents": [
        "0460de9bd57a2986e525ee449625043c91bbbce3"
      ],
      "author": {
        "name": "Rimuksh Kansal",
        "email": "nihonrk@gmail.com",
        "time": "Wed Apr 01 15:31:57 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 08:31:57 2026 +0200"
      },
      "message": "feat(cpp): Add functions related to consumer groups (#2988)"
    },
    {
      "commit": "0460de9bd57a2986e525ee449625043c91bbbce3",
      "tree": "cd41401e41a79089a0d88ea49487ac22151416e8",
      "parents": [
        "0935a76eb59920ea512063c2b8d2a14fc74945c1"
      ],
      "author": {
        "name": "ryerraguntla",
        "email": "ryerraguntla@users.noreply.github.com",
        "time": "Tue Mar 31 15:42:15 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 21:42:15 2026 +0200"
      },
      "message": "feat(connectors): implement InfluxDB Sink and Source (#2933)"
    },
    {
      "commit": "0935a76eb59920ea512063c2b8d2a14fc74945c1",
      "tree": "15710776df9ffd51c23043e41d0d0fc942579669",
      "parents": [
        "8ec9077921e43b03b4c8d16b465b0a308a8efc57"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Tue Mar 31 15:09:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 15:09:53 2026 +0200"
      },
      "message": "feat(partitions): rework partitions using new message (#3020)\n\nRefactors partition messaging around Message\u003cH, B\u003e, where the backing\nstorage is part of the type rather than\n  being encoded through the old TwoHalves prefix/tail layout.\n\nRequest messages now use a contiguous Owned backing, while\nresponse-style paths can use fragmented storage\ndirectly. This removes the old prefix/tail copy-on-write design\nentirely, along with the aliasing and uniqueness\nproblems it introduced. In particular, storage reads no longer need to\nreconstruct a request-shaped message from\na split buffer, which was fragile once the tail could already be shared\nby cache-backed Frozen values. The new\ndesign makes the ownership model explicit, keeps the request path\nsimple, and avoids relying on prefix\n  detachment semantics to preserve correctness.\n\n---------\n\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e"
    },
    {
      "commit": "8ec9077921e43b03b4c8d16b465b0a308a8efc57",
      "tree": "64cf6d68c6f6ab9edc2cfcfe5db3f7e0f15cdc35",
      "parents": [
        "d0786e0f928a534c093e08790f4a65d3b4853adc"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Mar 31 17:04:45 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 13:34:45 2026 +0200"
      },
      "message": "fix(test): remove racy assertion in postgres source delete_after_read test (#3064)"
    },
    {
      "commit": "d0786e0f928a534c093e08790f4a65d3b4853adc",
      "tree": "94584e38c69206f9a8904906394670b649f030e7",
      "parents": [
        "bd595ef341a940d39ca05be15f8dfc1c2a4c64b4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Mar 31 11:17:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 11:17:29 2026 +0200"
      },
      "message": "chore(deps): bump pygments from 2.19.2 to 2.20.0 in /foreign/python (#3054)"
    },
    {
      "commit": "bd595ef341a940d39ca05be15f8dfc1c2a4c64b4",
      "tree": "cedbd89e4741953dcfecac950c1d0fca8dfc4deb",
      "parents": [
        "30fae4cefb03bf9230311089a502eb635a1a4af5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Mar 31 10:47:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 10:47:47 2026 +0200"
      },
      "message": "chore(deps): bump pygments from 2.19.2 to 2.20.0 in /bdd/python (#3055)"
    },
    {
      "commit": "30fae4cefb03bf9230311089a502eb635a1a4af5",
      "tree": "6cf51031ff6073e6c2a8d08bf36d74ca888c974a",
      "parents": [
        "e0c55e6e491082cf72a1193d86c519291147ebfc"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Mon Mar 30 04:35:37 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 11:35:37 2026 +0200"
      },
      "message": "fix: stats semver wire alignment using a zero sentinel (#3036)\n\nCloses #2979"
    },
    {
      "commit": "e0c55e6e491082cf72a1193d86c519291147ebfc",
      "tree": "1c8867e978900f522a6f40c92c7afe89700db16f",
      "parents": [
        "4ca3cf2b3d2d43efcb677737f2b565e52f67ae75"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Mon Mar 30 14:36:19 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 11:06:19 2026 +0200"
      },
      "message": "fix(test): remove race condition in postgres source mark test (#3052)\n\nCloses #3050\n\n## Rationale\n\nThe processed_column_source_marks_rows_after_producing test fails\nintermittently on CI because the postgres source connector (polling\nevery 10ms) can process rows between the insert and the initial\ncount_unprocessed check.\nThe strict assertions `unprocessed \u003d\u003d 3` and `processed \u003d\u003d 0` are\nreplaced with a single `unprocessed + processed \u003d\u003d 3` check that\nverifies all rows exist without being timing-sensitive. The final\npolling loop already asserts the actual behavior under test: `processed\n\u003d\u003d 3`, `unprocessed \u003d\u003d 0`, and `total \u003d\u003d 3`.\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "4ca3cf2b3d2d43efcb677737f2b565e52f67ae75",
      "tree": "1d808992a3a3996413962c9b7cc3d8cbdf0cb75b",
      "parents": [
        "3e848424bd062a0ca8d1cdaee5dfccf2799c8b9a"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Mon Mar 30 10:43:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 10:43:53 2026 +0200"
      },
      "message": "feat(security): encrypt user headers alongside message payload (#3040)\n\nServer-side encryption protected message payloads and state\nlog entries but left user-defined headers in plaintext on\ndisk. Client-side encryption in the Rust and C# SDKs had\nthe same gap, encrypting only the payload.\n\nBoth server and all SDKs with client-side encryption now\nencrypt and decrypt user headers using the same encryptor\nas the payload. The integration test verifies no plaintext\nheaders appear on disk when encryption is enabled, and a\nnew unit test covers the client-side round-trip. The C#\nSDK adds TryMapHeaders for graceful handling of encrypted\nheader bytes during deserialization.\n\nBREAKING"
    },
    {
      "commit": "3e848424bd062a0ca8d1cdaee5dfccf2799c8b9a",
      "tree": "3db9df3ba887e6e780b613bceebc622b4e9934cb",
      "parents": [
        "169a09bcd5c336de73e14d0350fe66f8f2968b7d"
      ],
      "author": {
        "name": "Atharva Lade",
        "email": "92752921+atharvalade@users.noreply.github.com",
        "time": "Mon Mar 30 03:14:19 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 10:14:19 2026 +0200"
      },
      "message": "feat(cli): Add context create/delete CLI commands to complete login/logout workflow (#2998)\n\nCloses #595"
    },
    {
      "commit": "169a09bcd5c336de73e14d0350fe66f8f2968b7d",
      "tree": "a9a1919aa22670daa50a01388c13be482912e43e",
      "parents": [
        "411a697eb184ebc33d7ce4b862f51db49ce46ea5"
      ],
      "author": {
        "name": "saie-ch",
        "email": "132209179+saie-ch@users.noreply.github.com",
        "time": "Mon Mar 30 12:37:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 09:07:51 2026 +0200"
      },
      "message": "fix(go): correct Permissions serialization and add unit tests (#3015)"
    },
    {
      "commit": "411a697eb184ebc33d7ce4b862f51db49ce46ea5",
      "tree": "4357e5680e756ad57d21b6a556658908f84a3905",
      "parents": [
        "9ee1f6dfaafdfc367032579469b2d31860eec5eb"
      ],
      "author": {
        "name": "Aviraj Khare",
        "email": "49766964+avirajkhare00@users.noreply.github.com",
        "time": "Fri Mar 27 16:42:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 27 12:12:41 2026 +0100"
      },
      "message": "ci: add Helm chart validation (#3019)"
    },
    {
      "commit": "9ee1f6dfaafdfc367032579469b2d31860eec5eb",
      "tree": "34e14590aadbfb815a1adf79c87869efb31d91de",
      "parents": [
        "b55d065d80c90a27d9102c3b781a80662de9250e"
      ],
      "author": {
        "name": "Jonathon Henderson",
        "email": "8791010+jrhenderson1988@users.noreply.github.com",
        "time": "Fri Mar 27 09:30:34 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 27 10:30:34 2026 +0100"
      },
      "message": "feat(java): Support connection timeout (#3026)\n\nCloses #3010"
    },
    {
      "commit": "b55d065d80c90a27d9102c3b781a80662de9250e",
      "tree": "b2d1d872f4facc0a1d9855eb58968d9640500979",
      "parents": [
        "f8be02437b0bea1d035c5caaa0cc324386a8e8dd"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Thu Mar 26 23:41:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 19:11:39 2026 +0100"
      },
      "message": "feat(metadata): Persistent WAL journal with recovery and compaction (#2916)"
    },
    {
      "commit": "f8be02437b0bea1d035c5caaa0cc324386a8e8dd",
      "tree": "67768fbf2ebe92964c4bfc08c264cf57d8f2843d",
      "parents": [
        "38e392abecb82d82b640855d51e201624eae86d1"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Mar 26 16:38:06 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 16:38:06 2026 +0100"
      },
      "message": "refactor(server): replace ServerCommand enum and binary mapper with wire types (#3027)"
    },
    {
      "commit": "38e392abecb82d82b640855d51e201624eae86d1",
      "tree": "d86657f270aabd5157738e3ec965bd00c0e1a6fb",
      "parents": [
        "a78dd0726318ae40dc49635cee7ba669cf214753"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Mar 26 12:38:15 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 12:38:15 2026 +0100"
      },
      "message": "chore(deps-dev): bump picomatch from 4.0.3 to 4.0.4 in /examples/node (#3033)\n\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a78dd0726318ae40dc49635cee7ba669cf214753",
      "tree": "6946ef4ee49fdbb551ea3489a7f45875f65069de",
      "parents": [
        "4659a2b5134305595d388e9239b3cc12cbc4a93c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Mar 26 12:15:28 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 12:15:28 2026 +0100"
      },
      "message": "chore(deps-dev): bump picomatch from 4.0.3 to 4.0.4 in /foreign/node (#3034)"
    },
    {
      "commit": "4659a2b5134305595d388e9239b3cc12cbc4a93c",
      "tree": "f4092af367b891ee980107cadfb6a0f1918a4c29",
      "parents": [
        "3727d66d26778e1a9d8b08f82e0f37022e35b399"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Mar 26 11:36:43 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 11:36:43 2026 +0100"
      },
      "message": "ci: allow `deps-dev` scope in PR title (#3035)"
    }
  ],
  "next": "3727d66d26778e1a9d8b08f82e0f37022e35b399"
}
