)]}'
{
  "log": [
    {
      "commit": "5248fb28acda184580bd490cea8a1bea6933535a",
      "tree": "5e03215a16e03016beeec410ff13b04a9d746424",
      "parents": [
        "6f5b5ad72e83de9b6abe0b145151a275caa8624a"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 15 19:46:05 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Oct 16 00:10:43 2026 +0200"
      },
      "message": "THRIFT-6425: Run the skip-depth and negative-size tests of lib/js\nClient: js\n\ntest-skip-depth.html (THRIFT-6014) has no QUnit target in Gruntfile.js,\nand no page loads test-protocol-negative-size.js (THRIFT-6037), so\nneither make check nor the lib-js CI job has ever run them. Both now\nhave a target in the test task, and the negative-size tests get a page\nof their own.\n\nOne of the skip-depth tests could not pass. It handed four binary bytes\nto the transport and skipped an i32, but the JSON protocol reads from\nthe parsed message, so the test died with a TypeError, and its\nassertion, skip(...) !\u003d\u003d undefined || true, could not fail anyway. It\nnow parses a message and checks that skip() at depth 63 reads the\nfield\u0027s value.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "6f5b5ad72e83de9b6abe0b145151a275caa8624a",
      "tree": "88fb0b24b5e086200f28cdf50d55ad405d093e4e",
      "parents": [
        "5cba029b06956f2c13daae5ef563b98bf2cc1094"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 15 18:28:56 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Oct 16 00:10:03 2026 +0200"
      },
      "message": "THRIFT-6418: Give the browser TApplicationException the symbol-keyed read and write methods\nClient: js\n\nGenerated JavaScript code reads and writes structs through the keys\nSymbol.for(\"read\") and Symbol.for(\"write\"). Since 5fc920dac (0.21.0) the\ngenerated client also reads an EXCEPTION reply that way, calling\nx[Symbol.for(\"read\")](input) on a new Thrift.TApplicationException.\nlib/nodejs gives its TApplicationException both keys, but lib/js did not,\nso a browser client threw \"TypeError: x[Symbol.for(...)] is not a\nfunction\" instead of the TApplicationException the server sent. The two\nkeys now point at the existing read() and write(), as in lib/nodejs.\n\nThe ant JSLint check in lib/js/test/build.xml reads thrift.js as ES3,\nwhere \"for\" cannot be a property name, so it now runs with the es5\noption.\n\nThe test that should have caught this could not. test_handler.js took\nTException from the top level of the Node.js library, where it is\nundefined, so testException(\"TException\") failed inside the test server\nwith HTTP 500, and the TException test in test.js had been changed to\naccept any error. The handler now uses Thrift.TException, and the test\nexpects the TApplicationException that the server sends for an\nundeclared exception. A second test decodes an EXCEPTION reply through\nthe generated client without a server.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5cba029b06956f2c13daae5ef563b98bf2cc1094",
      "tree": "91dbc876f1ba7075b64e6ce8ff1332b18c92c926",
      "parents": [
        "b75785effb5073c4e9656320b794bab14a29b67f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 14 07:02:00 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Oct 16 00:09:47 2026 +0200"
      },
      "message": "Bump System.Security.Cryptography.Xml from 10.0.10 to 10.0.13\n\n---\nupdated-dependencies:\n- dependency-name: System.Security.Cryptography.Xml\n  dependency-version: 10.0.13\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "b75785effb5073c4e9656320b794bab14a29b67f",
      "tree": "c0a47e79d21d839f8a5554e9c060a58579c17b3b",
      "parents": [
        "f4d8e8c3fa56ef04d7462e26d3b8226127edb2fe"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Oct 14 22:45:43 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 15 23:00:44 2026 +0200"
      },
      "message": "THRIFT-6406: Escape Rust 2018/2024 keywords and service method names\nClient: rs\n\nThe Rust generator escaped names that clash with Rust keywords by appending\nan underscore, but its list predated Rust 2018, and the names of the client\nmethods were not escaped at all. Fields, arguments and methods named async,\nawait, dyn, try or gen, and methods named after any keyword (type, match,\nreturn, ...), gave code that does not compile.\n\nasync, await, dyn and try (Rust 2018) and gen (Rust 2024) now become raw\nidentifiers, e.g. r#gen. A raw identifier is the same name, so code written\nfor an edition in which the plain name still compiles keeps compiling; gen\nis a valid name up to edition 2021. Client method names now go through the\nsame escaping, e.g. fn type_(). Methods named alignof, offsetof, proc, pure\nor sizeof keep their names: Rust no longer reserves these words, and fields\nwith these names keep their underscore. The names on the wire do not change.\n\nlib/rs/test gets Keywords.thrift, with such names for fields, arguments and\nmethods, and tests that round-trip the struct and call the client methods.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f4d8e8c3fa56ef04d7462e26d3b8226127edb2fe",
      "tree": "84c264dc2afd35bb52b699f48287eb7a74904eca",
      "parents": [
        "83befb9e90614a72ae04ea0fea0e3d9054411088"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 09:47:12 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 15 09:43:36 2026 +0200"
      },
      "message": "THRIFT-6417: Treat a zero-byte write as an error in the socket, fd and SSL transports\nClient: c_glib\n\nthrift_socket_write(), thrift_fd_transport_write() and\nthrift_ssl_socket_write() call send(), write() and SSL_write() until the whole\nbuffer has gone out. A call that returns 0 for a non-empty buffer has made no\nprogress, and repeating it cannot make any, so the write now fails with a\nGError instead of asking again: THRIFT_TRANSPORT_ERROR_SEND for the socket and\nfd transports, and for SSL_write(), which signals a failed write with any value\n\u003c\u003d 0, the same SSL error as for a negative result.\n\nC++ handles these results the same way: TSocket::write_partial() and\nTFDTransport::write() throw on a 0 from send() and write(), and\nTSSLSocket::write() checks the SSL_write() result for \u003c\u003d 0.\n\ntestfdtransport now includes thrift_fd_transport.c, as the socket tests do\nwith their transports, so that it can substitute write().\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "83befb9e90614a72ae04ea0fea0e3d9054411088",
      "tree": "f9078868870fb142c000c1be00a66f4a1af08582",
      "parents": [
        "b3c95976dacf20bb71d853b163374bbf4ba3b50c"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 09:41:04 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 15 09:41:34 2026 +0200"
      },
      "message": "Remove an unreachable branch from the zlib transport\u0027s read_slow()\nClient: c_glib\n\nthrift_zlib_transport_read_slow() delivers at most one byte per call. need\nstarts at 1 and only ever drops to 0, when that byte has been copied, and the\nfunction then returns at once. The check that follows it, need \u003c 1, is\ntherefore never true, and the early return it guards cannot be taken. Remove\nthe check and the comment above it. Behaviour does not change.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b3c95976dacf20bb71d853b163374bbf4ba3b50c",
      "tree": "f18869af63a3f455b4655d678ed6b9dc93ead38d",
      "parents": [
        "fe6ce727e8a754ba6f224bfb169f98816c9abca1"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Oct 12 22:22:50 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 08:48:05 2026 +0200"
      },
      "message": "THRIFT-6162: Require Rust 1.85 with the 2024 edition and build with Rust 1.99\nClient: rs\n\nAll Rust crates declare edition 2024 and rust-version 1.85. Edition 2024\nturns on Cargo\u0027s MSRV-aware resolver, so dependencies resolve to versions\nthat still build on 1.85 even when a newer toolchain runs the build.\n\nCI, the crates.io release and the Docker images use Rust 1.99.0, pinned\nrather than \"stable\": the Rust jobs run clippy with -D warnings, and each\nnew release adds lints. Bump the pin on purpose, together with any lint\nfixes it needs.\n\nThe generated ok_or() now matches with if-let instead of is_some() and\nunwrap(), which clippy 1.99 rejects in every generated client.\n"
    },
    {
      "commit": "fe6ce727e8a754ba6f224bfb169f98816c9abca1",
      "tree": "a6ad361c53ed846824830d42354b7dbf746db43f",
      "parents": [
        "9f46580aef43e041daaefe5437752fc71dd6692a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 14 01:04:01 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 08:09:06 2026 +0200"
      },
      "message": "Bump shell-quote from 1.10.0 to 1.12.0 in /lib/js\n\nBumps [shell-quote](https://github.com/ljharb/shell-quote) from 1.10.0 to 1.12.0.\n- [Changelog](https://github.com/ljharb/shell-quote/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/ljharb/shell-quote/compare/v1.10.0...v1.12.0)\n\n---\nupdated-dependencies:\n- dependency-name: shell-quote\n  dependency-version: 1.12.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "9f46580aef43e041daaefe5437752fc71dd6692a",
      "tree": "a7ce905bfe66a037d907c68ef478c1d2828c0786",
      "parents": [
        "b70d718ff02d4690080a1a103367cb4950c616a1"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Oct 14 02:04:31 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 08:07:35 2026 +0200"
      },
      "message": "THRIFT-6407: Install OpenSSL 3.6.5 in the MSVC image\nClient: build\n\nslproweb.com only keeps the current OpenSSL builds. The 3.6.4 installer\nthat the image downloaded is gone (404) since 3.6.5 replaced it, so every\nrebuild of the image failed. The SHA256 of the 3.6.5 installer matches\nboth a download and the value slproweb publishes.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b70d718ff02d4690080a1a103367cb4950c616a1",
      "tree": "5bc6319db6bf5f1a24fb04feb45830fc0ff29f48",
      "parents": [
        "412e56c1be9e9f625b91d6902bede7946bdc2249"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Oct 14 01:35:56 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 08:06:35 2026 +0200"
      },
      "message": "THRIFT-6405: List only .cargo/config.toml in EXTRA_DIST and reword its comment\nClient: rs,build\n\nmake dist copies from the working tree, so listing the directory would also\npack any local file under .cargo/. The comment no longer assumes that no\ncrate sets package.rust-version, which THRIFT-6162 is about to change.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "412e56c1be9e9f625b91d6902bede7946bdc2249",
      "tree": "432d5faf30562da25a87780430bc56819d1411d4",
      "parents": [
        "19bb4835a665cd1bddcae54f91bcf2e6d59ab287"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Oct 12 19:49:29 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 08:06:35 2026 +0200"
      },
      "message": "THRIFT-6405: Resolve Rust dependencies to versions the pinned toolchain can build\nClient: rs,build\n\nuuid 1.27.0 raised its minimum to Rust 1.89 and lib-rust, which builds with\nthe 1.85.1 in rust-toolchain, has failed since. .cargo/config.toml turns on\nthe MSRV-aware resolver for every Cargo build in the tree, so uuid resolves\nto 1.26.1. No crate sets package.rust-version, so the running toolchain is\nthe bound; THRIFT-6162 decides that key. Removing the file brings the\nfailure back with the next dependency that raises its minimum.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "19bb4835a665cd1bddcae54f91bcf2e6d59ab287",
      "tree": "218b4cae59b43e1571d9527b1d762d10de8e79ba",
      "parents": [
        "c8151cd32f16f209e0cb0a205340d8a83bcc2b5f"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sun Sep 27 12:23:32 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 01:49:26 2026 +0200"
      },
      "message": "THRIFT-6379: Link libboost_system only when Boost ships it\nClient: cpp\n\nBoost.System is header-only since 1.69, and 1.89 stopped shipping the stub\nlibrary, so the C++ tests and the cross-test client and server failed to link\nagainst current Boost. configure still links it where it exists, for Boost 1.56 to\n1.68, and test/cpp now uses the same variable instead of -lboost_system.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c8151cd32f16f209e0cb0a205340d8a83bcc2b5f",
      "tree": "5c8fe63e5f65c7ff3d68a011ce2eb347abd0e9bf",
      "parents": [
        "a81db74f84321bfec0a9bff2d91bb121a08863fa"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sun Sep 27 15:49:26 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Oct 14 01:48:32 2026 +0200"
      },
      "message": "THRIFT-6080: Stop copying a binary field on every call to its byte[] getter\nClient: java\n\nThe generated byte[] getX() right-sized the field and stored it through setX(),\nwhich copies again with copyBinary, so every call copied the bytes although it\nreturns the field\u0027s own array either way. It now assigns the right-sized buffer\ndirectly, as Apache Accumulo already does by patching the generated code.\nUnion getters and bufferForX() are unchanged.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "a81db74f84321bfec0a9bff2d91bb121a08863fa",
      "tree": "b339d2d9060f46e1edf3551d441fd5ef0b3d87ae",
      "parents": [
        "50bbda109593a0b5c7634ac21c5d98eee97fe7ec"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sun Sep 27 18:02:15 2026 +0200"
      },
      "committer": {
        "name": "Yuxuan \u0027fishy\u0027 Wang",
        "email": "fishywang@gmail.com",
        "time": "Sun Oct 11 13:14:31 2026 -0700"
      },
      "message": "THRIFT-6391: Import packages that collide with -remote stub locals under an alias\nClient: go\n\nThe Go -remote stub\u0027s main() declares locals such as client, cmd and host, which\nshadowed an imported package of the same name, so the stub did not compile.\nApache Accumulo (client.thrift) and Apache Pegasus (package cmd) hit it. The stub\nnow gets import identifiers of its own, with those names reserved, so such a\npackage is imported under an alias there; the program\u0027s other files are\ngenerated as before. An alias is also never one already taken by another import.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "50bbda109593a0b5c7634ac21c5d98eee97fe7ec",
      "tree": "359505a79e7c8ddcc6bff7a91a26efa0f96cb982",
      "parents": [
        "11be31c5e1d1d5f1a4f16b3097e26935956bfc76"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 01:39:21 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Oct 02 02:00:56 2026 +0200"
      },
      "message": "THRIFT-6401: Declare the minimum Visual C++ runtime for WinGet and Chocolatey, and drop the dead Chocolatey icon\nClient: build\n\nThe Chocolatey review of the thrift 0.25.0 package flagged the nuspec\u0027s\niconUrl, which returns 404, and a dependency without a version. There\nis no square Thrift logo to point at, so the package goes without an\nicon, as the 0.12.0 package did.\n\nThe released thrift.exe links the shared Visual C++ runtime, and the\ninstalled redistributable has to be at least as new as the build tools\nthe program was built with; thrift-0.25.0.exe reports linker version\n14.51. Without a minimum, any vcredist140 that is already installed\nsatisfies the dependency and is not updated, and the WinGet manifest\nhad the same gap. The nuspec now asks for vcredist140 14.51 or later,\nand the WinGet installer manifest asks for Microsoft.VCRedist.2015+.x64\n14.51 or later through MinimumVersion, quoted so that YAML keeps it a\nstring.\n\nThe tests check both minimums, that the two agree, and that the nuspec\nnames no icon. doc/ReleaseManagement.md says to raise the minimum when\nthe compiler is built with newer build tools, and build/windows/README.md\nmentions it.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "11be31c5e1d1d5f1a4f16b3097e26935956bfc76",
      "tree": "6edb06c8c6e250587431a3ff8196e9d0c7b38826",
      "parents": [
        "16768cfed419ab04accbcc0312f726e0f7e6617f"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 00:29:35 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Oct 02 00:45:45 2026 +0200"
      },
      "message": "THRIFT-6399: Let the WinGet and Chocolatey workflows take the installer from the GitHub release\nClient: build\n\nThe WinGet manifest and the Chocolatey package download the Windows\ninstaller from archive.apache.org, where it arrives through dist/release\nwhen the release vote covered it. When the vote did not cover it, as for\n0.25.0, it is not there, and dist/release is not the place to add it\nafterwards. The GitHub release carries it as a convenience copy, built\naround the voted compiler, at a permanent URL that needs no login.\n\nbuild-winget-manifests.ps1 and build-chocolatey-package.ps1 get\n-InstallerSource: archive, the default, or github for that copy. An\nunknown source, or a source together with -InstallerUrl, is refused, and\na failed download names what to check for the source in use. The tests\ncover the new URL and both refusals.\n\nA manual run of the WinGet and Chocolatey workflows takes the source\nfrom a new installer_source input. A release run keeps the archive.\n\nThe Chocolatey package description no longer says that the installer\ncomes from the Apache archive. doc/ReleaseManagement.md no longer adds\nan installer the vote did not cover to dist/release after the release.\nThe two workflows are run with installer_source github instead, once\nthe copy on the GitHub release is built around the voted compiler, and\nthat copy is not replaced afterwards, because both package managers\nrecord its SHA-256. build/windows/README.md and the comments in\nwindows-packages.yml say the same.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "16768cfed419ab04accbcc0312f726e0f7e6617f",
      "tree": "b04539e5963757c6bf0cc18e1f41e22210d875b0",
      "parents": [
        "c7ae9d36e0b2f7a7fd6298d37a43eac69e1e42ce"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 00:34:27 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Oct 02 00:44:49 2026 +0200"
      },
      "message": "THRIFT-6400: Package the voted compiler in the .NET tool\nClient: build\n\nThe .NET tool workflow built thrift.exe from the release tag and packed\nthat build. A new build of the same source is not the same bytes, so\nApache.Thrift.Compiler did not carry the thrift-\u003cversion\u003e.exe the\nrelease vote covered: the compiler in the 0.25.0 package has SHA-256\n3d3f2e8a..., the voted one 9e1cb466.... THRIFT-6397 made the Windows\ninstaller package the voted executable, and the .NET tool now does the\nsame.\n\nWhen the GitHub release is published, a new voted-compiler job runs the\ntests of get-voted-compiler.ps1 and then uses it to fetch\nthrift-\u003cversion\u003e.exe from dist/release, checking its checksums and its\nsignature against KEYS. The package carries that file and the LICENSE\nand NOTICE of the release tag. If the fetch or a check fails, nothing is\npacked or published: a release does not fall back to building its own\ncompiler. A manual run with the new compiler_url input packs the\nexecutable at that URL, for example a release candidate\u0027s, and never\npublishes. Pull requests, and manual runs without compiler_url, still\nbuild the compiler from source.\n\ntest-dotnet-tool.ps1 gets -ExpectedSha256, which the workflow uses to\ncheck that the thrift.exe in the package is the file it packed. The run\nsummary names the compiler\u0027s source and hash.\n\nThe README shown on nuget.org, build/windows/README.md and\ndoc/ReleaseManagement.md describe it.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c7ae9d36e0b2f7a7fd6298d37a43eac69e1e42ce",
      "tree": "ef9ebc046c46e8f3f9834fec2ec63f011cbc7ba4",
      "parents": [
        "0637ac53f33c170044ce0e0ef706fa4a81417521"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 16 01:01:08 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 00:36:48 2026 +0200"
      },
      "message": "Record the per-nesting-level budget re-offer in the Q59 allocation notes\n\nThe Q59 working text describes checkReadBytesAvailable and the pre-allocation\nthat follows it, and gives the constant-factor amplification for a single list\nfield. It does not yet record that the check is a pure comparison run before any\nelement is read, so the message-size budget bounds bytes consumed rather than\ncapacity reserved; nor that on a transport which never narrows the budget to the\nreal message length (the unframed sockets, as opposed to the framed and\nin-memory transports that call updateKnownMessageSize) the full maxMessageSize is\nre-offered at every nesting level and every sibling field.\n\nAdd both to the working text, with measured figures for the unframed path, so\nthe note reflects the reserved-vs-consumed distinction. Leaves the Q59 triage\nthreshold pending: this records mechanism and measurement, not a verdict.\n\nBase: doc/thrift-threat-model.md on master at 6e28ac93b.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0637ac53f33c170044ce0e0ef706fa4a81417521",
      "tree": "3b40f73ec556dc4c39e2badbc6ac1c4ab5eb14f5",
      "parents": [
        "4802f20b95202fdcbbf419a5a7f8a17439972c9c"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Sep 11 14:51:07 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 00:36:48 2026 +0200"
      },
      "message": "Record the scope of the D3/N1 resource-cap disclaimer in the threat model\n\n§9 D3 and §11a N1 disclaim unbounded allocation as the operator\u0027s\nresponsibility to cap. That disclaimer presupposes a cap that exists, is\ndocumented, and is reachable on the path that performs the allocation.\nWhere the allocating path exposes no such cap -- or one that cannot bind\nit -- the disclaimer does not reach it; that is a §8 P10 finding with §6\ncross-binding parity. Write that boundary down where each disclaimer is\nread, phrased so it holds whichever way the pending Q62/Q38 questions\nresolve.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "4802f20b95202fdcbbf419a5a7f8a17439972c9c",
      "tree": "ce9f9a4872dbeb3e21f7a04f419d1651b137561e",
      "parents": [
        "9bf64230bbdbfa02e44b5d8bfc028f5c781cc52f"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Sep 04 23:28:48 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 00:36:47 2026 +0200"
      },
      "message": "make threat model N7 more precise\n"
    },
    {
      "commit": "9bf64230bbdbfa02e44b5d8bfc028f5c781cc52f",
      "tree": "037c6d490f296334f703833174a852f130b2a6b2",
      "parents": [
        "f61566e1775dc6c861a7482fc599530c53b1e545"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Jul 24 10:16:27 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Oct 02 00:36:47 2026 +0200"
      },
      "message": "Correct threat-model description of per-transport message-size accounting\n\nThe document stated that C++/Java use a decreasing remainingMessageSize_ counter\nthat each consumed wire byte reduces. That is not how the primary socket path\nworks: TSocket::read (and TSSLSocket / THttpTransport / TFDTransport / TPipe) check\neach read against the full maxMessageSize but never call the protected\ncountConsumedMessageBytes, and Java\u0027s TIOStreamTransport does no per-read\naccounting at all. The counter is drawn down only by the in-memory buffer\u0027s\nconsume()/borrow path, TZlibTransport, and the framed updateKnownMessageSize reset.\nSo on a plain socket the cap is enforced per-field against the full maxMessageSize\nvia the protocol-level checkReadBytesAvailable guard — the same structural property\nas Go, not a cumulative remainder. Also aligns the \"bottom line\" note so it no\nlonger implies C++/Java differ from Go on this path.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f61566e1775dc6c861a7482fc599530c53b1e545",
      "tree": "8408b42b3daf6771dd27d70a99015f558a9133e5",
      "parents": [
        "1871e5814b0ca5a4ea2cc79184e20ad4448c11ea"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 06:04:56 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 23:41:47 2026 +0200"
      },
      "message": "Bump com.diffplug.spotless from 8.10.0 to 8.10.2 in /lib/kotlin\n\nBumps com.diffplug.spotless from 8.10.0 to 8.10.2.\n\n---\nupdated-dependencies:\n- dependency-name: com.diffplug.spotless\n  dependency-version: 8.10.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "1871e5814b0ca5a4ea2cc79184e20ad4448c11ea",
      "tree": "c194d19b8e279b59b81328df0a554c750c4cd91e",
      "parents": [
        "4f5d234a8d22feef3e009df4b45207598a00ce57"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 06:05:34 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 23:41:18 2026 +0200"
      },
      "message": "Bump dart-lang/setup-dart from 1.8.0 to 1.8.1\n\nBumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.8.0 to 1.8.1.\n- [Release notes](https://github.com/dart-lang/setup-dart/releases)\n- [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/dart-lang/setup-dart/compare/7654d458321ee25acccccfdb86cd48bd95768ff1...6afc89df92d6eb3834022f73cd65adc8cdfcb92d)\n\n---\nupdated-dependencies:\n- dependency-name: dart-lang/setup-dart\n  dependency-version: 1.8.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "4f5d234a8d22feef3e009df4b45207598a00ce57",
      "tree": "606e6dd4192c17389827c76aa22f1c53c0b46168",
      "parents": [
        "d31803207ef7f3546db1efdaa960da053097f63e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 06:05:57 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 23:40:29 2026 +0200"
      },
      "message": "Bump actions/setup-java from 6.0.0 to 6.0.1\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 6.0.0 to 6.0.1.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/dd06d9cba3e5552c54d9f8ea23572deb30010f7c...de7274f081f381c8f8158605e0321c36c376e2e6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "d31803207ef7f3546db1efdaa960da053097f63e",
      "tree": "7aff4b108ef1f2eb5caed29cf1b2973958a06579",
      "parents": [
        "a129465f217d77b1bfec5a7080abad3ce914a1d1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 06:07:22 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 23:40:26 2026 +0200"
      },
      "message": "Bump jvm from 2.4.10 to 2.4.20 in /lib/kotlin\n\nBumps [jvm](https://github.com/JetBrains/kotlin) from 2.4.10 to 2.4.20.\n- [Release notes](https://github.com/JetBrains/kotlin/releases)\n- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)\n- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.10...v2.4.20)\n\n---\nupdated-dependencies:\n- dependency-name: jvm\n  dependency-version: 2.4.20\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "a129465f217d77b1bfec5a7080abad3ce914a1d1",
      "tree": "632f8317ba23c652e4066d5e3843a4436fa147af",
      "parents": [
        "ba79631c7eb96fe5fd7f77b38b9f51fa5c355266"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 01 23:18:47 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 23:40:05 2026 +0200"
      },
      "message": "THRIFT-6398: Add 0.24.0 and 0.25.0 to the Docker Official Image packaging\nClient: docker\n\nupdate.sh was never run for 0.24.0, so versions.json still listed only\n0.22.0 and 0.23.0. Run it for 0.24.0 and then 0.25.0, with RELEASED_DATE\nset to the release dates (2026-07-11 and 2026-09-30). Both tarballs pass\nthe checksum and signature checks.\n\nWith maintained_releases: 2, the generated library now covers 0.25.0 and\n0.24.0, and 0.23.0 leaves it.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ba79631c7eb96fe5fd7f77b38b9f51fa5c355266",
      "tree": "47f62bb44d10e2c14f4b9cd2e57550c3a6486d3f",
      "parents": [
        "df9852a27c1d83cf221bc1334fb1b6eef9b06271"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 03:17:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 03:17:17 2026 -0400"
      },
      "message": "Bump zizmorcore/zizmor-action from 0.6.2 to 0.6.4 (#3988)\n\nBumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.6.2 to 0.6.4.\n- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)\n- [Commits](https://github.com/zizmorcore/zizmor-action/compare/3dc1ecc9bcb9e94e9b2c709687979e1298497054...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": "df9852a27c1d83cf221bc1334fb1b6eef9b06271",
      "tree": "c3e11fd140683488c424c67eed8d15e1f18c0cbd",
      "parents": [
        "51d2274b19aa2d1fc66e33525efc0a31d5aa4461"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 03:16:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 03:16:58 2026 -0400"
      },
      "message": "Bump rubygems/release-gem from 1.4.0 to 1.4.1 (#3991)\n\nBumps [rubygems/release-gem](https://github.com/rubygems/release-gem) from 1.4.0 to 1.4.1.\n- [Release notes](https://github.com/rubygems/release-gem/releases)\n- [Commits](https://github.com/rubygems/release-gem/compare/052cc82692552de3ef2b81fd670e41d13cba8092...7f9650160c1a4e7989fdc9855807bdbd421d8b6b)\n\n---\nupdated-dependencies:\n- dependency-name: rubygems/release-gem\n  dependency-version: 1.4.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": "51d2274b19aa2d1fc66e33525efc0a31d5aa4461",
      "tree": "e411d2d924ab9f76bb8305f67613691e8cb536d9",
      "parents": [
        "b19dc74f706f8816ce27d5f405a6bfb65e033334"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 03:16:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 03:16:31 2026 -0400"
      },
      "message": "Bump ruby/setup-ruby from 1.321.0 to 1.326.0 (#3989)\n\nBumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.321.0 to 1.326.0.\n- [Release notes](https://github.com/ruby/setup-ruby/releases)\n- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)\n- [Commits](https://github.com/ruby/setup-ruby/compare/95ef2b042f9d7a56d8268cba8559e2842e2ad01b...762794c140bbeda0f1224786aa33b4b46783a6c1)\n\n---\nupdated-dependencies:\n- dependency-name: ruby/setup-ruby\n  dependency-version: 1.326.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": "b19dc74f706f8816ce27d5f405a6bfb65e033334",
      "tree": "7292cec94d285fb65bf65b6e14053441d6724fc6",
      "parents": [
        "b2a4f2e0432b5eac4ac58d8c1ded623a0145bb17"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 00:09:46 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:36:02 2026 +0200"
      },
      "message": "Bump brace-expansion from 1.1.11 to 1.1.21 in /lib/js\n\nBumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.21.\n- [Release notes](https://github.com/juliangruber/brace-expansion/releases)\n- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.21)\n\n---\nupdated-dependencies:\n- dependency-name: brace-expansion\n  dependency-version: 1.1.21\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "b2a4f2e0432b5eac4ac58d8c1ded623a0145bb17",
      "tree": "b24a1418706800484deaea0c8917279f727ebf77",
      "parents": [
        "f1f3307789e540233f43098aefc638c25fc2f0b6"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:23:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 02:23:33 2026 +0200"
      },
      "message": "Update ReleaseManagement.md"
    },
    {
      "commit": "f1f3307789e540233f43098aefc638c25fc2f0b6",
      "tree": "97b332a8ef09a6c39be002d45ced3af8851c5f4a",
      "parents": [
        "bdeb3cba93abb42ae0625b1e85a2cb45c7d95d3d"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 01 02:10:25 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:22:12 2026 +0200"
      },
      "message": "THRIFT-6397: Build the Windows installer around the voted compiler\nClient: build\n\nThe installer of a release has to contain the thrift.exe the vote\ncovered, and a new build of the same source is not the same bytes. The\nWindows packages workflow could only package a compiler it built itself,\nso the installer for dist.apache.org had to be built by hand.\n\nget-voted-compiler.ps1 downloads a thrift-\u003cversion\u003e.exe from a release\ncandidate\u0027s or a release\u0027s directory on dist.apache.org, with its\nsignature, its checksum files and KEYS. It refuses the file unless every\nchecksum matches and the signature is good and made with a key from\nKEYS, and it accepts only dist.apache.org URLs naming a\nthrift-\u003cversion\u003e.exe. get-voted-compiler-tests.ps1 tests that with a\nthrowaway key, in a job of its own on every run.\n\nThe workflow packages that executable when it is started with the new\ncompiler_url input, and, from dist/release, when a GitHub release is\npublished. The installer then carries the LICENSE and NOTICE of the\nrelease tag, or of the branch for a release candidate. Pull requests and\nruns without compiler_url still build the compiler from source.\n\ntest-installer.ps1 gets -ExpectedSha256, which the workflow uses to\ncheck that the installed thrift.exe is the file it packaged.\nbuild-installer.ps1 now hands -SourceRoot to Inno Setup as an absolute\npath; a relative one was resolved against thrift.iss.\n\ndoc/ReleaseManagement.md and build/windows/README.md describe it. The\nvote mail template in doc/ReleaseManagement.md named the release\ncandidate\u0027s files thrift-1.0.0-rc0.*, but the steps above it produce\nthrift-1.0.0.*, which is also what get-voted-compiler.ps1 accepts; the\ntemplate now uses those names.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bdeb3cba93abb42ae0625b1e85a2cb45c7d95d3d",
      "tree": "f20ddbe33906ce12783d16bfd014e70f46b54ceb",
      "parents": [
        "b581cb84e34bc75fe8fe4e117be8ab209bb8b613"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:16:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 02:16:46 2026 +0200"
      },
      "message": "Update ReleaseManagement.md"
    },
    {
      "commit": "b581cb84e34bc75fe8fe4e117be8ab209bb8b613",
      "tree": "9d5a1a85ae858b597ad0b9ec8fb222651ac2595b",
      "parents": [
        "269d35b4e8b6864527143ee57d01361f5f55a7a7"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sun Sep 27 12:23:32 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:13:30 2026 +0200"
      },
      "message": "THRIFT-6377: Grow a list\u003cbool\u003e with push_back so generated C++ builds as C++11\nClient: cpp\n\nstd::vector\u003cbool\u003e has no emplace_back() before C++14, so code generated for a\nlist\u003cbool\u003e field, directly or through a typedef, did not compile as C++11 against\nlibc++. Other element types keep emplace_back().\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "269d35b4e8b6864527143ee57d01361f5f55a7a7",
      "tree": "b6ff631e9860201ee998df3e2d845392aceaea5c",
      "parents": [
        "4de20107730f316873aca80cb83dfbbd919d6916"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 01 01:47:18 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:12:11 2026 +0200"
      },
      "message": "THRIFT-6396: Let a manual run of the WinGet and Chocolatey workflows publish\nClient: build\n\nWhen a release run is too early for archive.apache.org, the documented\nway to publish is to run the workflow again from the Actions tab. That\nrun could not publish anything: only a release event downloaded the\npublished installer, so a manual run used the placeholder checksum, and\nthe submit and push jobs only ran for a release. Now only a pull request\nuses the placeholder, and a manual run submits or pushes like a release.\n\ndoc/ReleaseManagement.md:\n- describes how to add the installer to dist/release after the release,\n  when it was not part of the release candidate, built from the voted\n  compiler;\n- says that a release run can be re-run for 30 days, and that a manual\n  WinGet run needs the release date;\n- no longer describes the Chocolatey id takeover as pending;\n- says that the secrets and the variable can be set for the repository\n  or for the release environment.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "4de20107730f316873aca80cb83dfbbd919d6916",
      "tree": "d70d125a6ee8e7db57f5eafd49c0c19d7663b11f",
      "parents": [
        "a4f419fe83d243e90964abed55f490c0d0de05a4"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 01 01:47:18 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Oct 01 02:08:37 2026 +0200"
      },
      "message": "THRIFT-6395: Fix the Ruby gem release workflow and limit it to release tags\nClient: rb\n\nThe workflow has never published a gem. Its release-gem step runs\n\"bundle exec rake release\", but the job does not install the bundle,\nsince THRIFT-5965 turned bundler-cache off. Replayed in ruby:4.0 with\nBundler 2.2.34, it fails with Bundler::GemNotFound.\n\nA step now installs the bundle, frozen to Gemfile.lock. It does not go\nthrough bundler-cache, because a job that publishes should not restore\na cache.\n\nWith the bundle installed, Bundler\u0027s release task would create and push\nthe version tag if it does not exist yet, and then publish. The workflow\ncan be started by hand from any branch, so a run from master would push\na v0.26.0 tag and publish 0.26.0. The job now checks that it runs for a\nrelease tag matching the gemspec version, as release_rust.yml does for\nthe crate, and it gets contents: read, so it cannot push a tag at all.\nPre-releases are skipped, as in the other publishing workflows.\n\ndoc/ReleaseManagement.md gets an entry for the workflow.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "a4f419fe83d243e90964abed55f490c0d0de05a4",
      "tree": "36de53c830cf1b9ec43202f4ea066c6810eac06f",
      "parents": [
        "e2545c27309709e0389d946124b0e4a3667e880c",
        "27e8a425ffb498e190df3a12e239326bf5ba9ed6"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 30 23:52:07 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Oct 01 00:22:31 2026 +0200"
      },
      "message": "Merge branch \u0027release/0.25.0\u0027 into upstream-master\n"
    },
    {
      "commit": "e2545c27309709e0389d946124b0e4a3667e880c",
      "tree": "d72fb6f3c738428a441e6125aebfecfa182afd5e",
      "parents": [
        "7bb0567b642b7cc7bb6096e60b1c2ee1db090ead"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 29 23:30:03 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 30 22:40:16 2026 +0200"
      },
      "message": "THRIFT-3590: Implement interruptChildren() for TPipeServer\nClient: cpp\n\nTPipeServer did not implement interruptChildren(), so TServer::stop() could\nnot end a client that was waiting on a pipe, and serve() did not return while\na client stayed connected.\n\nTPipeServer now shares one event with every pipe it accepts.\ninterruptChildren() sets it. From then on, read() on such a pipe throws\nTTransportException::INTERRUPTED, even when the client has sent data, as it\ndoes on a TSocket that TServerSocket accepted. A write() that waits for the\nclient is interrupted as well. Closing the server sets the event too, again as\nwith TServerSocket, and setInterruptableChildren(false) turns all of this off;\nit must be called before listen(). Anonymous pipes do synchronous I/O and are\nnot interrupted.\n\nThis changes behavior: TServer::stop() now disconnects the clients of a\nTPipeServer instead of waiting for them, as it does for TServerSocket since\nTHRIFT-2441. setInterruptableChildren(false) restores the old behavior.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7bb0567b642b7cc7bb6096e60b1c2ee1db090ead",
      "tree": "de46f4378c6c8c72141edb5f0f6eb3d5c5304086",
      "parents": [
        "9c7d5c5446a416a4d91007215354383e9d5f18ed"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sun Sep 27 21:44:33 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Sep 29 23:27:38 2026 +0200"
      },
      "message": "THRIFT-6392: Stop the D fastest client pool hanging when a child fails early\nClient: d\n\nThe fastest pool stopped registering completion callbacks once it saw a\nchild future that had already completed, assuming that child had set the\nresult. A child that failed with an RPC fault does not set it, so the\nremaining children were never counted and the pool\u0027s future never\ncompleted. client_pool_test hit this in its all-clients-fail case whenever\nthe 1 ms server answered before the pool was constructed.\n\nclient_pool_test now bounds every client wait and socket read, and CI caps\nthe D check step, so a future hang fails in seconds rather than holding the\njob until its 60 minute timeout.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9c7d5c5446a416a4d91007215354383e9d5f18ed",
      "tree": "4082ba713e32ac077f8831dc8310e335e8af5582",
      "parents": [
        "5dddf66f9f65908f5bca79fb9247d125755d4ca1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 29 20:11:34 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Sep 29 23:26:16 2026 +0200"
      },
      "message": "Bump markdown-it from 14.2.0 to 14.3.2 in /lib/js\n\nBumps [markdown-it](https://github.com/markdown-it/markdown-it) from 14.2.0 to 14.3.2.\n- [Changelog](https://github.com/markdown-it/markdown-it/blob/14.3.2/CHANGELOG.md)\n- [Commits](https://github.com/markdown-it/markdown-it/compare/14.2.0...14.3.2)\n\n---\nupdated-dependencies:\n- dependency-name: markdown-it\n  dependency-version: 14.3.2\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "5dddf66f9f65908f5bca79fb9247d125755d4ca1",
      "tree": "25e3562f9fdbcc40171f835f6da13eaf25af184c",
      "parents": [
        "479a5c75ced3d98276a66c06f91e16459a84e9da"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 29 17:59:07 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Sep 29 22:10:23 2026 +0200"
      },
      "message": "Bump markdown-it and jsdoc\n\nBumps [markdown-it](https://github.com/markdown-it/markdown-it) to 14.3.2 and updates ancestor dependency [jsdoc](https://github.com/jsdoc/jsdoc). These dependencies need to be updated together.\n\n\nUpdates `markdown-it` from 12.3.2 to 14.3.2\n- [Changelog](https://github.com/markdown-it/markdown-it/blob/14.3.2/CHANGELOG.md)\n- [Commits](https://github.com/markdown-it/markdown-it/compare/12.3.2...14.3.2)\n\nUpdates `jsdoc` from 4.0.2 to 4.0.5\n- [Release notes](https://github.com/jsdoc/jsdoc/releases)\n- [Changelog](https://github.com/jsdoc/jsdoc/blob/4.0.5/CHANGES.md)\n- [Commits](https://github.com/jsdoc/jsdoc/compare/4.0.2...4.0.5)\n\n---\nupdated-dependencies:\n- dependency-name: markdown-it\n  dependency-version: 14.3.2\n  dependency-type: indirect\n- dependency-name: jsdoc\n  dependency-version: 4.0.5\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "479a5c75ced3d98276a66c06f91e16459a84e9da",
      "tree": "bf8cdcb0e4e32c132854128cf56cbdd43090eefd",
      "parents": [
        "9f5064d306716232410b3d1786e602002e4f0f98"
      ],
      "author": {
        "name": "Johan Nordström",
        "email": "johan.nordstrom@qt.io",
        "time": "Wed Sep 16 13:30:06 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Sep 29 22:10:06 2026 +0200"
      },
      "message": "THRIFT-6329: Keep the TPipe implementation alive while a read or write uses it\nClient: cpp\n\nclose() may run on a different thread than an in-flight read() or write().\nGuard the implementation pointer with a critical section and hand each caller\nits own reference, so that the implementation cannot be destroyed while a call\nis using it.\n\nclose() now detaches the implementation before releasing it and then cancels\nit, so that a read() or write() waiting on the pipe stops waiting for the peer\nand throws TTransportException::INTERRUPTED. Every overlapped wait also watches\na cancel event of the implementation, which is set once and never reset, so a\ncancel that comes before the I/O is issued is not lost. setPipeHandle() does\nthe same with the implementation it replaces. Anonymous pipes use synchronous\nI/O and are not interrupted; their handles stay open until a call in progress\nreturns.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9f5064d306716232410b3d1786e602002e4f0f98",
      "tree": "ab26c3d9e8ef9ac817bf6c5a86726e00b4bba74d",
      "parents": [
        "f82fcec13feea28debf54e2ff7895ebb289b158f"
      ],
      "author": {
        "name": "Hampus Adolfsson",
        "email": "hampus.adolfsson@qt.io",
        "time": "Fri Sep 25 09:42:18 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Mon Sep 28 23:09:58 2026 +0200"
      },
      "message": "THRIFT-6368: Import the parent service with ESM import in js:node,esm output\nClient: js,nodejs\n\nWith js:node,esm a service that extends another service imported its\nparent with require(), which throws \"require is not defined in ES\nmodule scope\" when Node loads the .mjs file. Emit a namespace import\ninstead, matching how the _types import is already handled.\n\nGenerated-by: Claude Opus 5.5 (Claude Code)\n"
    },
    {
      "commit": "f82fcec13feea28debf54e2ff7895ebb289b158f",
      "tree": "3d9b07ed7325472a7137bba045c39e50be5badfa",
      "parents": [
        "43ea5d0e32d38e53d8b98ba43a5eeea84079630e"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sun Sep 27 12:23:32 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 22:45:47 2026 +0200"
      },
      "message": "THRIFT-6381: Publish sha256 and sha512 checksums instead of md5 and sha1 [skip ci]\nClient: doc\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "43ea5d0e32d38e53d8b98ba43a5eeea84079630e",
      "tree": "0fae1666829c478fbb3fdae7b43147feaf2e8aa2",
      "parents": [
        "2e7cf9f991ca4bb6baaf1d26a36b99fca1867a2b"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 27 15:26:11 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 18:19:47 2026 +0200"
      },
      "message": "Correct the comment on the default of BUILD_SHARED_LIBS\nClient: build\n\nThe comment said that Windows builds default to static libraries and\nthat shared ones need work. The first part stopped being true with\n1e243a76b, which made shared libraries the default on Windows and\nstatic libraries the default elsewhere, and left the comment as it was.\nBoth AppVeyor jobs build shared libraries on Windows and pass their\ntests.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "2e7cf9f991ca4bb6baaf1d26a36b99fca1867a2b",
      "tree": "dfb0da30bc8c7cd79ed672541b1e8c6850de028b",
      "parents": [
        "68adf62cd1a1936caf5999e6ec5c43d9044c5e31"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 27 13:01:27 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 17:58:02 2026 +0200"
      },
      "message": "THRIFT-6376: Run the netstd tutorial in CI\nClient: netstd\n\nsmoketest.sh starts the tutorial server and runs the client against it\nwith -mc:2, once for each transport and with the compact and JSON\nprotocols, the buffered and framed transports and multiplexing. \"make\ncheck\" in tutorial/netstd runs it, and so does a new step in the\nlib-netstd job.\n\nThe client now exits with 1 when one of its clients fails. It used to\nlog the error and exit with 0, so a script could not tell a failed run\nfrom a good one.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "68adf62cd1a1936caf5999e6ec5c43d9044c5e31",
      "tree": "df335eefc6ed0b65a4d010db657123f2426c721f",
      "parents": [
        "f9b508e74ec345fdc89418c38a275bc4b13dd5c8"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 27 15:15:06 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 17:47:46 2026 +0200"
      },
      "message": "THRIFT-6390: Update the MSYS2 build instructions for UCRT64 [skip ci]\n\nThe instructions built in the MINGW64 environment, which MSYS2 is\nphasing out. They now build in UCRT64, as the AppVeyor MINGW job has\ndone since THRIFT-6373, with the packages and compiler paths the job\nuses.\n\nThey also passed -DWITH_SHARED_LIB\u003dOFF -DWITH_STATIC_LIB\u003dON, which\nCMake reports as deprecated, and -DWITH_PERL\u003dOFF, which is not a CMake\noption. They passed -DWITH_LIBEVENT\u003dOFF with a note that libevent does\nnot work, while the AppVeyor job builds with libevent and passes the\nnon-blocking server tests. The pointer to THRIFT-4046, fixed in 0.11.0,\nand the 2016 MSYS2 distribution named as the tested version give way to\nthe AppVeyor job as the tested reference.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f9b508e74ec345fdc89418c38a275bc4b13dd5c8",
      "tree": "db9e4047f4bb44e52c39d46b4323af7c9803f2da",
      "parents": [
        "c21dd251c383845dfa11994e65e743eee94f6792"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 27 10:55:06 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 13:52:01 2026 +0200"
      },
      "message": "THRIFT-6373: Build the AppVeyor MINGW job in UCRT64\nClient: build\n\nMSYS2 is phasing out its MINGW64 environment: since 2026-03-15 no new\npackages are added to it, and existing leaf packages may be removed if\nissues arise. The MINGW job built the compiler and the C++ library\nthere. It now builds in UCRT64, which carries the same versions of the\ntoolchain, Boost, CMake, libevent, OpenSSL and zlib. An x86 build, which\nthe matrix does not have, stays in MINGW32, the only 32-bit environment\nMSYS2 has left.\n\nThe job also stops upgrading the MINGW64 and MINGW32 packages that come\npreinstalled on the AppVeyor image and that the build does not use.\nMSYS2 removes packages from both environments, and an installed package\nthat has gone from the repository while it requires an exact version of\nanother one makes the whole upgrade fail. That happened on 2026-09-26\nwith mingw-w64-i686-gdb-multiarch, which gdb 18.1 no longer provides\nfor MINGW32. Leaving the two environments out also saves about 250 MiB\nof downloads.\n\nThe package list also named mingw-w64-x86_64-toolchain explicitly, on\ntop of the environment\u0027s own toolchain. That entry is gone.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c21dd251c383845dfa11994e65e743eee94f6792",
      "tree": "6cfe43b425310ed4b6f51224c65052c7ff1dbf7e",
      "parents": [
        "240728472c07696c6162b58de69b9270957bccaa"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 27 11:59:53 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 12:28:12 2026 +0200"
      },
      "message": "THRIFT-6375: Give each netstd tutorial client its own transport\nClient: netstd\n\nWith -mc greater than 1, all clients ran over the one transport and\nprotocol that RunAsync() created, so none of them completed its calls.\nCreate a transport and a protocol for each client inside the loop, as\nthe tutorial did before 0d12832d.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "240728472c07696c6162b58de69b9270957bccaa",
      "tree": "8f92b0327465db6b6528a9377326001615e2b7ae",
      "parents": [
        "bcdf956895aeac5411ce3029ab8b33901b7c7a36"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 27 11:12:00 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Sep 27 12:25:55 2026 +0200"
      },
      "message": "THRIFT-6374: Make the netstd tutorial HTTP server start\nClient: netstd\n\nUseMiddleware\u003cTHttpServerTransport\u003e() left ASP.NET Core only the\nRequestDelegate to match, and all three public THttpServerTransport\nconstructors accept one, so the host stopped at startup. The tutorial\nnow also passes the processor and a TConfiguration.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bcdf956895aeac5411ce3029ab8b33901b7c7a36",
      "tree": "1254eedbf3862f30daa1173ac3b51a9ff8fb36f6",
      "parents": [
        "e9bfabd0eab4a54d14491c233c75d597ac55d3aa"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:49:02 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 22:28:18 2026 +0200"
      },
      "message": "THRIFT-6341: Alias a D service\u0027s exceptions in the order they are first thrown\nClient: d\n\nThey were collected in a std::set\u003ct_type*\u003e, so the alias lines came out\nin pointer order and the generated file differed between runs.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e9bfabd0eab4a54d14491c233c75d597ac55d3aa",
      "tree": "aad35a7483ff36804d27814cdb3484679c4b8aef",
      "parents": [
        "3f55d0c13f17ba9d7487b46fc1d80cb1792b1e42"
      ],
      "author": {
        "name": "Klemen Košir",
        "email": "klemen.kosir@kream.io",
        "time": "Sun Sep 27 05:26:31 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 26 22:26:31 2026 +0200"
      },
      "message": "THRIFT-4564: Correctly reset the transport in NodeJS (#3919)\n\n* THRIFT-4564: Correctly reset the transport in NodeJS\nClient: nodejs"
    },
    {
      "commit": "3f55d0c13f17ba9d7487b46fc1d80cb1792b1e42",
      "tree": "f7fd9bcf616ec8a6e2c66deecedc56b0177ac5ca",
      "parents": [
        "98dfc1bfbcc3d73576dce60fedf6f3f6b3b5684c"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:49:01 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 22:25:24 2026 +0200"
      },
      "message": "THRIFT-6338: Emit each enum once in the Smalltalk generator\nClient: st\n\ninit_generator generated every enum and t_generator::generate_program\ngenerated them all again.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "98dfc1bfbcc3d73576dce60fedf6f3f6b3b5684c",
      "tree": "2b8daa63e83fbdfa538e750c2e1d5e4b517610e5",
      "parents": [
        "7b6ce7e2221ad9f833e81b20bec0d7ad460e2c19"
      ],
      "author": {
        "name": "Volodymyr Panivko",
        "email": "sveneld300@gmail.com",
        "time": "Wed Sep 23 16:21:02 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 21:51:40 2026 +0200"
      },
      "message": "THRIFT-6372: Make PHP redirect helpers instance methods\nClient: php\n\nGenerated-by: Codex (GPT-6)\n"
    },
    {
      "commit": "7b6ce7e2221ad9f833e81b20bec0d7ad460e2c19",
      "tree": "7ec1eb0ede380621ceedae2f28bf427c88133912",
      "parents": [
        "40ff4f631ec45f9a3d63ad493a7ad5aad31618bb"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Mon Sep 14 23:27:07 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 21:46:20 2026 +0200"
      },
      "message": "THRIFT-6108: Omit the empty first line of netstd exception-only docs\nClient: netstd\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "40ff4f631ec45f9a3d63ad493a7ad5aad31618bb",
      "tree": "6c5d9f14d27c253f4bea515d262bf2148ed48d7b",
      "parents": [
        "3848cffd8ef40aa56d151f0a61e06ccca377925a"
      ],
      "author": {
        "name": "Viacheslav Koryagin",
        "email": "viacheslavkoryagin@gmail.com",
        "time": "Thu Jul 23 15:17:49 2026 +0300"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 21:46:20 2026 +0200"
      },
      "message": "THRIFT-6108: implemented exception documentation generation\nClient: cpp,haxe,java,javame,kotlin,netstd,py\n"
    },
    {
      "commit": "3848cffd8ef40aa56d151f0a61e06ccca377925a",
      "tree": "169e6858d23053f2727b24786b1c1a49fba96273",
      "parents": [
        "609d5c83bde733898664c98ebf2f0c92e4a0f793"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:49:01 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 21:44:47 2026 +0200"
      },
      "message": "THRIFT-6336: Render a uuid constant as its value in the JavaScript generator\nClient: js\n\nThe TYPE_UUID case streamed the t_const_value pointer, so the generated\nconstant was a different address on every run.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "609d5c83bde733898664c98ebf2f0c92e4a0f793",
      "tree": "97382dcedbc80d9d23a0f29882f299623ba6e3c0",
      "parents": [
        "2299ea815e8d64f60a96db81478cb6b2f06e8716"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Sep 26 18:12:29 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sat Sep 26 21:42:43 2026 +0200"
      },
      "message": "THRIFT-6371: Quote a uuid constant in the Lua generator\nClient: lua\n\nrender_const_value wrote the value of a uuid constant without quotes, so\nthe generated TUUIDfromString(...) call did not parse. It now writes the\nescaped value as a string, as the other generators do. The new test\nswitches the Lua generator on in the compiler unit tests.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "27e8a425ffb498e190df3a12e239326bf5ba9ed6",
      "tree": "8a45c7a6c8764d911948f7426b8c96e249d8eb72",
      "parents": [
        "e6f57e24f649c7e4f011fdc61185daca46e97626"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:58:25 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 18:50:31 2026 +0200"
      },
      "message": "THRIFT-6367: Cap the message name in the Erlang binary and compact protocols\nClient: erl\n\nmessage_begin of thrift_binary_protocol and thrift_compact_protocol now\nreads the declared length of the name first and refuses a name longer than\n?MAX_MESSAGE_NAME_SIZE (4096 bytes) before reading it, with\n{error, {message_name_exceeds_maximum, 4096}}. A name the processor can\ndispatch is at most 255 characters for the function, plus a service name\nand a \u0027:\u0027 for a multiplexed service.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "2299ea815e8d64f60a96db81478cb6b2f06e8716",
      "tree": "3a461b57e700770ed689fdb39bbd011a75ece602",
      "parents": [
        "d717106c897f8494197b57c46cc459e7533aaded"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:58:25 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Sep 24 18:48:22 2026 +0200"
      },
      "message": "THRIFT-6367: Cap the message name in the Erlang binary and compact protocols\nClient: erl\n\nmessage_begin of thrift_binary_protocol and thrift_compact_protocol now\nreads the declared length of the name first and refuses a name longer than\n?MAX_MESSAGE_NAME_SIZE (4096 bytes) before reading it, with\n{error, {message_name_exceeds_maximum, 4096}}. A name the processor can\ndispatch is at most 255 characters for the function, plus a service name\nand a \u0027:\u0027 for a multiplexed service.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e6f57e24f649c7e4f011fdc61185daca46e97626",
      "tree": "87f4e5a8a9991f5f1af5015f36f4ce7a07abeb47",
      "parents": [
        "27fa70442bccdf981d72b1e57d1080646cb5e360"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:44:32 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:44:33 2026 +0200"
      },
      "message": "Collect JSON strings in chunks; bound numbers and message names\nClient: erl\n\nthrift_json_parser collects the characters of a string in lists of up to\n256 and turns each list into a UTF-8 chunk, and it refuses a number of more\nthan 1024 characters before collecting its digits. read_all/1 of\nthrift_json_protocol joins what it reads into 64 KiB chunks as it goes, and\nmessage_begin refuses a name longer than ?MAX_MESSAGE_NAME_SIZE (4096 bytes)\nwith {error, {message_name_exceeds_maximum, 4096}}.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d717106c897f8494197b57c46cc459e7533aaded",
      "tree": "f116415338cde88520e0d989f139f950c7f653ef",
      "parents": [
        "af15d9c3b1344d78e037c025662dde558e02cb96"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:44:32 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:44:32 2026 +0200"
      },
      "message": "Collect JSON strings in chunks; bound numbers and message names\nClient: erl\n\nthrift_json_parser collects the characters of a string in lists of up to\n256 and turns each list into a UTF-8 chunk, and it refuses a number of more\nthan 1024 characters before collecting its digits. read_all/1 of\nthrift_json_protocol joins what it reads into 64 KiB chunks as it goes, and\nmessage_begin refuses a name longer than ?MAX_MESSAGE_NAME_SIZE (4096 bytes)\nwith {error, {message_name_exceeds_maximum, 4096}}.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "27fa70442bccdf981d72b1e57d1080646cb5e360",
      "tree": "21c68736da26223d55f4cc2bdff805fede87f7b3",
      "parents": [
        "02b7d4dd3eed5f35165bd51eac99ebf053c62ea4"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:15:38 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:31:04 2026 +0200"
      },
      "message": "THRIFT-6366: Bound the message size in the Erlang binary and compact protocols\nClient: erl\n\nthrift_binary_protocol and thrift_compact_protocol now read a message only\nup to max_message_size: the option of new/2 or of the protocol factory, or\nelse the thrift application\u0027s max_message_size (100 MB by default) as it is\nwhen the protocol is created.\n\nEach read takes its bytes from what the message may still take, before they\nare read, so a string whose declared length would take the message past the\nmaximum is refused on its length alone. message_begin sets that budget and\nmessage_end clears it; between messages each read is held to the maximum on\nits own. A refusal is {error, {message_size_exceeds_maximum, Max}}, which\nmessage_begin now returns instead of failing a match.\n\nthrift_client_util passes a max_message_size client option on to the\nprotocol, and the binary, compact and JSON protocol factories accept it.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "af15d9c3b1344d78e037c025662dde558e02cb96",
      "tree": "8ed47ceebef5144f03f43c7019ac67cec0b00b59",
      "parents": [
        "8479a3de2ca89ca744244d106c2f29e4517418d2"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:15:38 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Sep 24 00:28:22 2026 +0200"
      },
      "message": "THRIFT-6366: Bound the message size in the Erlang binary and compact protocols\nClient: erl\n\nthrift_binary_protocol and thrift_compact_protocol now read a message only\nup to max_message_size: the option of new/2 or of the protocol factory, or\nelse the thrift application\u0027s max_message_size (100 MB by default) as it is\nwhen the protocol is created.\n\nEach read takes its bytes from what the message may still take, before they\nare read, so a string whose declared length would take the message past the\nmaximum is refused on its length alone. message_begin sets that budget and\nmessage_end clears it; between messages each read is held to the maximum on\nits own. A refusal is {error, {message_size_exceeds_maximum, Max}}, which\nmessage_begin now returns instead of failing a match.\n\nthrift_client_util passes a max_message_size client option on to the\nprotocol, and the binary, compact and JSON protocol factories accept it.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "02b7d4dd3eed5f35165bd51eac99ebf053c62ea4",
      "tree": "9e9fcc8dc00bd222cb7873d7937b9c27d07d0a3a",
      "parents": [
        "e9360fe4834e3437444381169b206fcb3c03ef7f"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:15:47 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:16:40 2026 +0200"
      },
      "message": "Updated CHANGES.md\n"
    },
    {
      "commit": "8479a3de2ca89ca744244d106c2f29e4517418d2",
      "tree": "d1ab79692a9490da65e0734a701266b8fe8fed1d",
      "parents": [
        "eddc8a4439060db88b19c4147efd1374dc40b409"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:53:26 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:07:20 2026 +0200"
      },
      "message": "Bound the size of a message thrift_json_protocol reads\nClient: erl\n\nread_all/1 now reads a message only up to the thrift application\u0027s\nmax_message_size, the setting thrift_http_transport already uses (100 MB by\ndefault), or up to a max_message_size option given to\nthrift_json_protocol:new/2. A longer message is refused before more than the\nmaximum has been read, with {error, {message_size_exceeds_maximum, Max}},\nwhich thrift_processor answers by closing the connection.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e9360fe4834e3437444381169b206fcb3c03ef7f",
      "tree": "765fca3a2168c44e07b7ca1bdc890073bee6f09f",
      "parents": [
        "2c09024bde00de4e3cb0c77a371880fae3882171"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:13:15 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Sep 24 00:06:10 2026 +0200"
      },
      "message": "THRIFT-6365: Add a container-size limit to the Lua protocols\nClient: lua\n\nThe binary, compact and JSON protocols refused only a negative list, set or\nmap size, and the generated code reads one element per declared element.\nLua has no MaxMessageSize that would bound the count otherwise, so the new\nlimit gets a finite default instead of the \"no limit of its own\" default\nTHRIFT-6291 gives MaxContainerSize.\n\n- TProtocol.lua: DEFAULT_MAX_CONTAINER_SIZE \u003d 16384000, the value of the\n  string and frame size limits, and TProtocolBase:checkContainerSize().\n  maxContainerSize on a protocol instance overrides the default; zero or\n  less switches the limit off.\n- readListBegin, readSetBegin and readMapBegin of TBinaryProtocol,\n  TCompactProtocol and TJSONProtocol call it before any element is read.\n- doc/specs/thrift-tconfiguration.md records the finite Lua default and the\n  reason.\n- test/test_container_limits.lua covers the three protocols for list, set\n  and map, at the limit and one over it, the default, the off values and\n  skip. Its pure-Lua stand-in for libluabpack gains the int8_t wrap of \u0027c\u0027\n  and toVarint32, which the compact protocol needs.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "eddc8a4439060db88b19c4147efd1374dc40b409",
      "tree": "807142a212c10475383df2f6007240f1a2580844",
      "parents": [
        "00d7ed17592add2ef134a974b685b4885cee64e2"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:13:15 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Sep 24 00:00:24 2026 +0200"
      },
      "message": "THRIFT-6365: Add a container-size limit to the Lua protocols\nClient: lua\n\nThe binary, compact and JSON protocols refused only a negative list, set or\nmap size, and the generated code reads one element per declared element.\nLua has no MaxMessageSize that would bound the count otherwise, so the new\nlimit gets a finite default instead of the \"no limit of its own\" default\nTHRIFT-6291 gives MaxContainerSize.\n\n- TProtocol.lua: DEFAULT_MAX_CONTAINER_SIZE \u003d 16384000, the value of the\n  string and frame size limits, and TProtocolBase:checkContainerSize().\n  maxContainerSize on a protocol instance overrides the default; zero or\n  less switches the limit off.\n- readListBegin, readSetBegin and readMapBegin of TBinaryProtocol,\n  TCompactProtocol and TJSONProtocol call it before any element is read.\n- doc/specs/thrift-tconfiguration.md records the finite Lua default and the\n  reason.\n- test/test_container_limits.lua covers the three protocols for list, set\n  and map, at the limit and one over it, the default, the off values and\n  skip. Its pure-Lua stand-in for libluabpack gains the int8_t wrap of \u0027c\u0027\n  and toVarint32, which the compact protocol needs.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "00d7ed17592add2ef134a974b685b4885cee64e2",
      "tree": "b3b505f076edbd1a443428239580c9853f33397e",
      "parents": [
        "87fe0a6f9ceeef96863d226937d6b88de56388e7"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:49:35 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 23:57:39 2026 +0200"
      },
      "message": "List the TJSONProtocol and TCurlClient changes under 0.25.0 in the PHP README [skip ci]\n\nBoth changes ship in 0.25.0, since master was merged into release/0.25.0\nfor RC-1. This makes lib/php/README.md the same as on release/0.25.0.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "2c09024bde00de4e3cb0c77a371880fae3882171",
      "tree": "96e33c2d92e8951b0cddd7a2befeaadcb944e53e",
      "parents": [
        "74a4f3e13fb923bb842fd7ce60565f39c5a68f3e"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:53:26 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:55:34 2026 +0200"
      },
      "message": "Bound the size of a message thrift_json_protocol reads\nClient: erl\n\nread_all/1 now reads a message only up to the thrift application\u0027s\nmax_message_size, the setting thrift_http_transport already uses (100 MB by\ndefault), or up to a max_message_size option given to\nthrift_json_protocol:new/2. A longer message is refused before more than the\nmaximum has been read, with {error, {message_size_exceeds_maximum, Max}},\nwhich thrift_processor answers by closing the connection.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "74a4f3e13fb923bb842fd7ce60565f39c5a68f3e",
      "tree": "bb286fa9f32cf5c590b3d95866c162a5d8b66de2",
      "parents": [
        "3bd6bfbe6b0072ebc18c16a18e7479431c4c2747"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:17:54 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 23:17:54 2026 +0200"
      },
      "message": "Updated CHANGES.md\n"
    },
    {
      "commit": "3bd6bfbe6b0072ebc18c16a18e7479431c4c2747",
      "tree": "678c0d4b9ddb1a6bb0133d353099c708c123c903",
      "parents": [
        "04502bd39348fa2ffe5bc77e6fee362870816192"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 22:56:17 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 22:56:17 2026 +0200"
      },
      "message": "keep branch at 0.25.0\n"
    },
    {
      "commit": "04502bd39348fa2ffe5bc77e6fee362870816192",
      "tree": "bd28606ffb51299360ec80639ee1b9b53fde601b",
      "parents": [
        "6dcc437b40041216e7c0ce589fbd65c0cd39e3b0"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 22:49:23 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 22:49:23 2026 +0200"
      },
      "message": "keep branch at 0.25.0\n"
    },
    {
      "commit": "6dcc437b40041216e7c0ce589fbd65c0cd39e3b0",
      "tree": "4d99722a186605957527e6d044901e50e15c9930",
      "parents": [
        "ff73fd3a7b392b5e33ec78eec4ac716fca639a7d",
        "87fe0a6f9ceeef96863d226937d6b88de56388e7"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 22:48:41 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 22:48:41 2026 +0200"
      },
      "message": "Merge branch \u0027master\u0027 into release/0.25.0\n"
    },
    {
      "commit": "87fe0a6f9ceeef96863d226937d6b88de56388e7",
      "tree": "ec39353cffc0db922b961cffaae62705a4b5a4eb",
      "parents": [
        "6f240e91d1c94fbdb7c20164614d297a12f689f0"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:49:02 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 22:00:16 2026 +0200"
      },
      "message": "THRIFT-6342: Render i8 and i16 constants as plain integers in the Haxe generator\nClient: haxe\n\nrender_const_value wrote (byte)N and (short)N for i8 and i16 values, in\nconstants and container literals alike. Neither cast is Haxe, and both\ntypes map to haxe.Int32.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "6f240e91d1c94fbdb7c20164614d297a12f689f0",
      "tree": "f06174f4155707da30db8ccee8c6987c7474fca5",
      "parents": [
        "ba4ed0b1ac222b3f15ffb809fdd6168db6ad8ebb"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:35:39 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 21:58:51 2026 +0200"
      },
      "message": "THRIFT-6344: D generator: fix the trailing space in the \"macro\" reserved word\nClient: d\n\nThe entry was \"macro \" so a field or function named macro was never\nescaped.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ba4ed0b1ac222b3f15ffb809fdd6168db6ad8ebb",
      "tree": "f44b5b9eb45f76f6d06bafcc2a0c6c22257ce916",
      "parents": [
        "f5fcbb1fc6d5cb9d1b60f668cc0c0306f47956d1"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:35:40 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 21:58:16 2026 +0200"
      },
      "message": "THRIFT-6345: Lua generator: fix error messages copied from the PHP generator\nClient: lua\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f5fcbb1fc6d5cb9d1b60f668cc0c0306f47956d1",
      "tree": "0830744e76387c221a784d3d970e5fff40c71e15",
      "parents": [
        "56e70b16feaa4371cbb2d5f9fa51983a6ced14d2"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Mon Sep 21 22:35:41 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 21:56:04 2026 +0200"
      },
      "message": "THRIFT-6346: Remove dead code from the Java ME, Dart, Mermaid and XSD generators\nClient: javame,dart,mmd,xsd\n\ngenerate_generic_field_getters_setters wrote to local streams that\nwere never emitted; get_java_type_string, generate_field_value_meta_data\nand get_dart_type_string had no callers; mmd assigned service_name_\nright after t_generator::generate_program had; xsd stored an exception\nfield\u0027s type as t_struct* through a C-style cast although the type can\nbe a typedef, and only read it as t_type*. No output changes.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "56e70b16feaa4371cbb2d5f9fa51983a6ced14d2",
      "tree": "5fabaad5f4604d2078b10e1b7110812900827fee",
      "parents": [
        "e6f28b16edacddc8979bf4e0cd35cc7f4c52b9de"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 07:02:41 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 12:36:22 2026 +0200"
      },
      "message": "Bump @babel/core from 7.8.4 to 7.29.7\n\nBumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.8.4 to 7.29.7.\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v7.29.7/packages/babel-core)\n\n---\nupdated-dependencies:\n- dependency-name: \"@babel/core\"\n  dependency-version: 7.29.7\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "e6f28b16edacddc8979bf4e0cd35cc7f4c52b9de",
      "tree": "edc07caa80d7b87b321c34fd80ca46ef69e61583",
      "parents": [
        "77f64cf36db060cc171c0f76012c91171f265644"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:31:31 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 08:53:49 2026 +0200"
      },
      "message": "THRIFT-6361: Add a GitHub Actions CI job for the C (GLib) library\nClient: build,c_glib\n\nBuild lib/c_glib and run the tests in lib/c_glib/test, which CI has not\nrun so far. C++ is enabled as well: configure looks for zlib only then,\nand two of the tests are C++ interop clients. The job runs on\nubuntu-22.04 until THRIFT-5680 is fixed, so the compiler job now also\nuploads its ubuntu-22.04 build; the ubuntu-24.04 one needs glibc 2.38.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "77f64cf36db060cc171c0f76012c91171f265644",
      "tree": "8ba7f3dd2c521676e8126bd453ab4c3c3f65f923",
      "parents": [
        "0ee89659036309a7ff2b01221369ace4eb7a4daa"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:39:33 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 02:17:34 2026 +0200"
      },
      "message": "THRIFT-6362: Follow redirects in TCurlClient only within the configured origin\nClient: php\n\nSince TCurlClient stopped letting curl follow redirects, every reply with\na 3xx status fails the request, including a redirect to another path on\nthe same server.\n\nflush() now follows one redirect itself, and only when it stays within\nthe origin of the configured URL, that is the same scheme, host and port:\nit sends the request again, with its headers and body, to the path and\nquery of the redirect target under the configured scheme, host and port.\nA redirect to another origin still fails the request with a\nTTransportException, as a redirect does in THttpClient.\n\ncurl_close() is no longer called. It has had no effect since PHP 8.0,\nand PHP 8.5 deprecates it, which failed the new redirect test there.\nDropping the reference frees the handle.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0ee89659036309a7ff2b01221369ace4eb7a4daa",
      "tree": "66699486faf92ca11244c422608c16d75de4971c",
      "parents": [
        "63d9169d2781220aa832d2196c7856db50de387d"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:06:53 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Sep 23 02:17:25 2026 +0200"
      },
      "message": "THRIFT-5881: Chain up to the parent finalize in c_glib\nClient: c_glib\n\nThe finalize function the generator writes for structs and exceptions,\nincluding the argument and result structs of service methods, released\nthe members but never called the parent class\u0027s finalize. GObject\u0027s own\nfinalize therefore never ran for these objects, and it is the step that\nreleases the data kept with an instance: anything attached with\ng_object_set_data_full(), and what g_object_unref() stores there itself\nwhile it disposes of the object. With GLib 2.72 that is 48 bytes for\nevery generated object that is destroyed. The generated class_init now\nremembers the parent class, and the generated finalize chains up to it\nas its last step.\n\nThriftApplicationException and the buffered, fd, framed, memory buffer,\nserver socket, socket and zlib transports had the same gap, and\nThriftSSLSocket chained up into ThriftSocket\u0027s finalize, where the chain\nstopped. Each of these finalize functions now chains up as its last step\nas well.\n\ntestfinalize covers a generated struct and exception and the classes of\nthe core library; the zlib transport is covered in testzlibtransport,\nwhich is only built with zlib support.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "63d9169d2781220aa832d2196c7856db50de387d",
      "tree": "a642cc9876cf14f069f19cd4e780ee69255595ea",
      "parents": [
        "5800c3c903865edc103c8872e4c1aa5b7eb4fb5f"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:38:52 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:51:45 2026 +0200"
      },
      "message": "Link the memory buffer into testzlibtransport\nClient: c_glib\n\ntestzlibtransport.c creates ThriftMemoryBuffer objects since cbfb46b7f,\nbut testzlibtransport_LDADD in lib/c_glib/test/Makefile.am did not list\nthe memory buffer object, so the autotools build of the test stopped\nwith an undefined reference to thrift_memory_buffer_get_type. The CMake\nbuild links the whole library and was not affected.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5800c3c903865edc103c8872e4c1aa5b7eb4fb5f",
      "tree": "fc6ab7ffb6dc5419e753cc6157f2e4fe29db98d9",
      "parents": [
        "bfd675f51c5f4910adc7f9f5a2fff3ffd6fa1c07"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:17:31 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:28:18 2026 +0200"
      },
      "message": "Send socket buffers by position\nClient: perl\n\nThrift::Socket::write() drops the bytes each send took from the front of its\nbuffer in place instead of copying the unsent rest after every partial send,\nand the __send() of Thrift::Socket and Thrift::SSLSocket pass that buffer on\nwithout copying it. A write that takes many partial sends, as a TLS socket\ndoes with one record per call, now takes time in proportion to its size.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bfd675f51c5f4910adc7f9f5a2fff3ffd6fa1c07",
      "tree": "3a91dba72c656d70e05d3f2ed6af422fb0383965",
      "parents": [
        "b23659e7f4bef4c0ee67a92060ac98534e68fe90"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:03:29 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:05:50 2026 +0200"
      },
      "message": "Read framed buffers by position\nClient: perl\n\nThrift::FramedTransport keeps the current frame as it arrived and tracks how\nmuch of it read() has returned, so reading a frame a few bytes at a time\ntakes time in proportion to its size. The frame is released once it has\nbeen read.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b23659e7f4bef4c0ee67a92060ac98534e68fe90",
      "tree": "3fba9414cc0aaa0826f091cf9cce2d41036f0a94",
      "parents": [
        "989824bb8f605e1727c6dcfa9621e264149d0cd5"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:08:31 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:02:13 2026 +0200"
      },
      "message": "Keep the thread pool server accepting after a connection fails to set up\nClient: rs\n\nTServer\u0027s listen loops returned from listen() when a connection they had\naccepted could not be set up, for example because its stream could not be\nduplicated while the process was out of file descriptors, and a Unix\ndomain socket connection panicked in that case. The loops now log such a\nconnection, drop it and go on accepting, as they already do after a\nfailed accept.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "989824bb8f605e1727c6dcfa9621e264149d0cd5",
      "tree": "e4638451e858bb1bdf2260eac4ca68c225904b5f",
      "parents": [
        "cbfb46b7f0c37b974e171ebb62fcea7d818d73dc"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:08:40 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:01:35 2026 +0200"
      },
      "message": "Apply the recursion limit on the dynamic read and write paths\nClient: py\n\nClasses generated with py:dynamic have no read() or write() of their own:\nTBase hands them to TProtocolBase.readStruct() and writeStruct() whenever\nthe C extension does not take over. Those two methods now count the struct\ndepth the way the generated read() and write() do, with the same default\nof 64 and the same TProtocolException(DEPTH_LIMIT).\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cbfb46b7f0c37b974e171ebb62fcea7d818d73dc",
      "tree": "039085ecf647368170756d915b976585cc508d37",
      "parents": [
        "d91521170a396011ef23a77e3a0e06f2c58caf01"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:30:00 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 01:01:11 2026 +0200"
      },
      "message": "Write out all of the data the zlib transport compresses\nClient: c_glib\n\nWhen the compressed write buffer filled up, flush_to_zlib() wrote it to the\nunderlying transport and then stopped, so the input deflate() had not\nreached yet was never compressed. Any write or flush whose compressed form\nwas larger than the buffer, 1024 bytes by default, lost data while\nreporting success. It now goes on deflating until the input is used up, as\nTZlibTransport::flushToZlib() does in C++.\n\nA failed write of the underlying transport in that loop, and a failure of\nflush_to_zlib() in flush(), are now returned to the caller as well.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d91521170a396011ef23a77e3a0e06f2c58caf01",
      "tree": "412d5ce49cae9fbd9bb1f21491a78be21ff398c6",
      "parents": [
        "b31b99807ad48a3a835d6a396e6d8ce93af6f0ec"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:32:18 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:55:46 2026 +0200"
      },
      "message": "Report a failed write or flush of the framed transport\u0027s frame\nClient: c_glib\n\nthrift_framed_transport_flush() ignored the results of the underlying\ntransport\u0027s write() and flush() and returned TRUE, so a frame that never\nreached the underlying transport was reported as sent, and the second call\ncould set a GError over the first. It now returns FALSE when either fails,\nand does not flush after a failed write.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b31b99807ad48a3a835d6a396e6d8ce93af6f0ec",
      "tree": "68857781021f0de8ac5cda8ef5603a3ec6194efa",
      "parents": [
        "cf5ce7f37477ff42c20b8c382b4c007267f00b17"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:04:13 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:55:21 2026 +0200"
      },
      "message": "Collect the frames of a framed read_exact before flattening them\nClient: erl\n\nread_exact/2 on a framed transport flattened everything it had collected\nagain for every frame it added, so a read spanning many frames copied the\ndata once per frame. It now collects the frames with their total size and\nflattens them once there are enough bytes.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cf5ce7f37477ff42c20b8c382b4c007267f00b17",
      "tree": "aa3e743c0555ebfe261889f24ebfedf75ef70ff9",
      "parents": [
        "fd57bb32c0e3202a455e76258df082188d1f76d1"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 14:25:31 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:54:38 2026 +0200"
      },
      "message": "Write and read JSON escapes and base64 correctly\nClient: lua\n\nEncode binary in three-byte groups so the base64 output is valid; escape a\nbackslash on write; format an escaped control byte through the hex helper;\nmatch the escape character on read by value rather than as a pattern; and\nkeep the byte a \\u00XX escape decodes to. Adds a round-trip test over a\nmemory buffer for strings with quotes, backslashes, control bytes and\n\\u00XX escapes and for binary of every length and byte value.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "fd57bb32c0e3202a455e76258df082188d1f76d1",
      "tree": "ae49aaab1067735e6a0b97341ba2af4e89e1e73c",
      "parents": [
        "bdcb0b8865aafe0ad61838a57256f5e027377a37"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:09:45 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:54:06 2026 +0200"
      },
      "message": "Count the recursion depth on the inlined read path\nClient: php\n\nThe struct readers of code generated with \"--gen php:inlined\" and\nTProtocol::skipBinary() now count the nesting depth on the transport they\nread from, with the same limit, DEFAULT_RECURSION_DEPTH, and the same\nTProtocolException (DEPTH_LIMIT) as the other generated modes and skip().\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bdcb0b8865aafe0ad61838a57256f5e027377a37",
      "tree": "30afa14b9ce081de619d6f4f96db759fc4e69f59",
      "parents": [
        "e94803e2f1f6674870ffdbab8131186edf84c926"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:14:51 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:53:45 2026 +0200"
      },
      "message": "Keep serving after a connection fails\nClient: perl\n\nSimpleServer now wraps each client\u0027s setup, dispatch and close in one guard:\nwhatever ends a connection ends only that connection, which is closed before\nthe server goes on accepting.\n\nForkingServer now checks the result of fork(): when it fails, the connection\nis closed and the parent keeps accepting.\n\ntryClose moves to the Thrift::Server base class so both servers share it.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e94803e2f1f6674870ffdbab8131186edf84c926",
      "tree": "361c6f2796c50ce900fe6cfaf4a518f42d34a6c3",
      "parents": [
        "3be674a87064587b8a35099c2335c08eb7023986"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:14:13 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:53:23 2026 +0200"
      },
      "message": "Apply the recursion limit when reading structs\nClient: erl\n\nthrift_protocol:read/2 now counts the nesting depth of the structs and\ncontainers it reads and stops with {protocol_error,\nmax_skip_depth_exceeded} beyond ?DEFAULT_RECURSION_DEPTH, the limit\nskip/2 already applies to the fields it walks.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "3be674a87064587b8a35099c2335c08eb7023986",
      "tree": "edb84e24e32c2168aab8720a66b0e436062d2a53",
      "parents": [
        "93e33392b707502396c83d68c96d1c8e3aad4963"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:15:39 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:53:00 2026 +0200"
      },
      "message": "Keep serving after a connection fails\nClient: rb\n\nA failure while serving one client now ends only that client\u0027s connection:\nSimpleServer logs it, closes the connection and keeps accepting clients.\nBaseServer gains an optional logger for that message.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "93e33392b707502396c83d68c96d1c8e3aad4963",
      "tree": "d48fad468f1f80ba9f8a4006282bcd6a35b1c857",
      "parents": [
        "40486d71c40464f3c69bd7eed7187f13c33ad1ee"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 14:20:22 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:52:37 2026 +0200"
      },
      "message": "Parse HTTP headers in linear time\nClient: lua\n\nSplit each header line at the first \u0027:\u0027 with a plain search and trim the\ntwo halves with anchored patterns. Every well-formed header parses as\nbefore; a line whose field name is not a run of name characters is no\nlonger taken as that header. Extends the Lua HTTP header test with\nfield-name and value checks and a same-length parsing-cost check.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "40486d71c40464f3c69bd7eed7187f13c33ad1ee",
      "tree": "13c002e4e6d157e936f1704f4256d0c403fe7935",
      "parents": [
        "541b46da7ae18880d5e6d1f2c8702d9e97dac2af"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 15:59:33 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:52:11 2026 +0200"
      },
      "message": "Handle errors on upgraded WebSocket connections\nClient: nodejs\n\nAn error on a WebSocket connection of the web server is now logged and\nthe connection closed, as the server already does when a frame cannot\nbe decoded.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "541b46da7ae18880d5e6d1f2c8702d9e97dac2af",
      "tree": "2f98fbe0e82749effda85e48a792ff78460a4542",
      "parents": [
        "1ae43c8ae13fd6c801b5147f3aa7db8963e9ee8e"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 13:00:25 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Sep 23 00:51:41 2026 +0200"
      },
      "message": "Stop following redirects in TCurlClient\nClient: php\n\nTCurlClient let curl follow one HTTP redirect: the request went again to\nthe host named in the Location header, and that host\u0027s reply was read as\nthe response. After a 302 the request kept a Content-Length header for a\nbody curl no longer sent, so the call waited for its timeout.\n\nRedirects are no longer followed. A reply with a 3xx status fails the\nrequest with a TTransportException, as it does in THttpClient.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "1ae43c8ae13fd6c801b5147f3aa7db8963e9ee8e",
      "tree": "a26845a5a7204c0b58863cd88cbec4988957d95a",
      "parents": [
        "87a9068b0348179f79c3d5f21ee5e6bf83396a4e"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Mon Sep 21 23:49:52 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Sep 22 22:05:26 2026 +0200"
      },
      "message": "THRIFT-6349: Drop the ubuntu-focal build image\nClient: build\n\nUbuntu 20.04 left standard support on 2025-05-31, and ppa:ondrej/php no\nlonger publishes packages for focal, so the image could not be built:\nits PHP step failed for every PHP version. No CI job builds the images\nunder build/docker, so nothing noticed.\n\nRemove build/docker/ubuntu-focal, and drop focal from the docker README:\nits column in the version tables, the python2 row that only focal had,\nand the Supported Containers list. Jammy, now the oldest image, becomes\nthe default in the README examples, .travis.yml and the comment in\nbuild-cpan-dist.sh. .travis.yml also loses its focal docker and\nautotools jobs; Travis CI no longer reports on this repository.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "87a9068b0348179f79c3d5f21ee5e6bf83396a4e",
      "tree": "c426600ee0f2be27e015fe934c4731d677bf45f4",
      "parents": [
        "77188b02e299aacf112591012c4fc56f343f7e4e"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Sep 22 10:25:05 2026 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Sep 22 22:03:43 2026 +0200"
      },
      "message": "THRIFT-6351: Require GLib 2.48 in configure and CMake\nClient: c_glib\n\nconfigure.ac asked for GLib 2.0 or later, and the three CMake\nfind_package(GLIB) calls asked for no version. The library has needed\nGLib 2.40 since 0.11.0, because thrift_ssl_socket.c calls g_info(), so\nwith an older GLib c_glib was still enabled and programs linked against\nit failed with an undefined reference to g_info.\n\nLANGUAGES.md has listed 2.48.2 as the minimum since 2018. Both build\nsystems now require 2.48. With an older GLib, configure leaves c_glib\nout as it does when GLib is missing, and the CMake summary names the\nrequired version.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    }
  ],
  "next": "77188b02e299aacf112591012c4fc56f343f7e4e"
}
