)]}'
{
  "log": [
    {
      "commit": "aaf5dde5ee89ae77d5907f05c0b17c402193a80f",
      "tree": "7928202df6d0f6a06a9d015fb709a728d10df233",
      "parents": [
        "2d69d0cd192caa352e5a53e2e2f5637e119df08a"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 27 14:27:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 14:27:06 2026 +0200"
      },
      "message": "[hotfix][ci] Do not run GHA if only azure pipelines are changed"
    },
    {
      "commit": "2d69d0cd192caa352e5a53e2e2f5637e119df08a",
      "tree": "17f7ae6f8b6b204474757260146c2531ae57492a",
      "parents": [
        "952fad470af61b26b24fb65d533a81bd08ead10b"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 27 08:54:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 08:54:16 2026 +0200"
      },
      "message": "[FLINK-40230][table] `StringToBinary` and `RawToBinary` cast rules might generate runtime code with useless array copy"
    },
    {
      "commit": "952fad470af61b26b24fb65d533a81bd08ead10b",
      "tree": "9d2c36cac31b22130d5acb5e2d20338224a7b3cf",
      "parents": [
        "9485109a4e1eb5b835b99132c5b29a656bed29dc"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 27 07:06:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 07:06:33 2026 +0200"
      },
      "message": "[FLINK-40231][tests] Fix flaky `HistoryServerArchiveFetcherTest#testArchiveStateTransition`"
    },
    {
      "commit": "9485109a4e1eb5b835b99132c5b29a656bed29dc",
      "tree": "a089e08f77bd56bce69b2a2a53421dbf8c233e35",
      "parents": [
        "e64a5d538d1c12097f545e75aa6a4553d2f09a8c"
      ],
      "author": {
        "name": "Dale Lane",
        "email": "dale.lane@uk.ibm.com",
        "time": "Sat Jul 25 21:29:25 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 22:29:25 2026 +0200"
      },
      "message": "[FLINK-40224][ci] Move common scripts out of tools/azure-pipelines\n\nGHA pipelines use some of the assets from tools/azure-pipelines\n\nThis commit moves them into tools/ci to reflect that they are not\nunique to the AZP builds, and are common across both.\n\nSigned-off-by: Dale Lane \u003cdale.lane@uk.ibm.com\u003e"
    },
    {
      "commit": "e64a5d538d1c12097f545e75aa6a4553d2f09a8c",
      "tree": "5ceb0f5594879a31c2932c5ae596f4b395e01075",
      "parents": [
        "1ea8cb0e4e53462d3196cee35eba954930847bb0"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Jul 25 22:26:28 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Jul 25 22:26:28 2026 +0200"
      },
      "message": "Revert \"[FLINK-40228][ci] Bump frontend-maven-plugin to 2.0.1\"\nas it requires minimum jdk17\n\nThis reverts commit 4e995125ff9dcafc8c91d6119ea3dd9436522fa1.\n"
    },
    {
      "commit": "1ea8cb0e4e53462d3196cee35eba954930847bb0",
      "tree": "0a995d533639737c5e3e2725a4f33eb1d54aa777",
      "parents": [
        "f9485ff173b940c5ddf606d8ca1a92a18bb23ff3"
      ],
      "author": {
        "name": "Weiqing Yang",
        "email": "yangweiqing001@gmail.com",
        "time": "Fri Jul 24 18:12:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 09:12:25 2026 +0800"
      },
      "message": "[FLINK-40167][table] Add EARLY_FIRE join hint surface and option validation (#28353)"
    },
    {
      "commit": "f9485ff173b940c5ddf606d8ca1a92a18bb23ff3",
      "tree": "52a8e5488a1ec9253b7bb79c757e0ad46814a7a6",
      "parents": [
        "4e995125ff9dcafc8c91d6119ea3dd9436522fa1"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Fri Jul 24 12:03:44 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 08:33:44 2026 +0200"
      },
      "message": "[FLINK-39770][tests][JUnit5 migration] Module: flink-state-processing-api"
    },
    {
      "commit": "4e995125ff9dcafc8c91d6119ea3dd9436522fa1",
      "tree": "1093082a5a41a44cc330c326dbfed61e8427c154",
      "parents": [
        "c43754cdc4f7f70b64f79bc64b42b03b0359fc70"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Fri Jul 24 07:36:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 07:36:26 2026 +0200"
      },
      "message": "[FLINK-40228][ci] Bump frontend-maven-plugin to 2.0.1"
    },
    {
      "commit": "c43754cdc4f7f70b64f79bc64b42b03b0359fc70",
      "tree": "1882e43bc7809c9a06077ca3ebed715f9b933756",
      "parents": [
        "96a45c1234dd4592852b9a93f86b4a36b40bf23a"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Thu Jul 23 12:59:58 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Jul 23 18:05:56 2026 +0200"
      },
      "message": "[FLINK-40217][table] Add `PARSE_JSON` and `TRY_PARSE_JSON` IT cases\n\nCover the end-to-end SQL wiring for PARSE_JSON and TRY_PARSE_JSON: a JSON_STRING round trip, NULL handling, and the out-of-range number behavior. An overflowing number such as 1e400 makes PARSE_JSON fail with a TableRuntimeException, while TRY_PARSE_JSON returns NULL. The parsing semantics themselves stay covered by BinaryVariantInternalBuilderTest.\n\nThis closes #28808.\n"
    },
    {
      "commit": "96a45c1234dd4592852b9a93f86b4a36b40bf23a",
      "tree": "41eb72947222a555c7fe28775dfec418e9c465e6",
      "parents": [
        "11c6b478ac35faf42c2cb11a7342e996044911ce"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Jul 22 18:00:43 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Jul 23 17:55:51 2026 +0200"
      },
      "message": "[FLINK-40217][core] Reject non-finite numbers in `VARIANT` JSON conversion\n\nPARSE_JSON accepted JSON numbers outside the double range, such as 1e400, and silently stored them as +/-Infinity. Variant.toJson() then emitted bare Infinity/-Infinity tokens, which are invalid JSON and cannot be parsed back by PARSE_JSON, so the round trip was broken.\n\nparseFloatingPoint now rejects a non-finite result from getDoubleValue() with a clear parse error. PARSE_JSON surfaces the failure and TRY_PARSE_JSON returns NULL, so a parsed Variant can never hold a non-finite value.\n\nAs a defensive safeguard for the builder API, which can still inject non-finite values, toJson() now throws for non-finite DOUBLE and FLOAT values instead of emitting invalid tokens.\n"
    },
    {
      "commit": "11c6b478ac35faf42c2cb11a7342e996044911ce",
      "tree": "dd0cedc3bbcd39230ea4d9aa1dc61ded4dd02da2",
      "parents": [
        "43a902ad128824d0e4f696ee96cd8c29e5416e2e"
      ],
      "author": {
        "name": "Liu Liu",
        "email": "imbiansl@live.cn",
        "time": "Tue Apr 28 13:59:33 2026 +0800"
      },
      "committer": {
        "name": "Dian Fu",
        "email": "dianfu@apache.org",
        "time": "Thu Jul 23 20:12:12 2026 +0800"
      },
      "message": "[FLINK-39532][python] Fix race condition in Python AsyncScalarFunctionOperation\n\nThis closes #28036.\n"
    },
    {
      "commit": "43a902ad128824d0e4f696ee96cd8c29e5416e2e",
      "tree": "ef32329352099af32bc8eb9c76fad0b0e6e892e6",
      "parents": [
        "ff3aadfa6ddd222c5360f3a4c0880e557c53ffd3"
      ],
      "author": {
        "name": "Dale Lane",
        "email": "dlane@confluent.io",
        "time": "Thu Jul 23 10:31:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:31:03 2026 +0200"
      },
      "message": "[FLINK-40166][table] SQL query parsing fails if current catalog unreachable (#28775)\n\nIf the current catalog is unreachable, any SQL query fails to\nparse - even queries that make fully-qualified accesses to\ncatalogs that are reachable.\n\nThis is because we make a call to databaseExists in the current\ncatalog as part of parsing the statement.\n\nThis commit wraps this in a try..catch so it doesn\u0027t block the\nremainder of the parsing.\n\nSigned-off-by: Dale Lane \u003cdale.lane@uk.ibm.com\u003e"
    },
    {
      "commit": "ff3aadfa6ddd222c5360f3a4c0880e557c53ffd3",
      "tree": "3e28509f49b867c3f118a664e0b72e0ecc5c95b8",
      "parents": [
        "aef4bb322d01863432eeb986db0e188ad32ab0fd"
      ],
      "author": {
        "name": "Yuepeng Pan",
        "email": "panyuepeng@apache.org",
        "time": "Thu Jul 23 12:45:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:45:24 2026 +0800"
      },
      "message": "[FLINK-40220][Connector/JDBC] Update the branch name of JDBC connector docs. (#28804)"
    },
    {
      "commit": "aef4bb322d01863432eeb986db0e188ad32ab0fd",
      "tree": "007974da43b939c3aa4e9f419d9925710149f952",
      "parents": [
        "1a45ad8ba3c40f8b390e98e9ced5b433cba2a7c4"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Wed Jul 22 20:13:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 20:13:38 2026 +0200"
      },
      "message": "[FLINK-40219][table] Fix outputType computation of LateralSnapshotJoin (#28803)\n\nTimeIndicatorRelDataType.getOriginalType() does not reliably provide the correct nullability.\nThe planner might have changed the nullability on the time indicator type without updating the nested original type.\nThis change fixes the outputType computation to use the same rowtime type conversion as RelTimeIndicatorConverter.\n\nGenerated-By: Claude Opus 4.8 (1M context)"
    },
    {
      "commit": "1a45ad8ba3c40f8b390e98e9ced5b433cba2a7c4",
      "tree": "710640ddd95db136c62f70ef3a0938b612c24895",
      "parents": [
        "3e348d9a4878ed2baf3c90d6769796d1f6cf5d1a"
      ],
      "author": {
        "name": "Yuepeng Pan",
        "email": "panyuepeng@apache.org",
        "time": "Wed Jul 22 20:19:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 20:19:42 2026 +0800"
      },
      "message": "[hotfix][docs] Remove inconsistent parameter descriptions. (#28767)"
    },
    {
      "commit": "3e348d9a4878ed2baf3c90d6769796d1f6cf5d1a",
      "tree": "47ad8edee7df4e2ad6d14b02de303a0d519a5e1f",
      "parents": [
        "9c4a95c067a4e8dd3bb300ac748d2716d349a5b3"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "rgharib@confluent.io",
        "time": "Wed Jul 22 14:10:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 14:10:26 2026 +0200"
      },
      "message": "[hotfix] Fix compilation with jdk11"
    },
    {
      "commit": "9c4a95c067a4e8dd3bb300ac748d2716d349a5b3",
      "tree": "a2dcfa103d4715f559e351b4b139836f6bb76ad7",
      "parents": [
        "c762aa5948c277d130f68daaa5d0443f73da8f01"
      ],
      "author": {
        "name": "David Anderson",
        "email": "david@alpinegizmo.com",
        "time": "Wed Jul 22 08:09:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 08:09:35 2026 -0400"
      },
      "message": "[FLINK-40020][release] Generate reference data for state migration tests based on release-2.3.0 (#28785)"
    },
    {
      "commit": "c762aa5948c277d130f68daaa5d0443f73da8f01",
      "tree": "a34accf18010b0386ca05427e5083b5b8bf34190",
      "parents": [
        "d8660309854d02a3f55e50f8d80b64c23bb76f55"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Wed Jul 22 09:44:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 09:44:50 2026 +0200"
      },
      "message": "[FLINK-40205][table] PTF are failing in case of usage multiple `PARTITION`/`ORDER BY`"
    },
    {
      "commit": "d8660309854d02a3f55e50f8d80b64c23bb76f55",
      "tree": "b55be55b248042ab9ec16d9162e0de6dded1a80c",
      "parents": [
        "ae20292b5c151714f2f64d84398dd4e5020eb9fc"
      ],
      "author": {
        "name": "Zihao Chen",
        "email": "ischenzihao@gmail.com",
        "time": "Tue Jul 07 17:44:23 2026 +0800"
      },
      "committer": {
        "name": "reswqa",
        "email": "reswqa@163.com",
        "time": "Wed Jul 22 15:03:13 2026 +0800"
      },
      "message": "[FLINK-40097][docs] Document archive load modes of HistoryServer\n"
    },
    {
      "commit": "ae20292b5c151714f2f64d84398dd4e5020eb9fc",
      "tree": "d92e662bc65e7f49e17480cd5b7c49ed573c52d3",
      "parents": [
        "db8a7f74fd93cb1d28823a292d57207ffccb2f88"
      ],
      "author": {
        "name": "Zihao Chen",
        "email": "ischenzihao@gmail.com",
        "time": "Tue Jul 07 14:43:07 2026 +0800"
      },
      "committer": {
        "name": "reswqa",
        "email": "reswqa@163.com",
        "time": "Wed Jul 22 15:03:13 2026 +0800"
      },
      "message": "[FLINK-40097][historyserver] Prioritize on-demand fetching for accessed jobs\n"
    },
    {
      "commit": "db8a7f74fd93cb1d28823a292d57207ffccb2f88",
      "tree": "7f5c2c960a45a35285fee18856eb91e71a08b6e9",
      "parents": [
        "f16dd6e7c230ce92fd8c87c3122ba5e188416a02"
      ],
      "author": {
        "name": "Zihao Chen",
        "email": "ischenzihao@gmail.com",
        "time": "Mon Jul 06 11:17:05 2026 +0800"
      },
      "committer": {
        "name": "reswqa",
        "email": "reswqa@163.com",
        "time": "Wed Jul 22 15:03:13 2026 +0800"
      },
      "message": "[FLINK-40097][historyserver] Lazily load archives to expose job overviews earlier\n"
    },
    {
      "commit": "f16dd6e7c230ce92fd8c87c3122ba5e188416a02",
      "tree": "db20de4108cd283e2143139d9c89ee85ac2cd516",
      "parents": [
        "8fd8d9298abf42c96f2023ff50fb6f5a3f75979b"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Jul 21 19:26:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 19:26:35 2026 +0200"
      },
      "message": "[hotfix][ci] Bump checkout action to v7"
    },
    {
      "commit": "8fd8d9298abf42c96f2023ff50fb6f5a3f75979b",
      "tree": "9e97362d36fad7588ea75629ead0f396ca229bbb",
      "parents": [
        "695ccca9a04a11275ffb230024527e3f226b9ab8"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Tue Jul 21 18:50:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 18:50:07 2026 +0200"
      },
      "message": "[FLINK-40131][docs] Document LATERAL SNAPSHOT join (#28737)\n\n* [FLINK-40131][docs] Document LATERAL SNAPSHOT join\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "695ccca9a04a11275ffb230024527e3f226b9ab8",
      "tree": "6031a2dd2ded44ca3313865496a989d62f4ae39e",
      "parents": [
        "67a3291aeac7d3075618294e12cd3bfe3b732261"
      ],
      "author": {
        "name": "Piotr Nowojski",
        "email": "piotr.nowojski@gmail.com",
        "time": "Wed Jul 08 18:05:49 2026 +0200"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Tue Jul 21 18:00:32 2026 +0200"
      },
      "message": "[FLINK-40101][runtime] Emit intermediate watermarks while firing timers\n\nWith unaligned checkpoints + interruptible timers, an operator\u0027s output\nwatermark could stall for hours (surviving restarts) because it only\nadvances once an entire due-timer backlog drains in one uninterrupted\npass — a large backlog (e.g. after a rescale) can outlast every single\nattempt.\n\nInternalTimerServiceImpl/InternalTimeServiceManagerImpl now track the\nhighest watermark known to be fully fired even when interrupted\npartway, and MailboxWatermarkProcessor emits that as an intermediate\nwatermark instead of withholding all progress. This progress lives in\na new field, not currentWatermark, since currentWatermark\u0027s eager\nsemantics are relied on elsewhere (WindowOperator cleanup timers, user\nProcessFunctions). Emission is paced by a configurable interval\n(default 5s, 0 disables) via an internal no-op processing-time nudge,\navoiding per-timer clock checks.\n"
    },
    {
      "commit": "67a3291aeac7d3075618294e12cd3bfe3b732261",
      "tree": "85d1a89d1127e744a8c2b055b87f089e3098d84d",
      "parents": [
        "36d42ebc33e64794bee45707a83eba9ee2a80e2a"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Tue Jul 21 17:01:28 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 13:31:28 2026 +0200"
      },
      "message": "[FLINK-38262][table] Add `CreateConnectionOperation` and converter"
    },
    {
      "commit": "36d42ebc33e64794bee45707a83eba9ee2a80e2a",
      "tree": "bd41733daeb144bb374a48e7aa16396e14cd1f0d",
      "parents": [
        "a0605af9be86bec09dbf7d75969644eb8d268792"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "rgharib@confluent.io",
        "time": "Tue Jul 21 13:24:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 13:24:23 2026 +0200"
      },
      "message": "[hotfix][ci] Add checkout step to fix Nightly trigger CI "
    },
    {
      "commit": "a0605af9be86bec09dbf7d75969644eb8d268792",
      "tree": "22edbdd177f4b1b30d09aa8173e78bb57f8e05d1",
      "parents": [
        "39c823ad53f348ec045989c47e14a73c010cd9b9"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 20 22:44:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 22:44:07 2026 +0200"
      },
      "message": "[FLINK-40181][ci] Make spotless checking changes since last green build in ci "
    },
    {
      "commit": "39c823ad53f348ec045989c47e14a73c010cd9b9",
      "tree": "65f9b73b5bbbb64c27c4e4c42e8ed3b426b8b4fc",
      "parents": [
        "d1f08ab3343c741d7668c76a709853d55e589abe"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Jul 19 09:52:25 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 20 19:08:06 2026 +0200"
      },
      "message": "[FLINK-40182][table] Optimize code generated by `ArrayToStringCastRule`\n"
    },
    {
      "commit": "d1f08ab3343c741d7668c76a709853d55e589abe",
      "tree": "bb760fffac9b1f70d9d23a8b9d3b0d13136967f0",
      "parents": [
        "2de0eaf5eff8f73175514527df28aa8abb8ec73e"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Jul 18 23:02:53 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 20 19:08:05 2026 +0200"
      },
      "message": "[FLINK-40182][table] Optimize code generated by `RawToStringCastRule`\n"
    },
    {
      "commit": "2de0eaf5eff8f73175514527df28aa8abb8ec73e",
      "tree": "f6c54e74d7f7038b493563049641dd34674aeef9",
      "parents": [
        "baab138d7784d44d2a49ec83b861c444b3705587"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Jul 18 19:05:15 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 20 19:08:05 2026 +0200"
      },
      "message": "[FLINK-40182][table] Optimize code generated by `CharVarCharTrimPadCastRule`\n"
    },
    {
      "commit": "baab138d7784d44d2a49ec83b861c444b3705587",
      "tree": "e89a1b626f250bc88010431be53c8b3bc1811e06",
      "parents": [
        "f2370b9b3f4366081b8533dbed9805a26590c1ce"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Jul 18 15:06:43 2026 +0200"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 20 19:08:04 2026 +0200"
      },
      "message": "[FLINK-40182][table] `ArrayToArrayCastRule` and `MapToMapAndMultisetToMultisetCastRule` should check for null values in runtime\n\nThis closes #28777.\n"
    },
    {
      "commit": "f2370b9b3f4366081b8533dbed9805a26590c1ce",
      "tree": "606d10a5792580f722b242e727852b27e88d2e57",
      "parents": [
        "f5aaf91f2db1f3eadffc325ad278680dc7aeac56"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Mon Jul 20 18:49:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 18:49:24 2026 +0200"
      },
      "message": "[FLINK-40079][table] Reject PTF calls with sys-args if they are disabled (#28675)\n\n* [FLINK-40079][table] Reject PTF calls with sys-args if they are disabled\n\n* Add a check in SqlValidator to reject PTF calls with system-args (on_time, uid) in SQL querys if the function disabled them.\n* Add a check in ResolveCallByArgumentsRule to reject system-args in functions that disabled them from Table API.\n\nGenerated-By: Claude Opus 4.8 (1M context)"
    },
    {
      "commit": "f5aaf91f2db1f3eadffc325ad278680dc7aeac56",
      "tree": "827e0e0114d4d66d6646ae14eb688639859247a5",
      "parents": [
        "a77d210c99675043794aff6f5fe335e23557fa9f"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Mon Jul 20 16:08:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 16:08:32 2026 +0200"
      },
      "message": "[FLINK-40158][table-planner] Support LATERAL SNAPSHOT join in batch mode (#28763)\n\nIn batch, all input is bounded and append-only, so the processing-time\nLATERAL SNAPSHOT join degenerates to a regular join of the probe side\nagainst the (final) build side; the SNAPSHOT-specific arguments are\ndropped. BatchPhysicalLateralSnapshotJoinRule converts the logical\nsnapshot join into a shuffle hash join that builds the (smaller) SNAPSHOT\nside, mirroring StreamPhysicalLateralSnapshotJoinRule.\n\nGenerated-By: Claude Opus 4.8 (1M context)"
    },
    {
      "commit": "a77d210c99675043794aff6f5fe335e23557fa9f",
      "tree": "9a4f2616b6117e0322e2007879988f658c2ac2e5",
      "parents": [
        "c6fc527d1e069f9d7cddc14ec6baf66b3ceac830"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Thu Jul 09 12:19:23 2026 +0200"
      },
      "committer": {
        "name": "Fabian Hueske",
        "email": "fhueske@gmail.com",
        "time": "Mon Jul 20 16:05:12 2026 +0200"
      },
      "message": "[FLINK-39785][table] Add LATERAL SNAPSHOT e2e and restore tests\n\nAdds end-to-end coverage for the LATERAL SNAPSHOT processing-time temporal join:\n\n* LateralSnapshotJoinSemanticTests: Semantic tests LATERAL SNAPSHOT join\n* LateralSnapshotJoinITCase: non-deterministic result tests and tests over HEAP and ROCKSDB backends\n* LateralSnapshotJoinRestoreTest / LateralSnapshotJoinTestPrograms: savepoint restore tests\n* Configure UTC as local timezone for CommonSemanticTestBase and RestoreTestBase\n\nGenerated-By: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "c6fc527d1e069f9d7cddc14ec6baf66b3ceac830",
      "tree": "4f5fcda7cbad39ca88d220fcb92338402a70835f",
      "parents": [
        "34bda761e9c7d5f5bcdf4ca5cab2d71c76ab3ca7"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Wed Jul 15 17:44:42 2026 +0200"
      },
      "committer": {
        "name": "Fabian Hueske",
        "email": "fhueske@gmail.com",
        "time": "Mon Jul 20 16:05:12 2026 +0200"
      },
      "message": "[FLINK-39785][table] Add input-driven savepoint trigger to restore test framework\n\nLets restore tests take the stop-with-savepoint at a point defined by an\ninput-side signal rather than sink output, so operators that emit nothing at\nthe point of interest can be captured.\n\n* RestoreTestBase: extract the trigger into an overridable awaitSavepointReady\n  (default unchanged: waits for sinks to reach their before-restore rows) and\n  retry stop-with-savepoint while the job is not yet fully running.\n* TestValues watermark-push-down NewSource: add a per-table emission barrier\n  (TestValuesTableFactory#awaitSourceEmitted) completed as rows are emitted.\n\nGenerated-By: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "34bda761e9c7d5f5bcdf4ca5cab2d71c76ab3ca7",
      "tree": "5b3b0e2448a7a38287fb6f5dc064a7cd9adc84ca",
      "parents": [
        "98ab58c023ea8abeceab04108bd939e596a0b078"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Wed Jul 08 20:14:01 2026 +0200"
      },
      "committer": {
        "name": "Fabian Hueske",
        "email": "fhueske@gmail.com",
        "time": "Mon Jul 20 16:05:12 2026 +0200"
      },
      "message": "[FLINK-39785][table] Honor source.sleep-* in TestValues watermark-push-down source\n\nWire the existing source.sleep-after-elements / source.sleep-time options into TestValuesScanTableSourceWithWatermarkPushDown\n\nGenerated-By: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "98ab58c023ea8abeceab04108bd939e596a0b078",
      "tree": "e23d6dd5e49ba617ba83bb8e9e73760c113deb55",
      "parents": [
        "2f21971b7d5bb6963270968b6b17ee084ca7089a"
      ],
      "author": {
        "name": "Roman Khachatryan",
        "email": "khachatryan.roman@gmail.com",
        "time": "Sun Jun 28 22:28:01 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 17 16:19:19 2026 +0200"
      },
      "message": "[FLINK-39522] Defer task finish until recovery completes\n\nA task that reaches END_OF_INPUT during recovery -- e.g. a bounded/batch\noperator whose input is already fully available behind a blocking exchange, as\nseen on TPC-H/TPC-DS HashAggregate -- previously suspended the restore mailbox\nloop immediately. With checkpointing during recovery the recovery future\ncompletes asynchronously, so this could end the restore loop before recovery\nfinished, tripping checkState(allGatesRecoveredFuture.isDone()) in\nrestoreInternal with \"Mailbox loop interrupted before recovery was finished\".\n\nInput is intentionally processed during recovery (so checkpoint barriers can\narrive from inputs); the bug is only the premature lifecycle finish. When\nEND_OF_INPUT is reached while recovery is still in progress, suspend only the\ndefault action (to avoid busy-spinning) and resume it once recovery completes,\nvia a new recoveryCompletionFuture field set in restoreStateAndGates.\nprocessInput then re-fires END_OF_INPUT from the main mailbox loop and finishes\nnormally. Sources remain covered by the no-input-gates short-circuit.\n\nValidated with a deterministic repro (bounded BATCH job, recovery window\nwidened): the race reproduces with this deferral disabled and is gone with it\nenabled. Full regression green: heavy-deployment e2e 6/6; ChainOrderTest,\nKeyedComplexChainTest, KeyedPartitionWindowedStreamITCase; UnalignedCheckpoint\n{,Rescale}ITCase (the with-recovered-state path) 11/11 and 50/50.\n"
    },
    {
      "commit": "2f21971b7d5bb6963270968b6b17ee084ca7089a",
      "tree": "17d3eb6ce35b0264fa331960316f06c7c1bab8ca",
      "parents": [
        "44c041eafff4411b78b6ac70567a6fedda04dafe"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:59:46 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 17 16:19:19 2026 +0200"
      },
      "message": "[FLINK-39522][network] Remove recovery flags and the filtering-complete future from the gate API\n\nPure deletion of the now-unused v1 gating: the previous commit made StreamTask\ngate the flag-on RUNNING transition on the recovery future chain instead of the\nfiltering-progress future, so the API has no callers left.\n\nDrop InputGate#getBufferFilteringCompleteFuture and its overrides in\nSingleInputGate, UnionInputGate and InputGateWithMetrics;\nIndexedInputGate#setCheckpointingDuringRecoveryEnabled /\n#isCheckpointingDuringRecoveryEnabled together with SingleInputGate\u0027s volatile\nbacking field; and RecoveredInputChannel\u0027s bufferFilteringCompleteFuture field,\ngetter and the finishReadRecoveredState lock-ordering commentary tied to it.\n\nThe one remaining consumer of the flag -- the unbounded heap-buffer fallback in\nRecoveredInputChannel#requestBufferBlocking, which stays until disk spilling\nsupersedes it -- now has the flag threaded explicitly from the job\nconfiguration through the recovery-handler call sites\n(requestBufferBlocking(boolean)) instead of reading it off the gate.\n\nRemove the corresponding testBufferFilteringCompleteFutureAggregation cases in\nSingleInputGateTest/UnionInputGateTest and adapt MockInputGate,\nMockIndexedInputGate, SingleInputGateBuilder and\nAlignedCheckpointsMassiveRandomTest.\n\nCo-authored-by: Roman Khachatryan \u003ckhachatryan.roman@gmail.com\u003e\n"
    },
    {
      "commit": "44c041eafff4411b78b6ac70567a6fedda04dafe",
      "tree": "06139e3731d57d6a4a7d03e9a1bcd53617936f85",
      "parents": [
        "32afcef2ec3cf7bdafb3f409683c475d4dade619"
      ],
      "author": {
        "name": "Roman Khachatryan",
        "email": "khachatryan.roman@gmail.com",
        "time": "Mon Jul 06 00:57:18 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 17 16:19:19 2026 +0200"
      },
      "message": "[FLINK-39522] Restructure StreamTask channel-state recovery into an async future chain\n\nRewrite StreamTask channel-state recovery to run asynchronously on the\nchannelIOExecutor and unify recovery completion on the gates\u0027 state-consumed\nfutures. Read the during-recovery flag once via\nCheckpointingOptions.isCheckpointingDuringRecoveryEnabled(jobConfig) and split\nrestoreStateAndGates into recoverChannelsWithCheckpointing /\nrecoverChannelsWithoutCheckpointing;\nrecoveryCompletionFuture.whenComplete(-\u003e mailboxProcessor.suspend()).\n\nWithout checkpointing (flag off): submit readInputChannelState to the\nchannelIOExecutor; convert and request partitions for each gate as soon as ITS\nOWN getStateConsumedFuture() completes (per-gate, avoiding the\nselective-reading multi-input deadlock); return completeAll(all\nstateConsumedFutures). Observable behavior equals master.\n\nWith checkpointing (flag on, in-memory backend, transitional until the\nspilling backend lands): future chain runAsync(readInputChannelState,\nchannelIOExecutor) -\u003e requestPartitions(true) for all gates on the mailbox\n(conversion pushes the queued recovered buffers plus the sentinel) -\u003e\ncompleteAll(the gates\u0027 stateConsumedFutures). An empty-input-gates\nshort-circuit completes synchronously so a finite source cannot suspend the\nrestore loop before recovery completes.\n\nrestoreInternal now calls get() on the recovery future and rethrows the\nunderlying cause, so recovery failures surface instead of being swallowed; the\nchannelIOExecutor is shut down after the restore loop.\n\nAlso move the gate-finishing loop (finishReadRecoveredState() for all gates)\nout of AbstractInputChannelRecoveredStateHandler.close() into\nStreamTask#readInputChannelState; close() only runs closeInternal() now.\nAdapt SequentialChannelStateReaderImplTest to call finishReadRecoveredState()\nitself and put TaskCheckpointingBehaviourTest under @Timeout(120).\n\nCo-authored-by: Rui Fan \u003c1996fanrui@gmail.com\u003e\n"
    },
    {
      "commit": "32afcef2ec3cf7bdafb3f409683c475d4dade619",
      "tree": "fd81604f91764102eb250ee47668da3fea84f968",
      "parents": [
        "642673e8d4e473a5a282018d08ba1416a850e1ec"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "rgharib@confluent.io",
        "time": "Fri Jul 17 15:07:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 15:07:58 2026 +0200"
      },
      "message": "[FLINK-40160][table] Fix casting `NaN` to `FLOAT` or `DOUBLE`"
    },
    {
      "commit": "642673e8d4e473a5a282018d08ba1416a850e1ec",
      "tree": "a0bb94e0c950da028e4d84c71b843fc77b9ea3db",
      "parents": [
        "4b94ae64b5e86745c067084c78f7b227cb5fcb0c"
      ],
      "author": {
        "name": "Zakelly",
        "email": "zakelly.lan@gmail.com",
        "time": "Fri Jul 17 20:07:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 20:07:11 2026 +0800"
      },
      "message": "[FLINK-40157][state/ForSt] Fix MapState putAll value serialization (#28762)"
    },
    {
      "commit": "4b94ae64b5e86745c067084c78f7b227cb5fcb0c",
      "tree": "ee6554dd26ebd84eab2767e0e41bbd4f88439b7e",
      "parents": [
        "a8835bd37312af00d6669d3ebe4caca70cf3f220"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Fri Jul 17 13:38:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 13:38:31 2026 +0200"
      },
      "message": "[hotfix][ci] Add more artifacts to skip GHA"
    },
    {
      "commit": "a8835bd37312af00d6669d3ebe4caca70cf3f220",
      "tree": "d72afc8b085cc68b4073a45751a1af25a61b30e3",
      "parents": [
        "a9ae79b1867e2862d291204d0ff40293249cf5a0"
      ],
      "author": {
        "name": "Efrat Levitan",
        "email": "41479945+Efrat19@users.noreply.github.com",
        "time": "Tue Jul 07 19:22:25 2026 +0300"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Fri Jul 17 10:52:14 2026 +0200"
      },
      "message": "[FLINK-40093][Runtime] Resume idle splits by alignment check if previously paused\n\nUsually pauseOrResumeSplits pauses idleness timer for the split so it isn\u0027t marked idle while paused. However with low idleness timeout (observed with 1s) + low allowed WM drift, a race condition could cause paused splits to never resume though they have records:\n\n1. A split becomes paused due to too advanced records.\n2. pauseOrResumeSplits pauses the split.\n3. pauseOrResumeSplits reaches to pause the split idleness clock but is {idlenessTimeout} too late, and the split becomes idle.\n4. The watermark advances but the split is excluded from the watermark alignment check due to its idleness.\n5. More records arrive but the split is paused at the connector level so they aren\u0027t processed, nor seen by watermarkGenerator so it still considers the split idle\nThe PR aims to fix it by preserving the part where idle splits are excluded from alignment pause (to not override their idle status) while allowing alignment check to resume splits even if they are currently idle.\nThey are considered idle until they emit the next record.\n\n[FLINK-40093][Runtime] Refactor the test to reproduce the race condition\n"
    },
    {
      "commit": "a9ae79b1867e2862d291204d0ff40293249cf5a0",
      "tree": "8463bf90c04b01eef1207aac7374df609df3dc3f",
      "parents": [
        "c830df80ee5723cd05bd6cba3e8a384faa8d022e"
      ],
      "author": {
        "name": "Mika Naylor",
        "email": "mnaylor@confluent.io",
        "time": "Fri Jul 17 09:58:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 09:58:12 2026 +0200"
      },
      "message": "[FLINK-40015] Introduce getFunctionOutput in PTF Test Harness (#28657)"
    },
    {
      "commit": "c830df80ee5723cd05bd6cba3e8a384faa8d022e",
      "tree": "82db92f049e1b01376f0e73ebd2fea9a0f14cd88",
      "parents": [
        "a417739e30e1fa2f40554619c9b35543f2b4d69e"
      ],
      "author": {
        "name": "Weiqing Yang",
        "email": "yangweiqing001@gmail.com",
        "time": "Fri Jul 17 00:38:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 09:38:20 2026 +0200"
      },
      "message": "[FLINK-40120][table] Persist RowData field names in RowDataSerializerSnapshot (#28717)"
    },
    {
      "commit": "a417739e30e1fa2f40554619c9b35543f2b4d69e",
      "tree": "30f7f55d405b9fccc48e106372b07c30968d57bd",
      "parents": [
        "80f0587c774173af581c9d5d019560df056db982"
      ],
      "author": {
        "name": "lincoln lee",
        "email": "lincoln.86xy@gmail.com",
        "time": "Fri Jul 17 14:20:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 14:20:20 2026 +0800"
      },
      "message": "[FLINK-40153][table] Fix resolving inherited metadata columns used by watermarks in LIKE clause\n\nThis closes #28750."
    },
    {
      "commit": "80f0587c774173af581c9d5d019560df056db982",
      "tree": "29e5b01530104a58fbd93aaed8cf959cc5c43f33",
      "parents": [
        "6027adb70fb3168c3886fe65f133a69e53ce7f70"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Thu Jul 16 20:30:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:00:27 2026 +0200"
      },
      "message": "[FLINK-40034][runtime-web] Refresh web-dashboard lint tooling to prettier 3 and stylelint 17 (#28710)\n\n* [FLINK-40034][runtime-web] Bump prettier to 3, eslint-plugin-prettier to 5, stylelint to 17\n\nGenerated-by: Claude Code (claude-opus-4-8)"
    },
    {
      "commit": "6027adb70fb3168c3886fe65f133a69e53ce7f70",
      "tree": "8a729e045d08d3d9218c4ebc17a22900eb2154da",
      "parents": [
        "96d0bfb8909382ab755013b1e47620fc1b7d3bc5"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Thu Jul 16 08:05:25 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:35:25 2026 +0800"
      },
      "message": "[FLINK-40118][runtime-web] Use REST endpoint field instead of removed host field (#28712)\n\nFLINK-36355 removed the deprecated `host` field from the REST API\u0027s\nsubtask-level responses, keeping only `endpoint`, but the web-dashboard\nfrontend was never updated. The SubTask TimeLine and the SubTask\nAccumulators table each read `task.host`, which is now always undefined,\nso their subtask rows render as \"N - undefined\" instead of showing the\nTaskManager endpoint.\n\nUpdate the two frontend interfaces (JobSubTaskTime, SubTaskAccumulators)\nand their consuming components to read `endpoint` instead of `host`.\n\nGenerated-by: Claude Code (claude-opus-4-8)"
    },
    {
      "commit": "96d0bfb8909382ab755013b1e47620fc1b7d3bc5",
      "tree": "a94684299688fae6d78132adbbe4586b5f4010fb",
      "parents": [
        "5004b5bee5e7ee4e6ce931ea61b98006addbf6ea"
      ],
      "author": {
        "name": "David Anderson",
        "email": "david@alpinegizmo.com",
        "time": "Wed Jul 15 21:05:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 21:05:38 2026 -0400"
      },
      "message": "[FLINK-40138][tests] Drive JUnit 5 lifecycle when generating migration test snapshots (#28753)\n\nGenerated-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "5004b5bee5e7ee4e6ce931ea61b98006addbf6ea",
      "tree": "9ffff2f995f64d97a4cb1f304c16269e3650634e",
      "parents": [
        "76e7898e484cb03aa6e030180310c4a941d41a83"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Wed Jul 15 14:59:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 14:59:56 2026 +0200"
      },
      "message": "[hotfix][table] Fix compilation with jdk11"
    },
    {
      "commit": "76e7898e484cb03aa6e030180310c4a941d41a83",
      "tree": "1c74a660517ecacd3dfd3d45e53c8493059f4988",
      "parents": [
        "9b608907a1a4018276204a085297da2d7bdb594b"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "rgharib@confluent.io",
        "time": "Wed Jul 15 13:59:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 13:59:57 2026 +0200"
      },
      "message": "[FLINK-37925][table] Support casting from `VARIANT` to primitive types"
    },
    {
      "commit": "9b608907a1a4018276204a085297da2d7bdb594b",
      "tree": "bfe9367b9cd2ecaeca56f515b34fbb6e4f919f97",
      "parents": [
        "435062c2c83bc264ca1d96b855bf554309fa31f4"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Wed Jul 15 11:58:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:58:04 2026 +0200"
      },
      "message": "[FLINK-39943][table] Fix nullability of IS JSON functions (#28741)"
    },
    {
      "commit": "435062c2c83bc264ca1d96b855bf554309fa31f4",
      "tree": "33ef030219d150e47da503d60246e15e02813bad",
      "parents": [
        "3f5129b87672fe91d4725d019b3e0b833c45ccc1"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Jul 07 14:45:50 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Wed Jul 15 11:20:50 2026 +0200"
      },
      "message": "[FLINK-40088][tests] Tolerate HTTP-level responses in RestClientITCase TLS check\n\ntestHttpsConnectionWithDefaultCerts only needs to prove that RestClient\ncompletes a TLS handshake against a public endpoint using the default JDK\ntruststore. It additionally required the response body to be valid JSON, so\nit failed whenever GitHub returned a plain-text 429 Too Many Requests. This\nis structural on GitHub Actions, where runners share egress IPs, and will\nrecur more often as CI moves from Azure to GHA.\n\nAny completed HTTP response proves the handshake succeeded, so assert that\nthe failure chain contains a RestClientException (which is only produced\nafter a full HTTP response is received). A genuine certificate/trust\nregression surfaces as an SSLException instead and still fails the test, as\ndo connect-refused, DNS, and connection-reset failures where no handshake\nhappened at all.\n\nGenerated-by: Claude Fable 5\n"
    },
    {
      "commit": "3f5129b87672fe91d4725d019b3e0b833c45ccc1",
      "tree": "d9ff964a307b0957356decf1eab8099787a2a34c",
      "parents": [
        "47abc18f7ac249c193f72697e8dad448920936a0"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Wed Jul 15 10:15:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 10:15:19 2026 +0200"
      },
      "message": "[FLINK-39784][table] Forbid SNAPSHOT outside a LATERAL context (#28674)\n\nAdds ForbidSnapshotOutsideLateralRule, which rejects any SNAPSHOT scan\nthat survives the LATERAL SNAPSHOT rewrite with a clear message instead\nof failing later in the generic PTF translation.\n\nGenerated-By: Claude Opus 4.8 (1M context)"
    },
    {
      "commit": "47abc18f7ac249c193f72697e8dad448920936a0",
      "tree": "1bd6cc5b26f7b61df8f63ae49cae1a72d8a452ff",
      "parents": [
        "7f707f3ece7c0fa5bf8bb44f9db499dc73d932ec"
      ],
      "author": {
        "name": "Rion Williams",
        "email": "riwilliams@confluent.io",
        "time": "Mon Jul 13 17:27:39 2026 -0500"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Wed Jul 15 09:27:29 2026 +0200"
      },
      "message": "[FLINK-40113][checkpoint] Reject restore when operators on a keyed vertex disagree on max parallelism\n\nDuring restore, each operator\u0027s recorded max parallelism is reconciled onto its\nshared vertex individually. When chaining has regrouped operators since the\ncheckpoint, they can disagree, and the reconciliation silently keeps whichever\nvalue is applied last -- restoring a keyed operator under a foreign key-group\ncount. Before the loop, verify that all operators chained into a vertex carrying\nkeyed state agree, and fail with a clear error otherwise. The check spans all\noperators, since a non-keyed one\u0027s value can win the reconciliation and misroute\na keyed operator\u0027s state.\n\nAdds ChainingMaxParallelismStateLossITCase covering both directions (explicit\nvalue below and above the chain head) on the HashMap and RocksDB backends.\n"
    },
    {
      "commit": "7f707f3ece7c0fa5bf8bb44f9db499dc73d932ec",
      "tree": "8756de5e62157b7f3a336f134e9e8115e7ca80c2",
      "parents": [
        "edba4901475bfd0696d4e95f1c9ca049924b7a81"
      ],
      "author": {
        "name": "Xuyang",
        "email": "xyzhong188@163.com",
        "time": "Wed Jul 15 11:21:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:21:57 2026 +0800"
      },
      "message": "[FLINK-40095][table-planner] Fix JSON aggregation functions failing in group window aggregate (#28682)"
    },
    {
      "commit": "edba4901475bfd0696d4e95f1c9ca049924b7a81",
      "tree": "6cd437736dd6f14f5c99faeb912528f920ba338a",
      "parents": [
        "e9540aed0082b0908feb3348dfc3befe776160fc"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Fri Jul 03 21:20:20 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Jul 14 19:49:58 2026 +0200"
      },
      "message": "[FLINK-40067][tests] Fix race in RescaleTimelineITCase.testRescaleTerminatedByJobFinished\n\nOn a loaded machine the cooldown-driven Idling transition terminates the in-progress rescale with NO_RESOURCES_OR_PARALLELISMS_CHANGE before the job finishes, so goToFinished\u0027s later JOB_FINISHED stamp is dropped and the wait can never succeed. Widen the fixture cooldown to keep the rescale in-progress until the job finishes, mirroring FLINK-39903/FLINK-40010.\n\nGenerated-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "e9540aed0082b0908feb3348dfc3befe776160fc",
      "tree": "5b2aeb94f369f855ad8234f99a46358440fdf50a",
      "parents": [
        "d769c08ccc9509f2f5c9234daefcc2ed42e6ce2c"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Tue Jul 14 18:15:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 18:15:16 2026 +0200"
      },
      "message": "[FLINK-39781][table] Add LateralSnapshotJoinOperator with two-phase LOAD/JOIN execution (#28329)\n\nStateful keyed two-input operator backing LATERAL SNAPSHOT joins.\n\n* Two phases (LOAD/JOIN) with flip triggers: build-side WM reaches\n  loadCompletedTime, or a processing-time idle-timeout fallback.\n* Probe records are buffered in LOAD and joined on flip. Build-side changes\n  are buffered per-key and applied lazily in event-time order on the next\n  per-key access once the build-side WM advanced, preserving atomic -U/+U\n  visibility.\n* Watermarks: build-side absorbed; probe-side held back in LOAD, forwarded\n  in JOIN. NULL equi-keys filtered via JoinConditionWithNullFilters.\n* State TTL via keyed processing-time timers with a post-flip grace window;\n  rearms are amortized so effective time-to-eviction is in\n  [1.0×, 1.5×] stateTtlMs.\n\nGenerated-By: Claude Opus 4.7 (1M context)"
    },
    {
      "commit": "d769c08ccc9509f2f5c9234daefcc2ed42e6ce2c",
      "tree": "31aa97f21ce0a632dcf5a8e971d709dd8b2b50b5",
      "parents": [
        "d8ba8aa84a8df078f9893251ea706eae74d72dd9"
      ],
      "author": {
        "name": "Matthias Pohl",
        "email": "mpohl@confluent.io",
        "time": "Thu Jul 09 16:38:01 2026 +0200"
      },
      "committer": {
        "name": "Matthias Pohl",
        "email": "github@mapohl.com",
        "time": "Tue Jul 14 15:57:28 2026 +0200"
      },
      "message": "[FLINK-40086][runtime] Adds error handling to newly added preCompletionAction\n"
    },
    {
      "commit": "d8ba8aa84a8df078f9893251ea706eae74d72dd9",
      "tree": "b3127f89acb8df11d0fb0f0cd0c05a42737b76b8",
      "parents": [
        "c404d7b08e4fcc97c892281f597148e398955552"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Jul 14 11:59:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 11:59:58 2026 +0200"
      },
      "message": "[FLINK-40134][ci] Bump maven-rat-plugin to 0.17"
    },
    {
      "commit": "c404d7b08e4fcc97c892281f597148e398955552",
      "tree": "52d56fa239326ee453c7b0a136b80e18dd3e770d",
      "parents": [
        "486f5291beaac07f6bb99c1f1dffb8af7a274ebe"
      ],
      "author": {
        "name": "Kaivalya Apte",
        "email": "apte.kaivalya@gmail.com",
        "time": "Mon Jul 13 20:35:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 12:35:32 2026 -0600"
      },
      "message": "[FLINK-40036][tests] Support custom MockEnvironment in multi-input harness and state-parameterized tests (#28589)"
    },
    {
      "commit": "486f5291beaac07f6bb99c1f1dffb8af7a274ebe",
      "tree": "16f4dd02c5c7a72d0011dbd11899b074284c9fc0",
      "parents": [
        "f5bb04d03b34d9ad570fb6656abc53cb966463ac"
      ],
      "author": {
        "name": "Fabian Hueske",
        "email": "fhueske@confluent.io",
        "time": "Mon Jul 13 18:25:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 18:25:44 2026 +0200"
      },
      "message": "[FLINK-39783][table] Translate LATERAL SNAPSHOT to LateralSnapshotJoinOperator (#28664)\n\nRewrites a join over a SNAPSHOT table function in a LATERAL clause into a\ndedicated FlinkLogicalLateralSnapshotJoin and converts it to a\nStreamPhysicalLateralSnapshotJoin / StreamExecLateralSnapshotJoin backed by the\nLateralSnapshotJoinOperator. The nodes derive their own output row type\n(materializing the build-side rowtime) and carry the SNAPSHOT arguments as\nfields.\n\nGenerated-By: Claude Opus 4.8 (1M context)"
    },
    {
      "commit": "f5bb04d03b34d9ad570fb6656abc53cb966463ac",
      "tree": "cd50187894e438323804c921c0f642d3e65432fe",
      "parents": [
        "21b47b97d216dc6bf8ac9fb6dda3d5e235a32324"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Thu Jul 02 17:50:12 2026 +0530"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Mon Jul 13 16:51:46 2026 +0200"
      },
      "message": "[FLINK-40035][runtime-web] Add Vitest smoke tests for the web-dashboard\n\nThe web-dashboard had no automated tests, leaving lint and the production\nbuild as the only guardrails against breakage during Angular/ng-zorro\nupgrades. Add a Vitest-based test setup with smoke-level component specs for\nhigh-traffic views, and run them in CI.\n\n- Wire Vitest via Angular\u0027s @angular/build:unit-test builder (the default\n  test runner in Angular 21; Karma is deprecated). Tests run in jsdom, so no\n  browser is needed in CI. Add tsconfig.spec.json and src/test-setup.ts with\n  the jsdom stubs ng-zorro/CDK require (matchMedia, ResizeObserver,\n  IntersectionObserver).\n- Migrate the build and serve targets from\n  @angular-devkit/build-angular:browser-esbuild to @angular/build:application\n  and :dev-server, which the unit-test builder requires and which is the\n  Angular 21 default. Output stays flat under web/ so packaging is unchanged.\n  Remove the now-unused @angular-devkit/build-angular.\n- Add smoke specs covering rendering and basic interactions for the Overview\n  statistic cards, the Task Manager list, and the Job Exceptions view.\n- Add test / test:ci npm scripts and include test:ci in ci-check so the specs\n  run as part of the existing Maven frontend build.\n\nGenerated-by: Claude Code (claude-opus-4-8)\n"
    },
    {
      "commit": "21b47b97d216dc6bf8ac9fb6dda3d5e235a32324",
      "tree": "a28e34728a00692eca03badeb99d3ab9a96aa4fd",
      "parents": [
        "eaeefddd526fb7663aa8039d1814a29ee0c24299"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 13 09:55:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 09:55:55 2026 +0200"
      },
      "message": "[FLINK-40124][ci] Do not store cache on every run if no dependency changed"
    },
    {
      "commit": "eaeefddd526fb7663aa8039d1814a29ee0c24299",
      "tree": "7c8f45cba9dffd7d26ac4bf0a173e9b3aca3fc89",
      "parents": [
        "9d52f18b02828d1c13b7f707ee076db1f768d862"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Jul 13 08:27:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 08:27:55 2026 +0200"
      },
      "message": "[FLINK-34423][ci] Make `tools/ci/compile_ci.sh` not necessarily rely on clean phase"
    },
    {
      "commit": "9d52f18b02828d1c13b7f707ee076db1f768d862",
      "tree": "0c7581b1a24b3b1a28a4029d8d170ab1522eae26",
      "parents": [
        "bfad2e8e4e96b8c4a2a955fb88bb67bbc807cda2"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Mon Jul 13 11:01:32 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 07:31:32 2026 +0200"
      },
      "message": "[hotfix][runtime-web] Fix savepointPath query parameter in JarService.runJob() (#28722)\n\nJarService.runJob() appended the programArgs value under the\nsavepointPath query key instead of savepointPath itself. This has been\nharmless in practice because the backend (JarRunHandler) prefers the\nvalue already present in the POST body over the query parameter, but\nthe query parameter itself was wrong.\n\nGenerated-by: Claude Code (claude-sonnet-5)"
    },
    {
      "commit": "bfad2e8e4e96b8c4a2a955fb88bb67bbc807cda2",
      "tree": "b5229225e289babb0dce73d9557b5597043f6252",
      "parents": [
        "b464b331dbd2cbd4714c47816cb0558b14955c91"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Jul 12 18:17:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 18:17:16 2026 +0200"
      },
      "message": "[FLINK-40125][ci] Add auto cancel for concurrently running jobs"
    },
    {
      "commit": "b464b331dbd2cbd4714c47816cb0558b14955c91",
      "tree": "32cd53288fd3f219caeb01e1979e73b2a74ddae1",
      "parents": [
        "1a5f86872d171a8e1a428b98c6459be1c0c78b42"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Thu Jul 09 12:49:36 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Sat Jul 11 22:04:15 2026 +0200"
      },
      "message": "[FLINK-40109] Verify Kerberos keytab logs after the YARN application is killed\n\nFLINK-40099 moved YARNSessionFIFOSecuredITCase\u0027s keytab check into a pre-kill\ncallback polling waitUntilCondition(cond, 500). The 500 int literal binds to\nthe (cond, int retryAttempts) overload (500*100ms, then \"Exhausted retry\nattempts.\"), and reading the JobManager log while the application is still\nalive is racy: the polled jobmanager.log does not reliably contain the keytab\nlogin line before teardown.\n\nRead the container logs after the application is killed (output flushed) but\npoll each log with a bounded wait instead of a single read, preserving the\nFLINK-17662 intent without the pre-kill race. On timeout, fail with the log\nfile and expected strings so a recurrence is diagnosable from the uploaded\ncontainer logs.\n\nGenerated-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "1a5f86872d171a8e1a428b98c6459be1c0c78b42",
      "tree": "8443f8a77b0867747c6b90362a8cd1fcadcb1a8c",
      "parents": [
        "c2f0c123409285cb244c23b32cc108dea2a9a990"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Jul 11 13:28:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 13:28:22 2026 +0200"
      },
      "message": "[hotfix] Use `systemPropertyVariables` instead of `systemProperties`"
    },
    {
      "commit": "c2f0c123409285cb244c23b32cc108dea2a9a990",
      "tree": "e8b93cdd6fe4c2ce325bb13ddc6be52b2a0a13fd",
      "parents": [
        "bf14146ea155d46b1af17f699f5a1b7844319814"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:31:08 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] CheckpointedInputGate: consume EndOfFetchedChannelStateEvent\n\nWhen the consume path polls the EndOfFetchedChannelStateEvent sentinel,\nassert the originating channel is a RecoverableInputChannel and call its\nonRecoveredStateConsumed(): the channel flips out of recovery, releases\nany upstream events held back during recovery and reopens the upstream so\nlive data may flow again. The event itself is never delivered to the\noperator.\n\nThe sentinel-consumption path is exercised end to end by the\nLocal/RemoteInputChannel recovery tests of this PR\n(onRecoveredStateConsumed after polling the sentinel) and by the\nStreamTask recovery tests of the follow-up PRs.\n"
    },
    {
      "commit": "bf14146ea155d46b1af17f699f5a1b7844319814",
      "tree": "47d36ef3cb29875bdf74fd06ac075bbfc590a2e8",
      "parents": [
        "e480c74453db5cc880e8ebd3eb62e5c7d3aa86ee"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:30:30 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] Propagate needsRecovery in PartitionRequest; start view reader with zero credit\n\nPropagate the consumer channel\u0027s needsRecovery flag to the producer so it\nwithholds credit while the consumer\u0027s exclusive buffers are on loan to\nrecovery:\n\n- NettyMessage.PartitionRequest gains a needsRecovery boolean (ctor arg,\n  writeBoolean/readBoolean, +Byte.BYTES in the length calculation). This\n  is a wire-format change (+1 byte per PartitionRequest); safe under the\n  usual single-version-cluster assumption for the TM network protocol,\n  stated in the PR description.\n- CreditBasedSequenceNumberingViewReader ctor gains needsRecovery;\n  numCreditsAvailable \u003d needsRecovery ? 0 : initialCredit.\n- PartitionRequestServerHandler passes request.needsRecovery;\n  NettyPartitionRequestClient passes inputChannel.needsRecovery().\n\nMechanical test adaptations: NettyMessageServerSideSerializationTest\n(round-trips the new field), PartitionRequestServerHandlerTest,\nPartitionRequestQueueTest, PartitionRequestRegistrationTest,\nCreditBasedSequenceNumberingViewReaderTest, CancelPartitionRequestTest,\nServerTransportErrorHandlingTest.\n"
    },
    {
      "commit": "e480c74453db5cc880e8ebd3eb62e5c7d3aa86ee",
      "tree": "db97f76def437166fc9673bac83673cb70d05ec2",
      "parents": [
        "9cb272efdcb82d011347ca438ec347cacc5c349f"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:29:49 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] Convert recovered channels via the push interface; thread needsRecovery through gates\n\nRecoveredInputChannel#toInputChannel(boolean needsRecovery) replaces the\nno-arg variant; constructor migration of recovered buffers is retired:\n\n- needsRecovery\u003dfalse: checkState(receivedBuffers.isEmpty()) +\n  inputChannel.setup() (setup moves from RemoteRecoveredInputChannel into\n  the conversion) + checkpointStopped(...). Flag-off conversion always\n  happens after full consumption, so default behavior is unchanged.\n- needsRecovery\u003dtrue (first used by the StreamTask recovery rework PR):\n  create the physical channel in recovery state, then synchronously push\n  every queued recovered data buffer via onRecoveredStateBuffer and\n  append the EndOfFetchedChannelStateEvent sentinel (the legacy\n  EndOfInputChannelStateEvent in the queue is dropped in translation).\n  This is the simple in-memory drain -- FLINK-38544 transitional code,\n  replaced by the disk drain when the spilling backend lands. The\n  sentinel is appended directly rather than via\n  finishRecoveredBufferDelivery(), which waits for upstream readiness\n  that cannot arrive while the mailbox thread is still converting\n  channels.\n- abstract toInputChannelInternal(ArrayDeque\u003cBuffer\u003e) becomes\n  toInputChannelInternal(boolean).\n\nGates thread the flag through: InputGate gains a concrete\nrequestPartitions(boolean) (default overload ignores the flag);\nSingleInputGate implements requestPartitions(boolean) and\nconvertRecoveredInputChannels(boolean) (no-arg kept as a\n@VisibleForTesting shim); getStateConsumedFuture() aggregation is\nunified on InputChannel#getStateConsumedFuture across all channels;\nUnionInputGate fans the flag out to member gates; InputGateWithMetrics\ndelegates.\n\nDeliberate consequence: the base v1 flag-on StreamTask still converts at\nfiltering-complete with unconsumed buffers, so the empty-queue checkState\nfires and the flag-on path is degraded until the StreamTask recovery\nrework lands -- covered by the randomization pin in the first commit of\nthis PR. Default (flag-off) configuration is unaffected.\n\nTests: RecoveredInputChannelTest is rewritten around the new conversion\nsemantics (reject-while-unconsumed, empty-queue assert, and a transitional\npush-conversion case); Local/RemoteRecoveredInputChannelTest cover the\nempty-queue assert of the subclasses; UnionInputGateTest\u0027s helper adapts\nto the new toInputChannelInternal signature.\n"
    },
    {
      "commit": "9cb272efdcb82d011347ca438ec347cacc5c349f",
      "tree": "efe2ad94395b9b86f4e8cab86ca92dde81975957",
      "parents": [
        "5a2151f091ddc8cfbb5c68ad000735c493b5aa8e"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:26:29 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] RemoteInputChannel: push-based recovery state\n\nTeach RemoteInputChannel to be created directly in a recovery state and to\nreceive recovered buffers through the RecoverableInputChannel interface.\nThe not-in-recovery checkpointStarted branch stays byte-identical to the\nprevious behavior, and with needsRecovery\u003dfalse the channel behaves\nexactly as before.\n\n- Constructor: drop ArrayDeque\u003cBuffer\u003e initialRecoveredBuffers, add\n  needsRecovery (pre-completed stateConsumedFuture when false, same as\n  LocalInputChannel). The BufferManager starts with credit notification\n  disabled while in recovery (notifyInitiallyEnabled\u003d!needsRecovery).\n- appendRecoveredBuffer() appends straight into receivedBuffers (NONE\n  subpartition id, recovery sequence numbers from Integer.MIN_VALUE), so\n  the consume path stays identical to the normal case.\n- recoveryEventStash (@GuardedBy receivedBuffers): ordinary upstream\n  events arriving while credit is suppressed are stashed and replayed\n  after the sentinel is consumed; live data buffers during recovery are a\n  protocol violation asserted in onBuffer.\n- upstreamReady as CountDownLatch(1), counted down by the first onBuffer\n  or by release; finishRecoveredBufferDelivery() awaits it and appends\n  the EndOfFetchedChannelStateEvent sentinel.\n- onRecoveredStateConsumed(): unstash + bufferManager.enableNotify()\n  (credit reopens) + complete stateConsumedFuture.\n- checkReadability() allows in-recovery reads before the partition\n  request client is initialized.\n- checkpointStarted() in-recovery branch persists the buffers collected\n  by collectPreRecoveryBarrier (walks receivedBuffers past the priority\n  head to the matching RecoveryCheckpointBarrier, retains pre-barrier\n  data buffers, removes the sentinel); only startPersisting is called, so\n  the persist window stays open. A missing barrier declines the\n  checkpoint (CHECKPOINT_DECLINED).\n- New public needsRecovery() getter, consumed by the netty stack in a\n  later commit of this PR.\n\nMechanical constructor-caller adaptations ride along\n(UnknownInputChannel, RemoteRecoveredInputChannel, InputChannelBuilder,\nbenchmark factory, netty test channels), all passing needsRecovery\u003dfalse.\nRemoteRecoveredInputChannel keeps calling remoteInputChannel.setup()\nuntil the conversion rework in the next commit moves setup() into\nRecoveredInputChannel#toInputChannel.\n"
    },
    {
      "commit": "5a2151f091ddc8cfbb5c68ad000735c493b5aa8e",
      "tree": "9f06cadf5f93d21b5cd853501a8b241ddf579272",
      "parents": [
        "f615ff7feea9b43bbed5daec908c71d39c459bb0"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:25:16 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] LocalInputChannel: push-based recovery state\n\nTeach LocalInputChannel to be created directly in a recovery state and to\nreceive recovered buffers through the RecoverableInputChannel interface,\ninstead of migrating them via the constructor:\n\n- Constructor: drop ArrayDeque\u003cBuffer\u003e initialRecoveredBuffers, add\n  networkBuffersPerChannel and needsRecovery. With needsRecovery\u003dfalse\n  the stateConsumedFuture is pre-completed, inRecovery stays false and no\n  recovery BufferManager exists -- behavior is byte-for-byte unchanged.\n- recoveredBuffers becomes a Deque\u003cBuffer\u003e whose monitor also guards\n  inRecovery and recoverySequenceNumber (starts at Integer.MIN_VALUE).\n- RecoverableInputChannel implementation: push append with released-state\n  recycling; finishRecoveredBufferDelivery() waits for upstreamReady and\n  appends the EndOfFetchedChannelStateEvent sentinel;\n  insertRecoveryCheckpointBarrierIfInRecovery();\n  requestRecoveryBufferBlocking() lends exclusive buffers via the\n  recovery-only BufferManager (setup() requests them) -- no production\n  caller until the drainer PR; onRecoveredStateConsumed() flips recovery\n  off and completes the stateConsumedFuture.\n- getNextBuffer() is rewritten under a single inRecovery predicate:\n  recovered buffer first, then a pending priority event pulled from the\n  subpartition view, otherwise empty (live data stays hidden while in\n  recovery). wrapRecoveredBufferAsAvailability() materializes\n  FileRegionBuffer/CompositeBuffer, assigns recovery sequence numbers and\n  computes the next data type via peekNextDataType.\n- upstreamReady completes on subpartition-view creation;\n  completeUpstreamReadyForTest() for tests.\n- checkpointStarted() splits into mutually exclusive in-recovery/normal\n  branches. In recovery it only starts persisting (the persist window\n  stays open) with the buffers collected by collectPreRecoveryBarrier,\n  which walks the queue to the matching RecoveryCheckpointBarrier,\n  retains pre-barrier data buffers and removes the sentinel; a missing\n  barrier is an IOException wrapped as\n  CheckpointException(CHECKPOINT_DECLINED).\n\nMechanical constructor-caller adaptations ride along (UnknownInputChannel,\nLocalRecoveredInputChannel, InputChannelBuilder, benchmark factory), all\npassing needsRecovery\u003dfalse at this stage.\n\nIncludes a port of the FLINK-40016 double-persist regression test to the push-based recovery API.\n"
    },
    {
      "commit": "f615ff7feea9b43bbed5daec908c71d39c459bb0",
      "tree": "9530bad183b45fbf6566e82b2006cb642d3f9986",
      "parents": [
        "6265c89af5dda97832ede37be618b124934f1d74"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:24:01 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] Add RecoverableInputChannel contract and recovery sentinels\n\nIntroduce the push-based recovery contract and its sentinels:\n\n- RecoverableInputChannel (@Internal): getChannelInfo(),\n  onRecoveredStateBuffer(Buffer), finishRecoveredBufferDelivery(),\n  insertRecoveryCheckpointBarrierIfInRecovery(long),\n  requestRecoveryBufferBlocking(), onRecoveredStateConsumed().\n- EndOfFetchedChannelStateEvent: singleton RuntimeEvent tail sentinel of\n  the recovered-buffer stream; reflective write()/read() throw;\n  deliberately distinct from EndOfInputChannelStateEvent.\n- RecoveryCheckpointBarrier (checkpoint.channel): per-checkpoint sentinel\n  carried inside the recovery queue; write()/read() throw.\n- EventSerializer: type tags 13 (RECOVERY_CHECKPOINT_BARRIER_EVENT) and\n  14 (END_OF_FETCHED_CHANNEL_STATE_EVENT).\n\nRecovery completion is unified on the InputChannel base class: the new\nabstract getStateConsumedFuture() completes once a channel has consumed\nall of its recovered state (or never had any / was released). It is\nabstract rather than defaulted so a future subclass must state its\nrecovery semantics explicitly. RecoveredInputChannel\u0027s package-private\ngetter becomes a public override (field tightened to\nCompletableFuture\u003cVoid\u003e); UnknownInputChannel returns a completed future\n(a channel with persisted state is always a RecoveredInputChannel at\nrestore time). Local/RemoteInputChannel temporarily return a completed\nfuture until their push-based recovery state lands in the next commits.\n\nTestInputChannel implements the new contract as a spying test double.\n"
    },
    {
      "commit": "6265c89af5dda97832ede37be618b124934f1d74",
      "tree": "8d23989cad4fa288c47f809053a51c65a1db8d17",
      "parents": [
        "4afea389445a7b72faf0d7cdb58d4295e5eec127"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:21:59 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][network] BufferManager: gate credit notification behind notifyInitiallyEnabled\n\nAdd a notifyInitiallyEnabled constructor parameter to BufferManager and a\nnew enableNotify() method: while notification is disabled, requested and\nrecycled floating buffers are queued but never announced to the producer\nas credit; enableNotify() opens the gate and announces the queued buffers\natomically with respect to concurrent recycle/floating-buffer callbacks.\n\nAll existing callers (RecoveredInputChannel, RemoteInputChannel) pass\ntrue, so behavior is unchanged. The disabled mode is used by a later\ncommit of this PR, where a remote channel created in recovery state\nwithholds credit until its recovered state has been consumed.\n"
    },
    {
      "commit": "4afea389445a7b72faf0d7cdb58d4295e5eec127",
      "tree": "9787e7f7a70758e811b65a484899517cda8cb3a4",
      "parents": [
        "4732a5210a876a55a9367e31f3aa9f8cf0f45fd7"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:21:26 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Fri Jul 10 16:09:59 2026 +0200"
      },
      "message": "[FLINK-39521][test] Temporarily remove during-recovery flag from ITCase randomization\n\nDrop the randomize(conf, CHECKPOINTING_DURING_RECOVERY_ENABLED, true, false)\nline from TestStreamEnvironment.randomizeConfiguration (the flag stays at\nits default false unless a test sets it explicitly) and @Disabled the\nexplicitly flag-on RecoveredStateFilteringLargeRecordITCase.\n\nRationale: a following commit of this PR retires the v1\nconversion-migration path, so ~50% of randomized ITCases would otherwise\nrun flag-on and fail until the StreamTask recovery rework and the\ncheckpoint-coordination-during-recovery PRs land. The randomization and\nthe ITCase are restored in the coordination PR (PR4 of the series).\n"
    },
    {
      "commit": "4732a5210a876a55a9367e31f3aa9f8cf0f45fd7",
      "tree": "2a8f6f7bcb57c629f3a2fdde359c595d9af62b87",
      "parents": [
        "8b7ebcacddcb43168879f1d6135b9714270cae6d"
      ],
      "author": {
        "name": "Gustavo de Morais",
        "email": "gustavopguto@gmail.com",
        "time": "Fri Jul 10 09:26:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:26:54 2026 +0200"
      },
      "message": "[FLINK-40111][table-planner] Fall back to retract for a keyless sink without an upsert key\n\nThis closes #28704."
    },
    {
      "commit": "8b7ebcacddcb43168879f1d6135b9714270cae6d",
      "tree": "453a73eb2de4c363f1f04f6d592cbb956fa43c5b",
      "parents": [
        "913207b3afa614b63128dc7f55d7f516ef8eff6d"
      ],
      "author": {
        "name": "Gustavo de Morais",
        "email": "gustavopguto@gmail.com",
        "time": "Fri Jul 10 09:11:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:11:33 2026 +0200"
      },
      "message": "[FLINK-40112][table-planner] Report changelog mode mismatch instead of a generic planning error\n\nThis closes #28703."
    },
    {
      "commit": "913207b3afa614b63128dc7f55d7f516ef8eff6d",
      "tree": "300f0dcb9f52f9f0bad24fc508e5d9c9ef1b8989",
      "parents": [
        "f9d81b2e11e5cff7469b523cc73ce34b1d28e5ab"
      ],
      "author": {
        "name": "Gyula Komlossi",
        "email": "komlossi@gmail.com",
        "time": "Thu Jul 09 20:40:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 20:40:12 2026 +0200"
      },
      "message": "[FLINK-39191][runtime-web] Upgrade monaco-editor to 0.55.1 (#27745)\n\n* [FLINK-39191][runtime-web] Upgrade monaco-editor to 0.55.1\n\n* Apache 2.0 license is chosen for dompurify"
    },
    {
      "commit": "f9d81b2e11e5cff7469b523cc73ce34b1d28e5ab",
      "tree": "64924ca78a7b4539e4390f727bfc370f3cd1ffce",
      "parents": [
        "1ebd43c2250f82ef8bb03151927cb4d07104fc07"
      ],
      "author": {
        "name": "Ferenc Csaky",
        "email": "fcsaky@apache.org",
        "time": "Thu Jul 09 13:49:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 13:49:09 2026 +0200"
      },
      "message": "[FLINK-39583][table-planner] Normalize Calcite correl variables for more effective sub-plan digest reuse (#27959)"
    },
    {
      "commit": "1ebd43c2250f82ef8bb03151927cb4d07104fc07",
      "tree": "05d814261d06ed791096d7aee525d646323b483c",
      "parents": [
        "3c1e1d9863d6e3248752cfeb0af3021b7dc54753"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Jul 08 13:19:45 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Thu Jul 09 10:38:00 2026 +0200"
      },
      "message": "[FLINK-40099] Fix flaky YARNSessionFIFOSecuredITCase by verifying Kerberos keytab logs before the application is killed\n"
    },
    {
      "commit": "3c1e1d9863d6e3248752cfeb0af3021b7dc54753",
      "tree": "3638530cfa2c3110d78cf206bce6707747031176",
      "parents": [
        "8cd1c0ec6579b5d6efcc5d876aec1d1b5047921e"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Jul 09 10:17:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 10:17:41 2026 +0200"
      },
      "message": "[FLINK-40084][build] maven-shade-plugin does not respect multi release jars"
    },
    {
      "commit": "8cd1c0ec6579b5d6efcc5d876aec1d1b5047921e",
      "tree": "9bf55054c5a0f3f6afd48705cb3ebff2c308d613",
      "parents": [
        "ed2a5d4050ca2c269092388c8c89884b5634d41a"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:04:41 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Thu Jul 09 10:11:20 2026 +0200"
      },
      "message": "[FLINK-39520][network] Additive logging overload; widen releaseAllResources visibility\n\n- NetworkActionsLogger: additive tracePersist(String, Object, Object, long)\n  overload; the existing Buffer overload delegates to it.\n- RecoveredInputChannel#releaseAllResources: package-private -\u003e public.\n"
    },
    {
      "commit": "ed2a5d4050ca2c269092388c8c89884b5634d41a",
      "tree": "ef284c1299566590318f7ad8fdd07cb7e45f77d2",
      "parents": [
        "0076de581afcd72367d94ecba5e9981524701ff9"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Mon Jul 06 00:03:40 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Thu Jul 09 10:11:20 2026 +0200"
      },
      "message": "[FLINK-39520][network] Add InputGate#getChannel(InputChannelInfo)\n\n- InputGate: new abstract InputChannel getChannel(InputChannelInfo).\n- SingleInputGate: channels[channelInfo.getInputChannelIdx()]. UnionInputGate:\n  resolve via inputGatesByGateIndex.get(channelInfo.getGateIdx())\n  .getChannel(channelInfo) (correct global-vs-member index semantics).\n  InputGateWithMetrics: delegate. CheckpointedInputGate: delegate helper.\n- AbstractStreamTaskNetworkInput: getChannel(channelInfo.getInputChannelIdx())\n  -\u003e getChannel(channelInfo).\n- Test impls: MockInputGate, MockIndexedInputGate,\n  AlignedCheckpointsMassiveRandomTest\u0027s inner gate.\n"
    },
    {
      "commit": "0076de581afcd72367d94ecba5e9981524701ff9",
      "tree": "cb28b5b1d462e4f167686c1034bd9dcb2979ef70",
      "parents": [
        "c09a21c82bc15ae9b515c49bbffee64f11ea6311"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Sun Jul 05 23:59:10 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Thu Jul 09 10:11:20 2026 +0200"
      },
      "message": "[FLINK-39520][checkpoint] Extract AbstractInputChannelRecoveredStateHandler with concrete no-filtering/filtering handlers\n\nSingle-file class split of RecoveredChannelStateHandler.java; all classes stay\npackage-private in this file. No behavior change.\n\n- New abstract AbstractInputChannelRecoveredStateHandler: fields inputGates,\n  channelMapping, rescaledChannels, oldToNewMappings; methods getMappedChannels,\n  calculateMapping, getChannel - verbatim extraction from\n  InputChannelRecoveredStateHandler. Adds a closeInternal() template hook used\n  by later phases.\n- New NoSpillingHandler: recover() is the verbatim old non-filtering branch\n  (onRecoveredStateBuffer(descriptor) followed by\n  onRecoveredStateBuffer(buffer.retainBuffer()), same try/finally recycle);\n  inherits the verbatim network-pool getBuffer.\n- New FilteringHandler (the v1 filtering behavior, verbatim): recover() \u003d old\n  recoverWithFiltering (filteringHandler.filterAndRewrite(...,\n  channel::requestBufferBlocking) delivering List\u003cBuffer\u003e via\n  onRecoveredStateBuffer); getBuffer \u003d old getPreFilterBuffer (reusable heap\n  MemorySegment, preFilterBufferInUse invariant); closeInternal \u003d old\n  segment-freeing close.\n- New static create(...) factory selecting NoSpillingHandler vs\n  FilteringHandler - equivalent to the old internal if-branch.\n  SequentialChannelStateReaderImpl switches from direct construction to the\n  factory (mechanical).\n- ResultSubpartitionRecoveredStateHandler: untouched.\n- Trace label in RecoveredInputChannel.onRecoveredStateBuffer:\n  \"InputChannelRecoveredStateHandler#recover\" -\u003e \"NoSpillingHandler#recover\"\n  (final label).\n- Tests: mechanical adaptation of InputChannelRecoveredStateHandlerTest,\n  RecoveredChannelStateHandlerTest.\n"
    },
    {
      "commit": "c09a21c82bc15ae9b515c49bbffee64f11ea6311",
      "tree": "40ec458ea816095a517aeec0de204ba459328c17",
      "parents": [
        "4aff72938d631b5478ac592631155cac92fe58bd"
      ],
      "author": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Thu May 21 15:26:09 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Thu Jul 09 10:11:20 2026 +0200"
      },
      "message": "[FLINK-39520][network] Decouple LocalInputChannel recovery wiring from toBeConsumedBuffers\n\nSplit the single toBeConsumedBuffers queue into two queues with disjoint\nresponsibilities:\n\n  - recoveredBuffers (new): holds buffers migrated from RecoveredInputChannel\n    during construction; consumed by getNextRecoveredBuffer() which retains\n    the priority-event interleaving and last-buffer dynamic next-data-type\n    detection introduced by FLINK-39018.\n  - toBeConsumedBuffers (existing): reverted to its pre-FLINK-39018 role of\n    holding FullyFilledBuffer partial-buffer splits only. The recovery-aware\n    early branch in getNextBuffer() and the checkpointStarted inflight scan\n    no longer touch this queue.\n\nRestores the checkState(toBeConsumedBuffers.isEmpty()) guard in\nrequestSubpartitions() (removed by cebc174a). hasPendingPriorityEvent,\nnotifyPriorityEvent, and the constructor signature are unchanged.\n\nPure refactor: no public API change, no new tests; verified by the 9 existing\nLocalInputChannelTest regression cases.\n"
    },
    {
      "commit": "4aff72938d631b5478ac592631155cac92fe58bd",
      "tree": "38c7e7017cc0c5bd80bcc032c3b58a47955c9cb3",
      "parents": [
        "7f770b87178b66781708b92beb3540e5257c7c9f"
      ],
      "author": {
        "name": "Roman Khachatryan",
        "email": "khachatryan.roman@gmail.com",
        "time": "Tue Jun 30 01:42:53 2026 +0200"
      },
      "committer": {
        "name": "Rui Fan",
        "email": "1996fanrui@gmail.com",
        "time": "Thu Jul 09 10:11:20 2026 +0200"
      },
      "message": "[hotfix] Report END_OF_INPUT from multiple-input processor when all inputs finished\n\nStreamMultipleInputProcessor.processInput returned NOTHING_AVAILABLE when no\ninput was selectable, even once all inputs were finished. Since\ngetAvailableFuture() returns AVAILABLE as soon as all inputs are finished, the\nmailbox loop then never blocks and would spin on processInput at 100% CPU if it\nwere ever invoked again after the operator finished.\n\nThis is a latent inconsistency with single-input processors (which keep\nreturning END_OF_INPUT once finished) and is independent of any particular\nfeature; it is just not reached today because a task suspends on the first\nEND_OF_INPUT and processInput is not called again. The checkpointing-during-\nrecovery work (later in this series) does re-invoke processInput after an\noperator finishes during recovery, which would otherwise turn this into a hang.\n\nReport END_OF_INPUT when there is nothing to read and all inputs are finished,\nconsistent with single-input processors and\nMultipleInputSelectionHandler#calculateOverallStatus.\n"
    },
    {
      "commit": "7f770b87178b66781708b92beb3540e5257c7c9f",
      "tree": "cbe0e7d974a72f69b5aa8e72451ca4afb26d4ce8",
      "parents": [
        "f5846010d6908e5407d78dadf597f1989f08a29c"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Sun Jul 05 19:59:52 2026 +0200"
      },
      "committer": {
        "name": "Matthias Pohl",
        "email": "github@mapohl.com",
        "time": "Thu Jul 09 08:12:14 2026 +0200"
      },
      "message": "[FLINK-40076][tests] Fix race in RescaleTimelineITCase.testRecordNonTerminatedRescaleMergingWithNewRecoverableFailureTriggerCause\n\nAfter terminating a TaskManager to trigger a recoverable failover, the test\nwaited via waitForVertexParallelismReachedAndJobRunning for PARALLELISM. That\ncondition is already satisfied by the stale pre-failover state, so the wait\nreturns immediately without synchronizing with the failover. The snapshot could\ntherefore be taken before AdaptiveScheduler merged the failover into the\nin-progress UPDATE_REQUIREMENT rescale and re-stamped its trigger cause, letting\nthe test observe UPDATE_REQUIREMENT instead of the expected RECOVERABLE_FAILOVER.\n\nWait for the job to be RUNNING again at the parallelism the single remaining\nTaskManager can host (NUMBER_SLOTS_PER_TASK_MANAGER) instead. The merge\nre-stamps the trigger cause in goToRestarting, before the job runs again at that\nreduced parallelism, so the job coming back up synchronizes the snapshot with\nthe merge. The assertion is unchanged.\n\nGenerated-by: Claude Opus 4.8 (via Claude Code)\n"
    },
    {
      "commit": "f5846010d6908e5407d78dadf597f1989f08a29c",
      "tree": "327090baa7592618622deffcc8550a9f74402fb2",
      "parents": [
        "a1dcc9d5beceda26b0745e6359da7881a69fbce5"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "rgharib@confluent.io",
        "time": "Thu Jul 09 06:58:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 06:58:13 2026 +0200"
      },
      "message": "[FLINK-40096][table] Migrate `EXPLAIN` `CTAS`/`RTAS` Explain tests to Java"
    },
    {
      "commit": "a1dcc9d5beceda26b0745e6359da7881a69fbce5",
      "tree": "1d94b752d642ef2f20b17b07b84184921f3a306a",
      "parents": [
        "3e3e270c98d9205d1eac3d4baea3a20c373805a2"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Wed Jul 08 16:17:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 16:17:19 2026 +0200"
      },
      "message": "[FLINK-40090][docs] Modernize cryptography export notice in distribution README (#28677)\n\n* [FLINK-40090][docs] Modernize cryptography export notice in distribution README\n\n* [FLINK-40090][tests] Update expected WordCount row count in CLI e2e test\n\nGenerated-by: Claude Opus 4.8"
    },
    {
      "commit": "3e3e270c98d9205d1eac3d4baea3a20c373805a2",
      "tree": "33c708c56cc4babf41017c3e01214f91b27e2291",
      "parents": [
        "ba41c1f950bab2663cf0c323076bce7347d2fef8"
      ],
      "author": {
        "name": "Keith Lee",
        "email": "leekei@apache.org",
        "time": "Tue Jul 07 23:01:08 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 16:01:08 2026 -0600"
      },
      "message": "[FLINK-39923][state] Fix RocksDB Statistics native memory leak (#28489)\n\nClose the JNI Statistics wrapper in `RocksDBNativeMetricMonitor.close()`\nand on partial init in `RocksDBHandle.loadDb()`."
    },
    {
      "commit": "ba41c1f950bab2663cf0c323076bce7347d2fef8",
      "tree": "0ccf073c30dce364ec86758bdf683c8f2cbee97e",
      "parents": [
        "eafba3bc13d8f9688a89d390af658f26de29ea91"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Jul 07 22:46:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 22:46:14 2026 +0200"
      },
      "message": "[FLINK-40039][table] Fix `CTAS`/`RTAS` when used with set-semantic PTFs"
    },
    {
      "commit": "eafba3bc13d8f9688a89d390af658f26de29ea91",
      "tree": "7664fb184a2be62ee71cf6213525a9fb0fb8959f",
      "parents": [
        "20216e41992090ca3ee08f129335bde86c9c7c2d"
      ],
      "author": {
        "name": "Stepan Stepanishchev",
        "email": "116617250+SteveStevenpoor@users.noreply.github.com",
        "time": "Wed Jul 08 03:25:45 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 22:25:45 2026 +0200"
      },
      "message": "[FLINK-36334][tests] Enable TraversableSerializerUpgradeTest"
    },
    {
      "commit": "20216e41992090ca3ee08f129335bde86c9c7c2d",
      "tree": "cf61f45f056d52879a1b57aa3088aadbb5f04d37",
      "parents": [
        "0b16dd32ab17a0458708c6d41f647975a337edac"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Jul 07 22:23:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 22:23:17 2026 +0200"
      },
      "message": "[FLINK-39715][table] Sync SQL and table api behavior for queries with  sort \n\n\n---------\n\nCo-authored-by: Arvind Kandpal \u003carvind.kandpal@ksolves.com\u003e"
    },
    {
      "commit": "0b16dd32ab17a0458708c6d41f647975a337edac",
      "tree": "a01e76ed63c278aff9f430182e04dcdda0d7ecd5",
      "parents": [
        "6bdaa5e1211449f5b209d51daf2ee5a88d74826e"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Fri Jul 03 02:26:04 2026 +0530"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Jul 07 16:43:15 2026 +0200"
      },
      "message": "[FLINK-40032][runtime-web] Migrate web-dashboard eslint to v9 (flat config)\n\nReplace .eslintrc.js and .eslintignore with eslint.config.js flat\nconfig. @angular-eslint 21 already supports eslint 9, so this adds the\nunified angular-eslint and typescript-eslint packages (which provide\nflat-config-ready presets and parser wiring) alongside the existing\nsplit @angular-eslint/* packages needed by the Angular CLI builder and\nschematics. eslint-plugin-prettier stays on v4.x since v5 requires\nprettier 3, which is a separate deferred upgrade.\n\nGenerated-by: Claude Code (claude-opus-4-8)\n"
    },
    {
      "commit": "6bdaa5e1211449f5b209d51daf2ee5a88d74826e",
      "tree": "d16376b989163a816bab6f9fe6cd5e9a99018763",
      "parents": [
        "2c0bf2466abf962cdd0f65ef3e8fbaa1fd173e1c"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Tue Jul 07 18:39:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 15:09:40 2026 +0200"
      },
      "message": "[FLINK-40045][runtime-web] Upgrade d3-flame-graph to v5 (#28601)"
    },
    {
      "commit": "2c0bf2466abf962cdd0f65ef3e8fbaa1fd173e1c",
      "tree": "b7f14b4deba3a1c454f0cc28b40d961c75a2e198",
      "parents": [
        "a6f1f40dcb09258afa93fba274a4470ea342b790"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Jul 07 10:15:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 10:15:58 2026 +0200"
      },
      "message": "[FLINK-40082][table] Watermark generated method `extractTimestamp` might invoke code throwing exceptions"
    },
    {
      "commit": "a6f1f40dcb09258afa93fba274a4470ea342b790",
      "tree": "200d55aa91eb759f1abdb3397288684e0cd72ea2",
      "parents": [
        "a053de2138e6ceeaa1cef73f6d99981bd823e9cb"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Thu Jul 02 14:03:42 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Jul 07 09:42:36 2026 +0200"
      },
      "message": "[FLINK-32695][e2e] Migrate SqlToolbox watermark push-down source to Source V2\n\nTestSourceFunction implemented the legacy SourceFunction and manually\ndrove the pushed WatermarkStrategy\u0027s generator;\nTestScanTableSourceWithWatermarkPushDown wrapped it in the deprecated\nSourceFunctionProvider.\n\nReplace both with a DataGeneratorSource behind a DataStreamScanProvider\nthat applies the pushed watermark strategy via fromSource, the same\npattern KafkaDynamicSource uses. A plain SourceProvider is not suitable\nbecause the planner does not apply the pushed strategy on that path, so\nthe generated watermark code would never be instantiated on the\nTaskManager, which is what this source exists to test (FLINK-28693).\n\nGenerated-by: Claude Code (Sonnet 4.6)\n"
    },
    {
      "commit": "a053de2138e6ceeaa1cef73f6d99981bd823e9cb",
      "tree": "fce310ba10072a08110989ce8c75479e8c6609ac",
      "parents": [
        "7b663bae4c512f6d32696ded52edbcb62a5b6554"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Fri Jul 03 21:31:15 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Jul 07 09:32:42 2026 +0200"
      },
      "message": "[FLINK-40068][tests] Do not assert apply() was called when cancelling KeyedJob window\n\nStatefulWindowFunction.close() also runs on the cancellation path, and the GENERATE/MIGRATE jobs are always stopped via non-draining cancel-with-savepoint, so a window subtask can be closed before apply() was called; the failing assertion then kills the shared MiniCluster\u0027s only TaskManager and starves every later parameterization. Restrict the assertion to RESTORE, the only mode whose job runs to completion.\n\nGenerated-by: Claude Opus 4.8 (1M context)\n"
    }
  ],
  "next": "7b663bae4c512f6d32696ded52edbcb62a5b6554"
}
