)]}'
{
  "log": [
    {
      "commit": "2448f5ac7d6a3bcbc61a7acd6edeeb400829ced1",
      "tree": "9eb0c0c63da1ca3b7f5be55ae856ebb15b9016bc",
      "parents": [
        "0e32466f7c99d9b0533d5deee52a25a045914447"
      ],
      "author": {
        "name": "Udit Jain",
        "email": "uditjainstjis@gmail.com",
        "time": "Sat Sep 19 04:02:17 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 15:32:17 2026 -0700"
      },
      "message": "Expand Beam Python heap dump with process/native memory stats (#39244) (#39466)\n\nThe heap dump (--experiments\u003denable_heap_dump) previously only contained the\nguppy Python-object heap. This adds a memory_stats() section so operators can\ntell whether memory is growing on the native (C) heap vs in Python objects,\nand can spot native-heap fragmentation:\n\n* Process memory: peak RSS (ru_maxrss, unit-corrected per platform) and, on\n  Linux, current RSS from /proc/self/statm.\n* Python allocations: sys.getallocatedblocks() and per-generation gc stats.\n* glibc malloc: mallinfo2() arena/hblkhd/uordblks/fordblks/keepcost plus a\n  fordblks/(arena+hblkhd) fragmentation ratio. mallinfo2 is used rather than\n  the legacy mallinfo, whose int fields overflow past 2GB and would misreport\n  exactly when memory is the concern.\n\nEvery collector degrades gracefully and never raises when a source is\nunavailable on the current platform. memory_stats() is emitted even when\nguppy is not importable.\n\nTests cover section presence, that stats are emitted without guppy, and that\nthe glibc section degrades gracefully on non-glibc platforms.\n\nGenerated-by: Claude (Anthropic AI assistant)\n\nCo-authored-by: uditjainstjis \u003cuditj668@gmail.com\u003e\nCo-authored-by: tvalentyn \u003ctvalentyn@users.noreply.github.com\u003e"
    },
    {
      "commit": "0e32466f7c99d9b0533d5deee52a25a045914447",
      "tree": "aacc27b838318e12b05cf0e03493ed759602f342",
      "parents": [
        "94482e8da035c47d842e50583a21968c64197742"
      ],
      "author": {
        "name": "Shunping Huang",
        "email": "shunping@google.com",
        "time": "Fri Sep 18 15:17:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 15:17:34 2026 -0400"
      },
      "message": "[Python] Make cloud storage dependencies optional on import in gcsio and s3io (#40178)\n\n* Add tests to reproduce first\n\n* Make GCP storage dependencies optional on import in gcsio\n\n* Fix BOTO3_INSTALLED detection in s3io when boto3 is missing\n\n* Reformat\n\n* Fix broken tests."
    },
    {
      "commit": "94482e8da035c47d842e50583a21968c64197742",
      "tree": "59fca2d067f74f14a13812568d2f40f7e6ddeb83",
      "parents": [
        "73bb356a40861f9e9ee17afce1b13659e3ecec9c"
      ],
      "author": {
        "name": "akshayjadiyanv",
        "email": "ajadiya@nvidia.com",
        "time": "Fri Sep 18 10:44:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 10:44:58 2026 -0700"
      },
      "message": "Re-enable the TensorRT integration test (#40139)\n\n* Re-enable the TensorRT integration test\n\nThe staged engines have been rebuilt with TensorRT 11 and uploaded alongside\nthe 2022 originals, so the tests can be pointed at them and the Dataflow\nintegration test can come back.\n\n- Point the engine paths at the _trt11 objects. The ONNX sources are\n  unchanged, since ONNX is not version locked.\n- Request install-nvidia-driver:5xx rather than an unversioned driver. The\n  test container is now TensorRT 11 on CUDA 13.3, which needs a 580 or newer\n  driver, and would otherwise fail at CUDA init rather than at engine load.\n  This matches what the vLLM integration tests already request.\n- Re-enable tensorRTtests in the py312 post-commit suite.\n\nFixes #33078\n\n* Keep the default NVIDIA driver and trigger the Python post-commit\n\nDataflow only accepts \u0027default\u0027 and \u0027latest\u0027 for install-nvidia-driver, and\nan unrecognized value makes the driver install fail, so the 5xx request this\nPR introduced would have broken the test rather than fixed it. Reverted to the\nunversioned default per review; \u0027latest\u0027 is the fallback if the default driver\nturns out to be too old for TensorRT 11 on CUDA 13.3.\n\nAlso bump .github/trigger_files/beam_PostCommit_Python.json so the Python\npost-commit runs against this PR. That suite reaches tensorRTtests through\npython312PostCommit -\u003e inferencePostCommitITPy312, which is the only way to\nexercise the rebuilt engines before merging.\n\n* Request the latest NVIDIA driver for the TensorRT integration test\n\nThe default driver is too old for the TensorRT 11 container, which is built on\nCUDA 13.3. The post-commit run failed before it ever reached the engine:\n\n  [TRT] [E] createInferRuntime: Error Code 6: API Usage Error\n        (CUDA initialization failure with error: 35)\n  Python (worker sdk-0-0) exited 4 times: signal: segmentation fault\n\nCUDA error 35 is CUDA_ERROR_INSUFFICIENT_DRIVER. Dataflow accepts only\n\u0027default\u0027 and \u0027latest\u0027 for this option, so \u0027latest\u0027 is the remaining choice."
    },
    {
      "commit": "73bb356a40861f9e9ee17afce1b13659e3ecec9c",
      "tree": "5f68ba609d99551c4ccfef51a78847900f2a6806",
      "parents": [
        "f865f12198ea40cdc626838ecb2cf54aed8b2c4a"
      ],
      "author": {
        "name": "Nicolas Gibanel",
        "email": "ngibanel@users.noreply.github.com",
        "time": "Fri Sep 18 10:13:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 10:13:48 2026 +0200"
      },
      "message": "SolaceIO: map message user properties (#40108)\n\n* SolaceIO: map message user properties\n\n* fixup: rather than trying stringify user properties, support all types except protocol specific ones (SDTMap and SDTStream)\n\n* fix: log.warning instead of log.info\n\n---------\n\nCo-authored-by: Nicolas Gibanel \u003cnicolas.gibanel@renault.com\u003e"
    },
    {
      "commit": "f865f12198ea40cdc626838ecb2cf54aed8b2c4a",
      "tree": "d9cb37adbe60ad1410640c68c18f9b2a183d76dc",
      "parents": [
        "bb692b6777184f19fb3a0b6167ff69c9a27c2deb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 18 01:55:45 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 01:55:45 2026 -0400"
      },
      "message": "Bump github.com/aws/aws-sdk-go-v2/credentials in /sdks (#40171)"
    },
    {
      "commit": "bb692b6777184f19fb3a0b6167ff69c9a27c2deb",
      "tree": "9c97528ae5695ca317d305d218c8b1e63e114ba1",
      "parents": [
        "7459a91bd0586bfa6c04139c8b6b783040039c5a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 18 01:54:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 01:54:17 2026 -0400"
      },
      "message": "Bump google.golang.org/api from 0.297.0 to 0.298.0 in /sdks (#40172)"
    },
    {
      "commit": "7459a91bd0586bfa6c04139c8b6b783040039c5a",
      "tree": "168066a5273c394b415f5a408767ec89b9992dad",
      "parents": [
        "d37560364756bface6fcffad8575e6c47cb91d5e"
      ],
      "author": {
        "name": "Nitin Ware",
        "email": "nitinware@gmail.com",
        "time": "Thu Sep 17 21:13:52 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 19:13:52 2026 -0700"
      },
      "message": "Improve docstrings for coder.RegisterCoder and NewCustomCoder (#40050)\n\nAdds explicit encoder/decoder function signature documentation to\ncoder.RegisterCoder, matching the signatures already documented on the\ntop-level beam.RegisterCoder wrapper. NewCustomCoder now points at the\nsame signature spec.\n\nAddresses #21930"
    },
    {
      "commit": "d37560364756bface6fcffad8575e6c47cb91d5e",
      "tree": "1d7fe54f44b4237df35e74bf7b29b64d67fa1d0b",
      "parents": [
        "0842cd3d077c0b31db173cf7d7c7545119696515"
      ],
      "author": {
        "name": "claudevdm",
        "email": "33973061+claudevdm@users.noreply.github.com",
        "time": "Thu Sep 17 13:42:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 13:42:21 2026 -0400"
      },
      "message": "Addfiles wiring provider (#40150)\n\n* AddFiles: wire the schema pre-pass behind a Wait.on gate (batch)\n\nAddFiles gets a ninth constructor argument, SchemaEvolutionConfig\n\nWith options set, the topology becomes\n\n  paths -\u003e ReadFooterSchema -\u003e CollectDistinctSchemas -\u003e CommitSchemaOnce\n                                                              |\n  paths -\u003e Wait.on(signal) -\u003e ConvertToDataFile -\u003e ... (unchanged)\n\nso no path reaches ConvertToDataFile until the schema commit has\nlanded.\n\n* IcebergAddFiles provider: schema_evolution_options, required_columns, incompatible_schema_handling, unverifiable_file_handling\n\nExposes the pre-pass through the iceberg_add_files SchemaTransform and\nBeam YAML:\n\n  - type: WriteToIceberg   (transform: IcebergAddFiles in YAML)\n    config:\n      table: db.sales\n      schema_evolution_options: [ALLOW_FIELD_ADDITION, ALLOW_TYPE_PROMOTION]\n      required_columns: [id]\n      incompatible_schema_handling: ROUTE_TO_ERRORS\n\n* trigger tests\n\n* simplify arg\n\n* tests\n\n* fixes\n\n* changes\n\n* comments, refresh only once per bundle"
    },
    {
      "commit": "0842cd3d077c0b31db173cf7d7c7545119696515",
      "tree": "85e75395d56e8ed10cc972bdde504d4e8db90ad6",
      "parents": [
        "8c25cc493bf6653ef357c48de21019ae85eab067"
      ],
      "author": {
        "name": "Elia Liu",
        "email": "Elialiu760317@outlook.com",
        "time": "Fri Sep 18 02:32:45 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 12:32:45 2026 -0400"
      },
      "message": "[Website] Add blog post on Python UnboundedSource and Watch (#40091)\n\n* [Website] Add GSoC 2026 Python streaming blog post\n\n* [Website] Focus streaming blog on practical API use\n\n* [Website] Align streaming blog with project report\n\n* [Website] Expand streaming blog design and validation\n\n* [Website] Address review on the GSoC streaming blog post\n\nName the Google Summer of Code project in the intro and add a motivation\nsection describing the gaps the two APIs fill. Describe what the\nMatchContinuously refactor changed about its per-file state. List a contact\nemail on the author entry.\n\n* [Website] Lead the blog motivation with the use cases\n\nSay what the two APIs let a Python developer build: a source for their own\nmessage queue or database change feed, and reusable polling for an input that\nkeeps growing. Credit the splittable DoFn support that already existed, and\nnote that checkpoint finalization is best effort.\n\n* [Website] State the motivation as the SDF learning curve\n\nAn unbounded splittable DoFn could already do this. UnboundedSource exists so\na source author does not have to learn restrictions, resumption, and watermark\nestimators first.\n\n* [Website] Clarify streaming blog motivation and API behavior\n\n* [Website] Scope the blog post by release version\n\nReaders track Beam releases, so name 2.77.0 instead of the master branch."
    },
    {
      "commit": "8c25cc493bf6653ef357c48de21019ae85eab067",
      "tree": "1585f1ff9b3771d63e5b90c40b0e0f157b128908",
      "parents": [
        "dd873a690b7b3382614714116dc93611bdb017d7",
        "b4dc40f9c876183f2496d48175e6132926d2e83a"
      ],
      "author": {
        "name": "Kenn Knowles",
        "email": "klk@google.com",
        "time": "Thu Sep 17 12:30:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 12:30:55 2026 -0400"
      },
      "message": "Merge pull request #40045: Remove nullness suppression in PTransformReplacements"
    },
    {
      "commit": "dd873a690b7b3382614714116dc93611bdb017d7",
      "tree": "639ec963305698fe52c64ce7d7957484675da40c",
      "parents": [
        "ab0ee639755b7908534882d8bf73b768b380e3dd"
      ],
      "author": {
        "name": "Ahmed Abualsaud",
        "email": "65791736+ahmedabu98@users.noreply.github.com",
        "time": "Thu Sep 17 16:54:05 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 08:54:05 2026 -0700"
      },
      "message": "[Iceberg CDC sink] Assign CDC keys (#40030)\n\n* assign cdc keys\n\n* assign cdc keys\n\n* sync\n\n* cleanup\n\n* address comments"
    },
    {
      "commit": "ab0ee639755b7908534882d8bf73b768b380e3dd",
      "tree": "0fe7a9334dc6229b442d4ce4bb830ba4ba6a7402",
      "parents": [
        "a1e128896fc33f01e4ad8eec9e0aae68918614e1"
      ],
      "author": {
        "name": "Radosław Stankiewicz",
        "email": "radoslaws@google.com",
        "time": "Thu Sep 17 17:46:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 17:46:52 2026 +0200"
      },
      "message": "[SolaceIO] refactor SolaceIO\u0027s writers finishBundle (#39612)\n\n* refactor SolaceIO\u0027s writers to block in @FinishBundle until all published persistent messages have received either an acknowledgment (ACK) or a negative acknowledgment (NACK/error) from the Solace broker, up to a timeout.\n\n* Transition to blocking queue\n\n* remove timer, introduce state variable to still force checkpoint.\n\n* throw exception if there are non ack-ed messages to avoid data loss"
    },
    {
      "commit": "a1e128896fc33f01e4ad8eec9e0aae68918614e1",
      "tree": "0dadcfc07af8ab0532219ae955be89fa3d0eb839",
      "parents": [
        "7b60339d86b8de685ce66833c0f868ad9362e2aa"
      ],
      "author": {
        "name": "Shunping Huang",
        "email": "shunping@google.com",
        "time": "Thu Sep 17 11:15:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 11:15:51 2026 -0400"
      },
      "message": "Add -PshowTests to print each test as it runs in gradle (#40147)\n\n* Add -PshowTests to print each test as it runs\n\nGradle logs only failed tests by default, and only failed/skipped at\n--info. A passing run therefore prints nothing but \"BUILD SUCCESSFUL\"\nand gives no indication of which tests --tests actually selected. That\nis easy to misread: a filter matching nothing, or a task restored from\nthe build cache, looks identical to a real run. PASSED is otherwise\nonly available at --debug, which is unusably noisy.\n\nWith the fix here, we can choose to print out tests even if they\nrun successfully, which avoids having to dig through\nbuild/test-results/**/TEST-*.xml. Without the property the build is\nunchanged.\n\n* Make per-test reporting the default, gate only test output"
    },
    {
      "commit": "7b60339d86b8de685ce66833c0f868ad9362e2aa",
      "tree": "73cd91031ba3f6c4941076e6b90c33884fc9ca74",
      "parents": [
        "706c76dc6132b156e47bd6ab9bcc3169c5ea928f"
      ],
      "author": {
        "name": "Kenn Knowles",
        "email": "klk@google.com",
        "time": "Thu Sep 17 10:59:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 16:59:38 2026 +0200"
      },
      "message": "Fix output bugs in FnApiDoFnRunner @OnTimer and @OnWindowExpiration (#40024)\n\nThe three argument providers each carry their own near-identical copy of\nthe output-receiver plumbing, and the @OnTimer and @OnWindowExpiration\ncopies had drifted from the working @ProcessElement one:\n\n- OnTimerContext.outputWindowedValue(tag, ...) had an empty body, so\n  tagged windowed output from @OnTimer was silently dropped.\n- OnTimerContext\u0027s tagged receivers passed no tag to\n  outputWindowedValue, so output to a side tag went to the main output.\n- The @OnTimer row receivers built from WindowedValues.builder(\n  currentElement) or called withValue() on a fresh builder. Neither\n  works during timer processing: currentElement is only set while\n  processing an element, and withValue() reads timestamp/window/pane\n  off the builder it is called on. Both now seed from currentTimer,\n  matching the @OnWindowExpiration equivalents.\n- OnWindowExpirationContext read currentElement.getValueKind() while\n  currentElement was null. Window expiration emits new records, so this\n  is ValueKind.INSERT.\n- OnWindowExpirationContext.timeDomain() returned currentTimeDomain,\n  which processOnWindowExpiration never sets. TimeDomain is not an\n  allowed @OnWindowExpiration parameter, so drop the override and let\n  BaseArgumentProvider reject it.\n- outputWindowedValue(tag, ...) skipped the unknown-tag check its\n  siblings perform, so a bad tag produced an NPE.\n- processTimer\u0027s finally did not clear causedByDrain, unlike\n  processOnWindowExpiration. Not observable today since every entry\n  point sets it before invoking user code, but the asymmetry is a trap.\n\nThe two inner Context classes are renamed to TimerContext and\nWindowExpirationContext so the fields holding them can drop their raw\ntypes; the enclosing providers are generic in K, and errorprone\u0027s\nSameNameButDifferent rejects the bare Context name.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "706c76dc6132b156e47bd6ab9bcc3169c5ea928f",
      "tree": "45de1522cc945464bf4e59397e731bf7fe6fd054",
      "parents": [
        "57801c9b2d2668a810bb19bebcbc9c90caa92345"
      ],
      "author": {
        "name": "claudevdm",
        "email": "33973061+claudevdm@users.noreply.github.com",
        "time": "Thu Sep 17 07:23:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 07:23:31 2026 -0400"
      },
      "message": "AddFiles: per-file coverage check and pinned-column enforcement in ConvertToDataFile (#40143)\n\n* AddFiles: per-file coverage check and pinned-column enforcement in ConvertToDataFile\n\nConvertToDataFile gains a SchemaEvolutionConfig.\nWith options set, every Parquet file is checked against the table\nbefore its DataFile is built, and every failure is one row on the\nerror output:\n\n1. FileSchemas.effective(footer) (convert plus tighten, shared with the\n   read side so both sides see the same schema) is computed. A footer\n   whose schema cannot be converted (unannotated repeated leaf, legacy\n   MAP_KEY_VALUE, uint64, ...) yields \"Could not read the file\u0027s\n   schema: \u003ccause\u003e\".\n2. Coverage: SchemaDelta.classify against the cached table. The\n   pre-pass commits the schema before paths reach this DoFn, so the\n   delta is expected to be empty. If it is not, the table is refreshed once\n    and classified again. A remaining delta is reported as \"Table schema does\n   not cover the file after refresh: \u003creason\u003e\", where the reason is the\n   delta\u0027s disallowed reason when the options forbid the change (the\n   ROUTE_TO_ERRORS path: this is where an incompatible file lands) or\n   \"changes not applied: ...\" when the change was allowed but somehow not committed\n   (defensive catch all).\n3. Pins: for each pinned column the table has, the file must contain\n   it and be provably null-free: the footer\u0027s own null count for the\n   column (FileSchemas.nullCount, summed over row groups) must be\n   present and zero. A missing count is a violation too: \"cannot prove\"\n   is not \"proven\".\n   Messages: \"Pinned required column X is absent from the file\" / \"has no null\n   count statistics in the file\" / \"has N null(s) in the file\".\n\nThe pin evidence deliberately does NOT come from the Metrics object\nbuilt for the DataFile: the table\u0027s write.metadata.metrics\nconfiguration shapes those (mode none, or the inferred-column cap on\nwide schemas, drops null counts entirely), and pin enforcement must\nnot be configurable away. Two tests pin this down under\nwrite.metadata.metrics.default\u003dnone: a null-free pinned file still\nregisters and a file with nulls is still caught.\n\nWith evolution enabled, a non-Parquet file (ORC, Avro) is routed to\nthe error output instead of registering unchecked: none of the checks\nabove can read those formats, and silently registering a file the\noptions promised to verify would be a hole in the guarantee. With\nevolution disabled they register exactly as before.\n\nSchemaEvolutionConfig.UnverifiableFileHandling relaxes exactly the\n\"cannot verify\" cases, never a failed check: REJECT (default) routes\nthem to the error output as above; ACCEPT registers a non-Parquet file\nunchecked, and a Parquet file whose footer has no null count for a\npinned column on trust (a writer with statistics disabled, or a pin\nunder a list or map, whose physical chunk path is never mapped). An\nabsent pinned column and a counted null stay violations under ACCEPT,\nand the pin walk continues past an unproven pin so a counted one still\nfails the file.\n\n* comments\n\n* spotbugs"
    },
    {
      "commit": "57801c9b2d2668a810bb19bebcbc9c90caa92345",
      "tree": "25056c80575054039e1f66dc01998991d9f0eab4",
      "parents": [
        "8e67bceb09a5e5ebf12a4b616854d19df302e106"
      ],
      "author": {
        "name": "Ahmed Abualsaud",
        "email": "65791736+ahmedabu98@users.noreply.github.com",
        "time": "Thu Sep 17 09:49:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 01:49:49 2026 -0700"
      },
      "message": "[Iceberg CDC sink] Write deltas transform (#40031)\n\n* write deltas\n\n* destination shard\n\n* cleanup\n\n* address comments\n\n* use serializable table"
    },
    {
      "commit": "8e67bceb09a5e5ebf12a4b616854d19df302e106",
      "tree": "67892e0d66d33be29c0a842cf4085b5bf12e7da4",
      "parents": [
        "9c805cc2facdeb21caf7fe3bf2a85e3a366f28d0"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 17 09:53:53 2026 +0400"
      },
      "committer": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 17 09:53:53 2026 +0400"
      },
      "message": "Update CHANGES.md for 2.78.0\n"
    },
    {
      "commit": "9c805cc2facdeb21caf7fe3bf2a85e3a366f28d0",
      "tree": "6484abf9c012ba97ceaf06dde6d737af4e4ef252",
      "parents": [
        "2bf8ba50bb243a16ea535c4423970f3595859aff"
      ],
      "author": {
        "name": "Amar3tto",
        "email": "actions@GitHub Actions 1028201023.local",
        "time": "Thu Sep 17 05:50:17 2026 +0000"
      },
      "committer": {
        "name": "Amar3tto",
        "email": "actions@GitHub Actions 1028201023.local",
        "time": "Thu Sep 17 05:50:17 2026 +0000"
      },
      "message": "Moving to 2.78.0-SNAPSHOT on master branch.\n"
    },
    {
      "commit": "2bf8ba50bb243a16ea535c4423970f3595859aff",
      "tree": "ad8dde4ed084ccc087aeec078ebf4ed3b95c4d9e",
      "parents": [
        "4cfde9e6cbde6e1be82bf79fbbdf76bdb39f50af",
        "b39a33a29ee9541560f51b44c19111fb7f52c75e"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev.akv@gmail.com",
        "time": "Thu Sep 17 09:45:17 2026 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 09:45:17 2026 +0400"
      },
      "message": "Merge pull request #40106 from Abacn/update-cap-matrix\n\nUpdate runner capability matrix"
    },
    {
      "commit": "4cfde9e6cbde6e1be82bf79fbbdf76bdb39f50af",
      "tree": "98d0cd1cab33b20bf965967d03bb41185e35c113",
      "parents": [
        "480a438cc8009a039dbab5fae5a355a9d2a45c47"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Wed Sep 16 19:31:54 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 19:31:54 2026 -0400"
      },
      "message": "[CI] Fix label race condition between LabelPrs and pr-bot-pr-updates (#40141)"
    },
    {
      "commit": "480a438cc8009a039dbab5fae5a355a9d2a45c47",
      "tree": "7a2585b9cefa564b38e3b7ef4b21677cb334cab4",
      "parents": [
        "876596e1afdca33d4462aee581507d56a3726b4a"
      ],
      "author": {
        "name": "Danny McCormick",
        "email": "dannymccormick@google.com",
        "time": "Wed Sep 16 21:03:35 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 17:03:35 2026 -0400"
      },
      "message": "Update Dataflow container versions to 20260916 (#40145)"
    },
    {
      "commit": "876596e1afdca33d4462aee581507d56a3726b4a",
      "tree": "f37bbe8e4db66b8c74fb3572d1cccc7d57a0525a",
      "parents": [
        "2bd256532b55f82196d3524c56ac1e2a42647da1"
      ],
      "author": {
        "name": "Michael Gruschke",
        "email": "56450401+MichaelGruschke@users.noreply.github.com",
        "time": "Wed Sep 16 20:00:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 14:00:09 2026 -0400"
      },
      "message": "Merge pull request #37731: RedisIO support PCollection of \u003cbyte[], byte[]\u003e "
    },
    {
      "commit": "2bd256532b55f82196d3524c56ac1e2a42647da1",
      "tree": "16aedbae25b4d5597b0d0a2e101896cb401081d1",
      "parents": [
        "405c084045ef304e2cd34c41e696d923da332b89"
      ],
      "author": {
        "name": "claudevdm",
        "email": "33973061+claudevdm@users.noreply.github.com",
        "time": "Wed Sep 16 12:01:40 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 12:01:40 2026 -0400"
      },
      "message": "AddFiles: create the table from the file schemas when it does not exist (#40124)\n\n* AddFiles: create the table from the file schemas when it does not exist\n\nBefore this change the pre-pass required an existing table. AddFiles\nwithout evolution creates a missing table from whichever file happens to\nreach ConvertToDataFile first; with the pre-pass we can do better, since\nevery schema of the window is known before anything is created.\n\nCreate path (CommitSchemaUnion.create), taken when loadTable throws\nNoSuchTableException:\n\n- The window\u0027s schemas are folded into one union on a scratch create\n  transaction that is never committed (the same staging loop as the\n  evolve path, so a schema conflicting with another is reported or\n  skipped per the handling, and the create is abandoned under\n  FAIL_PIPELINE before anything exists).\n- The real table is built directly from createdSchema(union, config):\n  every column optional at every level - one lucky file\u0027s declared or\n  proven required-ness must not become a table constraint that the next\n  file violates - except pinned paths and their ancestors, which are\n  created required. Creation is the schema-authoring moment; evolution\n  never tightens columns afterwards. A pin that no file schema carries\n  fails the create under FAIL_PIPELINE (later windows could only add\n  the column optional, so the pin would stay inert forever) and warns\n  under ROUTE_TO_ERRORS. The created table is born with a single schema\n  version.\n- Creation is not gated on any particular evolution option: the options\n  guard an existing table\u0027s schema, and there is none to guard yet.\n- Partition spec, sort order and table properties come from\n  TableCreation (the AddFiles constructor arguments), resolved against\n  the union, so a partition or sort column carried by any schema of the\n  window works; the name mapping is written in the same transaction.\n- Create race: two workers (or a concurrent non-evolution AddFiles) may\n  create the table at once. AlreadyExistsException joins\n  CommitFailedException in the retry, and the next attempt takes the\n  evolve path against the table the other party created.\n- Empty window against a missing table returns NO_TABLE (-1) and\n  creates nothing.\n\n* comments\n\n* test"
    },
    {
      "commit": "405c084045ef304e2cd34c41e696d923da332b89",
      "tree": "6d79827673526c5633c7a5d5e013f4de17504219",
      "parents": [
        "006cd7b98d5f481f8954b44b16ddbf76f407aede"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 16 10:32:18 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 10:32:18 2026 -0400"
      },
      "message": "Bump cloud.google.com/go/spanner from 1.95.0 to 1.95.1 in /sdks (#40136)"
    },
    {
      "commit": "006cd7b98d5f481f8954b44b16ddbf76f407aede",
      "tree": "ae9e0a60c2dac4aac74f41a349344fe91251ed8a",
      "parents": [
        "808376b1cae3732a2fcf6bed046ba0aa55e0815d"
      ],
      "author": {
        "name": "Abdelrahman Ibrahim",
        "email": "abdoibrahim1017@gmail.com",
        "time": "Wed Sep 16 17:17:08 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 10:17:08 2026 -0400"
      },
      "message": "normalize Spanner CDC (#40040)\n\n* normalize Spanner CDC\n\n* use hashset for spanner table filter"
    },
    {
      "commit": "808376b1cae3732a2fcf6bed046ba0aa55e0815d",
      "tree": "1a0ccc9ce213793a9c90ad6e4d9fa5e98f311c7e",
      "parents": [
        "333a7787e94117440c82226a3acc3436ef338ac2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 16 10:15:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 10:15:25 2026 -0400"
      },
      "message": "Bump github.com/aws/aws-sdk-go-v2/service/s3 in /sdks (#40138)\n\nBumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.111.0 to 1.113.1.\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.111.0...service/s3/v1.113.1)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/aws/aws-sdk-go-v2/service/s3\n  dependency-version: 1.113.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "333a7787e94117440c82226a3acc3436ef338ac2",
      "tree": "ca4646e154076593742979c627451e4336b6dd41",
      "parents": [
        "720fa2fcb5f8f08b7c0385de4279b0e3f871c74e"
      ],
      "author": {
        "name": "Jack McCluskey",
        "email": "34928439+jrmccluskey@users.noreply.github.com",
        "time": "Wed Sep 16 09:57:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 09:57:24 2026 -0400"
      },
      "message": "Implement Iceberg Side-Input Table Cache Integration with Fallback (#40080)\n\n* Implement Iceberg Side-Input Table Cache Integration with Fallback\n\n* review comments\n\n* clean up extra identifier round trip"
    },
    {
      "commit": "720fa2fcb5f8f08b7c0385de4279b0e3f871c74e",
      "tree": "404b5da870b60220889e000f8814c89becca7e76",
      "parents": [
        "bdf650a75b54ab76c01025622fb31f91420359d2"
      ],
      "author": {
        "name": "Shunping Huang",
        "email": "shunping@google.com",
        "time": "Wed Sep 16 09:48:50 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 09:48:50 2026 -0400"
      },
      "message": "Track ReplaceTokens values as processResources inputs (#40133)\n\nGradle treats the `tokens:` map passed to the ReplaceTokens content\nfilter as a filter argument, not a task input, so it affects neither\nthe up-to-date check nor the build cache key. The filtered sources\ncontain only unsubstituted placeholders and are byte identical\nregardless of what the tokens expand to, so nothing invalidates\nprocessResources when a token value changes.\n\nIn a shared checkout where build/ survives branch switches, the task\nstays UP-TO-DATE and the previous branch\u0027s substituted resource is\nleft behind. Switching master -\u003e a former release branch left\ndataflow.properties holding master\u0027s container version, so pipelines\nran against a wrong version of beam-master SDK harness. The same\nstaleness also poisons the build cache, since both branches compute\nthe same key for different correct outputs, so `clean` is not a\nreliable workaround.\n\nThis can be fixed by declaring the token map as an input property."
    },
    {
      "commit": "bdf650a75b54ab76c01025622fb31f91420359d2",
      "tree": "dfbde39733051be0747f1bbcaa6b254e53ffeadf",
      "parents": [
        "db9a625d7b56f12dceff7f2d1a0e849a96185f1e"
      ],
      "author": {
        "name": "akshayjadiyanv",
        "email": "ajadiya@nvidia.com",
        "time": "Tue Sep 15 13:55:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 13:55:51 2026 -0700"
      },
      "message": "Support TensorRT 10 and later in TensorRTEngineHandlerNumPy (#39922)\n\n* Fix stale metrics namespace assertion in TensorRT test\n\ntest_namespace has asserted \u0027RunInferenceTensorRT\u0027 since the original\nTensorRT commit (a8ca3057c0b). The handler was later changed to return\n\u0027BeamML_TensorRT\u0027 in f477b85f230, matching the BeamML_* prefix that every\nother model handler uses, but the test was never updated.\n\nThe mismatch went unnoticed because the TensorRT suite does not run in any\nactive CI job.\n\n* Support TensorRT 10 and later in TensorRTEngineHandlerNumPy\n\nTensorRT 10 removed the index based binding API that the handler was written\nagainst, so RunInference fails at engine load time with:\n\n  AttributeError: \u0027ICudaEngine\u0027 object has no attribute \u0027num_bindings\u0027\n\nSelect the API at runtime from the TensorRT major version rather than picking\none of them. TensorRT 8.x keeps the binding API and execute_async_v2, while\nTensorRT 10 and later use the name based tensor API and execute_async_v3. No\ncurrently supported GPU loses support.\n\nSupporting both versions is necessary rather than merely convenient. Dataflow\nnow offers Blackwell GPUs (RTX Pro 6000, compute capability 12.0) that no\nTensorRT 8.x release can target, while TensorRT 10 and later require compute\ncapability 7.5 or higher and so cannot target the Pascal and Volta GPUs that\nDataflow still offers. No single TensorRT version covers the whole range.\n\nAlso handle cuda-python 13, which removed the cuda.cuda alias in favour of\ncuda.bindings.driver, and move the test container to\nnvcr.io/nvidia/tensorrt:26.06-py3 (TensorRT 11.0, CUDA 13.3, Python 3.12).\nBecause that image is Python 3.12, the disabled tensorRTtests task moves from\nthe py310 suite to the py312 suite.\n\nThe Dataflow integration test stays disabled. Every .trt engine staged under\ngs://apache-beam-ml/models/ was built with TensorRT 8.x, and a serialized\nengine can only be read by the major version that built it. Rebuilt and\nverified replacements are available, but staging them needs write access to\nthat bucket; see the pull request description.\n\nVerified on a T4 GPU on GCE: 7/7 tests pass under TensorRT 11.0\n(nvcr.io/nvidia/tensorrt:26.06-py3) and 7/7 under TensorRT 8.6.1 (23.05-py3).\n\nAddresses #36306\nAddresses #33946\n\n* Pass host buffers to CUDA by address in TensorRT inference\n\n_default_tensorRT_inference_fn passed numpy arrays directly to\ncuMemcpyHtoDAsync and cuMemcpyDtoHAsync. An array holding exactly one\nelement is coerced to a scalar rather than being handled through the buffer\nprotocol, so the value is read as a null host pointer and the copy fails:\n\n  RuntimeError: Cuda Error: \u003cCUresult.CUDA_ERROR_INVALID_VALUE: 1\u003e\n\nPass the buffer address explicitly instead. This is not specific to a\nTensorRT or cuda-python version; it reproduces on cuda-python 12.9 and 13.3\nalike, and depends only on an input or output tensor having a single element.\n\nSingle element tensors are common. The ssd_mobilenet_v2_320x320_coco17_tpu-8\nmodel behind the tensorRTtests integration test has a num_detections output\nof shape (1, 1), so that test cannot pass without this fix. The existing unit\ntests did not catch it because every tensor in their models holds four\nelements.\n\nThe two copies of this loop in the test file are updated to match, so they do\nnot keep demonstrating the broken pattern.\n\n* Add a script to rebuild the staged TensorRT test engines\n\nA serialized TensorRT engine can only be deserialized by the same TensorRT\nmajor version and GPU architecture that built it, so the engines the tests\nload from gs://apache-beam-ml/models/ have to be rebuilt whenever the\nTensorRT version in tensor_rt.dockerfile changes, or the tensorRTtests task\nmoves to a different GPU. Until now that was undocumented manual work, which\nis part of why the staged engines went stale.\n\nbuild_test_engines.py rebuilds each of the three from the ONNX source already\nstaged beside it, so no new model sources are needed, and verifies the result\nby loading it back through TensorRTEngineHandlerNumPy: the two small engines\nagainst the exact values the unit tests assert, and the object detection\nengine against the same COCO images the integration test uses. Engines are\nonly uploaded once verification passes.\n\nThe script needs a GPU, so it cannot run as part of the test suite. README.md\ncovers how to run it and when it needs running.\n\n* Address review feedback on TensorRT version support\n\n- Cache _trt_major_version() and _import_cuda_driver() with\n  functools.lru_cache. _import_cuda_driver() is called from _assign_or_fail(),\n  so it ran on every CUDA call. Caching rather than resolving at import time\n  keeps the module importable without TensorRT, so jobs can still be submitted\n  from a machine that does not have it.\n- Pin torch in the TensorRT documentation rather than leaving it unpinned.\n- Trim the two CHANGES.md entries to the change itself.\n- Drop the TensorRT 8 branch from build_test_engines.py. The script only\n  rebuilds engines for the container the tests currently use, so it can\n  require TensorRT 10 or later. The equivalent branch in the handler stays,\n  since the handler does support both.\n\n* Require TensorRT 10 or later instead of supporting both APIs\n\nPer review discussion, bump the lower bound rather than carrying two code\npaths. TensorRT 8.x is from 2023 and keeping both APIs alive makes the handler\nharder to maintain for a shrinking set of users.\n\nRemoves _trt_major_version() and _network_creation_flags() and the branches\nthey fed, so engine setup always uses the name based tensor API and execution\nalways uses execute_async_v3. The numpy monkey patch that only existed for\nTensorRT 8.x goes with them.\n\n_check_trt_version() replaces them. It raises a clear error naming the\ninstalled version, rather than letting an unsupported TensorRT surface as an\nAttributeError deep inside engine setup. It stays lazy and cached so the\nmodule remains importable without TensorRT, which is what lets jobs be\nsubmitted from a machine that does not have it.\n\nCHANGES.md records this as a breaking change and asks anyone hard blocked by\nit to comment on #36306.\n\n* Check the TensorRT version before deserializing an engine\n\n_load_engine() deserialized first and only reached _check_trt_version() when\nTensorRTEngine was constructed, so loading a pre-built engine on an\nunsupported TensorRT failed with an opaque deserialization error instead of\nthe message naming the installed version. Loading a pre-built engine is the\nmost common path, and the one users hitting the new lower bound will take.\n\n* Update sdks/python/apache_beam/examples/inference/README.md\n\n* Update sdks/python/apache_beam/examples/inference/README.md\n\n---------\n\nCo-authored-by: tvalentyn \u003ctvalentyn@users.noreply.github.com\u003e"
    },
    {
      "commit": "db9a625d7b56f12dceff7f2d1a0e849a96185f1e",
      "tree": "ccb207c50f3269f8c5d882bdbfb59bc22bbd4136",
      "parents": [
        "40cf39576e2370ec44b31c29194da2e28463adf2"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Tue Sep 15 13:20:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 13:20:00 2026 -0400"
      },
      "message": "Revert \"Bump org.codehaus.plexus:plexus-xml from 3.0.2 to 4.2.0 (#39857)\" (#40131)\n\nThis reverts commit ac159f4f37f00f5d95a04f74bbcb8f721012ce6e."
    },
    {
      "commit": "40cf39576e2370ec44b31c29194da2e28463adf2",
      "tree": "de3d0992025c9b15fa88657d283166181453ec20",
      "parents": [
        "2a4f4c7fc5ef0c184fe1b5808724812322689113",
        "9d804536b80fd01adcba0d2fd58a6266513b6a6f"
      ],
      "author": {
        "name": "Kenn Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 13:11:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 13:11:34 2026 -0400"
      },
      "message": "Merge pull request #40132: Bump beam-master containers"
    },
    {
      "commit": "2a4f4c7fc5ef0c184fe1b5808724812322689113",
      "tree": "958dd57de7f9f349c75cd946330db810d0bedd3f",
      "parents": [
        "2b42a230a7280ee73c327d2c7136a0d2aa2db0e7"
      ],
      "author": {
        "name": "Chamikara Jayalath",
        "email": "chamikaramj@gmail.com",
        "time": "Tue Sep 15 09:12:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 09:12:21 2026 -0700"
      },
      "message": "Adds Delta Lake bounded CDC read support to Beam Python and YAML SDKs (#40085)"
    },
    {
      "commit": "2b42a230a7280ee73c327d2c7136a0d2aa2db0e7",
      "tree": "cbf34d44101741c74172a78c912791f3c03fe039",
      "parents": [
        "b55a0aba7ce5352e3f06239df6ebaee7922145d2"
      ],
      "author": {
        "name": "Tobias Kaymak",
        "email": "tobias.kaymak@gmail.com",
        "time": "Tue Sep 15 17:33:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 11:33:07 2026 -0400"
      },
      "message": "[Spark][#36841] Prune dead DStream helpers and add streaming lifecycle timeout test (#40130)"
    },
    {
      "commit": "b55a0aba7ce5352e3f06239df6ebaee7922145d2",
      "tree": "33efc6213c8c94f808f3879a2ba16de8296bde3a",
      "parents": [
        "42663f32154b454c8bc64dd312373b3138c84f1c"
      ],
      "author": {
        "name": "Jack McCluskey",
        "email": "34928439+jrmccluskey@users.noreply.github.com",
        "time": "Tue Sep 15 15:07:58 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 11:07:58 2026 -0400"
      },
      "message": "Warn on failed import of internal BQ client for easier debugging (#40082)"
    },
    {
      "commit": "42663f32154b454c8bc64dd312373b3138c84f1c",
      "tree": "8114b25ae492fad103558471919c10b63652551b",
      "parents": [
        "d297b647bd5d8fc8d21a71b44ceb2d0449de086d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 15 10:51:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:51:38 2026 -0400"
      },
      "message": "Bump github.com/aws/aws-sdk-go-v2/credentials in /sdks (#40116)\n\nBumps [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2) from 1.20.3 to 1.20.4.\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.20.3...service/mq/v1.20.4)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/aws/aws-sdk-go-v2/credentials\n  dependency-version: 1.20.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d297b647bd5d8fc8d21a71b44ceb2d0449de086d",
      "tree": "5455e61585b56fb18823407e68956397998a84da",
      "parents": [
        "dc508f69c1e41a7cf4ec0e5738be8fe13a9f2dac"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 15 10:51:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:51:10 2026 -0400"
      },
      "message": "Bump golang.org/x/net from 0.58.0 to 0.59.0 in /sdks (#40113)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.58.0 to 0.59.0.\n- [Commits](https://github.com/golang/net/compare/v0.58.0...v0.59.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n  dependency-version: 0.59.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9d804536b80fd01adcba0d2fd58a6266513b6a6f",
      "tree": "1d8ffe086dbad4fe8ffe8569e0f3bb7ed75a70bc",
      "parents": [
        "db8408e65eafe87eda865469e5620b6c934600c3"
      ],
      "author": {
        "name": "Kenneth Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 14:47:14 2026 +0000"
      },
      "committer": {
        "name": "Kenneth Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 14:47:14 2026 +0000"
      },
      "message": "Update Java legacy beam-master container to 20260911\n\nUpgrade dataflowLegacyContainerVersion from beam-master-20260731 to the\nlatest available Java legacy worker container image tag\nbeam-master-20260911.\n"
    },
    {
      "commit": "db8408e65eafe87eda865469e5620b6c934600c3",
      "tree": "5d96da993082dfbd153afc2568a6d29f5549215c",
      "parents": [
        "cc1a111307acd5c0a33f6674eca944fd93576707"
      ],
      "author": {
        "name": "Kenneth Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 14:46:20 2026 +0000"
      },
      "committer": {
        "name": "Kenneth Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 14:46:20 2026 +0000"
      },
      "message": "Update Java FnAPI beam-master container to 20260909\n\nUpgrade dataflowFnapiContainerVersion from beam-master-20260731 to the\nlatest available Java FnAPI SDK container image tag beam-master-20260909.\n"
    },
    {
      "commit": "cc1a111307acd5c0a33f6674eca944fd93576707",
      "tree": "61e11f0059e1b0605c7e8482864158bbd5f06224",
      "parents": [
        "2abc3fb11fcd18e8659018199a8e755d2b507b98"
      ],
      "author": {
        "name": "Kenneth Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 14:45:37 2026 +0000"
      },
      "committer": {
        "name": "Kenneth Knowles",
        "email": "klk@google.com",
        "time": "Tue Sep 15 14:45:37 2026 +0000"
      },
      "message": "Update Python FnAPI beam-master container to 20260909\n\nUpgrade BEAM_DEV_SDK_CONTAINER_TAG from beam-master-20260831 to the\nlatest available Python SDK container image tag beam-master-20260909.\n"
    },
    {
      "commit": "dc508f69c1e41a7cf4ec0e5738be8fe13a9f2dac",
      "tree": "cd18a51ae2d448b2fbe23eea2d0327c03129aecc",
      "parents": [
        "b240fd35dc0b25128842ed4d590c9ff00a84e4f5"
      ],
      "author": {
        "name": "scwhittle",
        "email": "scwhittle@users.noreply.github.com",
        "time": "Tue Sep 15 16:27:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:27:53 2026 -0400"
      },
      "message": "[Python SDK] Add support for named data streams to provide bundle isolation (#40061)\n\n* Initial support for named data streams for python sdk.\n\n* fix format and lint::\n\n* fix format and lint"
    },
    {
      "commit": "b240fd35dc0b25128842ed4d590c9ff00a84e4f5",
      "tree": "a36f60a5055d5d611615b2b93c1e594c7ef18564",
      "parents": [
        "a20b0f9e30121eefe0159e6a0cd9f1776ef506ed"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Wed Sep 16 00:10:47 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:10:47 2026 -0400"
      },
      "message": "Encode DynamoDB empty list and empty map attributes (#39731)\n\nAttributeValueCoder.encode selected the L and M branches with a size\ncheck. DynamoDB allows an empty L and an empty M, so both guards fail for one,\nnul() is null, and it reaches the terminal else and throws\nCoderException(\"Unknown Type\"). One empty list anywhere inside an item\nmakes the whole item unencodable, since MAP_ATTRIBUTE_CODER re-enters\nthis coder for every child.\n\nhasL()/hasM() are the SDK\u0027s way of separating \"unset\" from \"set but\nempty\", which is exactly the distinction the size check lost.\n\nThe ss/ns/bs guards look identical and are deliberately left alone:\nDynamoDB rejects empty sets, so an empty one there is not a value worth\npreserving.\n\nThe decode side already handles both -- case l: and case m: delegate to\nListCoder/MapCoder, which round-trip empties."
    },
    {
      "commit": "a20b0f9e30121eefe0159e6a0cd9f1776ef506ed",
      "tree": "832f52c8303a53066fb86dd165398d6d0e0c1c41",
      "parents": [
        "fd93d7951240c0e433f7370725e86c74c9652e50"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 15 10:06:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:06:43 2026 -0400"
      },
      "message": "Bump cloud.google.com/go/bigtable from 1.56.0 to 1.57.0 in /sdks (#40126)\n\nBumps [cloud.google.com/go/bigtable](https://github.com/googleapis/google-cloud-go) from 1.56.0 to 1.57.0.\n- [Release notes](https://github.com/googleapis/google-cloud-go/releases)\n- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)\n- [Commits](https://github.com/googleapis/google-cloud-go/compare/compute/v1.56.0...compute/v1.57.0)\n\n---\nupdated-dependencies:\n- dependency-name: cloud.google.com/go/bigtable\n  dependency-version: 1.57.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fd93d7951240c0e433f7370725e86c74c9652e50",
      "tree": "dee1ea2699792716fddc57c17d5d0a7300d8329d",
      "parents": [
        "a7b24f3d5779e881368da3c42b4c011334c7bd74"
      ],
      "author": {
        "name": "Elia Liu",
        "email": "Elialiu760317@outlook.com",
        "time": "Wed Sep 16 00:03:18 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:03:18 2026 -0400"
      },
      "message": "[Spark] Retain the last watermark of a source with no update in the batch (#39823)\n\n* [Spark] Retain the last watermark of a source with no update in the batch\n\nGlobalWatermarkHolder.advance() rebuilt the watermark map from only the\nsources with a queued update and overwrote the stored map, so an idle\nsource lost its last watermark and consuming stages jumped ahead of it.\ncomputeNewWatermarks now merges the updates over the stored map. A\nsource whose high watermark reached the end of time is done and holds\nnothing back, so it is not retained. Retained sources can disagree on\nthe synchronized processing time, so SparkTimerInternals takes the\nslowest one instead of asserting equality. Two CreateStream test\nscripts now advance their watermarks to infinity like the other\nscripts; with retention their stalled watermarks would otherwise hold\nthe global watermark back until the test timeout.\n\n* [Spark] Trigger the Spark ValidatesRunner and portable streaming postcommits\n\n* [Spark] State why a completed source is dropped from the watermarks\n\nA completed high watermark does not imply a completed low watermark, and SparkTimerInternals takes the slowest low watermark across sources."
    },
    {
      "commit": "a7b24f3d5779e881368da3c42b4c011334c7bd74",
      "tree": "beac4b8f792eb1a82a7ba127012a8c88d44ac3c3",
      "parents": [
        "f9064240c35d6dcedb3eba409ce2ce2715e7db18"
      ],
      "author": {
        "name": "Chamikara Jayalath",
        "email": "chamikaramj@gmail.com",
        "time": "Mon Sep 14 12:48:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 12:48:34 2026 -0700"
      },
      "message": "Revert \"Revert \"[Experimental] Use zstd compression in Docker ...\n\n... builds\"\" (#40121)"
    },
    {
      "commit": "f9064240c35d6dcedb3eba409ce2ce2715e7db18",
      "tree": "0c75675b6ae85d6a927da198671f622b1b7e0cca",
      "parents": [
        "544e40f5a89aef7cdb9891801ac687d022ff5478"
      ],
      "author": {
        "name": "Ahmed Abualsaud",
        "email": "65791736+ahmedabu98@users.noreply.github.com",
        "time": "Mon Sep 14 20:28:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 11:28:26 2026 -0700"
      },
      "message": "[Iceberg CDC sink] table setup (#40007)\n\n* table setup\n\n* spotless\n\n* add unit tests for CommitToken and PartitionShardPlan"
    },
    {
      "commit": "544e40f5a89aef7cdb9891801ac687d022ff5478",
      "tree": "534ed652aeb75e6790be01445ccb57feb5d0d5c0",
      "parents": [
        "8f02ad3868d2c5498bcc7d147a1ae318a861679d"
      ],
      "author": {
        "name": "Ahmed Abualsaud",
        "email": "65791736+ahmedabu98@users.noreply.github.com",
        "time": "Mon Sep 14 20:15:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 20:15:16 2026 +0200"
      },
      "message": "[Iceberg CDC sink] Split late data and create commit windows (#40006)\n\n* split late data and create commit windows\n\n* address comments"
    },
    {
      "commit": "8f02ad3868d2c5498bcc7d147a1ae318a861679d",
      "tree": "d6794831810552425d5eb334344dabb99bafbefb",
      "parents": [
        "830d7b63ab5d7dac48485dd5dd0f1e0b7d135b0b"
      ],
      "author": {
        "name": "claudevdm",
        "email": "33973061+claudevdm@users.noreply.github.com",
        "time": "Mon Sep 14 13:48:09 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 13:48:09 2026 -0400"
      },
      "message": "AddFiles: CommitSchemaUnion  (#40104)\n\n* AddFiles: CommitSchemaUnion applies a window\u0027s file schemas to the table in one transaction\n\nThe commit side of the pre-pass, for an existing table (creation comes\nnext). commit(catalog, tableId, schemas, config, handling, committer)\ntakes the distinct canonical file schemas of one window, most common\nfirst, and returns the table\u0027s schema id afterwards.\n\nOne attempt, in order:\n\n1. Fresh load of the table; the classification below must run against\n   the current schema, never a cached one.\n2. SchemaDelta.classify for each schema. Empty deltas are skipped;\n   deltas the config does not allow go to the incompatible list with\n   their reason; the rest are accepted.\n3. Staging, most common first, on one Transaction: per accepted schema\n   one unionByNameWith plus an explicit makeColumnOptional for every\n   path the delta reported as an absent required column. Two accepted\n   schemas can still conflict with each other (file A says score is\n   long, file B says string; each is fine against the table alone).\n   That only surfaces while staging and poisons the transaction, so the\n   offender is moved to the incompatible list (\"conflicts with another\n   file schema in the same window\") and the transaction is rebuilt\n   without it. Most common first means the majority wins such a tie.\n4. relaxNewRequiredFields: the union adds top-level columns as optional\n   but keeps the file\u0027s optionality for fields inside a struct it just\n   added, so one file\u0027s luck would impose required nested columns on\n   every future file. Every field new in this transaction is made\n   optional at every level, except pinned paths and fields under lists\n   and maps (which the union already handles). Found by fuzzing;\n   testFieldsInsideAnAddedStructAreOptional covers it.\n5. Name mapping repair: if the table\u0027s schema.name-mapping.default is\n   absent, malformed or does not cover the staged schema, it is\n   regenerated (NameMappingUtils.regenerate, preserving custom names by\n   field id). Zero-copy files carry no field ids, so a column missing\n   from the mapping is unreadable in every registered file; a missing\n   mapping alone is reason enough to commit even when the schema did\n   not change.\n6. Incompatible schemas are reported: under FAIL_PIPELINE an\n   IncompatibleSchemaException listing every one (schema, file count,\n   reason) is thrown before anything is committed; under\n   ROUTE_TO_ERRORS they are logged and the rest proceeds (their files\n   fail the per-file coverage check later, with the same reason).\n7. Single commit through the injectable Committer, then refresh.\n   Nothing is committed when nothing was staged.\n\nRetry: CommitFailedException (a concurrent writer moved the table\nbetween load and commit) restarts the whole attempt from step 1, up to\nMAX_ATTEMPTS (5); classification is redone against the new state rather\nthan replayed, since the concurrent change may have made a delta empty\nor incompatible. A persistent failure propagates.\n\nWorked example: table {id required long, name required string}; window\nschemas A x5 {id, name optional, score long}, B x1 {id, score string}\nunder all options. A: relax name, add score. B: absent name\n(relaxation), score conflicts with A\u0027s addition while staging, so B is\nincompatible. FAIL_PIPELINE: exception, table untouched. ROUTE_TO_ERRORS:\none commit with name optional and score optional long; B\u0027s file will be\nrouted to errors at registration.\n\nThe tests use a local HadoopCatalog and check metadata versions to\nprove \"nothing committed\" claims, and inject a Committer that fails\nonce to exercise the retry path.\n\n* comments"
    },
    {
      "commit": "830d7b63ab5d7dac48485dd5dd0f1e0b7d135b0b",
      "tree": "fb6099a4fea73a761e4062efd3ccff250b3fbf38",
      "parents": [
        "898b70e3061c28f1cb5682b72da9a8636c3ee62b"
      ],
      "author": {
        "name": "Tobias Kaymak",
        "email": "tobias.kaymak@gmail.com",
        "time": "Mon Sep 14 17:13:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 11:13:18 2026 -0400"
      },
      "message": "[Spark] Make cancel() cancel the Spark jobs and stop only a session the runner created (#40103)\n\n* [Spark] Make cancel() cancel the Spark jobs and stop only a session the runner created\n\nFixes #40101."
    },
    {
      "commit": "898b70e3061c28f1cb5682b72da9a8636c3ee62b",
      "tree": "5dfd9cfcec0896f4de3c75b4e6326996c56c574a",
      "parents": [
        "fbe8ddf6c6493f5efb4058121de26867521cb077"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 14 08:18:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 08:18:48 2026 -0400"
      },
      "message": "Bump cloud.google.com/go/storage from 1.67.0 to 1.67.1 in /sdks (#40118)\n\nBumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.67.0 to 1.67.1.\n- [Release notes](https://github.com/googleapis/google-cloud-go/releases)\n- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)\n- [Commits](https://github.com/googleapis/google-cloud-go/compare/compute/v1.67.0...storage/v1.67.1)\n\n---\nupdated-dependencies:\n- dependency-name: cloud.google.com/go/storage\n  dependency-version: 1.67.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fbe8ddf6c6493f5efb4058121de26867521cb077",
      "tree": "2a20e5952a16a8e060671a5b4ea5ecbcb8443da4",
      "parents": [
        "7bf5506f9a2bc7eb5fe2107aab561b54a2f84623"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 14 08:16:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 08:16:35 2026 -0400"
      },
      "message": "Bump zizmorcore/zizmor-action from 0.6.3 to 0.6.4 (#40117)\n\nBumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.6.3 to 0.6.4.\n- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)\n- [Commits](https://github.com/zizmorcore/zizmor-action/compare/70fb788f84895a7701f5643d103d587e460b5c99...cc914d7f3750a2d13d75c7f184a1060aa0e9d482)\n\n---\nupdated-dependencies:\n- dependency-name: zizmorcore/zizmor-action\n  dependency-version: 0.6.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7bf5506f9a2bc7eb5fe2107aab561b54a2f84623",
      "tree": "330abd0bd0156f60b09da17e53b67e9b6c0dee7c",
      "parents": [
        "90ecd1600e3eeea835827ccea64e770780bbed52"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 14 08:15:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 08:15:44 2026 -0400"
      },
      "message": "Bump github/codeql-action from 4.37.9 to 4.38.0 (#40115)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.37.9 to 4.38.0.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.37.9...v4.38.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.38.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "90ecd1600e3eeea835827ccea64e770780bbed52",
      "tree": "52fac82b40d865c234dc344b220be6e2bcc06e99",
      "parents": [
        "07c1a1350b81dc02b2749a5e832ede6ed70d40e1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 14 08:13:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 08:13:35 2026 -0400"
      },
      "message": "Bump go.mongodb.org/mongo-driver from 1.17.9 to 1.17.10 in /sdks (#40111)\n\nBumps [go.mongodb.org/mongo-driver](https://github.com/mongodb/mongo-go-driver) from 1.17.9 to 1.17.10.\n- [Release notes](https://github.com/mongodb/mongo-go-driver/releases)\n- [Commits](https://github.com/mongodb/mongo-go-driver/compare/v1.17.9...v1.17.10)\n\n---\nupdated-dependencies:\n- dependency-name: go.mongodb.org/mongo-driver\n  dependency-version: 1.17.10\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "07c1a1350b81dc02b2749a5e832ede6ed70d40e1",
      "tree": "fadb64a767a3c062426f6ee3eb1ce1f5ac466b30",
      "parents": [
        "790468a6591cd1dea07365c2294f7de07918e723",
        "60205a1a12ac0fcd4935d3a2d9aeeedf50ffd6bc"
      ],
      "author": {
        "name": "Jan Lukavský",
        "email": "je.ik@seznam.cz",
        "time": "Mon Sep 14 14:05:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 14:05:54 2026 +0200"
      },
      "message": "Merge pull request #40068: Kafka Streams runner: add a flush marker payload variant"
    },
    {
      "commit": "790468a6591cd1dea07365c2294f7de07918e723",
      "tree": "819b6b5a0003741d0a964348f515dc69887bffc1",
      "parents": [
        "4621a0b229f31e94a819eb5c28bc9b95435f4524"
      ],
      "author": {
        "name": "Andrew Crites",
        "email": "crites@google.com",
        "time": "Sat Sep 12 19:04:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 19:04:13 2026 -0700"
      },
      "message": "Ensure 0 backlog is sent when finishing processing restrictions. (#40102)"
    },
    {
      "commit": "4621a0b229f31e94a819eb5c28bc9b95435f4524",
      "tree": "a89f4bcc8477521b302de9212d2ae82032e88f23",
      "parents": [
        "12126d8942aaf848030c478b4c6a28c6af861c66"
      ],
      "author": {
        "name": "Chamikara Jayalath",
        "email": "chamikaramj@gmail.com",
        "time": "Sat Sep 12 09:08:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 09:08:54 2026 -0700"
      },
      "message": "Revert \"[Experimental] Use zstd compression in Docker builds\" (#40105)"
    },
    {
      "commit": "b39a33a29ee9541560f51b44c19111fb7f52c75e",
      "tree": "64f311e890fd983a6222d223251c564b25be3c43",
      "parents": [
        "f5ba5fa5910dca23f4b150ec11cee94c081b1a43"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Fri Sep 11 19:03:33 2026 -0400"
      },
      "committer": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Fri Sep 11 19:30:17 2026 -0400"
      },
      "message": "Update runner capability matrix\n"
    },
    {
      "commit": "12126d8942aaf848030c478b4c6a28c6af861c66",
      "tree": "8664d5707d9a5cebfb2e1826a765755be5be803e",
      "parents": [
        "f8221572fb20b18eda0530bca9f117eb36c68e1d"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Fri Sep 11 18:09:37 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 18:09:37 2026 -0400"
      },
      "message": "[CI] Stop infinite reviewer reassignment, batch state commits, clean up stale state (#40096)\n\n* [CI] Stop infinite reviewer reassignment, batch state commits, and clean up stale state\n\n* Stop infinite reviewer reassignment loops: label with \"awaiting triage\" if a PR has both \"reassigned-reviewers\" and \"Next Action: Reviewers\", and review started \u003e60 days ago.\n\n* Track initial reviewer assignment timestamp (reviewersAssignedAt) in persistent PR state, falling back to PR creation time for legacy PRs.\n\n* Skip reviewer assignment for PRs labeled \"awaiting triage\" across new PR processing and daily reminder workflows.\n\n* shallow fetch pr-state branch to accelerate the workflow run\n\n* Incrementally prune closed PR state files (oldest 100 per daily run) from the pr-bot-state branch.\n\n* Document core PR bot logic in scripts/ci/pr-bot/README.md."
    },
    {
      "commit": "f8221572fb20b18eda0530bca9f117eb36c68e1d",
      "tree": "d5d904252501178885d7e44a99e50c1d8ef10f43",
      "parents": [
        "8b3370c310d55f65488e7ec1983f3e0b4c5a5751"
      ],
      "author": {
        "name": "Tobias Kaymak",
        "email": "tobias.kaymak@gmail.com",
        "time": "Fri Sep 11 20:42:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 14:42:24 2026 -0400"
      },
      "message": "[Spark][#36841] Translate stateless streaming pipelines on the Spark 4 runner (#40090)\n\n* [Spark 4] Translate stateless streaming pipelines\n\nMakes the DataSourceV2 unbounded source from #39971 reachable. The Spark 4\nmodule overrides PipelineTranslatorFactory and dispatches streaming pipelines\nto PipelineTranslatorStreaming, which translates unbounded reads and reuses\nthe batch translators for stateless single output ParDo, Window.Assign,\nFlatten and Reshuffle. GroupByKey, Combine.perKey, stateful ParDo, ParDo with\nside inputs or additional outputs, Impulse and bounded reads fail at\ntranslation, the batch translators for them persist or collect the Dataset,\nwhich Spark rejects on a streaming plan."
    },
    {
      "commit": "8b3370c310d55f65488e7ec1983f3e0b4c5a5751",
      "tree": "3670dea17f5e07e5963c44c3600e7044d463e933",
      "parents": [
        "4581141552a85f53949911f85b9ccfe6acf2a447"
      ],
      "author": {
        "name": "claudevdm",
        "email": "33973061+claudevdm@users.noreply.github.com",
        "time": "Fri Sep 11 12:58:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 12:58:00 2026 -0400"
      },
      "message": "AddFiles: SchemaDelta classifies what a file schema needs from the table (#40062)\n\n* AddFiles: SchemaDelta classifies what a file schema needs from the table\n\nThe classifier behind the options. Iceberg\u0027s unionByNameWith has no\nknobs: it adds, relaxes and promotes in one go, or throws. To honour\nALLOW_FIELD_ADDITION / ALLOW_FIELD_RELAXATION / ALLOW_TYPE_PROMOTION\nseparately, SchemaDelta.classify(table, fileSchema) applies the union\non a throwaway UpdateSchema (apply(), never commit()), diffs the result\nagainst the current table schema, and labels every change:\n\n- FIELD_ADDITION: a field id present only after the union.\n- FIELD_RELAXATION: required before, optional after; or a required\n  table column with no counterpart in the file at all (see below).\n- TYPE_PROMOTION: same id, wider primitive type after.\n- CONFLICT: anything else. The union throwing (ValidationException or\n  IllegalArgumentException, e.g. int column vs string file column, a\n  dotted or empty file column name), a field removed by the union\n  (cannot happen with unionByName but is refused rather than trusted),\n  a struct where a primitive was, a doc string or default changing, a\n  promotion Iceberg would not allow (TypeUtil.isPromotionAllowed guard,\n  so a bad union result is never staged as a \"promotion\").\n\nThe diff is keyed by field id and walks fields attribute by attribute\n(name, optionality, type kind, doc, defaults), so an attribute the union\nsilently changes is reported rather than committed unnoticed. Changes\nare listed in a deterministic order (unquoted path) with quoted names in\nmessages so a reviewer can find them in the schema.\n\nAbsence rule: a required table column that the file lacks is a\nFIELD_RELAXATION, not a pass. Registering such a file would put nulls\nin a required column for every reader; the fix is to relax the column\nexplicitly (the commit side stages makeColumnOptional for exactly the\npaths absentRequiredPaths() reports). The walk descends through structs\nwhose parent is present, through list elements and map values (paths\nuse \"element\" and \"value\", which makeColumnOptional accepts); an absent\nstruct is itself the relaxation, its children are not listed\nseparately; map keys are required by definition and skipped.\n\nPins: Change.allowedBy(config) refuses a relaxation of a pinned path\neven when ALLOW_FIELD_RELAXATION is set, and disallowedReason(config)\nnames it, so \"id is pinned\" shows up as the reason rather than a\ngeneric \"relaxation not allowed\".\n\n* move pins to class\n\n* pins\n\n* docstring\n\n* Fix docstring\n\n* tests\n\n* split file\n\n* split\n\n* map keys\n\n* track test"
    },
    {
      "commit": "4581141552a85f53949911f85b9ccfe6acf2a447",
      "tree": "1dd2bdf0ecc56a1752b35080d76ca1b37241a8f5",
      "parents": [
        "2e7e9d371e8da0286cce358c18fc07fa3cf556da"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev.akv@gmail.com",
        "time": "Fri Sep 11 20:20:49 2026 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 12:20:49 2026 -0400"
      },
      "message": "Bump google-cloud-bigtable to 2.44.0 (#40100)"
    },
    {
      "commit": "2e7e9d371e8da0286cce358c18fc07fa3cf556da",
      "tree": "e9bce88dc9dff047155a7cb477ddfb7a34c8b62d",
      "parents": [
        "7b6413fd5efc5ad863d5aae5d9e57beac8478de7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 11 08:16:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 08:16:56 2026 -0400"
      },
      "message": "Bump org.nosphere.apache.rat from 0.8.2 to 0.9.0 (#40097)\n\nBumps org.nosphere.apache.rat from 0.8.2 to 0.9.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.nosphere.apache.rat\n  dependency-version: 0.9.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "60205a1a12ac0fcd4935d3a2d9aeeedf50ffd6bc",
      "tree": "84a46b61ed4a268b365fcb5b8cfba0c96b6cc6f7",
      "parents": [
        "a0adae53810427b1f35b11233ddc869ac7fc6297"
      ],
      "author": {
        "name": "junaiddshaukat",
        "email": "junaiddshaukat@gmail.com",
        "time": "Fri Sep 11 12:29:47 2026 +0500"
      },
      "committer": {
        "name": "junaiddshaukat",
        "email": "junaiddshaukat@gmail.com",
        "time": "Fri Sep 11 12:29:47 2026 +0500"
      },
      "message": "Carry target partitions in the flush marker, and shorten the comments\n\nThe marker now carries the partitions it is addressed to rather than the\nproducing partition and count. The producer knows all three numbers, so it\ncan compute the targets itself, and the consumer never needed the source\ninformation. That also removes the empty case from the wire: a producer with\nnothing to address emits no marker at all.\n"
    },
    {
      "commit": "7b6413fd5efc5ad863d5aae5d9e57beac8478de7",
      "tree": "a2564b81e8517a009911046d88086506ee4fa4f3",
      "parents": [
        "634bfe71a97747c1728e4fa1620dceb5edc94eed"
      ],
      "author": {
        "name": "Mukesh Bhandarkar",
        "email": "31272819+mukeshbhandarkar@users.noreply.github.com",
        "time": "Fri Sep 11 04:22:53 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 15:52:53 2026 -0700"
      },
      "message": "Document Python BigQuery CDC record format (#40021)"
    },
    {
      "commit": "634bfe71a97747c1728e4fa1620dceb5edc94eed",
      "tree": "cdc2e7a90160dfee7d63fa227f1bb322f3c51d74",
      "parents": [
        "f5ba5fa5910dca23f4b150ec11cee94c081b1a43"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Thu Sep 10 14:04:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 14:04:58 2026 -0400"
      },
      "message": "Revert \"[Python] Propagate WriteToFiles finalization failures (#39993)\" (#40095)"
    },
    {
      "commit": "f5ba5fa5910dca23f4b150ec11cee94c081b1a43",
      "tree": "c24d9d908fab51330a3d7bbf1b0dfc3f90de84e8",
      "parents": [
        "3a41d9e6ff9253cd8a42079550f8a20e014acfce"
      ],
      "author": {
        "name": "Bruno Volpato",
        "email": "brunocvcunha@gmail.com",
        "time": "Thu Sep 10 10:12:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 10:12:14 2026 -0400"
      },
      "message": "[Python] Propagate WriteToFiles finalization failures (#39993)\n\n* [Python] Propagate WriteToFiles finalization failures\n\n* [Python] Link file finalization fix in changelog"
    },
    {
      "commit": "3a41d9e6ff9253cd8a42079550f8a20e014acfce",
      "tree": "cdc2e7a90160dfee7d63fa227f1bb322f3c51d74",
      "parents": [
        "33dc11cdba4cbb2569edd57d2620c8ce16e78f10",
        "5e11fcfbe2ced0c616b9a1ac76b615fa32eefb19"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev.akv@gmail.com",
        "time": "Thu Sep 10 18:00:27 2026 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 18:00:27 2026 +0400"
      },
      "message": "Merge pull request #40092 from apache/fix-java-postcommit\n\nFix PostCommit Java workflow"
    },
    {
      "commit": "33dc11cdba4cbb2569edd57d2620c8ce16e78f10",
      "tree": "3e6f9350ef446caab535dcaefc8055934c4e7ca4",
      "parents": [
        "a7b702ed5ba23973fcbcb529ffb4fc9510aadac1"
      ],
      "author": {
        "name": "Tobias Kaymak",
        "email": "tobias.kaymak@gmail.com",
        "time": "Thu Sep 10 15:42:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 09:42:18 2026 -0400"
      },
      "message": "[CI] Restore Java 17 in the Spark Versions PreCommit so the Spark 4 module runs (#40093)\n\n#39205 replaced the two version Java setup with Java 11 only. The job still\npasses -Pjava17Home\u003d$JAVA_HOME_17_X64, which is empty without the second\nJDK, and the build plugin disables every task of runners/spark/4 when its\nJDK is missing. Since then :runners:spark:4:build has been SKIPPED in every\nrun and the module\u0027s tests have not executed in CI."
    },
    {
      "commit": "a7b702ed5ba23973fcbcb529ffb4fc9510aadac1",
      "tree": "262393969802e6f19c8db77f774ed809f705ac1d",
      "parents": [
        "39d3b6567b1b9b8fb51f589d2ea485a5577d47d3"
      ],
      "author": {
        "name": "Bruno Volpato",
        "email": "brunocvcunha@gmail.com",
        "time": "Thu Sep 10 09:27:09 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 09:27:09 2026 -0400"
      },
      "message": "[Python] Deflake anomaly transform tests (#39669)\n\n* [Python] Deflake anomaly transform tests\n\n* Test ensemble model state without input ordering assumptions"
    },
    {
      "commit": "5e11fcfbe2ced0c616b9a1ac76b615fa32eefb19",
      "tree": "83be41f0c4b20dacf8d6804babc418a57ee99ae4",
      "parents": [
        "d847c2e32727a5c850b7c6b1551e97e329f1cab5"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 10 16:08:15 2026 +0400"
      },
      "committer": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 10 16:08:15 2026 +0400"
      },
      "message": "Change expected values order\n"
    },
    {
      "commit": "39d3b6567b1b9b8fb51f589d2ea485a5577d47d3",
      "tree": "c6692c26298026a59c83d375a3722ff5295df85b",
      "parents": [
        "5f09311030e911bf9bf823852311941fd0189247"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 10 07:33:29 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 07:33:29 2026 -0400"
      },
      "message": "Bump js-yaml from 3.15.1 to 3.15.2 in /website/www (#40088)\n\nBumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.15.1 to 3.15.2.\n- [Changelog](https://github.com/nodeca/js-yaml/blob/3.15.2/CHANGELOG.md)\n- [Commits](https://github.com/nodeca/js-yaml/compare/3.15.1...3.15.2)\n\n---\nupdated-dependencies:\n- dependency-name: js-yaml\n  dependency-version: 3.15.2\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "5f09311030e911bf9bf823852311941fd0189247",
      "tree": "d32f1894e645c210479150502ae5361135ce6782",
      "parents": [
        "1276b1a062a10163c8c4e4810f757fdd9713641e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 10 07:32:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 07:32:13 2026 -0400"
      },
      "message": "Bump google.golang.org/grpc from 1.82.1 to 1.83.2 in /playground/backend (#40089)\n\nBumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.82.1 to 1.83.2.\n- [Release notes](https://github.com/grpc/grpc-go/releases)\n- [Commits](https://github.com/grpc/grpc-go/compare/v1.82.1...v1.83.2)\n\n---\nupdated-dependencies:\n- dependency-name: google.golang.org/grpc\n  dependency-version: 1.83.2\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d847c2e32727a5c850b7c6b1551e97e329f1cab5",
      "tree": "8c1bdd71ffcc1bcdacbb79ea8b00965f9fe62302",
      "parents": [
        "56915c264c88a9f911617a3750ea6e8f69912bce"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 10 13:43:47 2026 +0400"
      },
      "committer": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 10 13:43:47 2026 +0400"
      },
      "message": "Normalize output\n"
    },
    {
      "commit": "56915c264c88a9f911617a3750ea6e8f69912bce",
      "tree": "e5d99664f160c71a0ba8d45e54ac69aa9d075d93",
      "parents": [
        "1276b1a062a10163c8c4e4810f757fdd9713641e"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 10 12:30:33 2026 +0400"
      },
      "committer": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev@akvelon.com",
        "time": "Thu Sep 10 12:30:33 2026 +0400"
      },
      "message": "Add direct runner\n"
    },
    {
      "commit": "1276b1a062a10163c8c4e4810f757fdd9713641e",
      "tree": "b6bdd557cef051ca83675c75c9bbdc3679037957",
      "parents": [
        "81b9188f40919ae617a77db616c17543b2d9bb9e"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Wed Sep 09 21:43:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 21:43:43 2026 -0400"
      },
      "message": "[CI] Setup reviewers for IcebergIO and DeltaIO (#40083)\n\n* Setup reviewers for IcebergIO and DeltaIO\n\n* Update reviewer for BUILD as well\n\n* Add chamikaramj as a reviewer for yaml"
    },
    {
      "commit": "81b9188f40919ae617a77db616c17543b2d9bb9e",
      "tree": "222a53e06d3e5608299d1cb359096a83a3f8769a",
      "parents": [
        "7898e7d1e487676dff12e649ad9e6a523aac4c64"
      ],
      "author": {
        "name": "Chamikara Jayalath",
        "email": "chamikaramj@gmail.com",
        "time": "Wed Sep 09 09:36:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 09:36:15 2026 -0700"
      },
      "message": "Adds Delta Lake read support to Beam SQL (#39950)"
    },
    {
      "commit": "7898e7d1e487676dff12e649ad9e6a523aac4c64",
      "tree": "b4ae9ce40428606ee73fe74d3773d80cdbc19b9b",
      "parents": [
        "6a3f229466de13dfed209f125c9255c224014071"
      ],
      "author": {
        "name": "Abdelrahman Ibrahim",
        "email": "abdoibrahim1017@gmail.com",
        "time": "Wed Sep 09 17:58:07 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 10:58:07 2026 -0400"
      },
      "message": "require google-cloud-bigtable 2.44 (#40042)"
    },
    {
      "commit": "6a3f229466de13dfed209f125c9255c224014071",
      "tree": "d37a027d63a44f30da3adc2f6b960ca307b6fb85",
      "parents": [
        "5236934e57ab7e831da9405b5a64400c8a54de15",
        "294456a9ebb4937c617633ff04a68044b09bec3b"
      ],
      "author": {
        "name": "Kenn Knowles",
        "email": "klk@google.com",
        "time": "Wed Sep 09 10:40:33 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 10:40:33 2026 -0400"
      },
      "message": "Merge pull request #40044: Remove nullness suppression in TaggedPValue"
    },
    {
      "commit": "5236934e57ab7e831da9405b5a64400c8a54de15",
      "tree": "0309ec461a127bed3df79e20562cf8bc6f7041bb",
      "parents": [
        "d11883d91a66277ed0a29b24daa998412a2fbd45",
        "9db91a086460582071ef6c85854a67f4463ccf73"
      ],
      "author": {
        "name": "Kenn Knowles",
        "email": "klk@google.com",
        "time": "Wed Sep 09 10:39:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 10:39:59 2026 -0400"
      },
      "message": "Merge pull request #40046: Remove nullness suppression in TimestampCombiner"
    },
    {
      "commit": "d11883d91a66277ed0a29b24daa998412a2fbd45",
      "tree": "cf79765360ecc7e167ddb46a4d5bec545baa3614",
      "parents": [
        "84713ce61e18bd448c739efb6a515de3ee66976d"
      ],
      "author": {
        "name": "Makoto Nagai",
        "email": "i05nagai@gmail.com",
        "time": "Wed Sep 09 23:26:55 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 10:26:55 2026 -0400"
      },
      "message": "Add biquery query parameter option to support parametrize query (#39389)\n\n* Add biquery query parameters to support parametrize query\n\n* Use encoding/gob for encode/decode to preserve type information\n\nQueryParameter and QueryParameterValue contains filed with any type.\nConverting go types to encoding/json lose type informations some of go\ntypes.\nThe registered types are ones supported in the implementation in\nparamValue method.\nhttps://github.com/googleapis/google-cloud-go/blob/bigquery/v1.79.0/bigquery/params.go#L434\n\n* Update coder.go\n\nFix typo\n\n---------\n\nCo-authored-by: Jack McCluskey \u003c34928439+jrmccluskey@users.noreply.github.com\u003e"
    },
    {
      "commit": "84713ce61e18bd448c739efb6a515de3ee66976d",
      "tree": "7f6e0c2145e75ce77021ba7206fb09a76e5e381d",
      "parents": [
        "961807b88e6531bb230ab400e6fe9f2688982518"
      ],
      "author": {
        "name": "Jack McCluskey",
        "email": "34928439+jrmccluskey@users.noreply.github.com",
        "time": "Wed Sep 09 09:36:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 09:36:59 2026 -0400"
      },
      "message": "Implement Iceberg Table Metadata Driver transform (#39883)\n\n* Implement Iceberg Table Metadata Driver transform\n\n* Rename unit test for clarity\n\n* Uncap cache size by default\n\n* Handle NoSuchTableExceptions in CatalogPollingDoFn\n\n* unbounded global window support\n\n* Streamline test definitions\n\n* add schema evolution test case, route through Deduplicate to re-emit panes\n\n* Add reshuffle and polling buckets\n\n* Side input tests + multiple tables, fix breakages\n\n* Explicit exception handling, time-based metadata merging\n\n* lastSeen impl\n\n* Extra cleanup\n\n* change eviction behavior for missing signals, streamline last seen logic\n\n* Clean up unused constructors\n\n* Clean up asView overloads\n\n* spotless"
    },
    {
      "commit": "961807b88e6531bb230ab400e6fe9f2688982518",
      "tree": "e6e861a6a4a57bebb1d5720b3e5a7ccfbc1e8738",
      "parents": [
        "47127f84d09967573fb37c6b9f23fed2d04e25f8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 08:33:47 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 08:33:47 2026 -0400"
      },
      "message": "Bump golang.org/x/sync from 0.22.0 to 0.23.0 in /sdks (#40074)\n\nBumps [golang.org/x/sync](https://github.com/golang/sync) from 0.22.0 to 0.23.0.\n- [Commits](https://github.com/golang/sync/compare/v0.22.0...v0.23.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sync\n  dependency-version: 0.23.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "47127f84d09967573fb37c6b9f23fed2d04e25f8",
      "tree": "9f5180a91a2139433ae15bed2ea133f505045c25",
      "parents": [
        "7018e456e9437dbe3cfc92c895ac4dd02002d048"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 07:38:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 07:38:44 2026 -0400"
      },
      "message": "Bump org.nosphere.apache.rat from 0.8.1 to 0.8.2 (#40070)\n\nBumps org.nosphere.apache.rat from 0.8.1 to 0.8.2.\n\n---\nupdated-dependencies:\n- dependency-name: org.nosphere.apache.rat\n  dependency-version: 0.8.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7018e456e9437dbe3cfc92c895ac4dd02002d048",
      "tree": "f623ac462f33aeb96aca907d83c8c606fafb1137",
      "parents": [
        "9fecf1eb0aabbcf02e25be1863a476bec4277257"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 07:37:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 07:37:24 2026 -0400"
      },
      "message": "Bump github.com/aws/aws-sdk-go-v2/feature/s3/manager in /sdks (#40071)\n\nBumps [github.com/aws/aws-sdk-go-v2/feature/s3/manager](https://github.com/aws/aws-sdk-go-v2) from 1.23.2 to 1.23.3.\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.23.2...v1.23.3)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/aws/aws-sdk-go-v2/feature/s3/manager\n  dependency-version: 1.23.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9fecf1eb0aabbcf02e25be1863a476bec4277257",
      "tree": "26c2bd03ff8aec2c94b9b44f017b9b2736872771",
      "parents": [
        "123dbe41c57018884a85a8a0ad790d777f03749f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 07:36:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 07:36:41 2026 -0400"
      },
      "message": "Bump google.golang.org/grpc in /.test-infra/mock-apis (#40069)\n\nBumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.82.1 to 1.83.2.\n- [Release notes](https://github.com/grpc/grpc-go/releases)\n- [Commits](https://github.com/grpc/grpc-go/compare/v1.82.1...v1.83.2)\n\n---\nupdated-dependencies:\n- dependency-name: google.golang.org/grpc\n  dependency-version: 1.83.2\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "123dbe41c57018884a85a8a0ad790d777f03749f",
      "tree": "51dfbc7484e66c86c7c7677e01017091e1af3c26",
      "parents": [
        "1bc283150d27999628e8ba82b38705a0985e2654"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 07:35:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 07:35:55 2026 -0400"
      },
      "message": "Bump docker/setup-qemu-action from 4.2.0 to 4.3.0 (#40075)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 4.2.0 to 4.3.0.\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v4.2.0...1f40c72289eff860ee54a304f1438e3cff362e0a)\n\n---\nupdated-dependencies:\n- dependency-name: docker/setup-qemu-action\n  dependency-version: 4.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "1bc283150d27999628e8ba82b38705a0985e2654",
      "tree": "1b1a679e0b272c8784e737092ed56fd519464caf",
      "parents": [
        "8f0cc353648f4790c91d4014bea8cc1401dc5480"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 07:35:09 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 07:35:09 2026 -0400"
      },
      "message": "Bump golang.org/x/sys from 0.47.0 to 0.48.0 in /sdks (#40073)\n\nBumps [golang.org/x/sys](https://github.com/golang/sys) from 0.47.0 to 0.48.0.\n- [Commits](https://github.com/golang/sys/compare/v0.47.0...v0.48.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n  dependency-version: 0.48.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8f0cc353648f4790c91d4014bea8cc1401dc5480",
      "tree": "aa13e17181f701fb1e066b510f4c5eb3bbd42706",
      "parents": [
        "e33cd1052721c427cea23c7b0b5df44e41e28508"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 09 07:34:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 07:34:23 2026 -0400"
      },
      "message": "Bump golang.org/x/oauth2 from 0.36.0 to 0.37.0 in /sdks (#40072)\n\nBumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.36.0 to 0.37.0.\n- [Commits](https://github.com/golang/oauth2/compare/v0.36.0...v0.37.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/oauth2\n  dependency-version: 0.37.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "e33cd1052721c427cea23c7b0b5df44e41e28508",
      "tree": "5c8dfee27ee13630c57dbb0d873c3dd8faabfc1e",
      "parents": [
        "eb91b752071267aad8077bb87e7fc6362e84e43b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 22:29:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:29:49 2026 -0400"
      },
      "message": "Bump nodemailer from 9.0.1 to 9.1.1 in /scripts/ci/issue-report (#40066)\n\nBumps [nodemailer](https://github.com/nodemailer/nodemailer) from 9.0.1 to 9.1.1.\n- [Release notes](https://github.com/nodemailer/nodemailer/releases)\n- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/nodemailer/nodemailer/compare/v9.0.1...v9.1.1)\n\n---\nupdated-dependencies:\n- dependency-name: nodemailer\n  dependency-version: 9.1.1\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "eb91b752071267aad8077bb87e7fc6362e84e43b",
      "tree": "380d093e2d3db735bb4de119678246bae980792e",
      "parents": [
        "2bdcd3dea60515d3ca2513bc3189decfb7756ab3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 22:28:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:28:34 2026 -0400"
      },
      "message": "Bump google.golang.org/grpc in /learning/tour-of-beam/backend (#40065)\n\nBumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.82.1 to 1.83.2.\n- [Release notes](https://github.com/grpc/grpc-go/releases)\n- [Commits](https://github.com/grpc/grpc-go/compare/v1.82.1...v1.83.2)\n\n---\nupdated-dependencies:\n- dependency-name: google.golang.org/grpc\n  dependency-version: 1.83.2\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2bdcd3dea60515d3ca2513bc3189decfb7756ab3",
      "tree": "5f1d4abea3e978271778a8b48aff3da938a34048",
      "parents": [
        "d79a2487a8745b882560f029486d347c69a024fe"
      ],
      "author": {
        "name": "Abdelrahman Ibrahim",
        "email": "abdoibrahim1017@gmail.com",
        "time": "Wed Sep 09 03:00:49 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 20:00:49 2026 -0400"
      },
      "message": "use default SDK image and aarch64 wheel (#40017)\n\n* use default SDK image and aarch64 wheel\n\n* pin PostCommit Arm snapshots image to sdk_version"
    },
    {
      "commit": "d79a2487a8745b882560f029486d347c69a024fe",
      "tree": "27c12b567f18129fba682403ade3f52a7ce7c6a6",
      "parents": [
        "bce7e07a9df478893ee209cd02432888101a9af2"
      ],
      "author": {
        "name": "Abdelrahman Ibrahim",
        "email": "abdoibrahim1017@gmail.com",
        "time": "Wed Sep 09 03:00:07 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 20:00:07 2026 -0400"
      },
      "message": "normalize firestoreIO (#39941)\n\n* normalize firestoreIO\n\n* move firestore to gcp_test extra"
    },
    {
      "commit": "a0adae53810427b1f35b11233ddc869ac7fc6297",
      "tree": "ea853d8f90f73ce4d85e0884b3b0168c458868ee",
      "parents": [
        "bce7e07a9df478893ee209cd02432888101a9af2"
      ],
      "author": {
        "name": "junaiddshaukat",
        "email": "junaiddshaukat@gmail.com",
        "time": "Wed Sep 09 04:33:33 2026 +0500"
      },
      "committer": {
        "name": "junaiddshaukat",
        "email": "junaiddshaukat@gmail.com",
        "time": "Wed Sep 09 04:33:33 2026 +0500"
      },
      "message": "Kafka Streams runner: add a flush marker payload variant\n\nFirst step toward bundles bounded by time (#39633). A bundle cannot be\nclosed from a punctuator, because transactions are committed by the Kafka\nStreams runtime in the background and are not exposed, so instead a source\nwill emit a marker that travels the topology as an ordinary record and a\nstage closes its bundle from process().\n\nThis adds the marker itself and nothing that emits or consumes one yet. It\ncarries the producing partition and that transform\u0027s partition count, which\nis what will let it be addressed to a slice of the downstream partitions\nrather than broadcast: broadcasting would deliver one flush per upstream\npartition, so a downstream partition would see N times more flushes than the\nconfigured interval.\n"
    },
    {
      "commit": "bce7e07a9df478893ee209cd02432888101a9af2",
      "tree": "899e1920024c587fd72dd90776ea39afc5fa1c52",
      "parents": [
        "abe41005e7bca3a41d8e42e0d5511902dadac124"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Tue Sep 08 16:59:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 16:59:39 2026 -0400"
      },
      "message": "Introduce LABEL_NOTICE for PR bot (#40002)"
    },
    {
      "commit": "abe41005e7bca3a41d8e42e0d5511902dadac124",
      "tree": "470ebd85ac3ab9a6d25d0919471bc5dc6ea0742a",
      "parents": [
        "ef94119c2f37eed92cf4b8968b98bdb9c5a0e019"
      ],
      "author": {
        "name": "Tobias Kaymak",
        "email": "tobias.kaymak@gmail.com",
        "time": "Tue Sep 08 21:37:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 15:37:49 2026 -0400"
      },
      "message": "[Spark][#36841] Add the DataSourceV2 unbounded source for the Spark 4 streaming runner (#39971)\n\n* [Spark 4] Add DataSourceV2 micro-batch source for Beam unbounded sources\n\nExposes any Beam UnboundedSource as a Spark 4 DataSourceV2 streaming\ntable with a fixed two column schema, encoded payload plus event\ntimestamp. Offsets are opaque, strictly increasing epoch counters, so\nSpark keeps scheduling micro-batches and termination stays with the\nlifecycle owner.\n\nRecovery is durable under the query\u0027s checkpoint location: the source id\nderives deterministically from the read transform\u0027s full name, the first\nrun pins its split list (Beam sources do not guarantee deterministic\nsplitting), and every split persists its CheckpointMark per epoch with a\nretention of two, written atomically via temp file and rename. Executors\ncache live readers between micro-batches and fall back to the newest\ndurable mark at or before the replayed epoch after a restart. Semantics\nare at least once, a crash between finishing a read and Spark\u0027s commit\nreplays the last micro-batch.\n\nThe batch cutoff honors maxRecordsPerBatch, values below 1, including\nthe default, mean no limit and the batch ends on the duration deadline."
    },
    {
      "commit": "ef94119c2f37eed92cf4b8968b98bdb9c5a0e019",
      "tree": "e9fabf88dcbd9150106cf9487fa72d3d591e9ee7",
      "parents": [
        "6a0bd90065ac35b70fc9888055319593b392a9fc"
      ],
      "author": {
        "name": "Yi Hu",
        "email": "yathu@google.com",
        "time": "Tue Sep 08 14:59:40 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 14:59:40 2026 -0400"
      },
      "message": "Fix artifact staging windows filename (#39916)\n\n* Fix artifact staging filenames on Windows\n\n* Fix tests in windows OS and exercises on windows test workflow\n\n* Address comments\n\n* Handle invalid chars in base as well\n\n* Fix white spaces\n\n---------\n\nCo-authored-by: Atharv Urunkar \u003catharvurunkar@gmail.com\u003e"
    },
    {
      "commit": "6a0bd90065ac35b70fc9888055319593b392a9fc",
      "tree": "0be175bb1163eb4b80c6c8092366dc3068634a58",
      "parents": [
        "b1068bc0acfcca88c6c1e7331d789b59ec6b8bf0"
      ],
      "author": {
        "name": "Vitaly Terentyev",
        "email": "vitaly.terentyev.akv@gmail.com",
        "time": "Tue Sep 08 20:20:35 2026 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:20:35 2026 -0400"
      },
      "message": "Fix new line (#40060)"
    },
    {
      "commit": "b1068bc0acfcca88c6c1e7331d789b59ec6b8bf0",
      "tree": "7e522b72b0f6f596bc962bd1d5590c1e8cbb99a8",
      "parents": [
        "c4cfdefa123ae7077828d734f2a584df9196ea04"
      ],
      "author": {
        "name": "claudevdm",
        "email": "33973061+claudevdm@users.noreply.github.com",
        "time": "Tue Sep 08 11:53:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 11:53:03 2026 -0400"
      },
      "message": "AddFiles: SchemaEvolutionConfig, the public settings for the schema pre-pass (#40003)\n\nThe user-facing shape of schema evolution for AddFiles, added ahead of\nthe code that acts on it so the API can be reviewed on its own.\n\nSchemaEvolutionOption is three independent switches: ALLOW_FIELD_ADDITION\n(new columns, added optional), ALLOW_FIELD_RELAXATION (a required column\nbecomes optional when a file may hold nulls in it or lacks it), and\nALLOW_TYPE_PROMOTION (widening along Iceberg\u0027s rules). They constrain\ncolumns the table already has; a column new in a window takes the union\nof that window\u0027s file schemas.\n\nSchemaEvolutionConfig is a Serializable AutoValue. With no options it is\ndisabled and files register as before this series. Pins\n(getRequiredColumns) are dotted column paths that are never relaxed and\nare created required; a Parquet file that cannot prove they hold no\nnulls goes to the error output. IncompatibleSchemaHandling picks\nFAIL_PIPELINE (batch only, the batch default) or ROUTE_TO_ERRORS (the\nstreaming default) for a file schema the options cannot cover."
    },
    {
      "commit": "c4cfdefa123ae7077828d734f2a584df9196ea04",
      "tree": "512a8b0a2c876e952dff4b57b66b77c20126d934",
      "parents": [
        "ac159f4f37f00f5d95a04f74bbcb8f721012ce6e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 11:47:18 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 11:47:18 2026 -0400"
      },
      "message": "Bump docker/setup-qemu-action from 4.2.0 to 4.3.0 (#40012)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 4.2.0 to 4.3.0.\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\n- [Commits](https://github.com/docker/setup-qemu-action/compare/96fe6ef7f33517b61c61be40b68a1882f3264fb8...1f40c72289eff860ee54a304f1438e3cff362e0a)\n\n---\nupdated-dependencies:\n- dependency-name: docker/setup-qemu-action\n  dependency-version: 4.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ac159f4f37f00f5d95a04f74bbcb8f721012ce6e",
      "tree": "b654052240a192c531df8b7f7c2d69d2d1eaefa9",
      "parents": [
        "6053b781a2cba1c274dbe7dd749bd389f7e1ab09"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 11:19:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 11:19:39 2026 -0400"
      },
      "message": "Bump org.codehaus.plexus:plexus-xml from 3.0.2 to 4.2.0 (#39857)\n\nBumps [org.codehaus.plexus:plexus-xml](https://github.com/codehaus-plexus/plexus-xml) from 3.0.2 to 4.2.0.\n- [Release notes](https://github.com/codehaus-plexus/plexus-xml/releases)\n- [Commits](https://github.com/codehaus-plexus/plexus-xml/compare/plexus-xml-3.0.2...plexus-xml-4.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.codehaus.plexus:plexus-xml\n  dependency-version: 4.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "6053b781a2cba1c274dbe7dd749bd389f7e1ab09",
      "tree": "746163103dba403c5f08951aa6113d05dd950702",
      "parents": [
        "07ddef7a3b56a04b74251ea555e244c003c7cb72"
      ],
      "author": {
        "name": "Shunping Huang",
        "email": "shunping@google.com",
        "time": "Tue Sep 08 11:01:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 11:01:06 2026 -0400"
      },
      "message": "[Java] Move GCP-related secret classes and tests from sdks/java/core to google-cloud-platform-core (#40019)"
    }
  ],
  "next": "07ddef7a3b56a04b74251ea555e244c003c7cb72"
}
