)]}'
{
  "log": [
    {
      "commit": "ca0b578a225bf4b9169e4ae78844f3f0423a4e99",
      "tree": "0ebde989d348cebef7936e2b0da497bc87fe437f",
      "parents": [
        "e6ec869500c3b362bf7f4b85650b7fc6df9a5fa1"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Sep 02 17:37:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 17:37:18 2026 +0200"
      },
      "message": "fix(sdk): correct consumer group polling and commits in IggyConsumer (#4034)"
    },
    {
      "commit": "e6ec869500c3b362bf7f4b85650b7fc6df9a5fa1",
      "tree": "3f9f281d27393d30cea1305794844d7cf4848d27",
      "parents": [
        "343ef06ebe279c59af9c47fefb9f8c3f0af4ca4c"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Wed Sep 02 16:17:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 16:17:27 2026 +0200"
      },
      "message": "feat(helm): deploy a cluster with one release per node (#4035)"
    },
    {
      "commit": "343ef06ebe279c59af9c47fefb9f8c3f0af4ca4c",
      "tree": "5883af9537490d6b448653bc80bffc20dc4db730",
      "parents": [
        "ad9e5ddce23ad5570b8b432c0f02ab19c9982ef0"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Sep 02 15:57:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 15:57:32 2026 +0200"
      },
      "message": "feat(server,deps,ci): update deps, fix CI scoping, panic exit, crash recovery (#4033)"
    },
    {
      "commit": "ad9e5ddce23ad5570b8b432c0f02ab19c9982ef0",
      "tree": "bebafdf1782243261f05b91e018c7221cf492fce",
      "parents": [
        "38d58ca13243f2ef81b2758547f55ae54d6c5f2e"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Sep 02 11:46:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 11:46:23 2026 +0200"
      },
      "message": "test(integration): catch on-disk storage format breaks pre-merge (#4003)"
    },
    {
      "commit": "38d58ca13243f2ef81b2758547f55ae54d6c5f2e",
      "tree": "1832694641371782823c0d90ee1dba1203a897b9",
      "parents": [
        "e7f03879d5c26aa4243263c0a3ae1fbb8e5bd35c"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Sep 02 10:56:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 10:56:28 2026 +0200"
      },
      "message": "refactor(server): split bootstrap.rs into the boot/ tree (#4031)"
    },
    {
      "commit": "e7f03879d5c26aa4243263c0a3ae1fbb8e5bd35c",
      "tree": "50c072cfb4243ba5d34b3b1edeaa71778b9402f6",
      "parents": [
        "bbfad594efebdf8e08da5c684c59d5628d308af6"
      ],
      "author": {
        "name": "Justin Mclean",
        "email": "jmclean@apache.org",
        "time": "Wed Sep 02 16:25:48 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 08:25:48 2026 +0200"
      },
      "message": "docs: wait for the issue to be assigned, not for a label (#4032)"
    },
    {
      "commit": "bbfad594efebdf8e08da5c684c59d5628d308af6",
      "tree": "ef338cc3781baff6a3a3a7197a4753a7abdcb2d8",
      "parents": [
        "a7d5a2894953cfac073a45741bc6cd5851d9a2ff"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 23:49:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 23:49:48 2026 +0200"
      },
      "message": "chore(deps): Bump taiki-e/install-action from 2.86.3 to 2.86.7 in the github-actions group (#4028)"
    },
    {
      "commit": "a7d5a2894953cfac073a45741bc6cd5851d9a2ff",
      "tree": "85080bf677ddfba57ddf7806113e4916276ae65a",
      "parents": [
        "9dbc5f303754ad30d61977502ef37fd906a0603f"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Tue Sep 01 23:16:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 23:16:11 2026 +0200"
      },
      "message": "chore(sdk): IggyConsumer docs (#3913)\n\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e"
    },
    {
      "commit": "9dbc5f303754ad30d61977502ef37fd906a0603f",
      "tree": "f1887536dd87a5c9e264ea6aa5c7e04a9902af51",
      "parents": [
        "7ff4eb170e8fec4f9ae8ac4dc60d43fded451622"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Sep 01 22:55:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 22:55:55 2026 +0200"
      },
      "message": "test(integration): stop harness servers pinning shards to cores (#4030)"
    },
    {
      "commit": "7ff4eb170e8fec4f9ae8ac4dc60d43fded451622",
      "tree": "b2209a9a8c8e2ef51142a4725321a2cff3795db0",
      "parents": [
        "4dd877267f9d07c85dd0b42aabba39d645e305f1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 22:38:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 22:38:07 2026 +0200"
      },
      "message": "chore(deps): Bump com.github.spotbugs:spotbugs-annotations from 4.10.3 to 4.10.4 in /foreign/java in the java group across 1 directory (#4029)"
    },
    {
      "commit": "4dd877267f9d07c85dd0b42aabba39d645e305f1",
      "tree": "d6ec7c607f475aefbbd41b9ef783dc5ce9d00914",
      "parents": [
        "f45f9dda9bcfb4b74723650fafd8933cc7ed19c9"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Tue Sep 01 22:26:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 22:26:33 2026 +0200"
      },
      "message": "chore(sdk): IggyProducer docs for Rust SDK (#3989)\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e"
    },
    {
      "commit": "f45f9dda9bcfb4b74723650fafd8933cc7ed19c9",
      "tree": "ae7b3b88f0242a7b0ac968efa9fafc33fd90a82d",
      "parents": [
        "2783907c7a90cd095b9d88b62646d906fedc1e2b"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Sep 01 21:45:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 21:45:55 2026 +0200"
      },
      "message": "refactor(server): split the dispatch spine into plane-named leaves (#4026)"
    },
    {
      "commit": "2783907c7a90cd095b9d88b62646d906fedc1e2b",
      "tree": "2bb2aefb763a5545ca0b75ea5888b4163c58d633",
      "parents": [
        "831b2a652ba71af89497aca9a08e2b8742d61e03"
      ],
      "author": {
        "name": "Richard Cocks",
        "email": "50965970+richardcocks@users.noreply.github.com",
        "time": "Tue Sep 01 20:13:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 21:13:45 2026 +0200"
      },
      "message": "fix(csharp): set default socket buffer size to OS default (#4013)\n\nCloses #4010 \n\n---------\n\nCo-authored-by: spetz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "831b2a652ba71af89497aca9a08e2b8742d61e03",
      "tree": "b345da16ab712aac2f4606fb0929be15ec47c85e",
      "parents": [
        "9b7cc5c4cf38189f394e50c9fa53fe6f099c68db"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Sep 01 20:33:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 20:33:03 2026 +0200"
      },
      "message": "perf(server): serve poll replies without copying record bytes (#4025)"
    },
    {
      "commit": "9b7cc5c4cf38189f394e50c9fa53fe6f099c68db",
      "tree": "3495a75874168d9034bbf63533babac64ab932b4",
      "parents": [
        "e362c0f0dcfcd1b6b52b071f6de3d6727f309c9a"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Tue Sep 01 20:09:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 20:09:40 2026 +0200"
      },
      "message": "chore(docs): core/sdk lib.rs and IggyClient docs (#3809)"
    },
    {
      "commit": "e362c0f0dcfcd1b6b52b071f6de3d6727f309c9a",
      "tree": "0eec8e5ce42230f4d920e7f0115ae55efb877a03",
      "parents": [
        "3aed9f458e545cb0de77bbe040e68ab5d5579a5a"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Sep 01 17:23:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 17:23:25 2026 +0200"
      },
      "message": "fix(connectors): iceberg sink writes real partitions on iceberg 0.10 (#3969)\n\nCo-authored-by: Ashutosh Prajapati \u003casprajapati@deqode.com\u003e"
    },
    {
      "commit": "3aed9f458e545cb0de77bbe040e68ab5d5579a5a",
      "tree": "fa80e4700eb3dc63dc3eb922bcc85e7225fa2cbb",
      "parents": [
        "0270b76b6b23f45d9fe0ab9a0c8a280f2e396d99"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Tue Sep 01 16:14:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 16:14:01 2026 +0200"
      },
      "message": "fix(shard): keep a parked prepare\u0027s stamp and op order on re-dispatch (#4005)\n\nPartition prepares can arrive before their namespace is\nmaterialised. Re-dispatch through the shard inbox lost each\nframe\u0027s original epoch stamp and placed it behind newer frames.\nA delete and recreate could therefore serve an old prepare\nagainst the replacement, while the backup gap check could drop\na later operation before the parked prefix reached the plane.\n\nStage parked frames in a shard-local FIFO and carry their epoch\nand park-pass provenance. A biased pump arm processes one\nstaged frame per iteration after ticks and before inbox work.\nThis preserves order without delaying heartbeats behind a\nbounded queue, and loopback runs after every delivery so a solo\nprimary commits re-dispatched requests immediately. Shutdown\nuses the same ordering.\n\nSimulator materialisation now passes its resolved epoch and\nwakes the pump after off-pump staging. Seeded three-replica and\nsolo-primary tests pin queue ordering, wakeup, loopback, and\ndeterministic replay. Quiescence rejects stranded redispatch\nwork.\n\nThe integration oracle now filters gap markers to the partition\nplane, removes ambient RUST_LOG when an explicit logging level\nis configured, and falls back to the server log when verbose\nmode inherits stdout. Dropped or rejected staged frames are\ncounted, and recovery documentation reflects same-view repair.\n\nThe shared leader-redirection BDD fixture could elect replica 1\nwhen a loaded runner delayed replica 0 during concurrent\nstartup. Start replica 1 only after replica 0 is healthy and use\na wider fixture heartbeat window so the scenarios test client\nredirection instead of container scheduling.\n\n---------\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "0270b76b6b23f45d9fe0ab9a0c8a280f2e396d99",
      "tree": "061fef0cb0e04cefd90ceccda549ec75f9d96ef6",
      "parents": [
        "8c4986ac545c1b75afd40b11c425d35b7fbbe058"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Sep 01 14:59:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 14:59:56 2026 +0200"
      },
      "message": "refactor(server): make the module graph a DAG and enforce it (#4023)"
    },
    {
      "commit": "8c4986ac545c1b75afd40b11c425d35b7fbbe058",
      "tree": "14d709b67b2771612f23eeac9585f0ec77bee48c",
      "parents": [
        "328b289745e0e24bace1bb531fde4c0f9159d608"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Tue Sep 01 09:25:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 09:25:15 2026 +0200"
      },
      "message": "fix(io_uring): keep shard startup off blocking fallbacks\n\nKernels without IORING_OP_FTRUNCATE, IORING_OP_BIND, or\nIORING_OP_LISTEN send compio to its blocking fallback. Shard\nexecutors disable that worker pool, so a torn metadata WAL\npanicked during recovery and synchronous repair alone only\nmoved the panic to plain TCP, WebSocket, or HTTP startup.\n\nRepair torn WAL tails through std::fs using a duplicate of the\nopen descriptor. The tracked write offset updates immediately\nafter truncation so it matches the file even when the fsync\nfails, and the helper syncs the new length itself so the repair\nis durable without a separate fsync from the caller.\n\nBind plain listeners through the existing synchronous socket2\npath while preserving TCP_NODELAY. This keeps shard startup off\nthe unsupported opcodes and restores the mainline Linux 5.19\nfloor. Regression tests pin no-pool truncation, descriptor\nidentity, and listener configuration.\n\n---------\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "328b289745e0e24bace1bb531fde4c0f9159d608",
      "tree": "f0c748dc9be73739cbca2f54b6e1d1d80ae28c6f",
      "parents": [
        "72b5995c5d66aaf8ac62e0221361d6eb460c0a72"
      ],
      "author": {
        "name": "aias00",
        "email": "liuhongyu@apache.org",
        "time": "Tue Sep 01 14:56:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 08:56:53 2026 +0200"
      },
      "message": "fix(journal): reject recovery slot collisions (#4009)"
    },
    {
      "commit": "72b5995c5d66aaf8ac62e0221361d6eb460c0a72",
      "tree": "0d346aa7b5b2ebc80e9b4af94bd29b6b66a3fc41",
      "parents": [
        "b1b911ffb894fb9d29381fd7fb8b2ef5933302bb"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Sep 01 08:32:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 08:32:30 2026 +0200"
      },
      "message": "docs(repo): add repo-wide team-review agent skill (#4004)\n\nThis PR adds a new skill used to review changes.\nContributors are encouraged to use it.\n\nIt is placed under .claude/skills/ next to the connector skills.\nThe report lands in the agent session scratchpad.\n\nSkills carry no disable-model-invocation flag, so the\ndescription states the skill is user-invoked only: one run\nspawns roughly ten subagents."
    },
    {
      "commit": "b1b911ffb894fb9d29381fd7fb8b2ef5933302bb",
      "tree": "2043ac5ae1202f4964556b8ff48002bda873d39b",
      "parents": [
        "bb973973d2158930a220dfb813cac613cf7bf599"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Tue Sep 01 08:25:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 08:25:19 2026 +0200"
      },
      "message": "fix(sdk): stream should terminate after consumer shutdown (#3964)"
    },
    {
      "commit": "bb973973d2158930a220dfb813cac613cf7bf599",
      "tree": "7e4317ff55d5ea73e44bf1a2bc21a7aba412d90a",
      "parents": [
        "e9b1c9a12d0baaf74129d6925c2f114663536151"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 07:41:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:41:43 2026 +0200"
      },
      "message": "chore(deps): Bump the csharp group with 1 update (#4011)"
    },
    {
      "commit": "e9b1c9a12d0baaf74129d6925c2f114663536151",
      "tree": "7bd1d70e87c30c60adfdc918591d42bc90fa4e34",
      "parents": [
        "6ef0c167787c6fefd429cccf41501222ae75ccf2"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Aug 31 21:43:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 21:43:07 2026 +0200"
      },
      "message": "fix(cluster): stop a late partition materialiser from wedging its group (#4007)\n\nA partition group with no history of its own seeds its view and\nlog_view from the metadata view this replica happens to publish.\nNothing bounds that view by the group\u0027s real one, so a replica that\nmaterialises the group late, after a further metadata election,\nstarts Normal on an empty log above every peer. That empty log is\ncanonical in the next DVC merge: as a backup it collects a nack\nquorum against committed ops and the group deadlocks for good, the\nsuperblock persisting the view so a restart re-wedges; as the\nprimary-by-index it answers the real primary\u0027s heartbeat with a\nStartView at op 0 that resets the peers\u0027 heads under their commit\nfloor, and every new write is fenced. Introduced with the seed in\n#3985.\n\nRecord the view the admitting primary mints the create in on the\ncommitted metadata entry and seed from that instead. Every replica\nreads the same value, and the group\u0027s view never drops below it, so\nan empty log at the creation view is the floor a view-0 start used\nto be, never canonical over committed history. The reconciler no\nlonger needs the published-view sentinel, its deferral, or the\ndouble atomic read that came with it.\n\nThe value rides the request body, not the prepare header: a\nheader\u0027s view is the one field a post-view-change retransmit\nrestamps (replicate_preflight refuses the frame otherwise), so a\nheader-derived value is a per-replica property of delivery history\nand durably diverges the metadata STM. The body is sealed by\nchecksum_body and never restamped; entries journaled before the\ntrailing field decode it as 0, the safe floor.\n\nChosen over electing into the seed: no extra round trip per group,\nno consensus change, and a late materialiser joins as a backup at\nor below its peers instead of forcing an election it may win with\nan empty log. The snapshot format moves to version 5 with the new\ntrailing field defaulted, so version 3 and 4 checkpoints still\ndecode."
    },
    {
      "commit": "6ef0c167787c6fefd429cccf41501222ae75ccf2",
      "tree": "05248baea86d79f919e3e204d614ce99a291aed8",
      "parents": [
        "dc1cdf23209c91fd703b59ceb47bdb9b4c662480"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Mon Aug 31 21:01:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 21:01:10 2026 +0200"
      },
      "message": "feat(sdk): consume the request counter for partition operations (#3958)\n\nOur partition operations did not use the `request` counter which meant\nthat partition ops did not participate in the deduplication process.\nThis PR makes the partition operations bump the request counter for all\nof the SDKs"
    },
    {
      "commit": "dc1cdf23209c91fd703b59ceb47bdb9b4c662480",
      "tree": "6961b8ba9d49d228813b0aebd64b8cca055814fb",
      "parents": [
        "e80992b6382a0a314d378454fc7332a2dda96ea6"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Mon Aug 31 15:46:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 15:46:05 2026 +0200"
      },
      "message": "fix(sdk): respect max_buffer_size when merging batches (#3933)\n\nMerging adjacent producer batches released their byte permits before\nthe write completed, allowing buffered and in-flight data to exceed\nmax_buffer_size. Large permit totals could also overflow during the\nmerge and permanently reduce available capacity.\n\nRetain each permit separately until send_internal completes. Validate\nbatch sizes before u32 conversion, split merged writes at the wire\nlimit, and handle zero buffer and in-flight limits without invalid\nsemaphores.\n\nUpdate max_buffer_size documentation and add regression coverage for\npermit lifetime, unlimited limits, and budgets above u32::MAX. Keep\nthe edge.6 package versions synchronized.\n\nFixes #3932"
    },
    {
      "commit": "e80992b6382a0a314d378454fc7332a2dda96ea6",
      "tree": "1f600443ef398e6c1605c0e54ce16af6268542eb",
      "parents": [
        "3e4898ac67c4f60f4146e8313e0132017e59becd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Aug 31 13:44:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:44:35 2026 +0200"
      },
      "message": "chore(deps): Bump the java group across 3 directories with 17 updates (#3966)"
    },
    {
      "commit": "3e4898ac67c4f60f4146e8313e0132017e59becd",
      "tree": "28a54ea34b84d07aa70a2ce81dcaa2e79b65b8e9",
      "parents": [
        "dde679aea50ea980f057a62dbfc07a90d0c6c4ec"
      ],
      "author": {
        "name": "Chengxi Luo",
        "email": "chengxi.luo2004@gmail.com",
        "time": "Mon Aug 31 06:33:29 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 12:33:29 2026 +0200"
      },
      "message": "fix(bdd): resolve server address and credentials only from env (#3935)"
    },
    {
      "commit": "dde679aea50ea980f057a62dbfc07a90d0c6c4ec",
      "tree": "147c71de04679982e6fb6bda157139bdafc16f1b",
      "parents": [
        "31b86ff2a9ef2e7802f55c9211eb3cfab541be47"
      ],
      "author": {
        "name": "Ethan Lin",
        "email": "103916325+ethanlin01x@users.noreply.github.com",
        "time": "Mon Aug 31 17:05:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 11:05:20 2026 +0200"
      },
      "message": "ci(python): fold the build task into test and check the stub (#3980)"
    },
    {
      "commit": "31b86ff2a9ef2e7802f55c9211eb3cfab541be47",
      "tree": "e967ce881d7bf3221b0e0537d40fd73e6d8a8021",
      "parents": [
        "a1df38354bc6ba521f4440abab03b19643a763e8"
      ],
      "author": {
        "name": "Chengxi Luo",
        "email": "chengxi.luo2004@gmail.com",
        "time": "Mon Aug 31 04:47:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 10:47:13 2026 +0200"
      },
      "message": "fix(server)!: reject a wildcard bind with no advertised address (#3923)"
    },
    {
      "commit": "a1df38354bc6ba521f4440abab03b19643a763e8",
      "tree": "8a69762690f6d596501b3f64952ad371837ba3ca",
      "parents": [
        "8b7dbd9c675479ef0a96e9b1cf072ef833cddf99"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Aug 31 09:28:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 09:28:55 2026 +0200"
      },
      "message": "test(partitions): gate the persist-retry test on Linux (#3998)"
    },
    {
      "commit": "8b7dbd9c675479ef0a96e9b1cf072ef833cddf99",
      "tree": "2e8e011e24f1b05170f856593c41508051fe65b1",
      "parents": [
        "c8ef3b9a43c07b6ddc4a00e606537827a61b6bdb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Aug 31 09:08:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 09:08:48 2026 +0200"
      },
      "message": "chore(deps): Bump the go group across 2 directories with 2 updates (#3990)"
    },
    {
      "commit": "c8ef3b9a43c07b6ddc4a00e606537827a61b6bdb",
      "tree": "b477d31b5a64466df496dfe1118c661476a7a8c1",
      "parents": [
        "eb410a96adbe638800eff2bf3a1e5282e7947a79"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Aug 31 08:45:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 08:45:34 2026 +0200"
      },
      "message": "fix(go): tear down only the connection a request failed on (#3986)"
    },
    {
      "commit": "eb410a96adbe638800eff2bf3a1e5282e7947a79",
      "tree": "4eda3d47b218c4b02de4bb1331e04621f96cadfb",
      "parents": [
        "5916e6f586491c8b431be1a844daee73856921cd"
      ],
      "author": {
        "name": "Jogesh A Dinavahi",
        "email": "jogeshanand@gmail.com",
        "time": "Sun Aug 30 23:27:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 08:27:35 2026 +0200"
      },
      "message": "fix(server):  apply thread pool limit carve-out to all of macOS (#3994)"
    },
    {
      "commit": "5916e6f586491c8b431be1a844daee73856921cd",
      "tree": "78795c3289706fee5a70380ce0286f9d836486f3",
      "parents": [
        "996ac04c874da857d6d734db4f27ada344e5585d"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Sun Aug 30 17:44:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 30 17:44:08 2026 +0200"
      },
      "message": "feat(partitions): persist log and index concurrently, harden recovery (#3970)\n\nEvery journal flush issued two serialized fdatasyncs, log then\nindex, so an fsync-gated topic paid two device round trips per\nack. Both files now persist under one futures::future::join:\n13.4k to 26.1k msg/s and p50 5.83 to 3.01 ms on ext4 with\nenforce_fsync and messages_required_to_save \u003d 1. Cursors advance\nonly after both saves succeed, so a failed half keeps its slot\nand a later flush rewrites the same positions instead of\nappending a duplicate.\n\nRemoving the write barrier forced a new recovery contract. An\nindex entry is derived from the log and, without enforce_fsync,\nproves nothing about it, so recovery checksum-walks every\nsegment from byte 0 and keeps a clean index untouched. Every\nentry must match its log batch\u0027s offset, timestamp, partition\nand extent, or the index is rebuilt: ascending columns alone let\na corrupt entry point at the wrong valid batch and polls\nsilently skipped offsets. Under enforce_fsync serialized flushes\nprove the prefix below the last entry, so a healthy boot still\nanchors there; a gap deeper than the one in-flight chunk refuses\nas FsyncedLogLoss, and a rebuild stopping below the last entry\u0027s\nposition refuses as FsyncedRebuildShortfall rather than\ntruncating bytes a completed flush made durable. Probe-budget\nexhaustion always refuses, since recovering as empty would serve\nthe segment and re-mint offsets over bytes never scanned.\nPreviously any index the log outran refused boot outright and\ntombstoned single-replica partitions with healthy logs.\n\nA persist failure on a cluster-committed op panicked on the\nshard pump, where compio::runtime::spawn swallows the unwind:\nthe process stayed up with every partition on that shard dead.\nThe partition now fences itself, the pump breaks, flips the\nshared shutdown flag before its final flush (the flush writes to\nthe failed device and can stall forever; the flag is what arms\nthe watchdog and the bounded drain), and a failed shutdown flush\nfences its partition too, so the exit is ShardFatal and non-zero\nrather than a clean report over unpersisted committed data.\n\nAlso: the active segment fills the same read-state slot sealed\nsegments use, ending one openat per head poll; latency extremes\nbackfill only as a whole group; segment writer save methods are\ncrate-private; index scans yield on a stride."
    },
    {
      "commit": "996ac04c874da857d6d734db4f27ada344e5585d",
      "tree": "6bfd234d62837cc6aa55bea58dd406d7e602044a",
      "parents": [
        "90e38b10f036ea174f8c049a586e5baadac8c0d5"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Fri Aug 28 19:44:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 19:44:47 2026 +0200"
      },
      "message": "fix(cluster): recover writes after a fast partition primary rejoin (#3987)\n\nA fast partition primary rejoin could leave the group unable to\ncommit new writes. A backup could adopt suffix headers without\nobtaining their bodies because repair stopped at commit_max. Clients\nthen handled the typed non-admission response by checking metadata\nleadership, even though metadata and partition groups can elect\ndifferent primaries.\n\nExtend suffix repair to the available frontier and clear completed\nsessions after the later commit catches up. Reject writes on stale\nbackups before local offset validation, so callers receive the typed\nresponse required for safe rerouting.\n\nAdd one-pass roster routing for HTTP and the Rust, Node, Go, Java,\nand C# clients. Coordinate concurrent Rust reconnects and prevent\nambiguous replicated writes from being replayed under a new session."
    },
    {
      "commit": "90e38b10f036ea174f8c049a586e5baadac8c0d5",
      "tree": "f22bbaa8b2d2f04c5e64b63091b0000c6b1434f2",
      "parents": [
        "db14a4b1718f16a0cc0f74088e0d028e80321306"
      ],
      "author": {
        "name": "T1B0",
        "email": "T1B0@users.noreply.github.com",
        "time": "Fri Aug 28 17:58:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 17:58:02 2026 +0200"
      },
      "message": "feat(node): support connection string syntax for nodejs client creation (#3917)"
    },
    {
      "commit": "db14a4b1718f16a0cc0f74088e0d028e80321306",
      "tree": "ad783c90ab01c59a92b487db213957029b7fb58d",
      "parents": [
        "0fdf9d6889b5ec7d0ac4b0540579b479179e9070"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Fri Aug 28 16:53:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 16:53:09 2026 +0200"
      },
      "message": "fix(cluster): make the advertised leader accept partition writes (#3985)\n\nA client is told which node leads the cluster, sends a partition\nwrite there, and is refused for its whole budget. The node it was\ntold about is genuinely the leader; the write is genuinely unroutable.\n\nEach node runs a metadata consensus group plus one per partition,\neach with its own view counter, and both pick a primary as\n`view % replica_count`. `get_cluster_metadata` marks a node Leader\nfrom the metadata plane alone and `ClusterNode` carries one `role`,\nso a partition group\u0027s primary cannot be expressed on the wire.\nPartition ops route within a node, never to a peer, so the\nadvertised leader cannot forward one either.\n\nA group materialised with no durable state started at view 0,\nnaming replica 0 wherever the metadata plane had got to, so any\nmetadata election opened the gap for every topic created after.\n\nSeed a fresh group from the metadata view shard 0 already publishes\nfor the roster\u0027s leader marking. Both planes then name the same\nnode by construction, with no wire or client change. The seed sets\n`log_view` too: a primary whose `log_view` lags counts as\nmid-transition and answers no `RequestStartView`. A replica that\nhas not seen a view defers materialising rather than reading the\nunknown sentinel as 0, and that deferral counts toward the pass so\nit cannot arm the reconciler\u0027s fast-skip.\n\nThis aligns the planes once, at creation. A later election on\neither side parts them again and nothing forwards a write across\nthe gap, so the symptom returns for that group."
    },
    {
      "commit": "0fdf9d6889b5ec7d0ac4b0540579b479179e9070",
      "tree": "186db480ed124313352ebbcf108b24751230d02c",
      "parents": [
        "1ad3f654ccae89a22560433515bc688f3d64680d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 28 10:32:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 10:32:21 2026 +0200"
      },
      "message": "chore(deps): Bump the node group across 1 directory with 10 updates (#3984)"
    },
    {
      "commit": "1ad3f654ccae89a22560433515bc688f3d64680d",
      "tree": "e54f353524695a44fd8d4ec71f3bdd0386eb0688",
      "parents": [
        "76f2dda5d818edc2ba2fe86ab8cbc1127353acd1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 28 09:20:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 09:20:58 2026 +0200"
      },
      "message": "chore(deps): Bump the web group across 1 directory with 4 updates (#3983)"
    },
    {
      "commit": "76f2dda5d818edc2ba2fe86ab8cbc1127353acd1",
      "tree": "de36cf1a95a7873a45e88cd7ca6bb097f6936a0d",
      "parents": [
        "7b491c09fa73caab9aeda60b84215e686fe4967b"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Fri Aug 28 12:28:57 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 12:28:57 2026 +0530"
      },
      "message": "feat(simulator): drive the workload under network and replica faults (#3942)\n\nFaults:\n\n* Network parameters drawn from the seed (`swarm`), or taken as a named\nprofile. Per-command delivery counters report what a run reached.\n* `FaultInjector` crashes and restarts replicas behind stability\nwindows, so a crash lasts long enough to need repair.\n* Clients resend on timeout, rotating target. Unblocks the rest: with\none in-flight slot per client, a dropped frame stranded it for the run,\nso primaries had to be spared and view changes were unreachable.\n* `SimJournal` honours a slot count, drains on checkpoint, advances its\nsnapshot watermark. `RangeEvicted` and state transfer were unreachable\nwhile it answered a constant 0.\n* Restart carries a partition\u0027s log across the rebuild. Without it, a\nrebuilt partition reports `commit_offset` 0, tripping the monotonicity\ninvariant on a harness artefact.\n\nOracles:\n\n* State checker folds every replica\u0027s committed metadata into one chain,\nasserting agreement where they overlap in both directions of “same op\niff same prepare.” Reports ops seen on more than one replica, so a green\nrun cannot mean “compared nothing.”\n* Dispatch shell: pre-commit denials, result-framed transients, PAT\nclient wire shape, logout forwarding, eviction re-login.\n* `settle_to_stable_view` before the leader-relative asserts. A failed\ndrain reports what is outstanding and what each live replica believes.\n\nTwo real bugs found:\n\n* Consumer-offset ops drew `consumer_kind` as `u8::from(bool)`, so half\nof every request carried kind 0. `WireConsumer` rejects it, the\npartition plane drops the frame with no reply, and the client wedges.\n* Metadata backup gated prepare admission on its sequencer, not its\njournal head. `on_start_view` adopts the announced head before bodies\narrive, so the backup refused the prepare that would heal its log. The\nop never reaches quorum and the client is never answered. This affected\nany rejoining replica."
    },
    {
      "commit": "7b491c09fa73caab9aeda60b84215e686fe4967b",
      "tree": "3d9a78c3a0a71c9c6ed0ff238a716fe8fc854611",
      "parents": [
        "9c6451d62f483dea8ebb4c8e08f0c91ecde8e6f2"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Thu Aug 27 19:19:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 19:19:41 2026 +0200"
      },
      "message": "fix(cluster): prevent repaired prepares from rewinding WAL parent (#3978)\n\nMetadata repair could backfill an operation below the sequencer\nfrontier and still replace the checksum used to parent the next\nprepare. A promoted replica then wrote a higher operation whose\nparent skipped committed WAL entries. Recovery correctly rejected\nthe interior chain break and refused to truncate a suffix that\ncan hold committed operations, leaving every node that durably\nheld the bad entry unable to restart.\n\nResolve the repaired frontier in one place: walk the contiguous\njournal above the current head and update the sequencer and\nlast_prepare_checksum together or not at all. The checksum is\nalways read from the journal entry sitting at the resulting\nhead, so the frame that happened to close a gap cannot stamp its\nown checksum as the parent, and a backfill below the head leaves\nthe head where it is. The head is re-anchored, not only advanced:\nhandle_start_view moves the sequencer to the announced head\nwithout touching the checksum, so the repair frame that finally\ndelivers that head is the one chance to make the pair agree\nagain. The helper lives in consensus and both repair ingest\npaths use it.\n\nThe partition path carried the same pattern. It has not produced\nthe same failure, but not because its prepares are unsealed:\nproject() seals the header checksum on both planes, and only\nchecksum_body is metadata-only. The partition journal is in\nmemory, so nothing refuses to boot on it. The chain is still\nverified: canonical_headers walks the DVC suffix and refuses a\nmerge whose headers do not hash-chain, and the partition plane\nfeeds it real headers. A rewound partition parent left in the\nuncommitted suffix therefore surfaces at the next partition view\nchange as a merge the new primary refuses to install, and that\ngroup cannot complete the view change while the suffix is what\nits replicas offer. Fixing it on both planes.\n\nBoth ingest sites are covered, and each test fails without the\nfix. The partition call site is pinned by unit tests over\napply_repaired_prepare: one for a backfill below the head, one\nfor the frame that closes a gap. The metadata call site is\ncovered in the simulator, which drives a real IggyShard: a backup\ncrashes, misses committed operations, then rejoins and repairs.\nIt asserts that no entry landing below the sequencer becomes\nlast_prepare_checksum while the stream runs, and that once the\nstream has run the pair describes one and the same journal\nentry. That catches the rewind at the backfill rather than\nwaiting for a projected prepare and for the journal rewrite that\nfinally makes the broken chain adjacent on disk.\n\n---------\n\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e"
    },
    {
      "commit": "9c6451d62f483dea8ebb4c8e08f0c91ecde8e6f2",
      "tree": "b5587827de92a3ae95f34a93ad9819d9cdadaa75",
      "parents": [
        "ffb186dbabf1c6d99e3b8d99abe185e9df3664bf"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Aug 27 14:27:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 14:27:04 2026 +0200"
      },
      "message": "fix(consensus): keep a late retry\u0027s reply instead of refusing it (#3945)"
    },
    {
      "commit": "ffb186dbabf1c6d99e3b8d99abe185e9df3664bf",
      "tree": "582c4e664e6df6ac44749f6501fee2209d14119f",
      "parents": [
        "6a1c84c39f06e956699a93fbd9a25215f20840e8"
      ],
      "author": {
        "name": "ryerraguntla",
        "email": "ryerraguntla@users.noreply.github.com",
        "time": "Thu Aug 27 06:39:32 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 16:09:32 2026 +0530"
      },
      "message": "feat(gateways): iggy gateway for kafka listener (#3519)\n\nCo-authored-by: Grzegorz Koszyk \u003c112548209+numinnex@users.noreply.github.com\u003e\nCo-authored-by: Krishna Vishal \u003ckrishnavishal2008@gmail.com\u003e"
    },
    {
      "commit": "6a1c84c39f06e956699a93fbd9a25215f20840e8",
      "tree": "376e5f3eaa5cbd15f8182bdf79bf8e43a3fc1f39",
      "parents": [
        "37aec0877ca5b27e32c94a73882d3bd907077f69"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Aug 27 11:04:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 11:04:09 2026 +0200"
      },
      "message": "fix(partitions): stop reserving 16 MiB per active segment index (#3974)\n\nensure_indexes reserved a 16.78 MB Vec (SIZE_16MB /\nIGGY_INDEX_SIZE \u003d 699050 entries) on the first flush of every\nactive segment, for a sparse index that gains ONE entry per\nflush. At the shipped cadence a full 1 GiB segment holds about\n1024 entries, so the reservation was roughly 700x its ceiling.\n\nIt stayed invisible until many partitions flushed at once.\nGraceful shutdown force-flushes every partition regardless of\nthe messages_required_to_save thresholds: with 10000 partitions,\n4000 of them holding writes, peak RSS went 3043 -\u003e 6808 MB and\nVmData 4.04 -\u003e 64.05 GB right after SIGTERM (60.01 GB / 16.78 MB\n\u003d 3576 reservations). Steady state is worse than the spike, since\n10000 actively written partitions would pin 168 GB.\n\nReserve nothing and let the Vec grow: ~1024 entries over a\nsegment\u0027s life is eleven reallocations and under 48 KB of memcpy,\non a path that runs once per flush. IggyIndexCache is a bare Vec\nbehind len / is_empty / push and two binary searches, and its\nlookups borrow \u0026self, so growth cannot invalidate a held\nreference. The shutdown delta is now 0 MB / 0.00 GB, idle RSS\nunchanged.\n\nAlso correct the sparse-index density in two doc comments: at\nmessages_required_to_save \u003d 1 a flush still covers a whole batch,\nso the file tracks every batch, not every message."
    },
    {
      "commit": "37aec0877ca5b27e32c94a73882d3bd907077f69",
      "tree": "ca4d040881c3d9d2815e9d37e3bf133f48c4095c",
      "parents": [
        "ed59b955d85d7ee3e661a2f8dd412915dadba98c"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Aug 27 09:30:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 09:30:55 2026 +0200"
      },
      "message": "feat(sdk): fail over to a surviving node when the current one dies (#3944)"
    },
    {
      "commit": "ed59b955d85d7ee3e661a2f8dd412915dadba98c",
      "tree": "4c3c95cff0bdfb6df467f268beba0bc6d36a950f",
      "parents": [
        "03f5b3034b370825a3cf4fd5a5187b42568e7644"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Aug 27 12:00:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 12:00:03 2026 +0530"
      },
      "message": "chore(deps): Bump gradle from 9.6.1-jdk17 to 9.7.0-jdk17 in /bdd/java in the docker group across 1 directory (#3972)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "03f5b3034b370825a3cf4fd5a5187b42568e7644",
      "tree": "467d7c30ba72437f15e1d95a32cda4be617fe05f",
      "parents": [
        "d7c2b618058f71f7963b8d7ae2e9f21594346c11"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Aug 26 21:42:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 21:42:02 2026 +0200"
      },
      "message": "fix(server): restore the mimalloc global allocator (#3971)"
    },
    {
      "commit": "d7c2b618058f71f7963b8d7ae2e9f21594346c11",
      "tree": "191dd41dbc20e2341f050c14579b9388ae4e3757",
      "parents": [
        "5068a960a8b309eea21163e7540f30df035ce4c1"
      ],
      "author": {
        "name": "Ethan Lin",
        "email": "103916325+ethanlin01x@users.noreply.github.com",
        "time": "Thu Aug 27 02:05:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 20:05:21 2026 +0200"
      },
      "message": "fix(python): read consumer metadata without the consumer lock (#3888)"
    },
    {
      "commit": "5068a960a8b309eea21163e7540f30df035ce4c1",
      "tree": "9bf5d30b9de11d4e0b5d9ca5c9e86aa54e300d49",
      "parents": [
        "1e2d2220f6b988c691ba6e0aee1d682f6919ed4f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Aug 26 13:16:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 13:16:56 2026 +0200"
      },
      "message": "chore(deps): Bump the github-actions group across 1 directory with 2 updates (#3968)"
    },
    {
      "commit": "1e2d2220f6b988c691ba6e0aee1d682f6919ed4f",
      "tree": "5e3bfe621849f4bd698dc27877357eab252b9acc",
      "parents": [
        "2e420398b9da1fb55de5da24a3b8ba5a2bc13f90"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Wed Aug 26 10:45:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 10:45:38 2026 +0200"
      },
      "message": "fix(sdk): error callback should await shard flush on producer shutdown (#3953)"
    },
    {
      "commit": "2e420398b9da1fb55de5da24a3b8ba5a2bc13f90",
      "tree": "e4b8e408039a611a27339cbecd7bc5e406f22f06",
      "parents": [
        "37d7eee35b560337961495ff9f5dc8c4f57a87d5"
      ],
      "author": {
        "name": "Bebeto Nyamwamu",
        "email": "59011741+realonbebeto@users.noreply.github.com",
        "time": "Wed Aug 26 03:42:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 09:42:11 2026 +0200"
      },
      "message": "feat(connectors): add Redshift sink connector (#3654)"
    },
    {
      "commit": "37d7eee35b560337961495ff9f5dc8c4f57a87d5",
      "tree": "4b2bc6c9ab4ff6f3877029fce3339a14e7adc597",
      "parents": [
        "4c475dfcfe6368028e40153f4a27e81864610318"
      ],
      "author": {
        "name": "Ethan Lin",
        "email": "103916325+ethanlin01x@users.noreply.github.com",
        "time": "Wed Aug 26 00:55:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 18:55:04 2026 +0200"
      },
      "message": "refactor(sdk): introduce NonZeroIggyDuration for retries and heartbeats (#3891)"
    },
    {
      "commit": "4c475dfcfe6368028e40153f4a27e81864610318",
      "tree": "534a1f41d087dee4e8ac399e715ee80be6c147fb",
      "parents": [
        "1a9874859c9b6afc36665a54fd6f087842e2dff4"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Aug 25 13:28:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 13:28:44 2026 +0200"
      },
      "message": "fix(ci): bump cargo-zigbuild so arm64 images link under Rust 1.98 (#3963)"
    },
    {
      "commit": "1a9874859c9b6afc36665a54fd6f087842e2dff4",
      "tree": "214683f5fb968df604b7bb56c0f259df4cf58cb6",
      "parents": [
        "2cbf6c15ee6ae7a8f751d478dda653c2facf8982"
      ],
      "author": {
        "name": "ryerraguntla",
        "email": "ryerraguntla@users.noreply.github.com",
        "time": "Tue Aug 25 04:36:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 10:36:52 2026 +0200"
      },
      "message": "fix(connectors): Harden Elasticsearch sink test readiness (#3729)"
    },
    {
      "commit": "2cbf6c15ee6ae7a8f751d478dda653c2facf8982",
      "tree": "640e53b6bfffcf7c44b9b7b61e525558636bf98e",
      "parents": [
        "4e5ec2586054ee056e7d7e7373b5b609ccad9cac"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Aug 25 10:18:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 10:18:14 2026 +0200"
      },
      "message": "chore(repo): bump Rust toolchain to 1.98.0 (#3962)"
    },
    {
      "commit": "4e5ec2586054ee056e7d7e7373b5b609ccad9cac",
      "tree": "dc1920e83a3093ec3e375cb2d3123b349b27f7b2",
      "parents": [
        "7207c640abbd32ee4586b44ad64462350a62d72a"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Tue Aug 25 09:55:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 09:55:34 2026 +0200"
      },
      "message": "fix(consensus): keep a client\u0027s dedup fence across capacity eviction (#3934)"
    },
    {
      "commit": "7207c640abbd32ee4586b44ad64462350a62d72a",
      "tree": "0361fa0a19f4a675c1d1cac20a443a5489c8e1bc",
      "parents": [
        "228f47e0cb22c66cf771a18f4b69d32b84a9b7cc"
      ],
      "author": {
        "name": "Łukasz Zborek",
        "email": "luki215@gmail.com",
        "time": "Tue Aug 25 09:30:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 09:30:07 2026 +0200"
      },
      "message": "ci(csharp): separate baseline coverage reports per framework (#3960)"
    },
    {
      "commit": "228f47e0cb22c66cf771a18f4b69d32b84a9b7cc",
      "tree": "53c3117e44d2f00ffcc80424bb6702b8a9e99c91",
      "parents": [
        "a2a8f0491409e5c85ade11c0757983ec2baf38b2"
      ],
      "author": {
        "name": "Łukasz Zborek",
        "email": "luki215@gmail.com",
        "time": "Tue Aug 25 09:09:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 09:09:20 2026 +0200"
      },
      "message": "refactor(csharp): cleanup tcp connection after vsr implementation (#3858)\n\nFollow-up cleanup of the .NET SDK TCP transport after the VSR support landed"
    },
    {
      "commit": "a2a8f0491409e5c85ade11c0757983ec2baf38b2",
      "tree": "a4959560af83ea3197ff3743388bfc922fb7c12e",
      "parents": [
        "2bd9d0bce11fc401dc2bec38c126bf9f0ffe8b48"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Aug 25 08:27:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 08:27:18 2026 +0200"
      },
      "message": "chore(deps): Bump the csharp group with 12 updates (#3961)"
    },
    {
      "commit": "2bd9d0bce11fc401dc2bec38c126bf9f0ffe8b48",
      "tree": "f56218aadb8e707b21068a236f0815a06727b271",
      "parents": [
        "f8311d651d219999855490922a48f0b4f60aa66f"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Mon Aug 24 21:33:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 21:33:37 2026 +0200"
      },
      "message": "fix(shard): tell an unknown consensus operation from a corrupt header (#3931)"
    },
    {
      "commit": "f8311d651d219999855490922a48f0b4f60aa66f",
      "tree": "e86fe3b509867c5bcb3c92adb83efc5544a6a049",
      "parents": [
        "69429e5e2c7126f6c884dfeb07e9bb209463badd"
      ],
      "author": {
        "name": "Rimuksh Kansal",
        "email": "nihonrk@gmail.com",
        "time": "Tue Aug 25 02:31:10 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 02:31:10 2026 +0900"
      },
      "message": "feat(cpp): add functions related to user management, and initial high-level client (#3733)"
    },
    {
      "commit": "69429e5e2c7126f6c884dfeb07e9bb209463badd",
      "tree": "d68862ece63e542625650108c9a3d7cfe0a1d2e1",
      "parents": [
        "a65f177dcf6f768fb53a9caecabd375ee0093ac6"
      ],
      "author": {
        "name": "Maciej Modzelewski",
        "email": "maciej@modzelewski.dev",
        "time": "Mon Aug 24 13:59:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 13:59:46 2026 +0200"
      },
      "message": "feat(connectors): store source state on an HTTP state server (#3940)\n\nSource connectors checkpoint through the file state backend, which\nwrites one file per source to local disk. That ties a source\u0027s\ncursor to the node it happens to run on, so replacing the node or\nfailing over to another runtime instance rewinds the source.\n\nAdd a second backend selected by state.storage. The HTTP provider\nstores each source at {url}/source_{key} on any HTTP-speaking\nstore, so cursors outlive the process. Concurrency is optimistic:\nreads remember the returned ETag, writes are conditional\n(If-Match, or If-None-Match: * before the first write), and each\nlogical save carries a stable Idempotency-Key so a server that\ncommitted a write but lost the response replays that outcome\ninstead of failing the retry with a spurious 412.\n\nState failures are now classified in the SDK. 5xx, timeouts and\nconnect failures retry with backoff and end as TransientState, so\nthe batch is Nacked and the plugin re-polls. Version conflicts and\nrevoked authorization are PermanentState and latch the provider,\nfailing later saves without touching the network: another writer\ntook over, and retrying would only mask the original error. A\nclassified failure while loading an enabled source\u0027s state aborts\nstartup instead of minting a failed plugin, because treating it as\n\"no state\" would silently rewind the source.\n\nThe file backend stays the default and its unclassified load\nerrors keep the per-connector failure path, so existing configs\nparse and behave as before.\n\n---------\n\nCo-authored-by: spetz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "a65f177dcf6f768fb53a9caecabd375ee0093ac6",
      "tree": "c48c14759d3851b5a2ff46ad73728a28f9d2fc6f",
      "parents": [
        "e1c8681651547fae3c037e7e03767b8623a6a195"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Aug 24 10:20:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 10:20:16 2026 +0200"
      },
      "message": "fix(server): truncate torn segment tails instead of resurrecting them (#3946)"
    },
    {
      "commit": "e1c8681651547fae3c037e7e03767b8623a6a195",
      "tree": "47ca10c8ef01bbce6096c912797692ba39bdcdb2",
      "parents": [
        "cc269ef70ef2d78af5102f5560b5b03c9dd81401"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Mon Aug 24 15:42:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 09:42:25 2026 +0200"
      },
      "message": "chore: migrate HawkEye to v7 (#3952)"
    },
    {
      "commit": "cc269ef70ef2d78af5102f5560b5b03c9dd81401",
      "tree": "cbb84df6fd73b7aee8912c08a536ef22b028d75e",
      "parents": [
        "2b1406b1811e6e4d9a14096df9ab76fc15b9dd3b"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Fri Aug 21 13:44:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 17:14:28 2026 +0530"
      },
      "message": "ci(rust): fail the build on rustdoc and rustc warnings (#3925)\n\nTwo classes of warning were accumulating unseen. The doctest\nleg ran cargo doc with no gate and stayed green through 69\nrustdoc diagnostics across 20 crates; broken intra-doc links\nare the costly ones, since they render as plain text and the\ndocs quietly lose their navigation. Separately, the clippy\nleg denies warnings but runs with --all-features while the\ntest legs build at default features, so a warning that only\nshows up when a feature is off was invisible - that is how\nfour dead_code findings in the integration test binary sat\nin CI output.\n\nRUSTDOCFLAGS closes the first and is cache-safe: it enters\nthe fingerprint of doc units only, never lib or bin units.\n\nFor the second the Cargo lints table beat RUSTFLAGS\u003d-D\nwarnings. RUSTFLAGS enters the fingerprint of every unit\nincluding registry dependencies, so it forces a full rebuild\nof the dep tree and would have to be mirrored into\ncoverage-baseline, the sole writer of the shared cargo\ncache. Measured both ways here: the lints table rebuilt 50\nworkspace crates and zero registry crates.\n\nEleven crates keep a local [lints.rust] block because cargo\nrefuses to merge an inherited table with the [lints.clippy]\nthey already carry. That makes their nursery \u003d \"warn\"\neffectively deny, since rustc resolves the warnings group at\nemission time and catches anything left at warn whatever the\nflag order. CI behaviour is unchanged: the clippy leg\nalready appended -D warnings.\n\nMost rustdoc fixes drop the link brackets where the target\nis private and rustdoc has nothing to point at under\n--no-deps. Widening visibility to satisfy a doc comment is\nbackwards, and --document-private-items would publish the\ninternals of every crate.\n\nThe dead ci-qemu feature goes with it; nothing has\nreferenced it since the monorepo restructure in 8db64db94."
    },
    {
      "commit": "2b1406b1811e6e4d9a14096df9ab76fc15b9dd3b",
      "tree": "aa45757823ee22f99b16b6af263baac63a0a0bbe",
      "parents": [
        "127a33c3bf162d377f4544a3102e65e8deed8785"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 21 12:54:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 12:54:08 2026 +0200"
      },
      "message": "chore(deps): Bump the python group across 3 directories with 1 update (#3926)"
    },
    {
      "commit": "127a33c3bf162d377f4544a3102e65e8deed8785",
      "tree": "84b0a9b1e8a50d032ce7c385ae060613d43f67f9",
      "parents": [
        "ba10371a48b242cd0fae754280861465f27061c2"
      ],
      "author": {
        "name": "Chengxi Luo",
        "email": "chengxi.luo2004@gmail.com",
        "time": "Fri Aug 21 05:27:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 11:27:38 2026 +0200"
      },
      "message": "ci(rust): don\u0027t fail when a DAG scope matches no tests (#3943)"
    },
    {
      "commit": "ba10371a48b242cd0fae754280861465f27061c2",
      "tree": "9f42e25fb7cba3ad3b86210bd00263ade3453160",
      "parents": [
        "3a3d32387f1af0aabf867ac308cc29ab9ed74f18"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 21 10:35:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 10:35:47 2026 +0200"
      },
      "message": "chore(deps): Bump the web group across 1 directory with 9 updates (#3936)"
    },
    {
      "commit": "3a3d32387f1af0aabf867ac308cc29ab9ed74f18",
      "tree": "b18b92abcd80acf172b9731b97ade34a37581b5b",
      "parents": [
        "0f48afd6287bc55cf33114a939c847c5429f0614"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 21 08:39:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 08:39:20 2026 +0200"
      },
      "message": "chore(deps): Bump googletest from 1.17.0.bcr.2 to 1.18.0 in /foreign/cpp in the cpp group across 1 directory (#3937)"
    },
    {
      "commit": "0f48afd6287bc55cf33114a939c847c5429f0614",
      "tree": "08d8867dafb252cb351f2399552f78b8e526e4d1",
      "parents": [
        "c0c74931b1727169daea06dcd438478640ce09f3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 21 08:17:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 08:17:41 2026 +0200"
      },
      "message": "chore(deps): Bump the node group across 2 directories with 7 updates (#3938)"
    },
    {
      "commit": "c0c74931b1727169daea06dcd438478640ce09f3",
      "tree": "23cf9a6978ddd1bc1ebb133715f06a095ff633a4",
      "parents": [
        "35d2c4244d09d06bab86ecadc30f6e3d391a0b5d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Aug 20 16:08:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 16:08:48 2026 +0200"
      },
      "message": "chore(deps): Bump taiki-e/install-action from 2.85.8 to 2.85.11 in the github-actions group (#3920)"
    },
    {
      "commit": "35d2c4244d09d06bab86ecadc30f6e3d391a0b5d",
      "tree": "3e979c359349adb2bc7670e5e1c8a58933afef84",
      "parents": [
        "2b52fe0bd7a752bee24d582f723cdcb5623c19bb"
      ],
      "author": {
        "name": "Ethan Lin",
        "email": "103916325+ethanlin01x@users.noreply.github.com",
        "time": "Thu Aug 20 21:28:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 15:28:51 2026 +0200"
      },
      "message": "feat(python): let poll_messages take a consumer (#3877)"
    },
    {
      "commit": "2b52fe0bd7a752bee24d582f723cdcb5623c19bb",
      "tree": "03bb374941ea4a07e1d427eabe9c0229e3efcbc3",
      "parents": [
        "9f3468bd57a432c68f2a7ac5f3f160a568fb4b8d"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Aug 20 15:04:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 15:04:27 2026 +0200"
      },
      "message": "ci: replace Ana06/get-changed-files with dorny/paths-filter (#3916)\n\nAna06/get-changed-files targets node20, which runners now force\nonto node24 with a deprecation warning on every detect run. The\naction is unmaintained with no node24 release.\n\ndorny/paths-filter v4.0.3 is ASF-approved (approved_patterns.yml),\ntargets node24, and yields the same changed-file list via a\ncatch-all filter with list-files: json. Its matcher sets dot: true,\nso .github/** changes still match, and all_files covers added,\nmodified and deleted paths like Ana06\u0027s all output."
    },
    {
      "commit": "9f3468bd57a432c68f2a7ac5f3f160a568fb4b8d",
      "tree": "ad6a5c46a421daea451edec9505f7978c5005826",
      "parents": [
        "89dea0ed3c8853ba27b38b28dde5f7263779126b"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Aug 20 14:41:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 14:41:52 2026 +0200"
      },
      "message": "chore(repo): remove incubating references after TLP graduation (#3928)\n\nApache Iggy graduated from the Apache Incubator to a\ntop-level project. Drop the incubation disclaimer from\nDockerfiles, READMEs, and edge release notes, delete\nthe DISCLAIMER file, rename release tarballs from\niggy-\u003cversion\u003e-incubating-src to iggy-\u003cversion\u003e-src,\nand strip \"(Incubating)\" from NOTICE, LICENSE, package\nmetadata, CLI about text, and the bench dashboard\nfooter. SECURITY.md now says PMC instead of PPMC."
    },
    {
      "commit": "89dea0ed3c8853ba27b38b28dde5f7263779126b",
      "tree": "c8df3bba9bfa585e11eb422f8bd1804bf7a98191",
      "parents": [
        "21fc4d849178d85381d8d78716a1e58b8ee6e566"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Aug 20 14:15:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 14:15:08 2026 +0200"
      },
      "message": "fix(metadata): truncate the WAL suffix above the state-transfer floor (#3918)"
    },
    {
      "commit": "21fc4d849178d85381d8d78716a1e58b8ee6e566",
      "tree": "64d6878cca6008d7ff1c47729c2465c046571c13",
      "parents": [
        "565e1a7b20ff1a1c58a9ac4eddead3c708cc0c04"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Aug 20 13:54:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 13:54:35 2026 +0200"
      },
      "message": "feat(shard): split the inbox into consensus and client-reply lanes (#3915)"
    },
    {
      "commit": "565e1a7b20ff1a1c58a9ac4eddead3c708cc0c04",
      "tree": "bfbd1a839f2b16ff34cd56e6363d4d6d2605da44",
      "parents": [
        "8ed41c7db2221d0e1fb3b2859e0586afc172f3db"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Aug 20 13:08:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 13:08:58 2026 +0200"
      },
      "message": "refactor(shard): drop journal generic, metrics scrape, poll cursor (#3914)"
    },
    {
      "commit": "8ed41c7db2221d0e1fb3b2859e0586afc172f3db",
      "tree": "55ebe88c4e558199ee2e052bf49abc81cf1c7a43",
      "parents": [
        "3db955eae215eb815dc2d3825c5b06e9787b77df"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Thu Aug 20 12:42:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 12:42:41 2026 +0200"
      },
      "message": "refactor(server): consensus restore, fail-stop, linear cleanup batch (#3911)"
    },
    {
      "commit": "3db955eae215eb815dc2d3825c5b06e9787b77df",
      "tree": "17f29821bca2482dfddf657ddf5b0d27976783ef",
      "parents": [
        "3cd0860a97492cc566d3c2e3b1752c18168b7580"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Thu Aug 20 08:58:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 08:58:10 2026 +0200"
      },
      "message": "ci: bound apt-get so a dead mirror cannot wedge a job (#3924)"
    },
    {
      "commit": "3cd0860a97492cc566d3c2e3b1752c18168b7580",
      "tree": "54cc9fd680069b2270e6b5982955f7f2b53b292d",
      "parents": [
        "ab257a03996cc67d2ee2efad5501d8953d086bcd"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Wed Aug 19 13:09:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 13:09:30 2026 +0200"
      },
      "message": "fix(connectors): stop rendering counter metrics with a doubled _total (#3921)\n\nThe runtime registered its six counter families under names that\nalready ended in _total, and the OpenMetrics encoder appends that\nsuffix itself, so every scrape exposed names like\niggy_connector_errors_total_total. The runtime README documented the\nun-doubled names all along, so no scraper ever saw what the docs\npromised.\n\nDrop the literal suffix at registration and let the encoder add it.\nGauges stay as they are: the encoder appends nothing to them, so\ntheir names already rendered correctly, including the ones that end\nin _total.\n\nThe existing tests could not catch this. They asserted with\ncontains() on a name that is a substring of the doubled one, which\npasses on broken and on fixed code alike. The new test compares the\nfull set of rendered series names, so a silent rename fails too, and\nthe live-runtime scrape test now rejects a doubled suffix on the\nwire.\n\nThis changes operator-facing series names, so anything scraping the\ndoubled names has to be updated."
    },
    {
      "commit": "ab257a03996cc67d2ee2efad5501d8953d086bcd",
      "tree": "c661cef0f98fec00f7838aabb9f642671f44bcb8",
      "parents": [
        "af9ce954841a3b0c54ed4a59e2a1db714fe84a5a"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Wed Aug 19 06:45:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 06:45:54 2026 +0200"
      },
      "message": "refactor(consensus): single restore constructor + wedge/replay/ack fixes (#3909)"
    },
    {
      "commit": "af9ce954841a3b0c54ed4a59e2a1db714fe84a5a",
      "tree": "c20d785b767118afa4476edb152aed4bbefb0c9a",
      "parents": [
        "c9d38ee331f0337b8fb089eb42deda02f706241e"
      ],
      "author": {
        "name": "Rohan Dubey",
        "email": "rohankumardubey497@gmail.com",
        "time": "Tue Aug 18 22:55:50 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 19:25:50 2026 +0200"
      },
      "message": "feat(connectors): add source batch acknowledgments (#3855)"
    },
    {
      "commit": "c9d38ee331f0337b8fb089eb42deda02f706241e",
      "tree": "e6c7fca3c794d3309744ad9351791dfb53f268a9",
      "parents": [
        "15fe5dce90721f4de8d7339d40ed2229af7bfba0"
      ],
      "author": {
        "name": "Jamison-J",
        "email": "jiangzhen0929@163.com",
        "time": "Tue Aug 18 23:09:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 17:09:49 2026 +0200"
      },
      "message": "test(bdd): add stream CRUD coverage for Rust and Java (#3875)"
    },
    {
      "commit": "15fe5dce90721f4de8d7339d40ed2229af7bfba0",
      "tree": "88d83facf7271e51fe0f28dfec16a023d947392d",
      "parents": [
        "e71e3c61ec78fee8dcf380332e5d606db376d97a"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Tue Aug 18 16:02:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 16:02:31 2026 +0200"
      },
      "message": "test(integration): add SIGKILL crash-durability cluster tests (#3905)\n\nEvery harness \"crash\" was a graceful SIGTERM with a 5s shutdown\nflush, so no test asserted that an acked write survives a real\nprocess kill at any node count, and the torn-tail recovery path\nin segment_recovery had no coverage at all.\n\nAdd a kill() facility (SIGKILL with the watchdog stopped before\nthe signal), shared disk oracles under harness::disk, and 12\ncluster tests covering crash durability, offset re-mint, on-disk\ncorruption recovery, failover client continuity, and client-table\ndedup under churn. Six tests pass; seven are honest red specs\nmarked #[ignore] with reasons naming the defects they pin:\noffset re-mint after restart, torn-tail size-counter divergence\nbricking restarts, index stride misalignment, missing SDK\nmulti-endpoint failover, dedup-watermark eviction, reply-ring\nfall-off, and unknown operations collapsing into\nInvalidBitPattern.\n\nREPLY_RING_CAPACITY is exported from consensus so the reply-ring\nspec tracks the real constant instead of a copied literal."
    },
    {
      "commit": "e71e3c61ec78fee8dcf380332e5d606db376d97a",
      "tree": "c4204d03e022e0d3a14d5d53cc00e3cc3c011a14",
      "parents": [
        "6043d194000cff5f5498a91dc2259e34762f7d1c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Aug 18 14:05:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 14:05:21 2026 +0200"
      },
      "message": "chore(deps): Bump the csharp group with 1 update (#3906)"
    },
    {
      "commit": "6043d194000cff5f5498a91dc2259e34762f7d1c",
      "tree": "102f9812bdcbff6ae6e905ffb77d77dc270ffff6",
      "parents": [
        "18a159a13626e4db69ac7fabb4ebf433977e72d2"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Tue Aug 18 11:35:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 11:35:06 2026 +0200"
      },
      "message": "refactor(consensus): build replies in Owned and clear stale todos (#3908)"
    },
    {
      "commit": "18a159a13626e4db69ac7fabb4ebf433977e72d2",
      "tree": "0048b7ce8778fe4c6ecd7671ac4cf47f645428cf",
      "parents": [
        "0490a1c851b059e8b10605115b679ae4ffb4ed9f"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Tue Aug 18 09:15:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 09:15:36 2026 +0200"
      },
      "message": "refactor(sdk)!: remove v2 bridges and legacy message wire format (#3904)\n\nRemoves the old bridge APIs such as `StoreConsumerOffset2` and\n`DeleteConsumerOffset2`, additionally promotes to the client side\nencoding the new message wire format, rather than relying on server-side\nconversion.\n\n---------\n\nCo-authored-by: Piotr Gankiewicz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "0490a1c851b059e8b10605115b679ae4ffb4ed9f",
      "tree": "17269b9706ad71e0fb7aefa341dfc5612511242b",
      "parents": [
        "1890c35f3a0cdd7766d68eef0fc297d33941f505"
      ],
      "author": {
        "name": "Krishna Vishal",
        "email": "krishnavishal2008@gmail.com",
        "time": "Tue Aug 18 11:17:56 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 07:47:56 2026 +0200"
      },
      "message": "fix(metadata): enforce namespace caps at admission to stop aliasing (#3907)\n\nNothing bounded the namespace packing limits at admission. The metadata\nSTM allocated stream and topic ids from an unbounded slab key and\npartition ids from `max + 1`, and `IggyNamespace::new` masked\nout-of-range components instead of rejecting them, so `4096 \u0026\nSTREAM_MASK \u003d\u003d 0`. The 4097th stream\u0027s partitions packed to the same\nconsensus group ids as stream 0\u0027s. Two distinct partitions then shared\none VSR instance and one prepare journal, interleaving prepares and\ncolliding offsets, with no error surfaced anywhere.\n\nThe existing fences could not catch it. The boot-time check only fired\non restart, after the corruption. The reconciler check read ids back out\nof the already-masked namespace, so the aliased value passed. The\n`[extra.namespace]` config only proved the configured caps fit the bit\nlayout and never gated a create.\n\nEnforcement now lives in the metadata STM apply handlers, compared\nagainst the compile-time constants rather than per-node config, so every\nreplica reaches the same verdict and the client gets a real error code\ninstead of corrupted routing. `IggyNamespace::new` rejects rather than\nmasks, with `try_new` for callers holding untrusted ids. The range check\nis paired with a distinctness\n\n---------\n\nCo-authored-by: spetz \u003cpiotr.gankiewicz@gmail.com\u003e"
    },
    {
      "commit": "1890c35f3a0cdd7766d68eef0fc297d33941f505",
      "tree": "5246f3f3e79c9d5cf6dc3368bde4bc7a16a95d57",
      "parents": [
        "d24b69fdafefb368001b00ab4052b4e256741309"
      ],
      "author": {
        "name": "Łukasz Zborek",
        "email": "luki215@gmail.com",
        "time": "Mon Aug 17 20:36:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 20:36:55 2026 +0200"
      },
      "message": "feat(csharp): add heartbeat mechanism (#3894)\n\n- TCP client heartbeat: PeriodicTimer loop pings server every\nHeartbeatInterval (default 5s, new option on IggyClientConfigurator).\nPing goes through normal request path, so reconnect + auto login repair\ndead session. Skips ping when connecting or when reconnect/auto-login\ndisabled and connection dead. Started under connect gate, no duplicate\nloops.\n- AutoLoginSettings: init-only, PersonalAccessToken support, public\nFor(user, pwd) / ForPersonalAccessToken(token) factories.\n- Consumer/Publisher builders: heartbeat + auto-login wiring, warning\nwhen reconnect enabled without auto login.\n- Enable reconnection by default"
    },
    {
      "commit": "d24b69fdafefb368001b00ab4052b4e256741309",
      "tree": "1febf4981425bfb647becfad1f3f1a20afc918b6",
      "parents": [
        "aeee0fc54420b30bf0a993776f539f80e9a2cd87"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Aug 17 18:28:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 18:28:43 2026 +0200"
      },
      "message": "fix(cli): bound ping retries, macOS boot smoke, java PAT expiry (#3903)"
    },
    {
      "commit": "aeee0fc54420b30bf0a993776f539f80e9a2cd87",
      "tree": "534a948971baad2d78974e1aaa96588e5ce204f4",
      "parents": [
        "3e805f30fe19c34c93a54235723574f44532c678"
      ],
      "author": {
        "name": "Ryan Huang",
        "email": "ryankert01@gmail.com",
        "time": "Mon Aug 17 16:59:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 10:59:22 2026 +0200"
      },
      "message": "perf(connectors): add opt-in CSV output format to Doris sink (#3575)"
    },
    {
      "commit": "3e805f30fe19c34c93a54235723574f44532c678",
      "tree": "7bd361c57810888d29f91d5cfede67b094ddc0cf",
      "parents": [
        "338cd2eaf7e14e2dc36e102eb6189efad43afb8d"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Mon Aug 17 09:35:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 09:35:41 2026 +0200"
      },
      "message": "fix(ci): restore Docker and PyPI releases (#3902)"
    },
    {
      "commit": "338cd2eaf7e14e2dc36e102eb6189efad43afb8d",
      "tree": "aeb84b8308d7bb45c3ad273cdc17fc746fc6f35e",
      "parents": [
        "be5012ec92c99c564ff9e91baae0aa8e5184025a"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Mon Aug 17 07:58:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 07:58:54 2026 +0200"
      },
      "message": "refactor(configs): clean up server config after full field audit (#3895)\n\nA field-by-field audit found dead fields with live plumbing,\ninert features, unsafe defaults, and stale comments.\n\nDrop dead fields and their plumbing, reject unsignable JWT\nalgorithms at boot, fix QUIC initial_mtu, split the per-stream\nreceive window, and enable the message cleaner by default.\nClient-listener TLS keeps the on-disk-certificate precedence:\nself_signed mints an ephemeral certificate only when cert_file\nis absent, and the server logs which way it went. Size\nretention divides max_topic_size across partitions, ignores\nthe active segment, floors each share at one sealed segment\n(warned and logged), and re-stages spent cleaner passes so\nbacklogs drain continuously.\n\nAlso bump every SDK touched by the previous release train one\nedge higher, and require authentication for the HTTP metrics\nendpoint.\n\nUpgrade notes:\n\n- Topics with finite message_expiry or max_topic_size start\n  deleting oldest sealed segments shortly after upgrade.\n- GET /metrics now requires a bearer credential (JWT or PAT);\n  configure scrapers accordingly (helm serviceMonitor gained an\n  authorization passthrough).\n- QUIC cert path defaults now empty.\n- http.jwt.algorithm refuses non-HMAC at boot when HTTP\n  enabled; trusted issuers unaffected."
    },
    {
      "commit": "be5012ec92c99c564ff9e91baae0aa8e5184025a",
      "tree": "0e2e99d1c3347d29a64d98183df237016f0775db",
      "parents": [
        "f42f5abc855f5d6f9906373e9a5b74a8bcb96d9d"
      ],
      "author": {
        "name": "Hubert Gruszecki",
        "email": "h.gruszecki@gmail.com",
        "time": "Sun Aug 16 22:10:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 22:10:41 2026 +0200"
      },
      "message": "fix(server): restore get_user self-read without read_users permission (#3897)"
    },
    {
      "commit": "f42f5abc855f5d6f9906373e9a5b74a8bcb96d9d",
      "tree": "b7660612ce29d781b0c997968ed542635a3d1764",
      "parents": [
        "ec456d2370de25f6585dc245077a487d9cdf7730"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Sun Aug 16 16:52:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 16:52:25 2026 +0200"
      },
      "message": "chore: remove resolved TODO comments (#3887)"
    },
    {
      "commit": "ec456d2370de25f6585dc245077a487d9cdf7730",
      "tree": "5cc2d4b34d13a69bb4e40fbf3755d2d8e9ba20a0",
      "parents": [
        "7c0fd68421aa610897fdbc7331f1cb22848fb386"
      ],
      "author": {
        "name": "Piotr Gankiewicz",
        "email": "piotr.gankiewicz@gmail.com",
        "time": "Sun Aug 16 09:59:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 09:59:25 2026 +0200"
      },
      "message": "ci(security): replace package tokens with OIDC (#3892)\n\nCargo, npm, PyPI, and NuGet publishing depended on long-lived\nrepository secrets that required rotation and expanded credential\nexposure.\n\nAuthenticate each registry through GitHub OIDC and short-lived\ncredentials. Route automatic releases through publish.yml so manual\nand version-triggered publishes use the same trusted workflow\nidentity."
    },
    {
      "commit": "7c0fd68421aa610897fdbc7331f1cb22848fb386",
      "tree": "d07d8618c7c61fbe0ac1ce085b8200b02f87b173",
      "parents": [
        "317ce15e794e7ac5c4c214ac5b0e646d8a7b0328"
      ],
      "author": {
        "name": "Grzegorz Koszyk",
        "email": "112548209+numinnex@users.noreply.github.com",
        "time": "Sat Aug 15 09:13:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 15 09:13:29 2026 +0200"
      },
      "message": "feat(common)!: extensible key-value options for topics, streams, users (#3880)\n\nThis PR reworks current Streams/Topics/Users metadata storage by\nreplacing the hard coded values with an extensible key value pair\nstorage. Additionally it moves some of the partition related settings\nsuch as `messages_required_to_save` or `segment_size` from the static\nconfiguration (config.toml) to topic property.\n\n---------\n\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e"
    },
    {
      "commit": "317ce15e794e7ac5c4c214ac5b0e646d8a7b0328",
      "tree": "9551648dfe3dd47d9cb8344070060cc7d33c1d1c",
      "parents": [
        "46bb40a9a55024470d827b02a216919fb5ece34c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 14 23:49:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 23:49:56 2026 +0200"
      },
      "message": "chore(deps): Bump github.com/klauspost/compress from 1.19.1 to 1.19.2 in /bdd/go in the go group across 1 directory (#3884)"
    },
    {
      "commit": "46bb40a9a55024470d827b02a216919fb5ece34c",
      "tree": "260ac22344d8f39b8bd88fa3bce352a0441d8f36",
      "parents": [
        "2a8a5c96925f8b96a7e8718448079a63ce57980c"
      ],
      "author": {
        "name": "haubur",
        "email": "haubur@mailbox.org",
        "time": "Fri Aug 14 21:47:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 21:47:52 2026 +0200"
      },
      "message": "fix(sdk): delete_offset(None) for a standalone consumer should delete current_partition_id offset (#3882)\n\nCo-authored-by: Hubert Gruszecki \u003ch.gruszecki@gmail.com\u003e"
    }
  ],
  "next": "2a8a5c96925f8b96a7e8718448079a63ce57980c"
}
