)]}'
{
  "log": [
    {
      "commit": "58143561cd00e9f5cab1eda67c478191fd0581ec",
      "tree": "f933ff6f071bef98084b81345ec4de267de2d765",
      "parents": [
        "32e805f221aeabe04643cfecfa98a0bfb9db4474"
      ],
      "author": {
        "name": "Anton Borisov",
        "email": "148864665+fresh-borzoni@users.noreply.github.com",
        "time": "Wed Nov 11 12:02:03 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 13:02:03 2026 +0100"
      },
      "message": "[FLINK-38753][table-planner] Enrich upsert keys by equi-join equivalences \n\nThis fixes #29653"
    },
    {
      "commit": "32e805f221aeabe04643cfecfa98a0bfb9db4474",
      "tree": "c0bbaa0e9d9db8b661b0c784bca2a8b891381ea0",
      "parents": [
        "34dd8cdce4dfdcada36bd1ffcd1178ccbc130bc4"
      ],
      "author": {
        "name": "Gustavo de Morais",
        "email": "gustavopguto@gmail.com",
        "time": "Wed Nov 11 10:48:47 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 10:48:47 2026 +0100"
      },
      "message": "[FLINK-41371][table] Keep upsert mode for row-semantic PTFs\n\nFixed in #29812"
    },
    {
      "commit": "34dd8cdce4dfdcada36bd1ffcd1178ccbc130bc4",
      "tree": "02cacb180ce67830112e6629f0897ecb930dcc87",
      "parents": [
        "5a5e76b69db01c78a1f46203310efbce26f1ddbe"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 11 09:45:32 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 09:45:32 2026 +0100"
      },
      "message": "[FLINK-41315][docs] Add a Function Basics page and list UNNEST and ML_PREDICT\n\nThe kinds of functions and the named arguments move to a new Function Basics page before Built-in Functions. The kinds now tell table functions, such as UNNEST, apart from process table functions, which take one or more tables. Collection gets a Table Functions section for UNNEST, and Process Table gets a row for ML_PREDICT, so All Functions lists both. Links to #named-arguments on the old built-in functions page now lead to Function Basics.\n\nGenerated-by: Claude Code 2.1.321 (Claude Opus 5.5)"
    },
    {
      "commit": "5a5e76b69db01c78a1f46203310efbce26f1ddbe",
      "tree": "ab7c71a1495c65c126f1a4e8b992181f577289da",
      "parents": [
        "e9f1ffc4803944c3b0c75ccc9c0e16937816d286"
      ],
      "author": {
        "name": "Mika Naylor",
        "email": "mnaylor@confluent.io",
        "time": "Wed Nov 11 09:30:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 09:30:39 2026 +0100"
      },
      "message": "[FLINK-40577][table] Support ChangelogModes in ProcessTableFunctionTestHarness (#29130)\n\nExtends the ProcessTableFunctionTestHarness so it can model changelog semantics, rather than assuming insert-only streams.\n\nThe harness lets the user supply a table argument\u0027s changelog mode and upsert keys directly. To do this, the PR ads a changelogMode per table argument, and (for upsert changelogs) one or more upsertKey candidates (each call adds another candidate).\n\nFor the output side, the harness derives the produced changelog mode. If the PTF implements ChangelogFunction its mode is resolved from that (insert-only otherwise).\nCollected rows whose RowKind the resolved output mode does not allow are rejected.\nInput rows and configurations that the planner could never produce (e.g. upsert output with\nrow-semantic table args) are likewise rejected.\n\nGenerated-by: Claude Code (Opus 5)"
    },
    {
      "commit": "e9f1ffc4803944c3b0c75ccc9c0e16937816d286",
      "tree": "776215c4dec379aeea2e44a83da09d6c585bf908",
      "parents": [
        "039410e17d6bb89735a0b8a42b6b38c7bd0d10d5"
      ],
      "author": {
        "name": "Moritz Manner",
        "email": "moritz.manner@gmail.com",
        "time": "Tue Nov 10 15:47:20 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 11 09:13:02 2026 +0100"
      },
      "message": "[FLINK-40807][table] Add XML_STRING function\n\nAdd XML_STRING(variant), the inverse of PARSE_XML. It writes a VARIANT\nas an XML string: @ fields as attributes, the $ field as text, and the\nother fields as child elements, in the order of the # field. A NULL is\nwritten with xsi:nil, and a typed scalar gets an xsi:type with the xs\nprefix, e.g. xsi:type\u003d\"xs:int\". The root element declares the xsi and\nxs prefixes if the document uses them and doesn\u0027t declare them itself.\nA variant without an XML representation fails.\n\nThe writer escapes the text itself and writes tabs and line breaks in\nattribute values, and carriage returns in text, as character\nreferences, so that PARSE_XML reads them back unchanged. Elements with\ncontent go on an explicit stack, so the depth of the variant doesn\u0027t\nadd to the depth of the call stack.\n\nGenerated-by: Claude Opus 5.5\n"
    },
    {
      "commit": "039410e17d6bb89735a0b8a42b6b38c7bd0d10d5",
      "tree": "b2f88a648487dcf47378023b00ec73de9d513229",
      "parents": [
        "ad4e744d883d45ee6c5861c2ceea789730662fda"
      ],
      "author": {
        "name": "Moritz Manner",
        "email": "moritz.manner@gmail.com",
        "time": "Tue Nov 10 15:46:01 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 11 09:13:02 2026 +0100"
      },
      "message": "[FLINK-40807][table] Refine the XML Schema handling of PARSE_XML\n\n- base64Binary is parsed as BYTES. The text has to match the grammar\n  of XML Schema, since the Java decoder also accepts a missing padding\n  and unused bits that aren\u0027t zero.\n- The declarations of the xsi and xs prefixes are dropped only if they\n  have the namespaces of XML Schema. Declarations with other namespaces\n  are kept as attributes.\n- A dateTime whose offset moves it past the year 9999 in UTC stays a\n  string, like a year after 9999 in the text.\n- The keys, prefixes and the boolean rule of XML Schema are moved to\n  XmlVariantNames, so that they can be shared.\n\nGenerated-by: Claude Opus 5.5\n"
    },
    {
      "commit": "ad4e744d883d45ee6c5861c2ceea789730662fda",
      "tree": "8bbf214061b6756788a114ae237a9bcab25835bd",
      "parents": [
        "9412b866063938aa17a0ca370d64884d57d5290b"
      ],
      "author": {
        "name": "Timo Theusner",
        "email": "32929874+Timm0@users.noreply.github.com",
        "time": "Wed Nov 11 08:08:49 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 09:08:49 2026 +0100"
      },
      "message": "[FLINK-41210][table] Add StartMode factories for each START_MODE clause (#29674)\n\n- Add `fromBeginning`, `fromNow`, `fromTimestamp`, `resumeOrFromBeginning`, `resumeOrFromNow` and `resumeOrFromTimestamp` to `StartMode`, with `Duration` and `Instant` overloads\n- Reject invalid offsets with `ValidationException`\n- Build offset intervals in the largest exact unit\n\nGenerated-by: Claude Code Opus 5.5"
    },
    {
      "commit": "9412b866063938aa17a0ca370d64884d57d5290b",
      "tree": "cab85532e330122c1e6187c473e5ad0011a8558d",
      "parents": [
        "e790cfb25215448268df2cdbab7cbcd556c21acb"
      ],
      "author": {
        "name": "Sepuri Sai Krishna",
        "email": "saik20533@gmail.com",
        "time": "Wed Nov 11 12:44:37 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:14:37 2026 +0800"
      },
      "message": "[FLINK-40793][tests] Fix unstable DefaultSchedulerTest (#29278)\n\nGenerated-by: Claude Code (Opus 5)"
    },
    {
      "commit": "e790cfb25215448268df2cdbab7cbcd556c21acb",
      "tree": "151eb32ab0894f275838c73e5fc55d97478d41f2",
      "parents": [
        "9efe0f8854ce372b834d39234e3a57f113464fb9"
      ],
      "author": {
        "name": "Biao Geng",
        "email": "biaogeng7@gmail.com",
        "time": "Wed Nov 11 14:40:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:40:04 2026 +0800"
      },
      "message": "[FLINK-41271][python] Fail Python tasks when the data RPC channel between Java/Python process terminates (#29677)"
    },
    {
      "commit": "9efe0f8854ce372b834d39234e3a57f113464fb9",
      "tree": "72fd591549c00f80982953c3f3f0f60ace07e8f6",
      "parents": [
        "3f35de7100456d7c0dbb8de43d8d9cc57cd176ce"
      ],
      "author": {
        "name": "Stefan Wang",
        "email": "1fannnw@gmail.com",
        "time": "Tue Nov 10 19:22:18 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 11:22:18 2026 +0800"
      },
      "message": "[FLINK-34985][python] Fix named row access in thread-mode Table.map (#29287)"
    },
    {
      "commit": "3f35de7100456d7c0dbb8de43d8d9cc57cd176ce",
      "tree": "fa1bc300f678e2060dc2a385642cf3851948fc50",
      "parents": [
        "43a6beb7ce4cf8bbf1ebed92b4c6a9a05bba1b8e"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Wed Nov 11 00:16:27 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 00:16:27 2026 +0100"
      },
      "message": "[hotfix][build] Update maven-archetype version to 3.4.1"
    },
    {
      "commit": "43a6beb7ce4cf8bbf1ebed92b4c6a9a05bba1b8e",
      "tree": "05684dcd2f8076dded4d51ffcb1a390e3eca29d3",
      "parents": [
        "20fbfd5d8275e24b0580fa53fa96f7fb9c0af979"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Nov 10 21:52:48 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 21:52:48 2026 +0100"
      },
      "message": "[hotfix][ci] Skip e2e for docs-only PRs based on the PR\u0027s changed files"
    },
    {
      "commit": "20fbfd5d8275e24b0580fa53fa96f7fb9c0af979",
      "tree": "09e28d45808a3d0352bcc39e7a4ed4712a04ac85",
      "parents": [
        "79a06c94a3de04eabc0620dc8201795859a3f408"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Nov 10 12:36:05 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Nov 10 17:02:55 2026 +0100"
      },
      "message": "[hotfix][splitter] Drop empty lines from code\n\nThis closes #29828\n"
    },
    {
      "commit": "79a06c94a3de04eabc0620dc8201795859a3f408",
      "tree": "bbfd1b3c705afe6da8b727b65262eda853d2a9f7",
      "parents": [
        "088d10ba124f4e75bf1523668ba0c100e9d2865f"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Nov 08 23:56:58 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Nov 10 17:02:55 2026 +0100"
      },
      "message": "[FLINK-41382][table] Ensure list of split calls is also splitted if required\n"
    },
    {
      "commit": "088d10ba124f4e75bf1523668ba0c100e9d2865f",
      "tree": "4d0c2579d6e5d15c22473067a2ddbc4046f9ac8b",
      "parents": [
        "61e584e530950b5eb31189320c8e6ef7c50f93bc"
      ],
      "author": {
        "name": "Saketh Kurnool",
        "email": "kurnoolsaketh@gmail.com",
        "time": "Tue Nov 10 07:49:53 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 16:49:53 2026 +0100"
      },
      "message": "[FLINK-40963][table-planner] Add support for `DATE` and `TIME` conversion to `JSON`"
    },
    {
      "commit": "61e584e530950b5eb31189320c8e6ef7c50f93bc",
      "tree": "6013f84e3352741e6c182450a8d9b6d0f93237cb",
      "parents": [
        "9c8f401704056ea1a6b87b1181d5fd202b52f529"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 10 15:41:13 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 15:41:13 2026 +0100"
      },
      "message": "[FLINK-41315][docs] Add the page structure for built-in function docs\n\nThe single Built-in Functions page becomes a section directly under Flink SQL, with 17 category pages, a Process Table Functions page and an All Functions page that lists every function from A to Z. Each category page starts with a short introduction and keeps its sql_functions table.\n\n- Old URLs and section anchors, such as .../functions/systemFunctions.html#string-functions, redirect to the page that now holds the section.\n- User-Defined Functions and Named Arguments move up to Flink SQL too. Column functions move to the Table API functions.\n- A sidebar section\u0027s title opens its own page, and a hovered link keeps its width.\n\nGenerated-by: Claude Code 2.1.321 (Claude Opus 5.5)"
    },
    {
      "commit": "9c8f401704056ea1a6b87b1181d5fd202b52f529",
      "tree": "7610ba91db085a1012ec3ea4c9edb75076753a70",
      "parents": [
        "d7ad073a4645e3a799a81577958684c473798424"
      ],
      "author": {
        "name": "Timo Theusner",
        "email": "ttheusner@confluent.io",
        "time": "Fri Oct 30 17:28:03 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 10 15:28:48 2026 +0100"
      },
      "message": "[FLINK-41273][table] Support set operations on unbounded tables in the Table API\n\n- Remove the streaming-mode rejection of `union`, `intersect`, `intersectAll`, `minus` and `minusAll`\n- Serialize `MINUS` as `EXCEPT` in `SetQueryOperation#asSerializableString`\n- Add five set operation programs to `QueryOperationTestPrograms`\n- Run the `intersect` and `minus` VARIANT checks of `ComparableTypeValidatorTest` in both modes\n- Drop the obsolete streaming rejection tests\n- Mark the operations as Streaming with a state warning in `tableApi.md` (en, zh) and the PyFlink DataFrame docstrings\n"
    },
    {
      "commit": "d7ad073a4645e3a799a81577958684c473798424",
      "tree": "14bb552ab3201067a57a0749c13dc3b78ebe2005",
      "parents": [
        "30e854cb49b59238b39b864aa02ab97ac15d7017"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 10 12:44:40 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 10 15:25:43 2026 +0100"
      },
      "message": "[FLINK-41414][table] Expand the AGENTS.md guide for adding a built-in function\n\nThe section listed six steps and named few files, so a contributor had to read earlier PRs to find the type strategies, the Table API and PyFlink methods, the PyFlink completeness tests and the docs rows. It is now a checklist of eight steps that names the file and an example for each step. It names no single function to copy, since no existing function follows every step.\n\nThe guide also says which implementation path a function takes. A runtime class is the default. Scalar codegen is only for performance that needs work shared between calls, such as PARSE_JSON parsing an input once, for a function that reads the operator context, or for one that evaluates an argument only when needed. Aggregates go through AggFunctionFactory, and the Calcite path is not for new functions. A runtime class can precompute a literal argument in its constructor, so that is no reason for codegen.\n\nTests go to the cheapest level that covers a behavior, since ITCases cost the most CI time: type strategies in a unit test, ITCase cases only for what needs a running query, added to the existing ITCase of the category, and no case that another test already covers. The implementation step sets the per-record rules for runtime classes and generated code alike: do query-constant work once, cache an argument that rarely changes, stay on internal data structures, build no error in a TRY_ variant, don\u0027t log, and measure when designs differ. Javadoc and docstrings stay short, and the docs describe what a user can observe, not the implementation.\n\nThe runtime and planner AGENTS.md files get the matching details: how a runtime class reads a literal argument, where a runtimeProvided scalar or aggregate is wired in, and where function tests go. The runtime file no longer says that aggregates are constructed by specialize().\n\nGenerated-by: Claude Code 2.1.321 (Claude Opus 5.5)\n"
    },
    {
      "commit": "30e854cb49b59238b39b864aa02ab97ac15d7017",
      "tree": "435669a01182fe551417f4b5a8928cb7e34cdd89",
      "parents": [
        "707f5e05b4cf34a0bd91488ba1a4c589aa2ec28a"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 10 12:44:40 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 10 15:25:43 2026 +0100"
      },
      "message": "[hotfix][python] List the missing expressions in the PyFlink API reference\n\n16 public expressions had no entry in `expressions.rst`, so the API reference had no page for them: `descriptor`, `json`, `lag`, `lead`, `uuid_v4`, `uuid_v7` and `with_all_columns` in `pyflink.table.expressions`, and `concat`, `is_valid_utf8`, `make_valid_utf8`, `array_append`, `array_prepend`, `parse_json`, `try_parse_json`, `parse_xml` and `try_parse_xml` on `Expression`. No test compares the list with the code.\n\nThe module functions go in at their position in the source, which the list already follows. The methods go into their category sections.\n\nGenerated-by: Claude Code 2.1.321 (Claude Opus 5.5)\n"
    },
    {
      "commit": "707f5e05b4cf34a0bd91488ba1a4c589aa2ec28a",
      "tree": "50651ca2b21853629cd8c3a4e6ea64a30643b0af",
      "parents": [
        "6ab669a9e19b1b8132095662a3a0cde802687e95"
      ],
      "author": {
        "name": "Diljeet(DJ) Singh",
        "email": "ctrlaltdilj@icloud.com",
        "time": "Sun Nov 08 15:29:06 2026 +0100"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Nov 10 15:02:12 2026 +0100"
      },
      "message": "[FLINK-36694][filesystems] Update Azure, OSS and GCS to Hadoop 3.4.3\n\nHadoop 3.3.4 fails on Java 23 and later, because Subject.getSubject is no\nlonger supported (HADOOP-19212). The S3 filesystems stay on 3.3.4, since\nhadoop-aws 3.4 requires AWS SDK v2 (FLINK-30975).\n\nhadoop-azure 3.4 no longer pulls in Jackson, so the Azure filesystem now\nbundles it itself.\n\nThis is the Azure, OSS and GCS part of #27026.\n\nCo-authored-by: Martijn Visser \u003c2989614+MartijnVisser@users.noreply.github.com\u003e\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "6ab669a9e19b1b8132095662a3a0cde802687e95",
      "tree": "4715925355acec398de59070bcf6d2a4c5cfe977",
      "parents": [
        "baf3e9adc8ea7fd587f579b54344affab94e641b"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Mon Nov 09 10:40:49 2026 +0100"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Nov 10 14:59:59 2026 +0100"
      },
      "message": "[FLINK-41378][yarn] Use the AWS SDK v2 modules in the YARN S3 test\n\nhadoop-aws 3.4.3 brings in the AWS SDK v2 bundle, a 686 MB jar with\nevery AWS client, so every build would download it for\nYarnFileStageTestS3ITCase. Use the modules S3A needs instead and drop\nthe SDK v1 overrides, which hadoop-aws 3.4 no longer uses. The\ninclude_hadoop_aws profile has duplicated the default hadoop-aws\ndependency since FLINK-28165, so remove it and its\n-Dinclude_hadoop_aws CI flags.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "baf3e9adc8ea7fd587f579b54344affab94e641b",
      "tree": "625d32dde7500d0c8efdb2932e7358a328d16e7a",
      "parents": [
        "50819e137adcca8f3b70e9abde262334d0a8fdf5"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Sun Nov 08 17:28:40 2026 +0100"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Nov 10 14:59:59 2026 +0100"
      },
      "message": "[FLINK-41378][ci] Drop the duplicate Hadoop 3.4.3 nightly stages\n\nWith 3.4.3 as the default, cron_hadoop343 on Azure and the \"Hadoop\n3.4.3\" nightly job on GitHub Actions run the same build as cron_azure\nand the Java 17 push build in ci.yml.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "50819e137adcca8f3b70e9abde262334d0a8fdf5",
      "tree": "1ee7f74a74ba28e60fb020113ebefa6d8672bc88",
      "parents": [
        "e62133a068ea629477357567a881db7b33d89efd"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Sun Nov 08 17:28:20 2026 +0100"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Nov 10 14:59:59 2026 +0100"
      },
      "message": "[FLINK-41378][build] Raise the minimum Hadoop version to 3.4.3\n\nHadoop before 3.4.3 fails on Java 23+ (HADOOP-19212), so the java25\nprofile already builds against 3.4.3. Make 3.4.3 the default for every\nJava version, fold the hadoop3-tests profiles into the default build and\ndrop the 2.10.2 CI flags and the dependency pins 3.4.3 no longer needs.\nAn enforcer rule rejects a flink.hadoop.version below 3.4.3. The secure\nYARN Docker cluster moves to 3.4.3 on focal, as its container-executor\nneeds OpenSSL 1.1.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "e62133a068ea629477357567a881db7b33d89efd",
      "tree": "ed2e8fb19396cb92195998484d35cec7cee7ebcc",
      "parents": [
        "f2c498a7d0af537a9ce8b7cac21203de0744d1a1"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Sat Nov 07 16:53:07 2026 +0530"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Tue Nov 10 14:13:23 2026 +0100"
      },
      "message": "[FLINK-39624][state] Return null from TtlListState#asyncGet for empty state\n\nAppendingState#asyncGet must complete with null when the state is empty,\nand ForSt does so. TtlListState wrapped that null in an AsyncIteratorWrapper,\nso callers got a non-null iterator whose onNext and isEmpty threw an NPE, and\nStateFutureUtils#toIterable failed with a ClassCastException.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "f2c498a7d0af537a9ce8b7cac21203de0744d1a1",
      "tree": "aa21f895ae0f3896a799b691a6d477aa8b679ddc",
      "parents": [
        "f69b51d2e18d84f0e59bbf0ed65664d4794dfbf4"
      ],
      "author": {
        "name": "Sangkyoon Nam",
        "email": "sangkyoon.nam@namsang.co",
        "time": "Tue Nov 10 15:59:08 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 14:59:08 2026 +0800"
      },
      "message": "[FLINK-41103][python] Clear ValueState without adding None in update(None) (#29601)"
    },
    {
      "commit": "f69b51d2e18d84f0e59bbf0ed65664d4794dfbf4",
      "tree": "3e22020d384ace1d8224d7e46855ddffee96210b",
      "parents": [
        "c0ee48e916fa0bd25ced8650a6f6bd7e50b7eef3"
      ],
      "author": {
        "name": "Sangkyoon Nam",
        "email": "sangkyoon.nam@namsang.co",
        "time": "Tue Nov 10 15:57:36 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 14:57:36 2026 +0800"
      },
      "message": "[FLINK-41108][python] Use the TTL config when invalidating cached state after namespace merges (#29602)"
    },
    {
      "commit": "c0ee48e916fa0bd25ced8650a6f6bd7e50b7eef3",
      "tree": "e55bf50897dae3cd3abe54118e3b483ab8e77af8",
      "parents": [
        "a21fa009bc5064f81525f501dea7da4759adbfc7"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 20:54:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 20:54:42 2026 +0100"
      },
      "message": "[hotfix][test] Run `testAcceptingOfferedSlotsWithoutResourceManagerConnected` on a single threaded main executor"
    },
    {
      "commit": "a21fa009bc5064f81525f501dea7da4759adbfc7",
      "tree": "5a8935e8c0fee648cd2edc809c93349ffcf78a20",
      "parents": [
        "56685ad4ebb56978a5286821a16bcd5dceaca89a"
      ],
      "author": {
        "name": "Utkarsh Vashishtha",
        "email": "utkarsh@grepr.ai",
        "time": "Mon Nov 09 10:24:09 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 19:24:09 2026 +0100"
      },
      "message": "[FLINK-40776][table-runtime] Cache query-parameter pattern in `PARSE_URL`"
    },
    {
      "commit": "56685ad4ebb56978a5286821a16bcd5dceaca89a",
      "tree": "a29c289b6537b97a2e2016d7747ae4befa7ebaaa",
      "parents": [
        "5b32cc755f7e6d5986b66c69eaa3e9344506b4a1"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 19:19:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 19:19:29 2026 +0100"
      },
      "message": "[hotfix][ci] Rebalance end-to-end tests in `run-nightly-tests.sh`"
    },
    {
      "commit": "5b32cc755f7e6d5986b66c69eaa3e9344506b4a1",
      "tree": "ef01c360df40b7575df84a2d6dfe04d1ae432872",
      "parents": [
        "9cc9a3ec47f6c08870ec5aa36d4631a3e48d3e4c"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 16:51:03 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 19:12:09 2026 +0100"
      },
      "message": "[hotfix][tests] Use uppercase keywords in `CaseFunctionsITCase`\n\nThis closes #29825\n"
    },
    {
      "commit": "9cc9a3ec47f6c08870ec5aa36d4631a3e48d3e4c",
      "tree": "7235329e87db0ffd50a5b2d4d79e8e014979f610",
      "parents": [
        "ac930c9793c0b13292c9361c6d28161d00151c9d"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Nov 07 10:52:39 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 19:12:08 2026 +0100"
      },
      "message": "[FLINK-41380][table] Make generated code for `CASE` ... `WHEN` flat\n"
    },
    {
      "commit": "ac930c9793c0b13292c9361c6d28161d00151c9d",
      "tree": "bf2279e573c048c85944ebbb77bad28fc4e047a0",
      "parents": [
        "fc2568fb9884e66538a51f83e5e861669b511969"
      ],
      "author": {
        "name": "Rion Williams",
        "email": "riwilliams@confluent.io",
        "time": "Mon Nov 09 11:55:22 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 18:55:22 2026 +0100"
      },
      "message": "[FLINK-41066][table] Handle upsert inputs in multi-way joins \n\nThis fixes #29583."
    },
    {
      "commit": "fc2568fb9884e66538a51f83e5e861669b511969",
      "tree": "9a0e3d9d698ef89688b50b8997c796cd574c4e65",
      "parents": [
        "ab1cb0b55fb6b0baa7a4896f71861c2d72239923"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 15:37:28 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 15:37:28 2026 +0100"
      },
      "message": "[FLINK-41383][table] `REGEXP`, `REGEXP_EXTRACT` and `REGEXP_REPLACE` look up a constant pattern for every row"
    },
    {
      "commit": "ab1cb0b55fb6b0baa7a4896f71861c2d72239923",
      "tree": "741882b567333fa49c9e174a9e4fa0493b5aa707",
      "parents": [
        "485da2c2da8a46f80b9275c8ccdd96ee6dd7d61b"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 14:32:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 14:32:45 2026 +0100"
      },
      "message": "[FLINK-41381][table] Use indexed seq for generation the digest of a Calc"
    },
    {
      "commit": "485da2c2da8a46f80b9275c8ccdd96ee6dd7d61b",
      "tree": "1cfa0c69e5a097a44863588c002cf5452594e1fb",
      "parents": [
        "8f8a1bc73d6b8a0bf5e9552b686f045d56ff468c"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Mon Nov 09 12:18:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:18:57 2026 +0100"
      },
      "message": "[FLINK-41370][table] Reject a literal index below 1 in SQL VARIANT array access (#29806)\n\nSQL `v[0]` and `v[-1]` on an array VARIANT returned NULL for every row, while the same literal fails during planning for a plain ARRAY and for `VARIANT.at(INT)` in the Table API. The index is 1-based, so such a literal can never address an element.\n\nThe ARRAY literal-index check now also runs for a VARIANT index of any integer type. A computed index below 1 still returns NULL.\n\nGenerated-by: Claude Code 2.1.319 (Claude Opus 5.5)"
    },
    {
      "commit": "8f8a1bc73d6b8a0bf5e9552b686f045d56ff468c",
      "tree": "676502149d68e068e59225ca9a1910666be83d8a",
      "parents": [
        "4fb928ed93fcb24b58beba1b5e5d55b8168b1752"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 09 09:14:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 09:14:00 2026 +0100"
      },
      "message": "[hotfix][test] Use `-Dfast` for `test_kubernetes_itcases.sh`"
    },
    {
      "commit": "4fb928ed93fcb24b58beba1b5e5d55b8168b1752",
      "tree": "2869e0574fb28c4160ddc3c1b94d408a4ae6fb70",
      "parents": [
        "2e89b879f1e99612c92be845ec53c90efeb77b0d"
      ],
      "author": {
        "name": "Garvit Sharma",
        "email": "garvits45@gmail.com",
        "time": "Fri Oct 30 17:53:53 2026 +0530"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Sun Nov 08 12:30:45 2026 +0100"
      },
      "message": "[hotfix][runtime] Fix typo in JobManagerProcessSpec and TaskExecutorProcessSpec javadoc\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "2e89b879f1e99612c92be845ec53c90efeb77b0d",
      "tree": "827f433b4e6ed98034f53b3c9915910c99a88bce",
      "parents": [
        "efb58c508a9aedf7346b28f5c33a971d056c4a39"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 04 10:00:47 2026 +0100"
      },
      "committer": {
        "name": "Roc Marshal",
        "email": "panyuepeng@apache.org",
        "time": "Sat Nov 07 01:13:00 2026 +0800"
      },
      "message": "[FLINK-40494][docs] Document the UUID type\n\nAdd a UUID section to the data types page: declaration, JVM bridging, the literal, the UUID_V4 and UUID_V7 generators, casts, and ordering. Add UUID to the cast matrix and to the list of data types, in the English and the Chinese page.\n\nGenerated-by: Claude Code 2.1.318 (Claude Opus 5.5)\n"
    },
    {
      "commit": "efb58c508a9aedf7346b28f5c33a971d056c4a39",
      "tree": "532cfe18f902faa3baf89148136e6a78e643fbf9",
      "parents": [
        "de2cb88cb0c5a1c076364e02dd03a19b6d890b91"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Fri Nov 06 21:43:13 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 17:13:13 2026 +0100"
      },
      "message": "[FLINK-41308][runtime-web] Use nettyShuffleMemorySegments fields for the Netty Shuffle Buffers table (#29761)\n\nFLINK-36355 removed the deprecated memorySegmentsAvailable and\nmemorySegmentsTotal fields from the TaskManager details REST response,\nleaving only nettyShuffleMemorySegments*. The TaskManager metrics page\nkept reading the old names, so the Netty Shuffle Buffers table has shown\nempty Available and Total cells since 2.0.\n\nRead the new fields, declare them on the Metrics interface, and cover the\nrendered counts in the component spec.\n\nGenerated-by: Claude Opus 5.5"
    },
    {
      "commit": "de2cb88cb0c5a1c076364e02dd03a19b6d890b91",
      "tree": "c2b4f087c06fd6ddaae62401be8519b14c2f8122",
      "parents": [
        "7c5b2379cb5d117ed26648f14bae4c9f11649e77"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Fri Nov 06 10:23:31 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Fri Nov 06 15:42:18 2026 +0100"
      },
      "message": "[FLINK-41301][table] Throw TableRuntimeException for every failed cast from VARIANT\n\nThe BOOLEAN reader of FromVariantConverter called Variant#getBoolean, which throws a VariantTypeException with the getter\u0027s message, such as \"Expected type BOOLEAN but got STRING\". It now checks the kind and throws the unsupportedKind TableRuntimeException, like the other readers. The DATE reader already does this since FLINK-41281, and the binary readers since FLINK-40319.\n\nA malformed variant, or one with a type this version does not know, still made a reader throw a VariantTypeException. FromVariantConverter#convert now wraps it in a TableRuntimeException and keeps it as the cause.\n\nA cast to a nullable target and VARIANT_GET first check for a variant null. That check reads the type outside convert and threw the same VariantTypeException. Both now call FromVariantConverter#isVariantNull, which wraps it the same way, so TRY_VARIANT_GET returns NULL for such a value instead of throwing.\n\nGenerated-by: Claude Code 2.1.319 (Claude Opus 5.5)\n"
    },
    {
      "commit": "7c5b2379cb5d117ed26648f14bae4c9f11649e77",
      "tree": "cde27944a1534e835fbeb81cace368b4ab7ee2d2",
      "parents": [
        "12c944d5def4edebe93e68f942922fca4b0d7b19"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Fri Nov 06 10:19:19 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Fri Nov 06 15:42:18 2026 +0100"
      },
      "message": "[FLINK-40319][table] Allow CAST from a VARIANT string value to BINARY and VARBINARY\n\nA cast from VARIANT to BINARY, VARBINARY or BYTES read the value with Variant#getBytes, which accepts only the BYTES kind. A string variant failed whatever it held, and so did every other kind, with the getter\u0027s VariantTypeException instead of the TableRuntimeException that the other readers throw.\n\nA string now reaches a binary target as its UTF-8 bytes, padded or truncated like a stored BYTES value. This matches a regular cast from a character string and mirrors the cast from a BYTES variant to a character string. JSON has no binary type, so it also lets a variant built by PARSE_JSON reach a binary target at all. Every other kind fails with the unsupportedKind message, as regular SQL also rejects BOOLEAN or INTEGER to BINARY.\n\nThe bytes come from getString, so a stored string whose payload is not valid UTF-8 comes out as the bytes of U+FFFD, the same substitution the cast to a character string makes. No raw-bytes accessor is added.\n\nCastRulesTest asserted that a string variant fails a BYTES cast. That case now passes.\n\nGenerated-by: Claude Code 2.1.319 (Claude Opus 5.5)\n"
    },
    {
      "commit": "12c944d5def4edebe93e68f942922fca4b0d7b19",
      "tree": "2fe3dea8c5a94f1f865a332e56538a785abba72f",
      "parents": [
        "675942743661d688202c246dd64b66cdce2c757b"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Fri Nov 06 19:10:17 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 14:40:17 2026 +0100"
      },
      "message": "[FLINK-39566][runtime-web] Add checkpoint duration Gantt view\n\nGenerated-by: Claude Code (Claude Opus 5.5)"
    },
    {
      "commit": "675942743661d688202c246dd64b66cdce2c757b",
      "tree": "496e39ba728acf6e4920e9e1b3fa80a0dbf9e6c0",
      "parents": [
        "8ac9c031c073e08a38f5f5a1446613982e2df127"
      ],
      "author": {
        "name": "Anton Borisov",
        "email": "148864665+fresh-borzoni@users.noreply.github.com",
        "time": "Fri Nov 06 12:02:02 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 13:02:02 2026 +0100"
      },
      "message": "[FLINK-41282][table-planner] Use each multi-join step\u0027s own join columns for upsert keys\n\n* [FLINK-41282][table-planner] Use each multi-join step\u0027s own join columns for upsert keys\n\n* Address review comments\n\n* Update flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/plan/metadata/FlinkRelMdUpsertKeys.scala\n\nCo-authored-by: Sergey Nuyanzin \u003csnuyanzin@confluent.io\u003e\n\n* Reword getLeftSideJoinKeyIndices description\n\n---------\n\nCo-authored-by: Sergey Nuyanzin \u003csnuyanzin@confluent.io\u003e"
    },
    {
      "commit": "8ac9c031c073e08a38f5f5a1446613982e2df127",
      "tree": "24d917d75d1d8f34112f08dd67ceace2ee3c1351",
      "parents": [
        "44131db0b9c9e01dc55ec7d2dae02a4c5fbe0e7e"
      ],
      "author": {
        "name": "Bonnie Varghese",
        "email": "bvarghese@confluent.io",
        "time": "Fri Nov 06 03:56:05 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 12:56:05 2026 +0100"
      },
      "message": "[FLINK-41263][table-planner] Add CompiledPlan support for BatchExecAdaptiveJoin\n\n- Build the AdaptiveJoin description prefix in the constructor instead of\n  getDescription(), since the serialized description is passed back to the\n  JsonCreator constructor on restore and would otherwise be prefixed twice."
    },
    {
      "commit": "44131db0b9c9e01dc55ec7d2dae02a4c5fbe0e7e",
      "tree": "076eaedacb4d782fb1578c9992b2e5db9c0449c6",
      "parents": [
        "6e194b0167e9a70c94b776cf43c4c6459633ec4b"
      ],
      "author": {
        "name": "Yahya Kisana",
        "email": "39938170+ykisana@users.noreply.github.com",
        "time": "Fri Nov 06 03:40:54 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 10:40:54 2026 +0100"
      },
      "message": "[FLINK-41086][table] Return NULL from `JSON_LENGTH` and `JSON_TYPE` when a JSON path function fails (#29628)\n\nJSON_LENGTH(json, path) and JSON_TYPE(json, path) only caught\nInvalidPathException around JsonPath#read. Path functions such as\nmin()/avg()/sum() throw JsonPathException on values they cannot handle,\ne.g. an empty or non-numeric array. It escaped and failed the job\ninstead of returning NULL.\n\nCatch JsonPathException, the parent of InvalidPathException and\nPathNotFoundException. Other exceptions still surface.\n\nGenerated-by: Claude Opus 5.5"
    },
    {
      "commit": "6e194b0167e9a70c94b776cf43c4c6459633ec4b",
      "tree": "55a67f4d9f0b29a24d9a8c180e4602cdd6d31894",
      "parents": [
        "362ce71ccd59af15d8cd4c12f7a6b2ef7c7fa1d4"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Thu Nov 05 21:58:36 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 21:58:36 2026 +0100"
      },
      "message": "[FLINK-41362][table] Reject VARIANT in primary key columns (#29801)\n\nChangelog normalization and upsert sinks key their state by the primary key and match keys by their binary encoding. One VARIANT value has many encodings, for example {\"a\":1,\"b\":2} and {\"b\":2,\"a\":1}, so an upsert source with a VARIANT primary key kept two rows for one key and dropped deletes.\n\nDefaultSchemaResolver now rejects a primary key column whose type is not comparable, the rule that GROUP BY and joins use since FLINK-40910.\n\nGenerated-by: Claude Code 2.1.318 (Claude Opus 5.5)"
    },
    {
      "commit": "362ce71ccd59af15d8cd4c12f7a6b2ef7c7fa1d4",
      "tree": "6e39cc63198ad4c74ffde80578f134fcadb3ee9b",
      "parents": [
        "17e379605e7f06a8dcdd9b67f31789d107f2d964"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Nov 05 20:22:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 20:22:24 2026 +0100"
      },
      "message": "[hotfix][ci] Build flink-shaded for e2e only once"
    },
    {
      "commit": "17e379605e7f06a8dcdd9b67f31789d107f2d964",
      "tree": "8c5ac2093bc13073700aa987fcf67c9b0b15d0b4",
      "parents": [
        "dd8c9d71b1565834254ac69032746fd462c03e2d"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Nov 05 13:13:40 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 13:13:40 2026 +0100"
      },
      "message": "[hotfix][ci] Do not run disk clean up if e2e is skipped"
    },
    {
      "commit": "dd8c9d71b1565834254ac69032746fd462c03e2d",
      "tree": "6d90182cec62f02fdfcdd6fb429f7b27eed2601e",
      "parents": [
        "d6addb7062b0274869b73b7550c4ab05b5d13830"
      ],
      "author": {
        "name": "Timo Theusner",
        "email": "32929874+Timm0@users.noreply.github.com",
        "time": "Thu Nov 05 11:07:51 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:07:51 2026 +0100"
      },
      "message": "[FLINK-41209][table] Run materialized table jobs in any TableEnvironment (#29659)\n\nBefore, materialized table refresh jobs could only be managed through the SQL Gateway. On a plain TableEnvironment, CREATE MATERIALIZED TABLE only wrote the catalog, DROP left the refresh job running, and SUSPEND, RESUME and REFRESH threw.\n\nNow every TableEnvironment creates, suspends, resumes, refreshes, alters and drops continuous-mode materialized tables on a session cluster. The SQL Gateway uses the same code path.\n\nBehavior changes:\n- CREATE MATERIALIZED TABLE in continuous mode fails without a session cluster target, so a default local TableEnvironment no longer writes only the catalog.\n- Full refresh mode still requires the SQL Gateway.\n- SQL Gateway errors for materialized table operations now have a TableException root cause instead of a SqlExecutionException.\n\nGenerated-by: Claude Code Opus 5.5"
    },
    {
      "commit": "d6addb7062b0274869b73b7550c4ab05b5d13830",
      "tree": "462c195f7fad041bb659ac0a7ed3863cd773394a",
      "parents": [
        "4baebd6bef6489811d81766d78386114f2d1bea0"
      ],
      "author": {
        "name": "Arvind Kandpal",
        "email": "arvind.kandpal@ksolves.com",
        "time": "Thu Nov 05 15:07:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 10:37:27 2026 +0100"
      },
      "message": "[hotfix][docs] Fix typos in Hive dialect docs\n\nFix misspellings in the SQL comments of the Hive dialect pages\n(create, alter, insert, set, show) for both English and Chinese docs.\nAlso fix \"ROW FROMAT\" to \"ROW FORMAT\" in the CREATE TABLE example,\nwhich made the example statement invalid.\n\nGenerated-by: Claude Code (Claude Opus 5.5)"
    },
    {
      "commit": "4baebd6bef6489811d81766d78386114f2d1bea0",
      "tree": "459793b4554819fd98dca3c7f309006ea80133c2",
      "parents": [
        "ec317b78fe33bbdaaa1385163fc1bbce38d39720"
      ],
      "author": {
        "name": "Arvind Kandpal",
        "email": "arvind.kandpal@ksolves.com",
        "time": "Thu Nov 05 14:41:31 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 10:11:31 2026 +0100"
      },
      "message": "[FLINK-37381][docs] Fix typo in `joins.md` document\n\nFix \"probe site\" to \"probe side\" in the event-time temporal join section.\nThe same fix was merged to release-1.20 in #26209 but never reached master.\n\nGenerated-by: Claude Code (Claude Opus 5.5)"
    },
    {
      "commit": "ec317b78fe33bbdaaa1385163fc1bbce38d39720",
      "tree": "724ade1c26bc6ea962fc2fa8fec48582b3e36248",
      "parents": [
        "4938de931bc12012f09c0de483f8e8dd97bea915"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Nov 05 09:55:30 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 09:55:30 2026 +0100"
      },
      "message": "[FLINK-40799][table] FlinkMarkChangeLogNormalizeProgram should cast to `RexCall` only in case of `AND`"
    },
    {
      "commit": "4938de931bc12012f09c0de483f8e8dd97bea915",
      "tree": "fb602fc4447948e4887027317a9beecb20493723",
      "parents": [
        "b70989e0c0efe4ce3ce49286384d59dea3428c88"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Nov 01 11:22:02 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@confluent.io",
        "time": "Thu Nov 05 08:19:58 2026 +0100"
      },
      "message": "[hotfix][table] Treat missing predicates in FilterPushDownSpec as empty\n"
    },
    {
      "commit": "b70989e0c0efe4ce3ce49286384d59dea3428c88",
      "tree": "b8f3f2a50c37fa1774dfe23ed2b4bd13786bc313",
      "parents": [
        "75f86b6c4aec6ea0c2eb3f6a00b1f565c188d281"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Nov 01 15:26:20 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@confluent.io",
        "time": "Thu Nov 05 08:19:58 2026 +0100"
      },
      "message": "[hotfix][table] Treat missing predicates in MetadataFilterPushDownSpec as empty\n"
    },
    {
      "commit": "75f86b6c4aec6ea0c2eb3f6a00b1f565c188d281",
      "tree": "85af6ddfc141b6ebdc913113d8657b76ee846e8a",
      "parents": [
        "e4d2b06ff33a6065ac2f1ba10d823ba30cdc0ad9"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Wed Nov 04 14:48:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 14:48:01 2026 +0100"
      },
      "message": "[FLINK-41331][ci] Move python header installation to flink-ci-docker"
    },
    {
      "commit": "e4d2b06ff33a6065ac2f1ba10d823ba30cdc0ad9",
      "tree": "d991404aaf99c05f3c2b18195e8d7768ae82420b",
      "parents": [
        "c59810c04f830f8d6d2d7a2fc77dcbd03b29e714"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 04 14:39:05 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 14:39:05 2026 +0100"
      },
      "message": "[FLINK-41330][table] Return NULL for a VARIANT array index outside the INT range (#29785)\n\nv[i] on an array VARIANT accepts any integer index, BIGINT included, but the generated code cast the index to int before the lookup. An index outside the INT range wrapped modulo 2^32 onto an existing element, so v[4294967297] returned the first element. A BIGINT index is now range-checked as a long before it is narrowed, and an index outside the INT range returns NULL like any other out-of-range index. Smaller integer index types keep the int lookup, since they cannot wrap onto a valid index.\n\nGenerated-by: Claude Code 2.1.318 (Claude Opus 5.5)"
    },
    {
      "commit": "c59810c04f830f8d6d2d7a2fc77dcbd03b29e714",
      "tree": "f239794b7c984482d7ae76290bbc9f867b520949",
      "parents": [
        "33a8167b49a17c6f45e0e3f864c9de859aa36430"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 03 16:42:39 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 04 14:38:00 2026 +0100"
      },
      "message": "[FLINK-41323][table-runtime] Add a binary encoding for a VARIANT column in the raw format\n\nThe raw format reads and writes a VARIANT column as a JSON document. JSON has no type for dates, times, timestamps, bytes or UUIDs, so a round trip turns those values into strings. Every message is also parsed on read and rendered on write.\n\nThe new option \u0027raw.variant-encoding\u0027 takes \u0027json\u0027, the default, or \u0027binary\u0027. With \u0027binary\u0027, a message holds the Variant binary encoding, the metadata followed by the value. The metadata states its own length, so the reader splits the message without a separator and wraps the two parts without parsing. Every Variant type survives the round trip. The bytes are only checked as far as needed to split them, so a malformed value fails when it is read. \u0027binary\u0027 ignores \u0027raw.charset\u0027.\n\nThe docs call the JSON round trip lossy, and recommend \u0027binary\u0027 for correctness and performance and \u0027json\u0027 for convenience.\n\nGenerated-by: Claude Code 2.1.316 (Claude Opus 5.5)\n"
    },
    {
      "commit": "33a8167b49a17c6f45e0e3f864c9de859aa36430",
      "tree": "1bf4d2802d27604b1896f4d081f2e7f1017d3717",
      "parents": [
        "2180171f1e2544f36f92cf694b05b6233f13ed15"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 03 11:44:38 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 04 14:38:00 2026 +0100"
      },
      "message": "[FLINK-41305][table-runtime] Support the raw line delimiter only for a string column and split UTF-8 on its bytes\n\nWith \u0027raw.line-delimiter\u0027, the raw format split a message of any column type. It decoded the whole message with \u0027raw.charset\u0027, split the text and encoded each part again before converting it. Decoding turned invalid UTF-8 into U+FFFD, so a STRING column lost bytes that it keeps without a delimiter, and a VARIANT column accepted bytes that PARSE_JSON rejects. Splitting the bytes of a number or a BYTES value is not meaningful either, because those bytes can contain the delimiter.\n\n\u0027raw.line-delimiter\u0027 is now supported only for a CHAR, VARCHAR or STRING column. Any other column type fails with a ValidationException when a query reads or writes the table. Newline-delimited JSON can be read through a STRING column and PARSE_JSON.\n\nIf \u0027raw.charset\u0027 is UTF-8, the message is split on the UTF-8 bytes of the delimiter and never decoded. In UTF-8 a delimiter\u0027s bytes can only match at a character boundary, so valid UTF-8 splits into the same parts as before. Other charsets keep the decoded split, because their delimiter bytes can match inside a character, as \u0027|\u0027 does in GBK. An empty delimiter keeps it too, because it splits between characters.\n\nGenerated-by: Claude Code 2.1.316 (Claude Opus 5.5)\n"
    },
    {
      "commit": "2180171f1e2544f36f92cf694b05b6233f13ed15",
      "tree": "730e86b89a42b04860e0a6c8f088cfb6cd00bd47",
      "parents": [
        "4cdc6d83a9db7f82a99610d6382bfb762bc65f7d"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 03 11:44:38 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 04 14:38:00 2026 +0100"
      },
      "message": "[FLINK-41305][table-runtime] Require UTF-8 for a VARIANT column in the raw format and parse it from bytes\n\nThe raw format decoded a VARIANT message with \u0027raw.charset\u0027 into a String and parsed that text. Invalid UTF-8 became U+FFFD and was stored, while PARSE_JSON rejects the same bytes.\n\nA VARIANT column now requires \u0027raw.charset\u0027 to be UTF-8, which RFC 8259 requires for JSON exchanged between systems. Another charset fails with a ValidationException when a query reads or writes the table. The converter parses the message bytes the way PARSE_JSON does, so invalid UTF-8 now fails the record. JSON in another charset can still be read through a STRING column and PARSE_JSON.\n\nGenerated-by: Claude Code 2.1.316 (Claude Opus 5.5)\n"
    },
    {
      "commit": "4cdc6d83a9db7f82a99610d6382bfb762bc65f7d",
      "tree": "08bad869823893c081a38081171c56582d4ca74d",
      "parents": [
        "ce373fe8b9e4131a0d756b739449e410318a74b5"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Wed Nov 04 08:52:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 08:52:24 2026 +0100"
      },
      "message": "[FLINK-41281][table] Allow CAST from a VARIANT timestamp to the other temporal types\n\n* [FLINK-41281][table] Allow CAST from a VARIANT timestamp to the other temporal types (#29690)\n\nA stored TIMESTAMP or TIMESTAMP_LTZ, including the nanosecond kinds, now casts to TIMESTAMP, TIMESTAMP_LTZ, DATE and TIME like a regular cast from its SQL type, using the session time zone and the same DateTimeUtils helpers. A stored DATE or TIME still casts only to its own type, since the other datetime types need a part the value does not have.\n\nA DATE target that gets another kind now fails with the standard VARIANT cast message instead of a raw VariantTypeException.\n\nGenerated-by: Claude Code 2.1.317 (Claude Opus 5.5)"
    },
    {
      "commit": "ce373fe8b9e4131a0d756b739449e410318a74b5",
      "tree": "3571ee49ef67e21f1953e4b27cc36122dcdb2f49",
      "parents": [
        "29655b36d7b64814df010c96b781060c97ad0c82"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Nov 03 22:42:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 22:42:33 2026 +0100"
      },
      "message": "[hotfix][ci] Remove obsolete libssl download for e2e netty-tcnative on Ubuntu 26.04"
    },
    {
      "commit": "29655b36d7b64814df010c96b781060c97ad0c82",
      "tree": "a3acda2b16780687d6d006bde3d96960bec02851",
      "parents": [
        "2ea9ccbc3e3436f320a1345794c0e3a3028f7f3b"
      ],
      "author": {
        "name": "Gabor Somogyi",
        "email": "gabor_somogyi2@apple.com",
        "time": "Tue Nov 03 18:39:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 23:09:26 2026 +0530"
      },
      "message": "[FLINK-41014][s3] Add an adaptive retry mode to the native S3 connector\n\n* [FLINK-41014][s3] Add an adaptive retry mode to the native S3 connector\n\n* [FLINK-41014][s3] Upgrade the AWS SDK of the native S3 connector to 2.57.2\n\nThe adaptive retry mode relies on the SDK\u0027s AdaptiveRetryStrategy, whose\nclient-side rate limiting was too aggressive (the allowed request rate\ncould end up far below what the object store serves) and unstable (it\nkept varying although the server side rate was constant). That is fixed\nby https://github.com/aws/aws-sdk-java-v2/pull/7197, first released in\nSDK 2.52.0, so the SDK is moved to the latest release, 2.57.2.\n\n- aws-crt is moved to 0.48.5, the version SDK 2.57.2 is built against.\n  download-crt-jars.sh resolves it from the SDK version and needs no\n  change apart from dropping an outdated example version.\n- Since SDK 2.46.0 every service client pulls in apache5-client, which\n  becomes the default HTTP client of clients built without an explicit\n  one (e.g. the STS client of the web identity credentials provider) and\n  would add org.apache.hc.* classes that the shade configuration does\n  not relocate. It is excluded to keep the Apache 4 based HTTP stack.\n  Moving to apache5-client, as apache-client is deprecated since SDK\n  2.54.15, is left for later.\n- NOTICE: the SDK versions are updated, and software.amazon.eventstream\n  is replaced by software.amazon.awssdk:eventstream because the SDK\n  dropped the former in 2.57.0 and ships its own module instead.\n\nGenerated-by: Claude Code 2.1.293 (Claude Sonnet 5.5)\n\n* [FLINK-41014][s3] Address review feedback on the adaptive retry mode\n\n- Shorten the description of s3.retry.mode and link the AWS SDK retry\n  guide. The README now says that the rate limiter exists per bucket and\n  TaskManager, as the factory builds one client provider per bucket.\n- Log the resolved retry mode at INFO when the client provider is built.\n- Test that the client of the provider is built with the strategy of the\n  configured mode and the configured number of attempts. The getters\n  checked so far did not notice a provider that ignores the mode.\n- Assert the attempts of a failed request with S3Exception#numAttempts\n  instead of the SDK\u0027s message, and drop the assertion on the message of\n  the circuit breaker, as the SDK may reword both.\n\nGenerated-by: Claude Code 2.1.293 (Claude Sonnet 5.5)"
    },
    {
      "commit": "2ea9ccbc3e3436f320a1345794c0e3a3028f7f3b",
      "tree": "72f1fa765c93d848409a0ef3c5694b5bedd267ab",
      "parents": [
        "18674692463d9237888b0bbd58a804cb414d6340"
      ],
      "author": {
        "name": "Joao Boto",
        "email": "boto@boto.pro",
        "time": "Tue Nov 03 16:32:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 21:02:01 2026 +0530"
      },
      "message": "[FLINK-40943][filesystems] Restore FileSink state written with flink-s3-fs-hadoop in flink-s3-fs-native"
    },
    {
      "commit": "18674692463d9237888b0bbd58a804cb414d6340",
      "tree": "d1bd6eb5a3dda6697cdb7384d380b791fece27f9",
      "parents": [
        "c48b1f1746dfd8d38858fd35468f5ab90797513d"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Mon Nov 02 09:33:01 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Tue Nov 03 11:31:22 2026 +0100"
      },
      "message": "[FLINK-41298][table] Document and test that JSON input is read only up to its first value\n\nPARSE_JSON, TRY_PARSE_JSON, the raw format\u0027s VARIANT column and the JSON functions read the first JSON value of their input and ignore what follows. PARSE_JSON(\u0027{\"a\":1}{\"a\":2}\u0027) returns {\"a\":1}, and \u0027{\"a\":1} xyz\u0027 IS JSON is TRUE. This is the intended behavior. It matches Spark\u0027s parse_json and Jackson\u0027s default, and rejecting the content would turn input that parses today into errors in running jobs.\n\nA test in BinaryVariantInternalBuilderTest pins it for PARSE_JSON and the raw format, and an IS JSON case pins it for the parser the JSON functions share. The docs say it for PARSE_JSON, TRY_PARSE_JSON, the JSON functions and the raw format.\n\nGenerated-by: Claude Code 2.1.316 (Claude Opus 5.5)\n"
    },
    {
      "commit": "c48b1f1746dfd8d38858fd35468f5ab90797513d",
      "tree": "1167e1edea48e827bbbaca9addc915834f06e395",
      "parents": [
        "891bd525d3faec2ef2fd4e253e7badfd79be6c6e"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Tue Nov 03 00:07:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 00:07:38 2026 +0100"
      },
      "message": "[hotfix][e2e] Submit all TPC-H queries in one SQL Client session in test_tpch.sh"
    },
    {
      "commit": "891bd525d3faec2ef2fd4e253e7badfd79be6c6e",
      "tree": "a77cbff299e30285f1efad08090ee0c2042616b8",
      "parents": [
        "10189e50f48c7607de54903664596c6df2255d18"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Oct 31 20:17:25 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 02 17:24:41 2026 +0100"
      },
      "message": "[hotfix][ci] Do not invoke lint or test for npm in compile_ci\n\nThis closes #29725\n"
    },
    {
      "commit": "10189e50f48c7607de54903664596c6df2255d18",
      "tree": "3fbe07b67482d43ae26c443a6ab83dafeaee93cd",
      "parents": [
        "8b445a18f8efe35926a892d50e7b7e7029289803"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Oct 31 18:37:54 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 02 17:24:31 2026 +0100"
      },
      "message": "[hotfix][ci] Use Redhat mirror only for certain groups\n"
    },
    {
      "commit": "8b445a18f8efe35926a892d50e7b7e7029289803",
      "tree": "a30945fc7dcf72b64c5663d9f96c567574dbb9a6",
      "parents": [
        "e77c6fe9b7c4a0a9890c15183f65829ec067cde3"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 02 14:18:28 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 14:18:28 2026 +0100"
      },
      "message": "[FLINK-41277][tests] `test_file_sink.sh` hangs in the second OpenSSL linkage run"
    },
    {
      "commit": "e77c6fe9b7c4a0a9890c15183f65829ec067cde3",
      "tree": "6401627aaac1ed8a401666aa437139d12ffb7bd7",
      "parents": [
        "a4c3507d49149958c264ea74fa0540e17275148b"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 02 12:35:34 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 12:35:34 2026 +0100"
      },
      "message": "[FLINK-41291] Bump snappy-java from 1.1.10.7 to 1.1.10.12 "
    },
    {
      "commit": "a4c3507d49149958c264ea74fa0540e17275148b",
      "tree": "f56ee414507b2325b439c7353b000a988011dced",
      "parents": [
        "b33e401ebe8328f44e1dd278d8feb972022ba917"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Nov 01 09:54:23 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 02 08:31:39 2026 +0100"
      },
      "message": "[hotfix][ci] Make scala byte code generation multithreaded\n\nThis closes #29727\n"
    },
    {
      "commit": "b33e401ebe8328f44e1dd278d8feb972022ba917",
      "tree": "87fa07d8d80c04199cc230715e8257f175f11bef",
      "parents": [
        "ac917e901a7e05c2db9047298eef7cc0c220a3fd"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sun Nov 01 09:42:28 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Mon Nov 02 08:30:53 2026 +0100"
      },
      "message": "[hotfix][ci] Skip maven source in compile_ci and test jobs\n"
    },
    {
      "commit": "ac917e901a7e05c2db9047298eef7cc0c220a3fd",
      "tree": "efc33a8d3166483f00a2271655b6639d795adb9a",
      "parents": [
        "b9d1ab937680733269bd9a17960cc1da29f4451b"
      ],
      "author": {
        "name": "Sangkyoon Nam",
        "email": "sangkyoon.nam@namsang.co",
        "time": "Mon Nov 02 15:06:47 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 14:06:47 2026 +0800"
      },
      "message": "[FLINK-41102][python] Flush pending keyed state operations on key switch without state cache (#29600)\n\nGenerated-by: Claude Code 2.1.308 (Claude Opus 5.5)"
    },
    {
      "commit": "b9d1ab937680733269bd9a17960cc1da29f4451b",
      "tree": "20c68d0882c7fca345dc813bc5aafe5b95d171aa",
      "parents": [
        "a5b015ffa72ae20cec82bde1a27811af9aa1a2f6"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Oct 29 09:10:03 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@confluent.io",
        "time": "Mon Nov 02 00:07:35 2026 +0100"
      },
      "message": "[FLINK-41275][e2e] Start SQL e2e test clusters once per class instead of per test\n"
    },
    {
      "commit": "a5b015ffa72ae20cec82bde1a27811af9aa1a2f6",
      "tree": "6a38002c956d0316940a47101b2c013879812662",
      "parents": [
        "0196674040113fa18b8731e17817bbb8f0db8732"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Oct 29 08:59:37 2026 +0100"
      },
      "committer": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@confluent.io",
        "time": "Mon Nov 02 00:07:35 2026 +0100"
      },
      "message": "[FLINK-41275][e2e] Start `FlinkContainers` once per class in `SqlClientITCase`\n"
    },
    {
      "commit": "0196674040113fa18b8731e17817bbb8f0db8732",
      "tree": "e59f3c7c7ae5ac6204b6925e356e72d5484fd7c2",
      "parents": [
        "cd4c2ab77b7109a64605dba18758f682a181bd2e"
      ],
      "author": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Fri Oct 30 13:10:59 2026 +0100"
      },
      "committer": {
        "name": "Ramin Gharib",
        "email": "ramingharib@gmail.com",
        "time": "Sun Nov 01 09:45:47 2026 +0100"
      },
      "message": "[FLINK-41280][table] Fix CAST of a TIMESTAMP before 1970 to DATE, TIME and a lower precision\n\nThree spots divided the epoch milliseconds with / or %, which round toward zero, so a TIMESTAMP before 1970 moved toward 1970: TimestampToDateCastRule for DATE, DateTimeUtils.timestampWithoutLocalZoneToTime for TIME, and DateTimeUtils.zeroLastDigits, which truncate() uses for a TIMESTAMP or TIMESTAMP_LTZ precision of 3 or less. Use floor division in all three. The other callers of zeroLastDigits pass the nano-of-millisecond or a TIME millis-of-day, which are never negative, so floor and truncation agree for them.\n\nGenerated-by: Claude Code 2.1.314 (Claude Opus 5.5)\n"
    },
    {
      "commit": "cd4c2ab77b7109a64605dba18758f682a181bd2e",
      "tree": "49c8371ba62653a247f5b1e29fcd91e77efbdbac",
      "parents": [
        "29a37c6e0438fd9ecdf39497d5c186b77329bae3"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Sat Oct 31 20:15:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 20:15:38 2026 +0100"
      },
      "message": "[hotfix][docs] Fix temporal table function examples (#29717)\n\ncreateTemporalTableFunction only takes expressions since 1.16, the join\nexamples referenced columns that do not exist, and the SQL example used\nthe rates alias without declaring it. Fixed in both the EN and ZH pages.\n\nCo-authored-by: novakov-alexey \u003c117519424+novakov-alexey@users.noreply.github.com\u003e\nGenerated-by: Claude Code (Claude Opus 5.5)"
    },
    {
      "commit": "29a37c6e0438fd9ecdf39497d5c186b77329bae3",
      "tree": "eb6a2d617576ec2cc9051578cb1a3e3303a01546",
      "parents": [
        "a7f4db7326a84cc7fbf075c99e2129364e493b0f"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Sat Oct 31 08:04:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 08:04:52 2026 +0100"
      },
      "message": "[hotfix][ci] Use `includeOnlyProperties` only for JGit"
    },
    {
      "commit": "a7f4db7326a84cc7fbf075c99e2129364e493b0f",
      "tree": "39d5f1e08d006bfa8dd333900e27953d96183c15",
      "parents": [
        "d542aeace2c784974a582ad657e4993e27d7fe45"
      ],
      "author": {
        "name": "Rakesh Kumar",
        "email": "82492543+rakeshkodathala@users.noreply.github.com",
        "time": "Fri Oct 30 13:45:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 21:45:58 2026 +0100"
      },
      "message": "[FLINK-34224][state] Fix mailbox handling in changelog storage metrics tests (#29560)\n\nGenerated-by: Codex (GPT-6)"
    },
    {
      "commit": "d542aeace2c784974a582ad657e4993e27d7fe45",
      "tree": "aa7a66d6097ea80c9c4d371c7484b8a33d5617de",
      "parents": [
        "f9252f2b039100149fb3d0ea4ce2986984361c24"
      ],
      "author": {
        "name": "bvarghese1",
        "email": "bvarghese@confluent.io",
        "time": "Tue Oct 27 20:01:00 2026 -0700"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Fri Oct 30 20:12:05 2026 +0100"
      },
      "message": "[FLINK-36725] Add CompiledPlan suppport for BatchExecRuntimeFilter\n\nGenerated-by: Claude Code (Sonnet)\n"
    },
    {
      "commit": "f9252f2b039100149fb3d0ea4ce2986984361c24",
      "tree": "f87f043f1b694760f01aef0208133d26ab6ba837",
      "parents": [
        "d8af3821bd9f62717a87c22aa84c146ad4bacfe3"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Fri Oct 30 19:44:07 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 19:44:07 2026 +0100"
      },
      "message": "[hotfix][ci] Use more threads for download during ci, also download dep POMs in parallel"
    },
    {
      "commit": "d8af3821bd9f62717a87c22aa84c146ad4bacfe3",
      "tree": "1e599496e7a53b0f26788a2582fbf1cde6b903b7",
      "parents": [
        "3d6cd0727bcfb9941ad45d61ea11cfc4c88c02f7"
      ],
      "author": {
        "name": "Purushottam Sinha",
        "email": "psinha@confluent.io",
        "time": "Thu Oct 29 21:35:56 2026 +0530"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Fri Oct 30 19:06:51 2026 +0100"
      },
      "message": "[FLINK-41247][queryable-state] Close server channels before shutting down the Netty event loops\n\nWith a quiet period of 0, Netty 4.2 can terminate an event loop without\nclosing its registered channels if the shutdown starts while the loop runs\ntasks (https://github.com/netty/netty/issues/17897). AbstractServerBase shut\nits event loop group down this way, which leaked the listening socket and\naccepted connections, and made AbstractServerTest.testPortRangeSuccess flaky.\n\nThe server now tracks its server channel and accepted channels in a\nChannelGroup and closes them before shutting down the event loop group.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "3d6cd0727bcfb9941ad45d61ea11cfc4c88c02f7",
      "tree": "a028cefde62ad0f414a42ec8202b5fd562d201d5",
      "parents": [
        "cc5f0540c6b259f545affff2a08b094439c9f5e1"
      ],
      "author": {
        "name": "Robin Varghese",
        "email": "robin.rvm@confluent.io",
        "time": "Fri Oct 23 10:38:42 2026 +0530"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Fri Oct 30 18:30:04 2026 +0100"
      },
      "message": "[FLINK-40886][runtime] Do not create the blob directories in the file count checks\n\ncheckFileCountForJob and checkFileCountForApplication got the job or application\ndirectory via getStorageLocation, which creates it. When a test checks the count while\nthe PermanentBlobCache cleanup task is deleting that directory, creating it can fail with\na FileAlreadyExistsException, as in BlobLibraryCacheManagerTest#verifyApplicationCleanup\nand BlobCacheCleanupTest#verifyJobCleanup. Build the directory path without creating it.\n\nGenerated-by: Claude Code 2.1.299 (Claude Opus 5.5)\n"
    },
    {
      "commit": "cc5f0540c6b259f545affff2a08b094439c9f5e1",
      "tree": "dbbaf669fb0289e280ecfe3ddafd9f3b7b5f5576",
      "parents": [
        "449a0b1ce6bd4b70b78c07f173ec3e33cadf93f2"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Fri Oct 30 18:21:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 18:21:11 2026 +0100"
      },
      "message": "[FLINK-41276][ci] Run the License task in parallel and regroup its log so the license checks still work"
    },
    {
      "commit": "449a0b1ce6bd4b70b78c07f173ec3e33cadf93f2",
      "tree": "f5ce219615e257f8b124f051712a2e44da89f56a",
      "parents": [
        "5a4f05bd645caf1eca56f44d723b6e787ee32822"
      ],
      "author": {
        "name": "Jim Hughes",
        "email": "jhughes@confluent.io",
        "time": "Fri Oct 30 12:02:42 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 17:02:42 2026 +0100"
      },
      "message": "[FLINK-40002][table-planner] Keep metadata column references out of physical filter push-down"
    },
    {
      "commit": "5a4f05bd645caf1eca56f44d723b6e787ee32822",
      "tree": "97422bfc866ae500dcd94f3800d9457aff89140b",
      "parents": [
        "4a0abed715192d6f6c18708aa9b15f41d525ef40"
      ],
      "author": {
        "name": "Rion Williams",
        "email": "riwilliams@confluent.io",
        "time": "Fri Oct 30 09:29:14 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 15:29:14 2026 +0100"
      },
      "message": "[FLINK-40842][table] Handle upsert inputs in the streaming semi/anti join \n\nThis fixes #29570."
    },
    {
      "commit": "4a0abed715192d6f6c18708aa9b15f41d525ef40",
      "tree": "e705d3972832c3428c02f76b6f0f67381d42af6f",
      "parents": [
        "f9abda3bbefae59ccd046382999ae12b20e981c0"
      ],
      "author": {
        "name": "Abhijeet Sharma",
        "email": "abhijeet.sharma@dominodatalab.com",
        "time": "Fri Oct 30 19:08:11 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 14:38:11 2026 +0100"
      },
      "message": "[FLINK-39330][runtime] Make CollectSinkFunction teardown null-safe (#28474)\n\nWhen a CollectSinkOperator is torn down before initializeState/open ran\n(e.g. during a JobManager failover), CollectSinkOperator#close() invokes\naccumulateFinalResults() on a sink function whose bufferLock (and\nserverThread) were never initialized, throwing a NullPointerException.\nThat NPE surfaces in the task\u0027s exception-handler path and is escalated\nto a fatal error that shuts down the TaskManager. In a single-TM\nMiniCluster the recovered job can then never reacquire slots, starves for\nthe full slot request timeout, and fails with NoResourceAvailableException.\n\nGuard accumulateFinalResults() and close() against being called before the\nfunction was opened so the failover teardown no longer raises an NPE.\n\nAdd tests for closing a function that was never opened, and for closing\none whose state was initialized but which was never opened; the latter\nalso pins down the resulting accumulator content (offset 0, null version,\nno results).\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n\nCo-authored-by: Abhijeet Sharma \u003cabhsharma@confluent.io\u003e"
    },
    {
      "commit": "f9abda3bbefae59ccd046382999ae12b20e981c0",
      "tree": "26a8631f6f3e151ba4d6d8cc848202a113b47971",
      "parents": [
        "f91e6224b83fd0250ce1bedfd9e2a0e7db7c637b"
      ],
      "author": {
        "name": "Piotr Nowojski",
        "email": "piotr.nowojski@gmail.com",
        "time": "Thu Oct 29 10:42:54 2026 +0100"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Fri Oct 30 11:18:02 2026 +0100"
      },
      "message": "[FLINK-41256][runtime] Don\u0027t set the current key in KeyedSortPartitionOperator\n\nKeyedSortPartitionOperator sorts records by key itself, so its input is not\nsorted by key, but it still runs on BatchExecutionKeyedStateBackend in BATCH\nexecution. Setting the current key for every record therefore failed on the\nfirst key change. The operator uses neither keyed state nor timers and only\nneeded the key to sort by, so it now takes the key from the key selector and\nno longer sets the current key.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "f91e6224b83fd0250ce1bedfd9e2a0e7db7c637b",
      "tree": "ac9966b54e9da96a32f3327fba1a2057d161c3f3",
      "parents": [
        "8d7da02879e8276f1052ddc4b9193bfde12fef00"
      ],
      "author": {
        "name": "Piotr Nowojski",
        "email": "piotr.nowojski@gmail.com",
        "time": "Wed Oct 28 19:20:34 2026 +0100"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Fri Oct 30 11:18:02 2026 +0100"
      },
      "message": "[FLINK-41256][runtime] Fail on operators changing the current key out of order in BATCH execution\n\nBatchExecutionKeyedStateBackend processes keys one at a time in sorted order:\nevery key change fires the outgoing key\u0027s timers and clears its state. Nothing\nprevented an operator from switching back to a key it had already left via\nsetCurrentKey, for example to process records it buffered for several keys.\nThat silently fired timers early and lost state: an operator that is correct\nin STREAMING produced wrong results in BATCH.\n\nNow that the keyed input path of key-sorted inputs changes keys via\nmoveToNextKey, make the batch backend\u0027s setCurrentKey throw for any key other\nthan the current one. Operators that buffer records across keys can override\nmoveToNextKey to flush before the key changes. Async state context switches\n(setCurrentKeyAndKeyGroup) are not checked yet.\n\nThe Python operators register the timers of the bundle they finish before the\nkey changes right away, while the previous key is still current, instead of\nswitching back to it later.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "8d7da02879e8276f1052ddc4b9193bfde12fef00",
      "tree": "309e414d2c16a4aa772a7768ae0bc8c14005c859",
      "parents": [
        "4f7d11117a25b4de5a9574ebfe62b61397a2cb68"
      ],
      "author": {
        "name": "Piotr Nowojski",
        "email": "piotr.nowojski@gmail.com",
        "time": "Wed Oct 28 19:21:54 2026 +0100"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Fri Oct 30 11:18:02 2026 +0100"
      },
      "message": "[FLINK-41256][runtime] Use moveToNextKey on the keyed input path of key-sorted inputs\n\nThe keyed input path of AbstractStreamOperator(V2) now changes the key via\nmoveToNextKey if the operator\u0027s keyed inputs are sorted by key, i.e. in BATCH\nexecution with sorted inputs, which is the only case where the input\nguarantees that keys never go back. Otherwise, it keeps calling setCurrentKey.\n\nWith sorted inputs, the input path no longer calls the operator\u0027s\nsetCurrentKey: operators that override it to act on input key changes must\noverride moveToNextKey too. Do so for the operators that do this:\n- The Python operators, which finish their bundle before the key changes in\n  BATCH execution and track the key for their timer service.\n- StateBootstrapWrapperOperator, which forwards key changes to the wrapped\n  operator.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "4f7d11117a25b4de5a9574ebfe62b61397a2cb68",
      "tree": "f579bcd467b9458ae64f1d031d0b7d7aa7684bf7",
      "parents": [
        "3e6471436eb6e1e3763345a79023a8583a1e1b23"
      ],
      "author": {
        "name": "Piotr Nowojski",
        "email": "piotr.nowojski@gmail.com",
        "time": "Wed Oct 28 19:20:34 2026 +0100"
      },
      "committer": {
        "name": "Piotr Nowojski",
        "email": "pnowojski@users.noreply.github.com",
        "time": "Fri Oct 30 11:18:02 2026 +0100"
      },
      "message": "[FLINK-41256][runtime] Add moveToNextKey to KeyContext and KeyedStateBackend\n\nBatchExecutionKeyedStateBackend processes keys one at a time in sorted order:\nevery key change fires the outgoing key\u0027s timers and clears its state, so the\ncurrent key may only advance with the sorted input. To tell such key changes\napart from an operator calling setCurrentKey itself, add\nKeyContext#moveToNextKey and KeyedStateBackend#moveToNextKey: move to the next\nkey of a key-sorted input, never back to a previous one. They default to\nsetCurrentKey, so only the batch backend implements them differently.\n\nAbstractStreamOperator(V2) forward moveToNextKey to the keyed state backend via\nStreamOperatorStateHandler. Nothing calls moveToNextKey yet, and the batch\nbackend\u0027s setCurrentKey still changes the key. Tests of the batch backend and\ntimer services now change keys via moveToNextKey.\n\nGenerated-by: Claude Code (Claude Opus 5.5)\n"
    },
    {
      "commit": "3e6471436eb6e1e3763345a79023a8583a1e1b23",
      "tree": "d84034c49c9bf92d1a540833ec5f9a755903f25c",
      "parents": [
        "5b04b40b373d05f8a1e727135dcdd03007923990"
      ],
      "author": {
        "name": "Rion Williams",
        "email": "riwilliams@confluent.io",
        "time": "Fri Oct 30 04:19:30 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 10:19:30 2026 +0100"
      },
      "message": "[FLINK-41260][table] Improve error msg by rejecting ORDER BY in ARRAY_AGG and JSON_ARRAYAGG during planning\n\nFixed in #29667"
    },
    {
      "commit": "5b04b40b373d05f8a1e727135dcdd03007923990",
      "tree": "48d6a083b3cd8fa42f3e044131e238563142f16a",
      "parents": [
        "379201f50d9c767a96c767d9d4863961d7c674c8"
      ],
      "author": {
        "name": "Timo Theusner",
        "email": "32929874+Timm0@users.noreply.github.com",
        "time": "Fri Oct 30 10:13:34 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 10:13:34 2026 +0100"
      },
      "message": "[FLINK-41211][table] Add listMaterializedTables for a given catalog and database\n\nFixed in #29661"
    },
    {
      "commit": "379201f50d9c767a96c767d9d4863961d7c674c8",
      "tree": "8ef82c8053b41a14cf088719748b36e4237faeb9",
      "parents": [
        "69285481f8d9fe3dc2e86456140582553e9ecce2"
      ],
      "author": {
        "name": "Sangkyoon Nam",
        "email": "sangkyoon.nam@namsang.co",
        "time": "Sat Oct 24 02:58:18 2026 +0900"
      },
      "committer": {
        "name": "Dian Fu",
        "email": "dianfu@apache.org",
        "time": "Fri Oct 30 15:54:40 2026 +0800"
      },
      "message": "[FLINK-41104][python] Return true from MapState.contains for keys mapped to None\n\nThis closes #29599.\n"
    },
    {
      "commit": "69285481f8d9fe3dc2e86456140582553e9ecce2",
      "tree": "675b3ae3f769a77cb175d26024fc4b49702ae03f",
      "parents": [
        "b6e38800e7209ff5c30344ae095b246dfb78ce4f"
      ],
      "author": {
        "name": "Sangkyoon Nam",
        "email": "sangkyoon.nam@namsang.co",
        "time": "Fri Oct 30 16:05:28 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 15:05:28 2026 +0800"
      },
      "message": "[FLINK-41106][python] Iterate key-value pairs in MapState.put_all (#29597)\n\nGenerated-by: Claude Code 2.1.308 (Claude Opus 5.5)"
    },
    {
      "commit": "b6e38800e7209ff5c30344ae095b246dfb78ce4f",
      "tree": "72f549de78db70809fdb93a7dd0c14d0da754985",
      "parents": [
        "22a8c01f0b84ac41cfff0a8a8524eb9ad76ed2bc"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Fri Oct 30 07:51:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 07:51:33 2026 +0100"
      },
      "message": "[hotfix][ci] Run python doc checks in parallel"
    },
    {
      "commit": "22a8c01f0b84ac41cfff0a8a8524eb9ad76ed2bc",
      "tree": "6328ba2bfa45f23946cfc1adb88703f2a8dba12b",
      "parents": [
        "3a4839487cc629741e37dac5c22da1e7bd3059ae"
      ],
      "author": {
        "name": "Sangkyoon Nam",
        "email": "sangkyoon.nam@namsang.co",
        "time": "Fri Oct 30 15:38:47 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 14:38:47 2026 +0800"
      },
      "message": "[FLINK-41228][python] Fix thread-mode conversion of arrays, lists and maps (#29630)"
    },
    {
      "commit": "3a4839487cc629741e37dac5c22da1e7bd3059ae",
      "tree": "9462f51e1b84fd0a1fb390e9937a4f7fc6a30f94",
      "parents": [
        "ebfb1b0c945d3a769e5c17184f198854b75df0f3"
      ],
      "author": {
        "name": "Matt Belle",
        "email": "github@sl.mattbelle.com",
        "time": "Fri Oct 30 02:03:32 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 14:03:32 2026 +0800"
      },
      "message": "[FLINK-40196][table] Remove IS_NOT_NAN in favor of NOT IS_NAN (#29639)\n\nIS_NOT_NAN only flips the result of IS_NAN. Unlike IS NOT NULL, it has\nno grammar-level counterpart in SQL, and other engines (Spark, BigQuery,\nTrino) only offer IS_NAN and rely on negation. Drop the dedicated\nfunction from the Java and Python Table APIs, the runtime, and the docs,\nand express it as not_(is_nan(...)) instead.\n\nGenerated-by: Claude Code 2.1.309"
    },
    {
      "commit": "ebfb1b0c945d3a769e5c17184f198854b75df0f3",
      "tree": "c87a6e7181b58aa2480421067f9097b7a495144f",
      "parents": [
        "72a46e1cfdc85c9411ed62a74619fd83ca5ba991"
      ],
      "author": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Fri Aug 28 14:26:22 2026 +0200"
      },
      "committer": {
        "name": "Martijn Visser",
        "email": "2989614+MartijnVisser@users.noreply.github.com",
        "time": "Thu Oct 29 23:08:17 2026 +0100"
      },
      "message": "[FLINK-40499][runtime] Emit ACTIVE before final MAX_WATERMARK at drain\n\nAt drain, advanceToEndOfEventTime() emitted Watermark.MAX_WATERMARK\ndirectly into the chain output, but RecordWriterOutput and ChainingOutput\ndrop watermarks while the last announced WatermarkStatus is IDLE, so a\nsource that went idle before finishing never delivered the final watermark\nand downstream event-time timers and windows did not fire. The drain path\nnow emits WatermarkStatus.ACTIVE first (deduplicated downstream when\nalready active). SourceOperatorStreamTask and SourceStreamTask skip the\nstatus for tasks deployed as finished, whose\nFinishedOnRestoreMainOperatorOutput rejects status events;\nMultipleInputStreamTask needs no such guard because its chained source\noutputs start ACTIVE and deduplicate the redundant status.\n\nGenerated-by: Claude Code (Fable 5)\nGenerated-by: Claude Code (Opus 5.5)\n"
    },
    {
      "commit": "72a46e1cfdc85c9411ed62a74619fd83ca5ba991",
      "tree": "3ac0b89c37bf753cfc73f562c8ad9d69613117bb",
      "parents": [
        "6477043008b4797c89798b925ccdeed4ed1e087b"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Oct 29 17:48:08 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 17:48:08 2026 +0100"
      },
      "message": "[hotfix][ci] Use blobless fetch in Azure single-branch checkout"
    },
    {
      "commit": "6477043008b4797c89798b925ccdeed4ed1e087b",
      "tree": "bba5a6370f4bc377b63742b1c906046c6ee735db",
      "parents": [
        "f8f70684560edc5bbd507fd2b76a74821a6e19d9"
      ],
      "author": {
        "name": "Sergey Nuyanzin",
        "email": "snuyanzin@gmail.com",
        "time": "Thu Oct 29 17:35:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 17:35:39 2026 +0100"
      },
      "message": "[FLINK-40958][core] `BinaryVariantInternalBuilder.appendVariantImpl` might lead to `StackOverflow`"
    }
  ],
  "next": "f8f70684560edc5bbd507fd2b76a74821a6e19d9"
}
