)]}'
{
  "log": [
    {
      "commit": "4c9b31231fcca14f217a707cf43e866328d40b89",
      "tree": "d708959a0f09f54d213905e94e3bc1b86f4d8c2d",
      "parents": [
        "00f74897126a3959fd8e47ef0ace2df7f1a89234"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 30 18:29:49 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 30 19:33:53 2026 +1000"
      },
      "message": "GROOVY-12214: STC: method reference should select the functional-interface overload over a Closure overload\n"
    },
    {
      "commit": "00f74897126a3959fd8e47ef0ace2df7f1a89234",
      "tree": "6e1b3b743d6a7df82daeda25c6eb93594b39ce91",
      "parents": [
        "9a8e0fb1de8f60f1535b010cdff35061c250f606"
      ],
      "author": {
        "name": "Kartik Kenchi",
        "email": "netliomax25@gmail.com",
        "time": "Wed Jul 29 16:44:35 2026 +0530"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 30 11:22:05 2026 +1000"
      },
      "message": "GROOVY-12213: avoid decoding the request URI in HttpBuilder.appendQuery\n"
    },
    {
      "commit": "9a8e0fb1de8f60f1535b010cdff35061c250f606",
      "tree": "a4114def5ffe00d3a3d4d1a22339b05bf202cf27",
      "parents": [
        "9e8de2f73c9d0429f5e409484071de3515c98b54"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jun 30 07:21:44 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 30 11:15:18 2026 +1000"
      },
      "message": "GROOVY-12115: Reify a receiver\u0027s type argument as a Class parameter under @CompileStatic (@ClassTag)\n"
    },
    {
      "commit": "9e8de2f73c9d0429f5e409484071de3515c98b54",
      "tree": "054a82daa5254125020749971fa3b7f5d72217f9",
      "parents": [
        "43cb1405260f15b08be3c86dee047b7d018dece5"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Thu Jul 30 00:54:12 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Thu Jul 30 00:55:01 2026 +0900"
      },
      "message": "GROOVY-12212: Bump antlr to 4.13.2.12\n"
    },
    {
      "commit": "43cb1405260f15b08be3c86dee047b7d018dece5",
      "tree": "a636ca1a1e62ca0fded7c07986f8690c6a29231c",
      "parents": [
        "7e8eb0045e280270df19ea3d415a9c4442b771ca"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 19:48:43 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 20:14:05 2026 +1000"
      },
      "message": "GROOVY-12209: NullChecker: track nullness through ?., ?:, and ternary results\n"
    },
    {
      "commit": "7e8eb0045e280270df19ea3d415a9c4442b771ca",
      "tree": "7dcda9668480ffc3111999565ddfce9149523238",
      "parents": [
        "ef807d4d1122ddce8f929999d715223f3f48e606"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 18:07:21 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 19:38:16 2026 +1000"
      },
      "message": "GROOVY-12208: NullChecker: broaden null-guard recognition\n"
    },
    {
      "commit": "ef807d4d1122ddce8f929999d715223f3f48e606",
      "tree": "d410c271dcaf4b86509ba6bfb904aabf74806cd4",
      "parents": [
        "ab94313eb012baf52722dae51f4575808a5b4315"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 19:08:06 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 19:08:52 2026 +1000"
      },
      "message": "minor refactor: some doco improvements\n"
    },
    {
      "commit": "ab94313eb012baf52722dae51f4575808a5b4315",
      "tree": "69ccb4051d2bf9627d34e77757251d4d357eddf5",
      "parents": [
        "1743a3037976a2344fa41c8c3ddb3d439dfad3f4"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 10:46:50 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 18:08:43 2026 +1000"
      },
      "message": "GROOVY-12207: Consult package-info.class of dependencies during resolution\n"
    },
    {
      "commit": "1743a3037976a2344fa41c8c3ddb3d439dfad3f4",
      "tree": "06c09b6e464b4a4616a22a21773ce03dba2d9212",
      "parents": [
        "9d266e33e6208bb0d7949e1acce067e4e6ed37ec"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 10:44:49 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 12:48:13 2026 +1000"
      },
      "message": "GROOVY-12211: Avoid full bytecode re-parse when completing NestMembers after class generation\n"
    },
    {
      "commit": "9d266e33e6208bb0d7949e1acce067e4e6ed37ec",
      "tree": "a6ec861d47f6cb4d1b13d378e1d06c375f4b3d83",
      "parents": [
        "292f8592d87b39f516afe74b88ef9ff66fe8f923"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Wed Jul 29 01:37:12 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 12:40:17 2026 +1000"
      },
      "message": "GROOVY-12199: Skip string-literal relocation for java.beans on grooid\n\nShadow rewrites bare package LDC strings that jarjar left intact, so\nJava9.JAVA8_PACKAGES entries became groovyjarjaropenbeans and ModuleFinder\nlookups no-oped. Keep type/descriptor remapping; only gate string constants.\n"
    },
    {
      "commit": "292f8592d87b39f516afe74b88ef9ff66fe8f923",
      "tree": "a6e8e10b00b94b64d31e6281688d822f0b09433b",
      "parents": [
        "08973b734fdbb8728bc9cdeb6ad322597f870e68"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 26 19:03:38 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 12:40:17 2026 +1000"
      },
      "message": "GROOVY-12199: Replace ant-jarjar with com.gradleup.shadow for package relocation\n"
    },
    {
      "commit": "08973b734fdbb8728bc9cdeb6ad322597f870e68",
      "tree": "ae0ade5b2efadd3edcc18dffbb5030e0f3cbfd13",
      "parents": [
        "2ea432993e7b7da1fa52708244d050c535eed01b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 10:26:46 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 10:26:46 2026 +1000"
      },
      "message": "use 5.0.7 for perf tests\n"
    },
    {
      "commit": "2ea432993e7b7da1fa52708244d050c535eed01b",
      "tree": "be37687a1aafc65883c8eb7af56b54b4d3579b15",
      "parents": [
        "013483a036eddce6d98298728e7386f44974d8dc"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 28 18:59:37 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 09:01:57 2026 +1000"
      },
      "message": "GROOVY-12206: Ingest type-use annotations when reading compiled classes\n"
    },
    {
      "commit": "013483a036eddce6d98298728e7386f44974d8dc",
      "tree": "4a99a5e4cd3a07afe7cdd8bfec287bbdf60758f6",
      "parents": [
        "52714bfe2855d141dd419e2a091cf362d960b462"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 28 14:28:40 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 09:00:28 2026 +1000"
      },
      "message": "GROOVY-12204: Support check-only compilation (stop after a configurable compile phase)\n\nAdd a targetPhase property to CompilerConfiguration (default Phases.ALL)\nwhich the no-arg CompilationUnit.compile() now honors; callers that name\nan explicit phase, such as the AST browser, are unaffected. The new\ngroovyc --check option is sugar for setting the target phase to\nINSTRUCTION_SELECTION: parse, resolution, and static type-checking\nerrors are still reported but no class files are generated, giving a\nfaster feedback loop for editors, CI checks, and coding agents.\n"
    },
    {
      "commit": "52714bfe2855d141dd419e2a091cf362d960b462",
      "tree": "6fe9587dc9931aa976bca3b2535161171de9e1f9",
      "parents": [
        "3a70be058bd2ea3a881fa6d6c148f35ed9f88959"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 28 17:20:38 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 29 08:59:46 2026 +1000"
      },
      "message": "GROOVY-12203: False positive \"name clash\" for a valid override when a `? super` wildcard uses a type that declares the same type variable name\n"
    },
    {
      "commit": "3a70be058bd2ea3a881fa6d6c148f35ed9f88959",
      "tree": "f8511a6c5684c42f2908731c38fca47763700c9d",
      "parents": [
        "023b9f5e319d1ecf12d89fb7fb5491a0f56e5fd1"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Wed Jul 29 02:34:11 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Wed Jul 29 02:35:42 2026 +0900"
      },
      "message": "GROOVY-12210: Bump antlr to 4.13.2.11\n"
    },
    {
      "commit": "023b9f5e319d1ecf12d89fb7fb5491a0f56e5fd1",
      "tree": "a222f2c750361da6f9c5ee64f9bc155752af246c",
      "parents": [
        "532d38577bb93e6f13bf1ec9ecba84aad02f463f"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Tue Jul 28 02:17:41 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Tue Jul 28 02:19:35 2026 +0900"
      },
      "message": "GROOVY-12202: Bump antlr to 4.13.2.10\n"
    },
    {
      "commit": "532d38577bb93e6f13bf1ec9ecba84aad02f463f",
      "tree": "aa1e4d316eb074fe2aee55387f6056ebdd1fcaf2",
      "parents": [
        "a2ff9787344eab17d1bddbf5632503676b53b5b8"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 26 20:50:11 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 26 20:50:52 2026 +0900"
      },
      "message": "Detect CI via env vars so Windows/macOS GHA get maxParallelForks\u003d1\n\nPath-only detectCi matched Linux GHA (/home/runner/work/) but not\nWindows (D:\\a\\...) or macOS (/Users/runner/work/), so those runners\nran test workers with local maxParallelForks and saw intermittent\nMessageIOException connection resets during worker teardown.\n"
    },
    {
      "commit": "a2ff9787344eab17d1bddbf5632503676b53b5b8",
      "tree": "15c85329ca8d8351a0b0727fbd9bd3caf99610a1",
      "parents": [
        "19db4fdf9359fcb7850cc16cf8e2e7c4053383c8"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 26 16:56:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 16:56:47 2026 +0800"
      },
      "message": "GROOVY-12185: Move classic call-site caching into optional groovy-callsite module (#2730)\n\n* GROOVY-12185: Move classic call-site caching into optional groovy-callsite module\n\n* GROOVY-12185: Drop formal @Deprecated on classic call-site types for beta-1"
    },
    {
      "commit": "19db4fdf9359fcb7850cc16cf8e2e7c4053383c8",
      "tree": "bea91e5b404e1aaa05590a81283e2a53f77b1d39",
      "parents": [
        "0b9b00db39babd79de3bccd95dbebd658c5b713b"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 26 15:41:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 15:41:59 2026 +0800"
      },
      "message": "GROOVY-11792: for-in loop variable captured by closure/AIC sees final value, not per-iteration value (#2732)\n\n* GROOVY-11792: for-in loop variable captured by closure/AIC sees final value, not per-iteration value\n\n* GROOVY-11792: rename for-in capture flag to groovy.forin.per.iteration.capture\n\nMake the language-compat switch self-describing: it only affects for-in\nloops, and true means per-iteration capture (false is legacy shared binding)."
    },
    {
      "commit": "0b9b00db39babd79de3bccd95dbebd658c5b713b",
      "tree": "f5a6d2dce6abf0235fe513afffb15d25836e3def",
      "parents": [
        "b8b6602001c302dc99bc227a5c1f4f74d94b3b51"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 26 02:18:17 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 13:16:46 2026 +1000"
      },
      "message": "Bump actions/setup-java from 5.5.0 to 5.6.0\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.5.0 to 5.6.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v5.5.0...v5.6.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.6.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "b8b6602001c302dc99bc227a5c1f4f74d94b3b51",
      "tree": "c1d2e3f6007fc2f8160a324e24b4d933d56dc278",
      "parents": [
        "c3b51227ae50d8660d85ffda662a5219e3fbd247"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 26 01:23:41 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 12:16:29 2026 +1000"
      },
      "message": "Bump actions/checkout from 7.0.0 to 7.0.1\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0 to 7.0.1.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v7.0.0...v7.0.1)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.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": "c3b51227ae50d8660d85ffda662a5219e3fbd247",
      "tree": "40dd88c02b78369c9bdcb17fad828c69a90c3e0a",
      "parents": [
        "40cb2afff3bf4ee2231e4eb959ced0aae89bc608"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 26 01:23:32 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 12:16:20 2026 +1000"
      },
      "message": "Bump github/codeql-action from 4.37.0 to 4.37.1\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.37.0 to 4.37.1.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.37.0...v4.37.1)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.37.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": "40cb2afff3bf4ee2231e4eb959ced0aae89bc608",
      "tree": "55d1d4587c8137b6807a2e0065aa24037cca944d",
      "parents": [
        "d5691dc83e7141de720497be931f8461ef8bc604"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 10:29:03 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 10:40:05 2026 +1000"
      },
      "message": "GROOVY-12198: Bump json-unit to 6.0.1 (test dependency)\n\njson-unit 6.0.1 still targets Java 17 and remains Apache 2.0 licensed, so\nneither the JDK 17 baseline nor the licensing changes. The classic\nJsonAssert.assertJsonEquals API used by the groovy-json tests is retained\nand the Gson backend is still supported.\n\nAdds the new transitive test deps to dependency verification (json-path,\njson-smart, accessors-smart) and drops the stale json-unit 2.38.0 entries.\nExcludes json-unit\u0027s transitive hamcrest-core (an empty 3.0 deprecation\nstub) so no checksum needs pinning for it; JUnit already supplies\nhamcrest-core and the tests use only assertJsonEquals.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d5691dc83e7141de720497be931f8461ef8bc604",
      "tree": "33f193f49b495996b6104a89ebe8cb367ca59882",
      "parents": [
        "1211b777bc2f5248b2d9ea5e067a0fdc8b9e4880"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:40 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:50 2026 +1000"
      },
      "message": "GROOVY-12197: Bump jarjar to 1.17.1 (build dependency)\n"
    },
    {
      "commit": "1211b777bc2f5248b2d9ea5e067a0fdc8b9e4880",
      "tree": "4d377d1b39b6a66b68e4a7029c4f6636454c6433",
      "parents": [
        "d9dcbc9fc5738d2e8d5446fa4b29e2f872554378"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:32:52 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:49 2026 +1000"
      },
      "message": "GROOVY-12196: Bump codenarc to 4.0.0 (build dependency)\n"
    },
    {
      "commit": "d9dcbc9fc5738d2e8d5446fa4b29e2f872554378",
      "tree": "b4b3678fb0759fb8117c2251e43be5b28c8be2b2",
      "parents": [
        "3317f747d2a06033982d93d3ff84e03364b36fa5"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:28:40 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:49 2026 +1000"
      },
      "message": "Remove stale maven-resolver-supplier-mvn4 2.0.16 verification entry\n\nThe org.apache.maven.resolver group is verified by trusted PGP key, so\nthis leftover per-artifact SHA512 entry for an old version is dead weight.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "3317f747d2a06033982d93d3ff84e03364b36fa5",
      "tree": "d09d2008c7defc9a7485ef5578da99f6ca8948fb",
      "parents": [
        "ba6e5d5b18172c1e9509bea108cde35a17999058"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:20:15 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:49 2026 +1000"
      },
      "message": "GROOVY-12195: Bump spotbugs to 4.10.3 (build dependency)\n"
    },
    {
      "commit": "ba6e5d5b18172c1e9509bea108cde35a17999058",
      "tree": "a6691625d6d18e2bcb69de080184c19ae86ae798",
      "parents": [
        "a650ded7679cfd077cf56118b5a8b9ada7970f24"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:18:15 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:49 2026 +1000"
      },
      "message": "GROOVY-12194: Bump log4j2 version to 2.26.1 (test dependency)\n"
    },
    {
      "commit": "a650ded7679cfd077cf56118b5a8b9ada7970f24",
      "tree": "ea16ed87d403bf77083bc995b6c5cf349ebe38d2",
      "parents": [
        "ec2f3c6decdf3226095270ec4efa136ff97f3149"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:16:44 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:49 2026 +1000"
      },
      "message": "GROOVY-12193: Bump logback to 1.6.0 (test dependency)\n"
    },
    {
      "commit": "ec2f3c6decdf3226095270ec4efa136ff97f3149",
      "tree": "8febca3cbdea69653c70cb848df2665a54bc410c",
      "parents": [
        "0ca665dad0d4070bfa218d9b5577ec423c8b2181"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:15:21 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 26 09:53:49 2026 +1000"
      },
      "message": "GROOVY-12192: bump maven-resolver-supplier-mvn4 to 2.0.21\n"
    },
    {
      "commit": "0ca665dad0d4070bfa218d9b5577ec423c8b2181",
      "tree": "43cc0fc590c4b483f68767141d96c4cd3f76b979",
      "parents": [
        "c513a3ade4e64d4b10531af3697be0fd1fdc5587"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 25 18:01:08 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 25 18:06:26 2026 +0900"
      },
      "message": "Harden parallel concurrency tests against common-pool contention\n\n@Parallel and eachParallel concurrency checks used CyclicBarrier on\nForkJoinPool.commonPool(). Barrier.await is unmanaged blocking: under\npool contention a single free worker can hit the barrier and never run\nthe second party, yielding TimeoutException (wrapped as\nUndeclaredThrowableException via the SAM Consumer proxy).\n\n- Isolate the barrier rendezvous with ParallelScope.withPool(parties)\n- Cover eachParallel with the same concurrency proof\n- Document that blocking parallel bodies need a dedicated or I/O pool\n"
    },
    {
      "commit": "c513a3ade4e64d4b10531af3697be0fd1fdc5587",
      "tree": "0048ea950e7e4055b60a4afb9f4689923fbecac5",
      "parents": [
        "c92f1c926a62af3c30d79db9a0028c7dd0bb1f9a"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 25 14:38:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 14:38:17 2026 +0800"
      },
      "message": "GROOVY-9192: Implement optional parser error recovery for Parrot parser (#2724)\n\n* GROOVY-9192: Implement optional parser error recovery for Parrot parser\n\n* GROOVY-9192: Harden recovery empty-collector guard and address review nits\n\nReturn a partial module under error recovery only when ErrorCollector has\ndiagnostics, so a CompilationFailedException with an empty collector cannot\nsurface as silent success. Also clear Sonar minor issues from the PR review\nand add regression coverage for the guard and defensive reporting paths."
    },
    {
      "commit": "c92f1c926a62af3c30d79db9a0028c7dd0bb1f9a",
      "tree": "3eedc0c201b07a6b55fce9e664543a0f87892e39",
      "parents": [
        "ccafb79419a2e807bd0c1baeda3a88cd756efef4"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 25 14:35:14 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 25 14:35:32 2026 +0900"
      },
      "message": "Fix warnings from \"SonarCloud Code Analysis\"\n"
    },
    {
      "commit": "ccafb79419a2e807bd0c1baeda3a88cd756efef4",
      "tree": "135fabf328c34c049cfbe52e244dbe329a9ed4bb",
      "parents": [
        "8fd428ca08ee530d6e46b8638bd5f39b402efd06"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 14:20:18 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 14:20:18 2026 +1000"
      },
      "message": "minor refactor: fix adoc indent level\n"
    },
    {
      "commit": "8fd428ca08ee530d6e46b8638bd5f39b402efd06",
      "tree": "1826a561e5f9aa045800c4f568c135bb166cebc8",
      "parents": [
        "f024ac677b95e2c3d517173a8e284684148982fc"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 12:46:21 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 14:13:02 2026 +1000"
      },
      "message": "GROOVY-12190: @TypeChecked switch on enum: unqualified case constants pass type checking but throw MissingPropertyException at runtime\n"
    },
    {
      "commit": "f024ac677b95e2c3d517173a8e284684148982fc",
      "tree": "9fd633d76da48891487fd83a1986d4bc946179f7",
      "parents": [
        "188718fb7cd694a5dfe733d09c61a7352a1c352b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Jul 10 21:35:49 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 14:03:49 2026 +1000"
      },
      "message": "GROOVY-12151: closure packing (GEP-27 S1) with per-class dispatch tables and full MOP integration\nUnder @PackedClosures (dynamic trust path) or -Dgroovy.target.closure.pack\u003dtrue under @CompileStatic (where the type checker PROVES delegate-independence), an eligible closure literal\u0027s body is hoisted into a synthetic private method on the enclosing class and the literal is replaced by a shared PackedClosure adapter — removing the per-closure generated class (and the nested $_closure1$_closure2 name explosion) while the value stays a real groovy.lang.Closure. Ineligible closures (escaping, delegate-dependent, default-param, nested-in-generated-function) keep their class exactly as today; opt-out via @PackedClosures(mode \u003d DISABLED).\n"
    },
    {
      "commit": "188718fb7cd694a5dfe733d09c61a7352a1c352b",
      "tree": "c5b29a2a5b37f83eab5fa12d83cc4156e2773993",
      "parents": [
        "fc1a14a6f65a611c35feee3828286ec82ccf61a6"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 19:21:07 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 11:45:00 2026 +1000"
      },
      "message": "GROOVY-12187: Add SqlInjectionChecker type checker to detect quoted GString interpolation in SQL queries\n"
    },
    {
      "commit": "fc1a14a6f65a611c35feee3828286ec82ccf61a6",
      "tree": "127a47331e43a48eeaef4108228e8f7c7ebebffa",
      "parents": [
        "361a02e91dfb33d794cfaa33db82c39262046d6a"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 05 16:07:32 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 09:25:07 2026 +1000"
      },
      "message": "GROOVY-12122: Provide a Regex timeout facility\n"
    },
    {
      "commit": "361a02e91dfb33d794cfaa33db82c39262046d6a",
      "tree": "7c466b05da7f0389624614777b5c5b22c4e6bc93",
      "parents": [
        "3240fcf05ad12df667e06e673bb3ff6822961029"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Jul 24 23:43:27 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 25 09:02:42 2026 +1000"
      },
      "message": "GROOVY-10687: complete NestMembers after class generation instead of reordering classgen\n\nClosure and anonymous inner classes materialize while bytecode is being\ngenerated, so a nest host emitted in normal order could not list them in\nits NestMembers attribute. The previous approach sorted nest hosts to the\nback of the classgen queue, which broke the supers-before-subclasses\ninvariant relied on by ClassCompletionVerifier (GROOVY-11753, GROOVY-12188)\nand still could not see a host\u0027s own nested closures, requiring name\nprediction (GROOVY-11780). No ordering satisfies both constraints once a\nnest member extends its own host.\n\nInstead, restore plain hierarchy-order sorting and complete each nest\nhost\u0027s NestMembers in a post-generation pass: once all of a module\u0027s\nclasses are generated, the host\u0027s inner class list is complete, so its\nbytes are rewritten with the exact member set. GroovyClassLoader defines\nclasses from the post-processed bytes. This removes the reordering, the\nclosure-detection walk, and the member-name prediction, and is unaffected\nby whether a closure ultimately produces a class (GEP-27 closure packing).\n"
    },
    {
      "commit": "3240fcf05ad12df667e06e673bb3ff6822961029",
      "tree": "612ae9f2aed10f663e073edd8f105be4f35cf442",
      "parents": [
        "29bd047aaa6a45ceea3ddaaeb0cc7efafccc231b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 15:24:11 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 15:31:27 2026 +1000"
      },
      "message": "GROOVY-12186: reject lone low surrogate in StreamingMarkupWriter.write (add another edge case - dangling surrogate on flush)\n"
    },
    {
      "commit": "29bd047aaa6a45ceea3ddaaeb0cc7efafccc231b",
      "tree": "a6ddb878deaffb5c9b5da65fa1cc1baa8f2949c0",
      "parents": [
        "ef482ef71668d222849a082ea1c9bc675f65cd90"
      ],
      "author": {
        "name": "Kartik Kenchi",
        "email": "netliomax25@gmail.com",
        "time": "Sat Jul 18 01:01:00 2026 +0530"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 15:31:27 2026 +1000"
      },
      "message": "GROOVY-12186: reject lone low surrogate in StreamingMarkupWriter.write\n"
    },
    {
      "commit": "ef482ef71668d222849a082ea1c9bc675f65cd90",
      "tree": "4e586552aecfa428b84154c0473266fd75fa79eb",
      "parents": [
        "bc6ed8b5eb6cdc20c53e6ec67f08fc8d38022883"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 14:18:51 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 15:21:38 2026 +1000"
      },
      "message": "rewrite box+mismatched unbox to primitive conversion\n"
    },
    {
      "commit": "bc6ed8b5eb6cdc20c53e6ec67f08fc8d38022883",
      "tree": "83978c686481081593ea7ecfcd0a5376262c0e64",
      "parents": [
        "3665093f18829ea6fb9fc8f4dd5ccf21feac1764"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Fri Jul 17 23:47:19 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 15:21:38 2026 +1000"
      },
      "message": "Minor tweak\n"
    },
    {
      "commit": "3665093f18829ea6fb9fc8f4dd5ccf21feac1764",
      "tree": "525788e5c2375eebff7f9100d9a9154a3c9d60f5",
      "parents": [
        "635004e822e22d61c29712a85e90e85dac9ac5a3"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Tue Jul 14 01:32:24 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 15:21:38 2026 +1000"
      },
      "message": "GROOVY-12162: Harden and extend bytecode peephole optimization\n"
    },
    {
      "commit": "635004e822e22d61c29712a85e90e85dac9ac5a3",
      "tree": "202da0f42a44e1b0ef0bcbb8ddae0b7d503ef8be",
      "parents": [
        "96713c94132e36aef6b37ac8ca49f957551bad49"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 23:31:43 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 11:55:55 2026 +1000"
      },
      "message": "GROOVY-12183: Improve MarkdownSlurper resilience\n"
    },
    {
      "commit": "96713c94132e36aef6b37ac8ca49f957551bad49",
      "tree": "500d5cfebcd16b44b5026494a22d7e78d1fcf836",
      "parents": [
        "cd405cf4eee6d278e1d478cf139ea25ffe166ac0"
      ],
      "author": {
        "name": "Kartik Kenchi",
        "email": "netliomax25@gmail.com",
        "time": "Tue Jul 14 13:07:40 2026 +0530"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 23 11:55:55 2026 +1000"
      },
      "message": "GROOVY-12183: cap nesting depth in MarkdownSlurper to avoid stack overflow\n"
    },
    {
      "commit": "cd405cf4eee6d278e1d478cf139ea25ffe166ac0",
      "tree": "11b11250ebcb1bbd58d24a875473488d9c9197c1",
      "parents": [
        "f1771e8f674108f645edc9a2e3e2c1fcd7f7a14f"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 20:26:16 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 20:26:16 2026 +1000"
      },
      "message": "GROOVY-12172: Groovy 5.0.7 fails to compile or startup with UnsupportedOperationException (confirm fixed on master)\n"
    },
    {
      "commit": "f1771e8f674108f645edc9a2e3e2c1fcd7f7a14f",
      "tree": "9bdabd05eed09ccd76b2090dbbfa127a5db8d018",
      "parents": [
        "610c8e6f224ba6a186788ab2c698942875448a67"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 14:10:48 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 14:10:48 2026 +1000"
      },
      "message": "GROOVY-12181: Refactor async runtime and AST helpers introduced by GROOVY-9381 (tweaks)\n"
    },
    {
      "commit": "610c8e6f224ba6a186788ab2c698942875448a67",
      "tree": "289ba25b192e0d93e6269228e48a7db97261d01e",
      "parents": [
        "c12477bc9db21ee668b4fae8cbfb136552e4d7fc"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Tue Jul 21 00:58:40 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 14:02:40 2026 +1000"
      },
      "message": "GROOVY-12181: Refactor async runtime and AST helpers introduced by GROOVY-9381\n"
    },
    {
      "commit": "c12477bc9db21ee668b4fae8cbfb136552e4d7fc",
      "tree": "b73a05dc852fadc4428cba24ca61ac06912ed9ac",
      "parents": [
        "cb27031d8e432f868d54b19ac290d0e61769c78e"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 21 11:48:58 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 22 12:12:36 2026 +1000"
      },
      "message": "GROOVY-12182: groovy-http-builder: confine requests (and redirects) to the base URI\n"
    },
    {
      "commit": "cb27031d8e432f868d54b19ac290d0e61769c78e",
      "tree": "022903db05e82bc8d0412c29be1c177e682d78be",
      "parents": [
        "57518021924da4f4542aa6e14b903a077e4b31af"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 17:53:23 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 17:54:53 2026 +0900"
      },
      "message": "GROOVY-12180: Bump antlr to 4.13.2.9\n"
    },
    {
      "commit": "57518021924da4f4542aa6e14b903a077e4b31af",
      "tree": "7d3540806e65b6ec88f290b5782dec4e880b59df",
      "parents": [
        "7ca9f06f0c63aa4b19d07644b006198e318cb682"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 19 12:29:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 12:29:52 2026 +0800"
      },
      "message": "Bump actions/setup-java from 5.4.0 to 5.5.0 (#2723)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.4.0 to 5.5.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v5.4.0...v5.5.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.5.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": "7ca9f06f0c63aa4b19d07644b006198e318cb682",
      "tree": "881984ceb27bb1abe01c0dd74639c3454dc77236",
      "parents": [
        "7e6e7716b0cecab52a2e04df4ea12d029d5a1d03"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 19 12:29:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 12:29:30 2026 +0800"
      },
      "message": "Bump github/codeql-action from 4.36.3 to 4.37.0 (#2722)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.3 to 4.37.0.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.36.3...v4.37.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.37.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7e6e7716b0cecab52a2e04df4ea12d029d5a1d03",
      "tree": "41bd36a6a2b177acabba76e107cbb22679f051b1",
      "parents": [
        "1df31051b8be43eccb50555f365422f2342d8dc2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 19 12:28:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 12:28:32 2026 +0800"
      },
      "message": "Bump com.fasterxml.jackson:jackson-bom from 2.22.0 to 2.22.1 (#2721)\n\nBumps [com.fasterxml.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.22.0 to 2.22.1.\n- [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.22.0...jackson-bom-2.22.1)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson:jackson-bom\n  dependency-version: 2.22.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": "1df31051b8be43eccb50555f365422f2342d8dc2",
      "tree": "19a0ba1b5415967485c6505939564a4fd44aa4d8",
      "parents": [
        "bfdfd8540a4feba3c33db9ecd4cb88424344cf86"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:33:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 02:33:53 2026 +0800"
      },
      "message": "GROOVY-12173: Left-factor parser rules to reduce lookahead on hot parse paths (#2720)"
    },
    {
      "commit": "bfdfd8540a4feba3c33db9ecd4cb88424344cf86",
      "tree": "2d3eab65d61c7d25da805a75cade2008cb03e611",
      "parents": [
        "94e49e905895a5cbebfe3f65160349632b6a33a2"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:57:48 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:58:27 2026 +0900"
      },
      "message": "GROOVY-12179: Bump flatlaf to 3.7.2\n"
    },
    {
      "commit": "94e49e905895a5cbebfe3f65160349632b6a33a2",
      "tree": "e00b9223bd9d39a92cf3c4e83104d6d223fd3536",
      "parents": [
        "fd9daca82e6132983e593e65b36f1274ae9753c6"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:36:10 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:36:10 2026 +0900"
      },
      "message": "GROOVY-12178: Bump maven-resolver-supplier-mvn4 to 2.0.20\n"
    },
    {
      "commit": "fd9daca82e6132983e593e65b36f1274ae9753c6",
      "tree": "5a2c4ad3bbc84a62b17b5f2a25dde8e1c66a2529",
      "parents": [
        "a4ac2e710d39bab993c7d34fbb8350e1c8c64b20"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:33:05 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:33:30 2026 +0900"
      },
      "message": "GROOVY-12177: Bump ivy to 2.6.0\n"
    },
    {
      "commit": "a4ac2e710d39bab993c7d34fbb8350e1c8c64b20",
      "tree": "ce0e77724e500dc1881552b333cb7b7ffe7583c1",
      "parents": [
        "324a399b7cd7f61f749ba6bab8ccd9334ba94f12"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:29:25 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:29:25 2026 +0900"
      },
      "message": "GROOVY-12176: Bump jline to 4.3.1\n"
    },
    {
      "commit": "324a399b7cd7f61f749ba6bab8ccd9334ba94f12",
      "tree": "19f846aff063a54bd7ffc04017efda0d542f3997",
      "parents": [
        "75eae47f67063b54041d18ab85cab98389ceee55"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:27:19 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 02:27:19 2026 +0900"
      },
      "message": "GROOVY-12175: Bump jackson to 2.22.1\n"
    },
    {
      "commit": "75eae47f67063b54041d18ab85cab98389ceee55",
      "tree": "78ea0b38f9350606fd5b07c7b811e18b1002c41e",
      "parents": [
        "48cf83f92c6e9615f35a74511185151f8492cc87"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 01:39:50 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 01:39:50 2026 +0900"
      },
      "message": "Update dependency metadata\n"
    },
    {
      "commit": "48cf83f92c6e9615f35a74511185151f8492cc87",
      "tree": "d3e9fc07dda4c2d147989966c3b721125ee4f901",
      "parents": [
        "a184bddbbe845d239fa4d286773b3869e5d5758d"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 01:35:44 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Jul 19 01:35:44 2026 +0900"
      },
      "message": "GROOVY-12174: Bump antlr to 4.13.2.8\n"
    },
    {
      "commit": "a184bddbbe845d239fa4d286773b3869e5d5758d",
      "tree": "f4b89ac2c7016ef5271e8f89043d9fd1a7a86b9d",
      "parents": [
        "3cf0433370ef992c30cb42c64e84eb87799cdf03"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 18 19:40:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 19:40:00 2026 +0800"
      },
      "message": "GROOVY-12095: Code in groovydoc does not display correctly (#2716)"
    },
    {
      "commit": "3cf0433370ef992c30cb42c64e84eb87799cdf03",
      "tree": "00af84c54a1f8d9dace8f11bda69f5e2261d8fd8",
      "parents": [
        "c76e8dc8df30e569789792a250280a447b25bb69"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 18 16:49:47 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 18 16:49:47 2026 +0900"
      },
      "message": "Minor tweak: use bitset instead\n"
    },
    {
      "commit": "c76e8dc8df30e569789792a250280a447b25bb69",
      "tree": "9ced9471b116185f0fcaef6e585eca475fc24108",
      "parents": [
        "2f0a29712f211481fc82ac127b43fed26d2b7e20"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 18 14:39:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 14:39:36 2026 +0800"
      },
      "message": "GROOVY-12171: Improve GString syntax error when \u0027$\u0027 is not followed by a valid interpolation (#2719)"
    },
    {
      "commit": "2f0a29712f211481fc82ac127b43fed26d2b7e20",
      "tree": "441602bc666cd2da59b2ec20d598f2c1088cc820",
      "parents": [
        "406c015c8b47c2dc60b3c0b93d925b2dc82e7e88"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 18 11:37:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 11:37:32 2026 +0800"
      },
      "message": "GROOVY-12169: Improve syntax error messages and caret positions for missing \u0027)\u0027, \u0027]\u0027, and \u0027}\u0027 (#2718)\n\n* GROOVY-12169: Improve syntax error messages and caret positions for missing \u0027)\u0027, \u0027]\u0027, and \u0027}\u0027\n\n* Minor tweak"
    },
    {
      "commit": "406c015c8b47c2dc60b3c0b93d925b2dc82e7e88",
      "tree": "f9d3e504639c9566258b5a7828ec84c3ebcae8c9",
      "parents": [
        "b9a3822a2b24ec8a87101cd7b3c04b68683db504"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 18 10:20:55 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 18 10:31:07 2026 +1000"
      },
      "message": "GROOVY-12170: Bump JUnit to 6.1.2\n"
    },
    {
      "commit": "b9a3822a2b24ec8a87101cd7b3c04b68683db504",
      "tree": "2bc18b34251f47dcc11a3fe9099d3f561396e662",
      "parents": [
        "2d5770407c6450a65f6d57876e66e2afea64a483"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Jul 18 00:34:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 00:34:41 2026 +0800"
      },
      "message": "GROOVY-12133: Implement findBalancedGroups utility to support Regex Balanced Groups (#2669)\n\n* GROOVY-12133: Implement findBalancedGroups utility to support Regex Balanced Groups\n\n* Minor tweak"
    },
    {
      "commit": "2d5770407c6450a65f6d57876e66e2afea64a483",
      "tree": "7783e9fc7348f2630a49caa417bd6a2fda8cd7d5",
      "parents": [
        "19339da14c7602a66a501e931aa33879ab14d692"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Jul 17 09:44:41 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Jul 17 13:18:50 2026 +1000"
      },
      "message": "GROOVY-12168: Improve exception handling consistency for numbers during JSON parsing (additional tweaks)\n"
    },
    {
      "commit": "19339da14c7602a66a501e931aa33879ab14d692",
      "tree": "d131cac2630209b383dbff910bc16d3c0a675a78",
      "parents": [
        "f02441ec9a89effe9111738b279b35558944f770"
      ],
      "author": {
        "name": "Kartik Kenchi",
        "email": "netliomax25@gmail.com",
        "time": "Thu Jul 16 19:41:39 2026 +0530"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Jul 17 13:18:50 2026 +1000"
      },
      "message": "GROOVY-12168: wrap malformed json number decode in JsonException\n"
    },
    {
      "commit": "f02441ec9a89effe9111738b279b35558944f770",
      "tree": "36e8447f637f11357aadd3cb0172fc1793e43def",
      "parents": [
        "538f618b3d817f1bb0e1035646e94e64c4d81144"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 17:54:41 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 17:54:41 2026 +1000"
      },
      "message": "minor edits clarify security stance for ASTTest\n"
    },
    {
      "commit": "538f618b3d817f1bb0e1035646e94e64c4d81144",
      "tree": "e96fa539dc6b0df743acc618836af10cecd2a19f",
      "parents": [
        "14c1c9f8369314452f37afed16bfba71a76e5d5f"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 16:14:21 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 17:33:30 2026 +1000"
      },
      "message": "GROOVY-12161: pin catch-variable debug metadata for try/catch without finally\n\nBackfills the LocalVariableTable coverage relaxed in GROOVY-11362 when the\nidentity catch-all was omitted: assert the catch parameter stays named,\ntyped Exception (not Object), with a non-degenerate range — without\ndepending on brittle label numbers.\n"
    },
    {
      "commit": "14c1c9f8369314452f37afed16bfba71a76e5d5f",
      "tree": "26ae3027666cdeff07c5f5b68523f11f57c15bfe",
      "parents": [
        "c98c2573e2a1b402e5900b9350139f8d26e41004"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Mon Jul 13 23:47:11 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 16:09:58 2026 +1000"
      },
      "message": "GROOVY-12161: Omit identity catch-all for try/catch without finally and slim exception bytecode\n"
    },
    {
      "commit": "c98c2573e2a1b402e5900b9350139f8d26e41004",
      "tree": "2e60e2eee886c01b924297c67d639c5e966996fd",
      "parents": [
        "46655500d81c3e4685269759f1e27748dbcd5f05"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 15:11:01 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 15:24:59 2026 +1000"
      },
      "message": "GROOVY-12155: decode process output streams using the native encoding\n\nwith thanks to https://github.com/netliomax25-code for identifying the problem\n"
    },
    {
      "commit": "46655500d81c3e4685269759f1e27748dbcd5f05",
      "tree": "91823764800bd9d3232ba38633997ad8b9d38e54",
      "parents": [
        "00d067fc3bce66a53adf6f6f9c9e00e0f48a7cde"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 11:09:14 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Jul 16 14:55:12 2026 +1000"
      },
      "message": "GROOVY-12147: Add locale-aware number, currency and percent formatting/parsing to the GDK (back out some variants and clarify javadoc)\n"
    },
    {
      "commit": "00d067fc3bce66a53adf6f6f9c9e00e0f48a7cde",
      "tree": "b47a5c43d0e444a7b97ac324c49e32d5c7a341e2",
      "parents": [
        "8a51ac0dc00d4e2c05a57e8557ad1fae9cfe6697"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 15 13:22:11 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 15 13:22:11 2026 +1000"
      },
      "message": "GROOVY-12165: note the call override cache\u0027s intended end-state (GEP-27)\n"
    },
    {
      "commit": "8a51ac0dc00d4e2c05a57e8557ad1fae9cfe6697",
      "tree": "26748909789ee1b8127cce46e69ed1369b4048a4",
      "parents": [
        "3740ee7e4c96992bb7ba3d915df5947b01ed2e06"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 20:30:20 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Jul 15 10:49:11 2026 +1000"
      },
      "message": "GROOVY-12165: extend Closure.call fast path to multi-argument overrides\n\nThe cached fast path covered only zero- and one-argument call overrides\n(GROOVY-11911, GROOVY-12164), so every multi-argument closure call from\nJava -- all Map iteration, eachWithIndex, inject -- took full metaclass\ndispatch. Generalise the cache to an arity-indexed table (0..4) with\nper-argument instance-of guards: at each arity an all-Object override\nwins outright (the 11911 rule), otherwise the single unambiguous typed\noverride dispatches when every argument is already an instance of its\ndeclared type (the 12164 rule), and anything else (coercion, null,\nsame-arity overloads, static declarations, array params) falls through\nto the metaclass exactly as before. Map#each is ~3-3.6x faster, inject\n~2x, eachWithIndex ~1.65x; one-arg calls also gain ~13% by spreading\nthe argument array directly instead of re-wrapping it.\n\nGROOVY-12165: key the cache on doCall and guard it on the stock metaclass\n\n    Per the closure-dispatch design discussion: call selects a doCall, so the\n    arity-indexed cache is re-keyed from call overloads to the subclass\u0027s\n    doCall declarations (hierarchy walk, most-derived override wins, vararg/\n    static/bridge shapes and same-arity overloads decline to the metaclass).\n    Declared call()/call(Object) overrides keep per-arity precedence\n    (GROOVY-11911) -- DGM\u0027s closure.call(item) reaches such an override via\n    plain virtual dispatch, so the varargs entry must agree -- while typed or\n    multi-arg call overloads are no longer honoured, restoring 3.x-5.x\n    behaviour (the ecosystem census found zero reliance: every real subclass\n    either overrides call(Object...) or declares doCall). MethodClosure and\n    CurriedClosure are excluded: MetaClassImpl has dedicated dispatch for\n    them, so their doCall declarations are not what the MOP would select.\n\n    The cache is now also semantically invisible: a mopPerturbed flag\n    (checked at construction, latched by setMetaClass -- the only mutation\n    path for the instance\u0027s metaclass field) plus the category quick-exit\n    gate the fast path, so a per-instance metaclass or active category\n    routes through invokeMethod as it did before the cache existed. The\n    re-entry latch is scoped to the 11911 call-form targets only: doCall\n    targets skip the ThreadLocal entirely, so nested closure calls inside a\n    dispatched body keep their own fast path (sum-style shapes gain ~50%).\n\n    Also keeps the GString-key coercion test honest (Copilot review): the\n    key stays a GString so the guard genuinely fails and the metaclass\n    coercion path is exercised.\n"
    },
    {
      "commit": "3740ee7e4c96992bb7ba3d915df5947b01ed2e06",
      "tree": "8a06131ec7e95002a2996ce8284e20a638cd75ab",
      "parents": [
        "9b4176bc49be4361134d4ed274bcc6a56145488d"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 16:35:55 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 19:42:18 2026 +1000"
      },
      "message": "GROOVY-12164: extend Closure.call fast path to typed one-arg overrides\n\nA closure with a typed parameter generates call(T)/doCall(T) rather than\ncall(Object), which the GROOVY-11911 CallOverride lookup cannot see, so\nevery such call fell back to full metaclass dispatch (~2.5x slower via\nDGM iteration). Cache the single unambiguous typed one-arg override with\nan instance-of guard (boxed for primitives): exact-instance arguments\ndispatch directly; anything needing Groovy coercion (GString-\u003eString,\nnumber conversions, null) still falls through to the metaclass, which\nbehaves exactly as before. Untyped closures are unaffected.\n"
    },
    {
      "commit": "9b4176bc49be4361134d4ed274bcc6a56145488d",
      "tree": "8ee82ace4bcb5fd486514b43781692272135c1f6",
      "parents": [
        "0558aef6cb41761551b8248e092fe2f30a0ce968"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 18:26:01 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 10:49:15 2026 +1000"
      },
      "message": "GROOVY-12160: @AnnotationCollector emits collected annotation members in hash order when the collector is precompiled\n"
    },
    {
      "commit": "0558aef6cb41761551b8248e092fe2f30a0ce968",
      "tree": "f3edec4e4751b96f0104a0541e8970b633b31465",
      "parents": [
        "310527e8cc5fb99b807aac561fb83272a175e0c2"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Sat Jul 11 12:58:14 2026 -0400"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 10:44:09 2026 +1000"
      },
      "message": "GROOVY-12149: Nondeterministic reflection order flows into generated bytecode, breaking reproducible builds\n\n(cherry picked from commit 7aabc479f6bc03a6a6c5ecd31fc2c66d2cfb8e21)\n"
    },
    {
      "commit": "310527e8cc5fb99b807aac561fb83272a175e0c2",
      "tree": "f1d453b704721e173696acef7b9006e414022661",
      "parents": [
        "0a16e3e3b8e02152467c6f5a5c24e63f1d0947d4"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 18:07:38 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 09:50:56 2026 +1000"
      },
      "message": "GROOVY-12159: Synthetic class-literal fields and accessors are emitted in hash order, not the order the literals were encountered\n"
    },
    {
      "commit": "0a16e3e3b8e02152467c6f5a5c24e63f1d0947d4",
      "tree": "32d7b6462305f79d656a53fe66449067058f7286",
      "parents": [
        "2ab10f94a23d202272e68336c663b60115d81714"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 17:35:51 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 09:48:54 2026 +1000"
      },
      "message": "GROOVY-12158: @AutoImplement generates methods in hash order, not the order they are found\n"
    },
    {
      "commit": "2ab10f94a23d202272e68336c663b60115d81714",
      "tree": "0d3b764c98e1129fd5c47bcf6ced974297682800",
      "parents": [
        "5ca3ac444e08513e6936d08c061b603ef148fb47"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 16:43:57 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 09:48:35 2026 +1000"
      },
      "message": "GROOVY-12157: Covariant bridge methods are emitted in hash order, not the order they are found\n"
    },
    {
      "commit": "5ca3ac444e08513e6936d08c061b603ef148fb47",
      "tree": "8085aa38c714073868e5cb6e95578ecef6185c4d",
      "parents": [
        "535be21d26e5073717db93fc055a09e7437837fa"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 16:26:40 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 09:48:16 2026 +1000"
      },
      "message": "GROOVY-12156: chooseBestMethod returns candidates in identity-hash order, making static-compilation output path-dependent\n"
    },
    {
      "commit": "535be21d26e5073717db93fc055a09e7437837fa",
      "tree": "db447770f80cd3a05b6d07bc17acad8c7b11dbfa",
      "parents": [
        "7c8e476f3373e89891788d09aed4e7fe2e505253"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 07:50:17 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 09:46:39 2026 +1000"
      },
      "message": "GROOVY-12163: fix concurrent modification of ExpandoMetaClass mixinClasses (tweak test for improved robustness and less cost and fix a misleading comment)\n"
    },
    {
      "commit": "7c8e476f3373e89891788d09aed4e7fe2e505253",
      "tree": "669cc0b7f3ff85936946b3eaaef3d5b4d3560b5b",
      "parents": [
        "86c6648d1e61436fe513afaa85d8d0c403de3cda"
      ],
      "author": {
        "name": "Kartik Kenchi",
        "email": "netliomax25@gmail.com",
        "time": "Sun Jul 12 21:30:40 2026 +0530"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 14 09:46:39 2026 +1000"
      },
      "message": "GROOVY-12163: fix concurrent modification of ExpandoMetaClass mixinClasses\n"
    },
    {
      "commit": "86c6648d1e61436fe513afaa85d8d0c403de3cda",
      "tree": "05752f617b7507bb11c70bff766539374679b427",
      "parents": [
        "97d68bb1c30b184c345979ed6e6523338a80994f"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 23:11:53 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 07:30:18 2026 +1000"
      },
      "message": "GROOVY-12154: box primitive lambda param when the target SAM param is a reference type\n\nA @CompileStatic lambda declaring a primitive parameter (e.g. (int a) -\u003e ...)\nagainst a generic functional interface (e.g. Function\u003cInteger,Integer\u003e)\ncompiled cleanly but threw at runtime:\n\n  java.lang.invoke.LambdaConversionException:\n    int is not a subtype of class java.lang.Object\n\nAbstractFunctionalInterfaceWriter.convertParameterType always emitted a\nprimitive implementation-method parameter when the lambda declared a\nprimitive, ignoring the target (functional-interface) parameter type. But\nLambdaMetafactory links against the erased SAM signature (Object) and will\nnot unbox to a primitive, so the implementation method must accept the boxed\ntype when the SAM parameter is a reference type. It stays primitive only when\nthe SAM parameter is itself primitive (e.g. IntUnaryOperator), preserving\nGROOVY-9790.\n"
    },
    {
      "commit": "97d68bb1c30b184c345979ed6e6523338a80994f",
      "tree": "f327a2ad85353e3860910a5324b0a01db91a83b0",
      "parents": [
        "60479488494fbbe20a552dc6b88755896e628cf2"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 17:09:29 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Jul 13 07:29:48 2026 +1000"
      },
      "message": "GROOVY-12153: Fix AstNodeToScriptAdapter decompiler rendering fidelity for strings\n"
    },
    {
      "commit": "60479488494fbbe20a552dc6b88755896e628cf2",
      "tree": "3427200e8e16ec960af67045a57858eed1bef930",
      "parents": [
        "07a0ffb91e5b4abbdeadf5186d46719c4cad2557"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 12 03:06:05 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 13:06:14 2026 +1000"
      },
      "message": "Bump com.gradle.develocity from 4.4.3 to 4.5.0\n\nBumps com.gradle.develocity from 4.4.3 to 4.5.0.\n\n---\nupdated-dependencies:\n- dependency-name: com.gradle.develocity\n  dependency-version: 4.5.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "07a0ffb91e5b4abbdeadf5186d46719c4cad2557",
      "tree": "d0fcd9e7f9c546ff96baaf4b1e58ab5f14664d46",
      "parents": [
        "ec599f2a53e61710706a9fddcb3b1932a2e4da57"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 12 01:22:30 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 13:04:20 2026 +1000"
      },
      "message": "Bump com.gradle.common-custom-user-data-gradle-plugin\n\nBumps com.gradle.common-custom-user-data-gradle-plugin from 2.4.0 to 2.7.0.\n\n---\nupdated-dependencies:\n- dependency-name: com.gradle.common-custom-user-data-gradle-plugin\n  dependency-version: 2.7.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "ec599f2a53e61710706a9fddcb3b1932a2e4da57",
      "tree": "b960806120c61cfe0e5add407166135fcfc59291",
      "parents": [
        "c9363dba83711e0b680546e275294a5ac1836485"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Jul 12 01:23:32 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 13:04:02 2026 +1000"
      },
      "message": "Bump github/codeql-action from 4.36.2 to 4.36.3\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.2 to 4.36.3.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.36.2...v4.36.3)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.36.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "c9363dba83711e0b680546e275294a5ac1836485",
      "tree": "7116177c6d50e9eaeb972d1a6549d17be6636a0f",
      "parents": [
        "12f8434883693782bd7eb4e426f9ade173d43848"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 07:19:22 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 11:23:46 2026 +1000"
      },
      "message": "GROOVY-12150: Show a closure\u0027s generated class in the AST browser decompiled view\n\nStamp each ClosureExpression, at closure-class creation, with the name of\nthe synthetic class it compiles to (a new GENERATED_CLOSURE_CLASS node-\nmetadata key on ClosureWriter), and have the console\u0027s AstNodeToScriptVisitor\nrender that name as a trailing block comment on the closure/lambda literal.\n\nPreviously the decompiled source showed the closure literal but never the\n`new \u003cClosureClass\u003e(...)` construction the writer emits, so a closure\u0027s\ngenerated class was visible only in bytecode. The mark rides the existing\nclass-creation path (one putNodeMetaData per closure, alongside the\nWriterControllerFactory one already there) and is only populated after the\nclass-generation phase, so it is free for normal compilation and simply\nabsent at earlier phases. The compiler itself never reads it.\n"
    },
    {
      "commit": "12f8434883693782bd7eb4e426f9ade173d43848",
      "tree": "81a5cab6ad379731de0ed2202d92f4117d2c6e4c",
      "parents": [
        "31c6d24a215c60f244d4cdc794f3b54f9b485df6"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 08:51:00 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 08:51:00 2026 +1000"
      },
      "message": "add Locale/TimeZone Jupiter isolation annotations - we don\u0027t use parallel tests yet but this would safeguard us if we do\n"
    },
    {
      "commit": "31c6d24a215c60f244d4cdc794f3b54f9b485df6",
      "tree": "8340f77d08db798f623f756aa87401aa9cfb0586",
      "parents": [
        "af8b417fc26a4186411e18ea372e4ec2ebd56259"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 07:13:09 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 07:13:09 2026 +1000"
      },
      "message": "rework benchmark to reflect current master defaults\n"
    },
    {
      "commit": "af8b417fc26a4186411e18ea372e4ec2ebd56259",
      "tree": "712abb1001ea9b541a2065341f539c768ac2f75e",
      "parents": [
        "3c58690c3913d828b56e922a65f806b587dd153e"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 06:31:33 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 06:35:34 2026 +1000"
      },
      "message": "GROOVY-12138: default invokedynamic property writes on (opt-out) + parity guard\n\nFlip groovy.indy.setproperty from opt-in (default off) to opt-out\n(default on); set -Dgroovy.indy.setproperty\u003dfalse to disable, matching\nthe getBooleanSafe(name, default) pattern used for cold.reflection.\n\nThe full suite (15709 tests) passes with the flag default-on, so no\nexisting test asserts flag-off-specific property-write bytecode and none\nneeds a skip guard — the behaviour-preserving adapter fallback means the\nsuite runs as-is and passes in both states.\n\nSince the default is now on, the off state is no longer exercised by the\nnormal run, so adds SetPropertyParityTest (in the ColdReflectionParityTest\nstyle): the flag is static-final at IndyCallSiteWriter class-init and\ncannot be toggled in-process, so it compiles+runs a property-write\ncorpus in two JVMs (\u003dtrue / \u003dfalse) and asserts byte-identical\ntranscripts, plus a bytecode check that emission is genuinely gated\n(indy setProperty sites when on, none when off) so the parity check\ncannot pass vacuously.\n"
    },
    {
      "commit": "3c58690c3913d828b56e922a65f806b587dd153e",
      "tree": "0adf5da4544642b98729c3536e4dc3a208de5a16",
      "parents": [
        "38a3cdef14c29b904353683803062ba3c78d4466"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Jul 07 20:32:04 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Jul 12 06:14:47 2026 +1000"
      },
      "message": "GROOVY-12137: experimental reflective cold tier for indy dispatch (spike)\n\nBehind the groovy.indy.cold.reflection flag (default: off), plain method\ncalls dispatch reflectively while a call site is cold, deferring all\nMethodHandle chain construction — and its one-time LambdaForm creation\ncost — to hit-count promotion. The shared cold dispatcher has a single\n(Object[])Object shape for every call site, arity, and primitive\npattern; promotion installs the unchanged full guarded chain, so the\nhot path is identical to master.\n\nPlain calls are public, non-static, non-category CachedMethods on\npublic classes with a real receiver and no spread/safe-null/interceptor\nsemantics; caller-sensitive targets (including unannotated\ncaller-context-sensitive cases like object serialization, and interface\nselections resolving to sensitive implementations) stay on the full\npath. Selection reuses Selector\u0027s existing logic via a new\nselection-only hook; validity is re-checked per call with plain-Java\nequivalents of the chain\u0027s guards. A per-wrapper cumulative counter\npromotes polymorphic receiver shapes that the consecutive-hit counter\nnever catches.\n\nMeasured (deterministic class-load counters + fresh-JVM timing):\n~2/3 of per-shape LambdaForm cost removed on cold dispatch workloads,\n1.34-1.40x faster cold dispatch with many cold sites, steady state\nunchanged after promotion, MOP-heavy test subset (3437 tests) green\nwith the flag on.\n\nChanges from review feedback: consolidate caller-sensitivity, harden invariants\n\n    - selectForColdReflection now throws GroovyBugError for non-METHOD call\n      types instead of silently returning null, so a broken fallback gate\n      cannot hide behind the full handle path\n    - the NullObject exclusion is marked TODO: its methods are ordinary\n      methods on a singleton receiver and could be served reflectively\n    - all method-determined caller-sensitivity — the annotation probe plus\n      declaring-class cases like object serialization\u0027s stack-walking loader\n      lookup — now lives behind CachedMethod#isCallerSensitive, computed\n      once per method; the wrapper keeps only the receiver-dependent case\n    - implementation resolution now applies to abstract selections only\n      (e.g. the metaclass picking ObjectInput.readObject() for a call on an\n      ObjectInputStream): interface default methods carry their own\n      annotations, are probed directly, and take the reflective tier\n"
    },
    {
      "commit": "38a3cdef14c29b904353683803062ba3c78d4466",
      "tree": "182b7212cd0ebc0519e23f52f4d1c15eff683f5c",
      "parents": [
        "9d01e177d88d57516ce821531624eccd359af8b4"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 11 22:59:01 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 20:59:01 2026 +0800"
      },
      "message": "GROOVY-12138: emit invokedynamic call sites for property writes (spike) (#2674)\n\n* GROOVY-12138: emit invokedynamic call sites for property writes (spike)\n\nProperty writes were the last un-cached dispatch surface: even in indy\nmode they compiled to static ScriptBytecodeAdapter.setProperty calls,\npaying getMetaClass() plus a full MetaClassImpl.setProperty resolution\nwalk on every write, in both indy and classic modes.\n\nBehind the compile-time flag groovy.indy.setproperty (default: off),\nAsmClassGenerator now diverts plain (non-safe, non-spread) property\nwrites to a new CallSiteWriter.makeSetPropertySite hook. The default\nimplementation is the classic adapter call, so classic mode and\nflag-off builds are unchanged; IndyCallSiteWriter overrides it to emit\ninvokedynamic setProperty:(ReceiverType, ValueType)V with the receiver\nfirst, preserving the runtime\u0027s arguments[0]-is-receiver invariant.\n\nThe new SetPropertySelector (replacing the \u0027not supported\u0027 GroovyBugError\nfor CallType.SET) fast-paths only shapes whose resolution is provably\nsender- and metaclass-independent: a public setter whose backing field\nis private or absent (GROOVY-8283 field-precedence is sender-dependent),\nor a public non-final field, each accepting the runtime value type\ndirectly. Everything else — Maps (GROOVY-8065/11367), Class receivers,\ncategories, overridden/mixed-in/expando setProperty (detected by both a\nreflection probe and a metaclass pickMethod probe; ExpandoMetaClass is\nexcluded wholesale, mirroring the GET selector), value coercion,\nlisteners, propertyMissing — binds the sender-aware\nScriptBytecodeAdapter.setProperty as the call-site handle, making\nnon-fast-path behavior identical to the classic path by construction.\nGuards, PIC, and hit-count promotion come free from the existing\ncall-site machinery; the value participates in the argument-class\nguards so type changes at a site re-select correctly.\n\nMeasured: ~42x on a hot property-write loop (6M mixed setter/field\nwrites: ~435ms -\u003e ~10ms, written state consumed and verified). Full\nroot test suite (15678 tests) passes with the flag enabled for all\ntest-code compilation; a 12-scenario semantic stress produces identical\noutput compiled with and without the flag.\n\n* GROOVY-12138: address review comments"
    },
    {
      "commit": "9d01e177d88d57516ce821531624eccd359af8b4",
      "tree": "02cbe182c3b6e0f483871044bface34a4cf3eeee",
      "parents": [
        "c60513a59044d1bc63f1f65c7bb2ba356c1ef7eb"
      ],
      "author": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Wed Jul 08 10:42:17 2026 -0500"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 11 15:01:57 2026 +1000"
      },
      "message": "GROOVY-12117: replace super trait search with more complete helper stub"
    },
    {
      "commit": "c60513a59044d1bc63f1f65c7bb2ba356c1ef7eb",
      "tree": "f45e86e8d638a12077d2c4bb894af942e4621a13",
      "parents": [
        "a9ead47e279e365ce4466afe6e1d42b879b890b7"
      ],
      "author": {
        "name": "Kartik Kenchi",
        "email": "netliomax25@gmail.com",
        "time": "Fri Jul 10 10:43:45 2026 +0530"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Jul 11 15:00:23 2026 +1000"
      },
      "message": "GROOVY-12148: fix out-of-bounds read on dangling escape in decodeJsonString\n"
    }
  ],
  "next": "a9ead47e279e365ce4466afe6e1d42b879b890b7"
}
