)]}'
{
  "log": [
    {
      "commit": "38697438da07ba1f9f05e93efe4fd8b1174718f9",
      "tree": "bdcb0d8452b120345921826f520c1f8e7532f9a0",
      "parents": [
        "c9eb64e804f2d7d7834a6a871c16571911052c7b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 30 05:42:17 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 30 05:42:17 2026 +1000"
      },
      "message": "GROOVY-12521: super.x \u003d value chooses among the setters of the superclass (COMPATABILITY note)\n"
    },
    {
      "commit": "c9eb64e804f2d7d7834a6a871c16571911052c7b",
      "tree": "01c3544e6661dc1c7534832c1ada00dc4db37adb",
      "parents": [
        "5e4ab9f224da772b54f5edf2bb3babea1fc3f3fb"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Oct 25 16:29:18 2026 -0700"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 30 05:39:02 2026 +1000"
      },
      "message": "GROOVY-12521: super.x \u003d value chooses among the setters of the superclass\n\nA property with several setters is a MultipleSetterProperty, whose\nsetProperty calls the setter by name with ordinary dispatch. For super,\nthat reached the class\u0027s own setter when it overrides one of them or\ndeclares the property: super.x \u003d \u0027a\u0027 set the class\u0027s own x in dynamic\nGroovy and under @TypeChecked, also in a closure and for super.x++ and\nsuper.x +\u003d v. MetaClassImpl.setProperty now calls the setter as a super\ncall, like super.setX(value).\n"
    },
    {
      "commit": "5e4ab9f224da772b54f5edf2bb3babea1fc3f3fb",
      "tree": "21824dd43f6a8236180972d9c8512c64d238eea8",
      "parents": [
        "0c7c1c1733871035166f5dd731903d2113876002"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 30 04:48:12 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 30 04:48:12 2026 +1000"
      },
      "message": "GROOVY-12520: document the isX()/getX() getter rule and test super.x through a middle class\n\nA boolean property has both isX() and getX(), a Boolean property only\ngetX(), and a read of a property with both getters calls isX(), also\nthrough super. Add the case where an intermediate superclass overrides\nisX(), which dynamic Groovy and @TypeChecked got wrong before\nGROOVY-12520, Groovy 4 included.\n"
    },
    {
      "commit": "0c7c1c1733871035166f5dd731903d2113876002",
      "tree": "78b58e988815e161b910818141afd703b6508ec9",
      "parents": [
        "5b077f9dcf610898e3415f1f1cebbaab8eecab61"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Oct 25 16:29:18 2026 -0700"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 30 04:41:44 2026 +1000"
      },
      "message": "GROOVY-12520: super.x calls isX() when the class overrides isX()\n\nWhen a class declares both isX() and getX(), the property x is read\nthrough isX() (GROOVY-10133), also through super. For super usage the\ngetter of a method the subclass overrides is the MOP method\nsuper$N$isX, and the check that keeps isX() over getX() only accepted\nnames starting with \"is\", so getX() replaced it: in a class that\noverrides isX() or declares a boolean property x, super.x called\ngetX() in dynamic Groovy and under @TypeChecked. The check now looks\npast the MOP prefix. 4.0.33 called isX(); the order in which the\naccessors are indexed changed in 5.0.0.\n"
    },
    {
      "commit": "5b077f9dcf610898e3415f1f1cebbaab8eecab61",
      "tree": "b149f3b05c285e6422fe51890b83e60a292960f9",
      "parents": [
        "45ba7877f7c01233c154a2a9e75ead6f61cf2cdd"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Oct 25 12:23:45 2026 -0700"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 20:22:48 2026 +1000"
      },
      "message": "GROOVY-12509: STC: allow members of a private nested type from another class of the same nest\n\nSince GROOVY-12310 (6.0.0), the type checker rejects a field whose\nqualifying type is out of reach, through hasAccessToClass. That check\ndid not know about nests, so a public field or enum constant of a\nprivate nested type, such as A.Hidden.x or A.E.ONE, failed with\n\"Cannot access field\" when used from a sibling of A or even from the\nouter class. Groovy 5.0.8 compiles and runs the same code, and javac\naccepts it (JLS 6.6.1). Methods and constructors of the same private\ntype were never affected.\n\nhasAccessToClass now treats every type of a nest as accessible from\nevery other type of the same nest. A private nested type of another\ntop-level class is still rejected, and so is the package-private\nnested type of another package that GROOVY-12310 is about.\n"
    },
    {
      "commit": "45ba7877f7c01233c154a2a9e75ead6f61cf2cdd",
      "tree": "3f6ce859fa7bc45ef9e10971a07bccb688fc3ccf",
      "parents": [
        "a39ba7a086183e2b6e0fd618b7f10382896112f9"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Oct 24 11:22:06 2026 -0700"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 20:04:18 2026 +1000"
      },
      "message": "GROOVY-12489: Decide once per class whether a GroovyObject overrides setProperty or getProperty\n\nA dynamic property access that carries a sender must know whether the\nreceiver overrides the setProperty or getProperty that GroovyObject\nprovides: an override receives the access, while for the GroovyObject\ndefault the runtime calls the metaclass itself with the sender, which is\nhow a superclass reaches its own private field on a subclass instance.\nScriptBytecodeAdapter, the indy property selectors and the classic call\nsites answered this with Class.getMethod on every access, and handled a\nfailed lookup inconsistently: the adapter let it escape, SetPropertySelector\ntreated it as an override, PropertySelector went around the class\u0027s own\ngetProperty to the metaclass, and the classic sites fell back only for\nNoSuchMethodException.\n\nReflection over a class can fail although the class works, notably in a\nGraalVM native image without reflection metadata for the class, so writes\nand adapter reads to such objects failed and indy reads were answered by\nthe metaclass, sometimes with a wrong value and no error.\n\nThe new internal GroovyObjectOverrides caches each answer per class in a\nClassValue: overridesSetProperty for all writes, overridesGetProperty for\nScriptBytecodeAdapter.getProperty, and hasCustomGetProperty (which also\nsets aside synthetic and @Internal implementations) for the indy and\nclassic read sites, keeping the existing split between the two read\ncriteria. When reflection cannot read the class, it counts as overriding,\nso the access reaches the object\u0027s own method instead of failing or\nbypassing a real override.\n\nThe checks now set aside only GroovyObject\u0027s own default. Since Groovy 5\n(GROOVY-8283) any interface default was taken for it, so a setProperty or\ngetProperty from a default method of another interface was skipped by\nobj.x \u003d v writes and computed-name reads while other accesses reached it.\nIt now receives every access, as a declared method does and as in Groovy 4.\n"
    },
    {
      "commit": "a39ba7a086183e2b6e0fd618b7f10382896112f9",
      "tree": "ffb7334e75db32d1a5e4a982e3265dc51172d144",
      "parents": [
        "fa35d67935c284f45818c6dd30aea4a52f18192a"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 16:02:17 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 19:19:04 2026 +1000"
      },
      "message": "GROOVY-12472: STC: propagate inferred return types of methods with a sole implementation, in the same class and via @TypeCheckingInfo\n"
    },
    {
      "commit": "fa35d67935c284f45818c6dd30aea4a52f18192a",
      "tree": "1a00773a2a7d19b8edfcb407e3ecf34e7629d2b6",
      "parents": [
        "f665ee703299e9d0d27b492367b256b32bedbea4"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 06:21:37 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 18:53:29 2026 +1000"
      },
      "message": "GROOVY-12442: address review comments round 2\n"
    },
    {
      "commit": "f665ee703299e9d0d27b492367b256b32bedbea4",
      "tree": "43fa4723179c083979967a578fb6b110caaba444",
      "parents": [
        "b84e0fe3a3f110cba3c0cbab8b15840d60f9614f"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 11:29:02 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 18:53:29 2026 +1000"
      },
      "message": "GROOVY-12442: address review comments\n"
    },
    {
      "commit": "b84e0fe3a3f110cba3c0cbab8b15840d60f9614f",
      "tree": "5b1facad222cc8c44cfcfbfb4ddb427700893c1f",
      "parents": [
        "7c25debf43e01e411a424ee782817fb624b61e99"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 13:11:28 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 18:53:29 2026 +1000"
      },
      "message": "GROOVY-12442: Introduce a null-coalescing operator (??) that provides a default value only when the left-hand operand is null, independently of Groovy Truth\n"
    },
    {
      "commit": "7c25debf43e01e411a424ee782817fb624b61e99",
      "tree": "6a72b5667acb38ce5d3b6af1927f28b58aa2390f",
      "parents": [
        "a58c3d52223979755d06f9bf0ae37c074c6c107d"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 12:18:35 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 18:49:43 2026 +1000"
      },
      "message": "GROOVY-12486: address review comments\n"
    },
    {
      "commit": "a58c3d52223979755d06f9bf0ae37c074c6c107d",
      "tree": "07bd80474f89d80ba750782607fc4b146d291fb3",
      "parents": [
        "d82dc98590867204f7ffbf8fb68b473b68cd6d72"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 13:02:25 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 18:49:43 2026 +1000"
      },
      "message": "GROOVY-12486: MonadicChecker types the DO generator variable from the carrier\u0027s first type argument\n\nThe bound variable is now typed from the input of the carrier\u0027s bind function, resolved against the receiver\u0027s type arguments, so Either\u003cL, R\u003e and Validation\u003cE, A\u003e bind R and A instead of L and E.\n"
    },
    {
      "commit": "d82dc98590867204f7ffbf8fb68b473b68cd6d72",
      "tree": "6913544e9ae3ec5ec8826fbd91edfa1dd1b8ebab",
      "parents": [
        "10a0c0ed854a3d2ba1a358e41f3a74c2f18bbe37"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 22 10:03:20 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 16:07:23 2026 +1000"
      },
      "message": "GROOVY-12428: STC: instanceof narrowing leaks from one switch case into subsequent cases\n"
    },
    {
      "commit": "10a0c0ed854a3d2ba1a358e41f3a74c2f18bbe37",
      "tree": "db72437cbbacda9fc2ec7be5ab7009b3f214c353",
      "parents": [
        "cde756f850fd7145fb0875e764e673bf229b5fcd"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 13:02:54 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 11:21:42 2026 +1000"
      },
      "message": "GROOVY-11434: add an optional groovy-fx module\n\nA fresh implementation of the GroovyFX ideas, structured like groovy-swing:\nSceneGraphBuilder registers JavaFX nodes through SwingBuilder-style\nregister* groups, with one reflective NodeFactory for the common shape\nand small factories only where JavaFX deviates (stages, scenes,\nBorderPane positions, charts, table columns, bind). @FXBindable turns\nGroovy properties into lazily created JavaFX properties, with a GEP-21\nstubber for joint compilation. FXExtensions supplies the operator names\nJavaFX spells differently (plus, minus, div, negative, concat) plus\nonChange/onInvalidate, and GroovyFX.start launches without an\nApplication subclass.\n\nJavaFX is GPL-2.0 with the Classpath Exception and published per\nplatform, so it is compileOnly and never bundled; FXRuntime reports the\nways to obtain it when it is missing. Tests run the toolkit headless\nthrough openjfx-monocle, whose 21.x builds need Java 21, so the toolkit\ntests are enabled for Java 21 and later; the property, binding and\ntransform tests need no toolkit and run everywhere.\n"
    },
    {
      "commit": "cde756f850fd7145fb0875e764e673bf229b5fcd",
      "tree": "ff35aefdb7c70ea95916521dc1c813344424b8e0",
      "parents": [
        "3f117e1e45cbe8b740e30f0beb4d03597546836f"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 13:34:51 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 09:40:06 2026 +1000"
      },
      "message": "GROOVY-12479: SC: receiver expression is not evaluated when it is used to access a static field or call a static method\n\nUnder static compilation a static member reached through an expression compiled to a bare GETSTATIC or INVOKESTATIC, so the expression itself never ran and its side effects were lost. Java evaluates it and discards the value (JLS 15.11.1, 15.12.4.1), as do dynamic Groovy and @TypeChecked.\n\nThere were four places that skipped it: InvocationWriter.writeDirectMethodCall visited the receiver only for an instance target (this also covers static properties, which are read and written through their accessors); StaticTypesCallSiteWriter.makeGetField emitted GETSTATIC directly; the static-extension path in StaticInvocationWriter passed null in its place; and, since GROOVY-12473, StaticTypesCallSiteWriter.makeGetPropertySite replaced a Class-typed receiver with the class literal before looking up the static member. Each now evaluates the receiver first, unless it is a class literal, a variable or the implicit this, which cannot have side effects, so the common forms compile as before. The Class-typed receiver is evaluated once into a temporary, which the java.lang.Class property fallback then reads. StaticInvocationWriter no longer wraps the receiver of a static target in a checkcast, which would fail for a Class-typed receiver.\n\nThe predicate for a receiver that may have side effects is ExpressionUtils.mayHaveSideEffects, shared by the three writers.\n"
    },
    {
      "commit": "3f117e1e45cbe8b740e30f0beb4d03597546836f",
      "tree": "47df0a12755bf76af5f0e4cd163dfaf779f2424b",
      "parents": [
        "a8c8478d879c8b68759fcaa74eb0b526a5f88207"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 13:08:17 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 07:35:46 2026 +1000"
      },
      "message": "GROOVY-12542: Branch directly on comparisons in conditions instead of first producing a boolean value\n"
    },
    {
      "commit": "a8c8478d879c8b68759fcaa74eb0b526a5f88207",
      "tree": "6740c35340f93ad974e5b0ebe46ba895ba58d994",
      "parents": [
        "d7427885fb49e2f39af7447571a304700cdcf796"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 07:34:58 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 07:34:58 2026 +1000"
      },
      "message": "some minor tweaks to reduce GitHub runner load\n"
    },
    {
      "commit": "d7427885fb49e2f39af7447571a304700cdcf796",
      "tree": "9cde9a9f8eba7dfbf38b3ff74d2ce0d9a803682c",
      "parents": [
        "dc1e6da78380062b00dad3d2479cbc79f220a683"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 12:48:31 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 06:33:39 2026 +1000"
      },
      "message": "GROOVY-12541: @CompileStatic silently drops type annotations on local variables\n"
    },
    {
      "commit": "dc1e6da78380062b00dad3d2479cbc79f220a683",
      "tree": "83df5a30fa50b191ce2d3d7928cfe1be7b24c8bb",
      "parents": [
        "37b3c2a3a6de09cded8a4bd78ff1606e8a15047e"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 12:42:58 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 06:24:27 2026 +1000"
      },
      "message": "GROOVY-12540: GroovyBugError when a primitive local variable has a TYPE_USE annotation\n"
    },
    {
      "commit": "37b3c2a3a6de09cded8a4bd78ff1606e8a15047e",
      "tree": "43609a44aca5583cd3941cf91a663728555c533c",
      "parents": [
        "4d2d9c21d6ee4facd0ac3211389f74ee41b15a55"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 19:15:50 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 05:48:43 2026 +1000"
      },
      "message": "GROOVY-12512: reject an enclosing instance member used from an anonymous class in an argument of this(...) or super(...)\n\nAn argument of an explicit constructor call is evaluated before the\ninstance exists, so an anonymous class created there has no enclosing\ninstance, just like one created in a static method. VariableScopeVisitor\nonly flagged the argument itself as a special constructor call, and gave\nthe anonymous class a scope whose parent was the constructor\u0027s\nnon-static scope. So the checks added for a static context did not\napply: pm() and an instance field compiled under @CompileStatic and\nfailed with VerifyError, and Box.this.pm() failed with VerifyError in\nevery mode. javac reports \"cannot reference this before supertype\nconstructor has been called\".\n\nThe anonymous class now gets a static scope between it and the\nconstructor, so the type checker, ResolveVisitor and the static scope\ncheck treat it like an anonymous class in a static method: pm() fails\nwith \"Cannot find matching method\" under @TypeChecked and\n@CompileStatic, and Box.this.pm() and an instance field are compile\nerrors in every mode. Its own body is visited outside the special\nconstructor call, as it has its own instance; constructor parameters,\nstatic members and its own members can still be used.\n"
    },
    {
      "commit": "4d2d9c21d6ee4facd0ac3211389f74ee41b15a55",
      "tree": "edca1583d1b08836e978a7ed9fea8b2dee9a72f3",
      "parents": [
        "7d72f650dc1f75ca91214efabb2a3af580389e6b"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Oct 25 12:34:17 2026 -0700"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 05:48:43 2026 +1000"
      },
      "message": "GROOVY-12512: reject an enclosing instance method called from an anonymous class in a static context\n\nAn anonymous class created in a static method, a static initializer, a\nstatic field initializer or a closure inside one of them has no\nenclosing instance. The type checker still looked up instance methods\nof the outer class for an unqualified call inside it, so @TypeChecked\ncompiled pm() there and it then failed with MissingMethodException, and\n@CompileStatic generated code that failed with \"VerifyError: Bad type\non operand stack\" (or a ClassCastException when a closure was\ninvolved). javac reports that a non-static method cannot be referenced\nfrom a static context. An instance field in the same place was already\nrejected.\n\nThe type checker now treats such an anonymous class like a static\nnested class when it looks for a method or property of an outer class,\nso the call fails with \"Cannot find matching method\". The static\ncontext is read from the variable scope that VariableScopeVisitor gives\nthe anonymous class, whose parent is the scope where the class is\ncreated.\n\nThe explicit form, Box.this.pm(), failed with VerifyError in every\nmode, in such an anonymous class and also in a static nested class,\nwhich never has an enclosing instance. ResolveVisitor now reports \"The\nusage of \u0027Class.this\u0027 and \u0027Class.super\u0027 is not allowed in \u0027...\u0027, which\nhas no enclosing instance of \u0027...\u0027\" when the path from the current\nclass to the named outer class crosses a static nested class or an\nanonymous class created in a static context.\n"
    },
    {
      "commit": "7d72f650dc1f75ca91214efabb2a3af580389e6b",
      "tree": "69ee80294bc2f467e32fd4f84e714030d3417547",
      "parents": [
        "4e2f5162c2a92b9553312616ffcafc057caf51cd"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 21:15:06 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 29 04:40:02 2026 +1000"
      },
      "message": "GROOVY-12538: Primitive double/float \u003e and \u003e\u003d comparisons return true when an operand is NaN\n\nWhen both operands of a comparison are primitive double or float values, the\ncomparison was compiled to DCMPG (FCMPG) for every ordered operator. DCMPG\npushes 1 when either operand is NaN, so \u003e and \u003e\u003d evaluated to true. javac uses\nDCMPL (FCMPL) for \u003e and \u003e\u003d and DCMPG (FCMPG) for \u003c and \u003c\u003d, so that every\ncomparison with a NaN operand is false (JLS 15.20.1), which Groovy already gave\nfor two Double objects.\n\nBinaryExpressionWriter gains a getCompareCode(int) hook, used by\nwriteStdCompare, and the double and float helpers choose the instruction per\noperator. Comparisons through Groovy\u0027s number comparison (mixed operand types,\n\u003d\u003d on Double objects) and \u003c\u003d\u003e are unchanged.\n"
    },
    {
      "commit": "4e2f5162c2a92b9553312616ffcafc057caf51cd",
      "tree": "094dd3f41ab9c338518d297164de30472f04adb8",
      "parents": [
        "35abd5be98cf6521b68854533bf19f136b3d3ede"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 05:16:20 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 05:16:20 2026 +1000"
      },
      "message": "show affects versions/branches merged on recent Jiras wit committed PRs\n"
    },
    {
      "commit": "35abd5be98cf6521b68854533bf19f136b3d3ede",
      "tree": "499e237e53ba8793bbd943599f596575a659ae1e",
      "parents": [
        "cfd9b2f0222a8e1a74473f7c5b2cb45b5bdd3b5b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 04:53:07 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 04:53:21 2026 +1000"
      },
      "message": "a skill to help with PR triage - magpie targets PR triage for non-committer PRs - it maybe should move but placed with the other scripts for now\n"
    },
    {
      "commit": "cfd9b2f0222a8e1a74473f7c5b2cb45b5bdd3b5b",
      "tree": "ed1adbf5201f3e5868a076e37ceee050aeb4522c",
      "parents": [
        "86d668a4f7c9353152b554d5c82ef3f432206bc4"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 02:53:35 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 28 04:47:52 2026 +1000"
      },
      "message": "GROOVY-11154: Script subclasses cannot have constructors with arguments\n"
    },
    {
      "commit": "86d668a4f7c9353152b554d5c82ef3f432206bc4",
      "tree": "d7a9557e69f94f962332547ff07b61eb4aafd651",
      "parents": [
        "c941f5a21d2c1e70650f3f24e2c43ce72bf26876"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 19:48:28 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 19:48:28 2026 +1000"
      },
      "message": "bump dependency metadata (cont\u0027d)\n"
    },
    {
      "commit": "c941f5a21d2c1e70650f3f24e2c43ce72bf26876",
      "tree": "8d150bb63de843762b2f8a85950d0b632a0c6e95",
      "parents": [
        "7be8da046fd57a35ef4bdc7ba93cfcda163025bd"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 19:39:27 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 19:39:27 2026 +1000"
      },
      "message": "bump dependency metadata\n"
    },
    {
      "commit": "7be8da046fd57a35ef4bdc7ba93cfcda163025bd",
      "tree": "2f0dfd9db093349b5fc3bb5220cadec2194ee311",
      "parents": [
        "2412319b847e559850d96f1fd4168aa75eed9de9"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 22 14:26:24 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 16:45:09 2026 +1000"
      },
      "message": "GROOVY-12458: @Grab in a class defined by a non-GroovyClassLoader fails at runtime with groovy-grape-maven (\"No suitable ClassLoader found for grab\")\n"
    },
    {
      "commit": "2412319b847e559850d96f1fd4168aa75eed9de9",
      "tree": "8d717ad4120791c11f7186ef170f4158e45d7d3d",
      "parents": [
        "1abbfc5df91dee3b7f085a8ff845762d1435198c"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 08:14:36 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 08:14:55 2026 +1000"
      },
      "message": "GROOVY-12532: Parallel parsing corrupts the shared ErrorCollector\u0027s message list (call failIfErrors outside the lock)\n\naddError(Message) now decides whether the tolerance is exceeded while\nholding the collector\u0027s monitor and calls the overridable failIfErrors()\nafter releasing it. The class Javadoc now names the collector itself as\nthe lock that subclasses touching errors or warnings must hold.\n"
    },
    {
      "commit": "1abbfc5df91dee3b7f085a8ff845762d1435198c",
      "tree": "8f8d5cc932ed32ea51c35282195583586d08c5c2",
      "parents": [
        "34e9ed62408400657ac94742df96ec8386d06689"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 17:12:40 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 08:14:55 2026 +1000"
      },
      "message": "GROOVY-12532: Parallel parsing corrupts the shared ErrorCollector\u0027s message list\n\nSynchronize recording and indexed access in ErrorCollector, and when parsing\nin parallel, finish parsing every source before rethrowing a failure, so the\ncollector is complete and no longer changing when compile() throws.\n"
    },
    {
      "commit": "34e9ed62408400657ac94742df96ec8386d06689",
      "tree": "43191c0a8c18d262ee217d672280a3845b6288df",
      "parents": [
        "8cc864683e6c0396ef969566e04bd355b3833628"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 06:28:10 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 27 06:28:10 2026 +1000"
      },
      "message": "GROOVY-12469: SC: call members of a wider-declared variable without narrowing it, and convert GStrings where only a String will do\n\nA local variable declared wider than the type inferred for its initializer\nfrom generics is stored as its declared type, so the value need not be of\nthe inferred type (e.g. a GString in a List\u003cString\u003e filled by dynamic code).\nCasting it to the inferred type before every call made calls the declared\ntype supports throw ClassCastException where Java would not.\n\n- bind calls and bound method references to the declared type when it has\n  the same method, as javac does\n- where only String has the member, convert a GString to its text before\n  the cast, as Groovy does wherever a String is required; this also applies\n  to generic results used directly (list.get(0).toUpperCase() and closure\n  parameters), which threw before; the check is skipped when a type check\n  such as instanceof guarantees a String\n- document GStrings in collections of Strings and the 6.0.1 behaviour change\n"
    },
    {
      "commit": "8cc864683e6c0396ef969566e04bd355b3833628",
      "tree": "994a37dbb274852e65fde5f15004feda806f132d",
      "parents": [
        "e301e08c4de31eb61b0805e45c7a99b879f165f9"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 16:43:15 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 17:55:38 2026 +1000"
      },
      "message": "GROOVY-12469: SC: static compilation inserts wrong cast, derived from generic return type when assigned to a variable\n"
    },
    {
      "commit": "e301e08c4de31eb61b0805e45c7a99b879f165f9",
      "tree": "8ba40b32ed17d1ba7c14e3a363753b1c9b7d70e0",
      "parents": [
        "68de9629415e99167a27a43cde8c263e228b92dd"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 10:17:42 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 10:20:26 2026 +1000"
      },
      "message": "GROOVY-12471: SC: Method abs misbehaves under static compilation (update docs)\n"
    },
    {
      "commit": "68de9629415e99167a27a43cde8c263e228b92dd",
      "tree": "9c404b3f6bbba2056fcfd293ca5ba182a5370979",
      "parents": [
        "da626f43025aa79b54979400871b82084d4ed95d"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 07:58:58 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 10:10:43 2026 +1000"
      },
      "message": "GROOVY-12471: SC: Method abs misbehaves under static compilation\n"
    },
    {
      "commit": "da626f43025aa79b54979400871b82084d4ed95d",
      "tree": "8102ac390f646e45e53f18dbcfe4d52e07c31ef6",
      "parents": [
        "48203839616dc0487857927de148e8da3c0f2486"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 11 23:31:52 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 09:42:26 2026 +1000"
      },
      "message": "GROOVY-12448: Wire Groovy Console and groovysh to the in-process language engine\n"
    },
    {
      "commit": "48203839616dc0487857927de148e8da3c0f2486",
      "tree": "d11084b31aeebee4009cd80ae8430df541954d97",
      "parents": [
        "8356f88973b86c35d6f8c2d581d2f58f1d86572d"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 18:04:26 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 26 06:46:14 2026 +1000"
      },
      "message": "GROOVY-12452: STC cannot find the accessor of a record component whose name starts with \"is\" or \"get\" when called from the same compilation unit\n"
    },
    {
      "commit": "8356f88973b86c35d6f8c2d581d2f58f1d86572d",
      "tree": "a13637336b6d59d987f672feb768f27d6bfc428a",
      "parents": [
        "612b1536f43692aac58264044c61f024f6538ede"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 25 17:44:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 17:44:35 2026 +0800"
      },
      "message": "Bump com.fasterxml.jackson:jackson-bom from 2.22.3 to 2.22.4 (#3027)\n\nBumps [com.fasterxml.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.22.3 to 2.22.4.\n- [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.22.3...jackson-bom-2.22.4)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson:jackson-bom\n  dependency-version: 2.22.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": "612b1536f43692aac58264044c61f024f6538ede",
      "tree": "3e5bd4358a3ed649199ff4ac7a5284c66b85a073",
      "parents": [
        "3dfc0b74885ffb5305e94d41f223baf00dd44154"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 05:37:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 05:37:58 2026 -0400"
      },
      "message": "GROOVY-12505: Bump slf4j to 2.0.20 (#3040)"
    },
    {
      "commit": "3dfc0b74885ffb5305e94d41f223baf00dd44154",
      "tree": "efb03755248ff18fc99fe2c4495e912ecca2e582",
      "parents": [
        "c744af13046abbd7991c918e946a92873b0c7cd7"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 05:37:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 05:37:55 2026 -0400"
      },
      "message": "GROOVY-12501: Bump mavenResolverProvider to 4.0.0-rc-7 (#3036)"
    },
    {
      "commit": "c744af13046abbd7991c918e946a92873b0c7cd7",
      "tree": "2844c6e212caf13e7d26ef38ba6a487fdd62ba95",
      "parents": [
        "ccf551900026e937ae937cc1b748c7333873c82d"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 05:37:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 05:37:49 2026 -0400"
      },
      "message": "GROOVY-12500: Bump commonsLang3 to 3.21.0 (#3035)"
    },
    {
      "commit": "ccf551900026e937ae937cc1b748c7333873c82d",
      "tree": "75cd87079c0b08be116f77651769c3828d1839cc",
      "parents": [
        "d807904c54dafa03fb91191e34d9b68e2315e40e"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:33:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:33:04 2026 -0400"
      },
      "message": "GROOVY-12498: Bump spotbugs to 4.10.5 (#3033)"
    },
    {
      "commit": "d807904c54dafa03fb91191e34d9b68e2315e40e",
      "tree": "fc36de5fb38316ef56358216ba73d79f3785d3c3",
      "parents": [
        "151db6e4b8cc0ad6db7693ad081300c70e22aaa1"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:20:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:20:13 2026 -0400"
      },
      "message": "GROOVY-12504: Bump jline to 4.4.8 (#3039)"
    },
    {
      "commit": "151db6e4b8cc0ad6db7693ad081300c70e22aaa1",
      "tree": "cc6cfae58702b4c87fd1966c7a5c8f9275f0cfb2",
      "parents": [
        "67b5e06b9454d3d51c33a751f48884624155296b"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:19:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:19:56 2026 -0400"
      },
      "message": "GROOVY-12503: Bump commonmark to 0.31.0 (#3038)"
    },
    {
      "commit": "67b5e06b9454d3d51c33a751f48884624155296b",
      "tree": "edf0db0481e065943d79c8531bdbac0851592447",
      "parents": [
        "59ccc345848eea157e057f098f91c709b3ee7a75"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:19:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:19:35 2026 -0400"
      },
      "message": "GROOVY-12502: Bump mavenResolverSupplier to 2.0.24 (#3037)"
    },
    {
      "commit": "59ccc345848eea157e057f098f91c709b3ee7a75",
      "tree": "501c7c47c6c119f91e55f295e2f3d32da3b944ff",
      "parents": [
        "cbc5f1ee88386f73cf23e9c2c6b128166a2f6e9b"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:19:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:19:12 2026 -0400"
      },
      "message": "GROOVY-12499: Bump reactor to 3.8.8 (#3034)"
    },
    {
      "commit": "cbc5f1ee88386f73cf23e9c2c6b128166a2f6e9b",
      "tree": "860026b725bcdfec4bbff1cc9f7ebf7dbfb1d3a2",
      "parents": [
        "63f91cf00e91aa9c2c31e7dbab164e294f63e54f"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:19:01 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:19:01 2026 -0400"
      },
      "message": "GROOVY-12497: Bump jackson to 2.22.4 (#3032)"
    },
    {
      "commit": "63f91cf00e91aa9c2c31e7dbab164e294f63e54f",
      "tree": "a69c73ff6b01f896dbbfcf4979093334db3a5880",
      "parents": [
        "ddba4ab9abbf7ac8cbdbd4c24a36ccd45389dc02"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:18:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:18:51 2026 -0400"
      },
      "message": "GROOVY-12496: Bump logback to 1.6.5 (#3031)"
    },
    {
      "commit": "ddba4ab9abbf7ac8cbdbd4c24a36ccd45389dc02",
      "tree": "16242ad4941ecca77be3fce50e69ee55d480a90f",
      "parents": [
        "5553cffd69cac8bba3d5cdbcbeb933dd446e6ae5"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:18:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:18:41 2026 -0400"
      },
      "message": "GROOVY-12508: Bump json-unit to 6.4.0 (#3043)"
    },
    {
      "commit": "5553cffd69cac8bba3d5cdbcbeb933dd446e6ae5",
      "tree": "3fe5ab1752cc4df4ac72510fd040fef02b373116",
      "parents": [
        "ef3689f7ac8ef9e7ed6a32b655e4f62497dd2f13"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:18:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:18:31 2026 -0400"
      },
      "message": "GROOVY-12507: Bump commons-codec to 1.23.0 (#3042)"
    },
    {
      "commit": "ef3689f7ac8ef9e7ed6a32b655e4f62497dd2f13",
      "tree": "58d1be42c8a6480f7ec3886a3ff0414f7e9f7e68",
      "parents": [
        "9810806a41bce1fb08ed54270d89a9c5e3fd5a31"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:18:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:18:06 2026 -0400"
      },
      "message": "GROOVY-12506: Bump gson to 2.15.0 (#3041)"
    },
    {
      "commit": "9810806a41bce1fb08ed54270d89a9c5e3fd5a31",
      "tree": "bc02d07a3e93b5e1c7c8c3785bac2bdbdcb89e6b",
      "parents": [
        "19d5ab63d7e8fc4334648d574c90c5f361c9f509"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 04:10:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 04:10:25 2026 -0400"
      },
      "message": "GROOVY-12495: Bump reload4j to 1.2.27 (#3030)"
    },
    {
      "commit": "19d5ab63d7e8fc4334648d574c90c5f361c9f509",
      "tree": "6a63d31212bb21e1307e4d6ce07f3b8e56898fcb",
      "parents": [
        "218e48f197d97e8b301f50fe283b7b8971e1e9b1"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 11:38:09 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 25 11:40:34 2026 +0900"
      },
      "message": "GROOVY-12493: Bump antlr to 4.13.2.18\n"
    },
    {
      "commit": "218e48f197d97e8b301f50fe283b7b8971e1e9b1",
      "tree": "646b547b3795d9d82c7fe9ecf2d4eca44e891eef",
      "parents": [
        "18fb6d9c1849addac2146bd7b7d6e0cdd1980b75"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 25 01:22:58 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 12:40:17 2026 +1000"
      },
      "message": "Bump actions/setup-java from 6.0.1 to 6.1.0\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 6.0.1 to 6.1.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v6.0.1...v6.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.1.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": "18fb6d9c1849addac2146bd7b7d6e0cdd1980b75",
      "tree": "884bfa2867b9c8c44ef03003b938054bb9afbcf5",
      "parents": [
        "0edaf2c5e972cc8c961321395efaae9e3a8e2281"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 25 01:24:09 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 12:39:45 2026 +1000"
      },
      "message": "Bump github/codeql-action from 4.38.3 to 4.39.0\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.38.3 to 4.39.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.38.3...v4.39.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.39.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": "0edaf2c5e972cc8c961321395efaae9e3a8e2281",
      "tree": "d0123a96b5d51210bff5d01a6915a0ee5b9d7584",
      "parents": [
        "2ecbfe7b8530c8930aede27d0f8ed6daeebdbd69"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 14:47:50 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 09:39:05 2026 +1000"
      },
      "message": "GROOVY-12464: PurityChecker: mutation through operators (\u003c\u003c, subscript assignment, GEP-15 compound-assignment methods such as plusAssign) is not detected, while the equivalent method calls are\n\nInside a @Pure method the checker refused a mutating call such as s.add(v)\non a parameter or field but accepted the same mutation written as an\noperator, because it looked at a binary expression only to report a field or\nproperty reassignment.\n\nOperators that stand for a method call on their receiver are now checked as\nthat call: a \u003c\u003c b as leftShift (using the method type checking resolved),\na[i] \u003d v, a[i] op\u003d v and a[i]++ / a[i]-- as putAt, and a compound assignment\ncarrying COMPOUND_ASSIGN_TARGET as the recorded *Assign method, which covers\nevery GEP-15 operator and extension implementations. @OperatorRename rewrites\na renamed compound assignment into ScriptBytecodeAdapter.compoundAssign, so\nthat form is recognised too. The receiver-type checks (logging, metrics, I/O,\nnon-determinism, immutable types) are shared with named calls, so the\nallowed effects apply in the same way, and a @Pure callee is accepted.\n\nOnly receivers outside the method\u0027s own state are checked: parameters,\nfields and properties, this, and variables captured by a checked closure.\nBuilding up a local value, the common idiom in pure code, is still accepted,\nas is a +\u003d v that only rebinds a because no *Assign method exists.\n\nCode that compiled before can now be refused, so this is intended for 6.1.0\nrather than a 6.0.x release.\n"
    },
    {
      "commit": "2ecbfe7b8530c8930aede27d0f8ed6daeebdbd69",
      "tree": "ffa582c37db994a98e039567b9b2e72f6885331e",
      "parents": [
        "876e3cb01f57d2541b5e91ee6cc2297b50c5d9e8"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 14:12:04 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 09:32:08 2026 +1000"
      },
      "message": "GROOVY-12466: GEP-15: compound assignment that resolves to a *Assign method is refused for final parameters and for final fields used inside their own class\n\nWhen static type checking resolves a compound assignment to a *Assign method\nthe receiver is mutated in place, so a final target is not reassigned. Two\nchecks refused it anyway. VariableScopeVisitor reported any assignment\noperator on a final parameter; it runs before type checking, so it now\nreports plain assignment only and leaves compound operators to the existing\nFinalVariableAnalyzer check in Verifier, which already skips a resolved\n*Assign target. ClassCompletionVerifier reported any assignment operator on a\nfinal field named directly or through this; it now skips assignments that\ncarry COMPOUND_ASSIGN_TARGET.\n\nThe classic code generation used by @TypeChecked still stored the result back\ninto the left-hand side, which would update a final field outside its\nconstructor (rejected by the JVM) and, for a final property reached from\noutside its class, failed with ReadOnlyPropertyException. Both the indy and\nthe ScriptBytecodeAdapter paths now skip the store when the *Assign target is\nresolved, matching static compilation. As documented, the setter is then not\ninvoked for a property target under @TypeChecked either.\n\nDynamic code is unchanged apart from the message for a final parameter, which\nis now \"The parameter [x] is declared final but is reassigned\".\n"
    },
    {
      "commit": "876e3cb01f57d2541b5e91ee6cc2297b50c5d9e8",
      "tree": "89f55eeb46712e7c77c0ac002a43a50a15474790",
      "parents": [
        "d8fb09b3c3a49133400a3d524fb10eee4b09cca3"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 09:24:39 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 09:24:39 2026 +1000"
      },
      "message": "Add (r) as needed\n"
    },
    {
      "commit": "d8fb09b3c3a49133400a3d524fb10eee4b09cca3",
      "tree": "ad143a9be39255944ed4247cc74197128ec8e8b6",
      "parents": [
        "872a70a64c4578133e5fd81e8b269e4a9ca09ca1"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 17:33:30 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 08:36:37 2026 +1000"
      },
      "message": "GROOVY-12454: Target constructor for constructor call expression hasn\u0027t been set\" when using map-constructor-call with method-returned map under static compilation\n"
    },
    {
      "commit": "872a70a64c4578133e5fd81e8b269e4a9ca09ca1",
      "tree": "7b4a62511d0519c4d03d7873906cb212d3bab55f",
      "parents": [
        "ffcb96d62ea2e5d6f7acc6def2118fd076ff9c50"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 17:27:11 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 08:23:49 2026 +1000"
      },
      "message": "GROOVY-12456: Regression in SC: Binding failed for arguments\n"
    },
    {
      "commit": "ffcb96d62ea2e5d6f7acc6def2118fd076ff9c50",
      "tree": "a50cae261816ebb34651ca41a4f01523d65cc85d",
      "parents": [
        "f2dd0f1a5e788efdf96646ed8a4be76370755e7c"
      ],
      "author": {
        "name": "Björn Kautler",
        "email": "Bjoern@Kautler.net",
        "time": "Wed Oct 21 11:43:15 2026 +0200"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 07:11:01 2026 +1000"
      },
      "message": "GROOVY-12474: Fix coercion of Node to something it already is\n"
    },
    {
      "commit": "f2dd0f1a5e788efdf96646ed8a4be76370755e7c",
      "tree": "007ef1000a69fab98ed42f0237bb5063223ca100",
      "parents": [
        "0c12f09d68c4c3968705309d971c600910494a0f"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 07:12:08 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 05:56:16 2026 +1000"
      },
      "message": "GROOVY-12475: split property definitions with @PackageScope\n\nThe annotated declaration was not the one taken as the field, so the\ndocumented form (property first) failed with \"declared multiple times\",\nand since GROOVY-11159 the reversed form left two fields of that name,\nan invalid class. Both orders now give one package-private field, the\nfield and property types are checked, and def, var and val match Object.\n"
    },
    {
      "commit": "0c12f09d68c4c3968705309d971c600910494a0f",
      "tree": "e0da80f16bec20e91e99273fdb82d595d1f5d4cb",
      "parents": [
        "98c2f9f106d2ee368278ca33d105e540bf23baf0"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 03:44:49 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 25 05:30:56 2026 +1000"
      },
      "message": "GROOVY-12477: @Modifies({ [] }) and bare @Modifies silently disable frame checking; @Modifies({}) is rejected\n\nThere was no working way to declare that a method modifies nothing.\nAn empty list left no metadata on the method, so ModifiesChecker and the\n@Ensures old-reference validation both treated it as if the method had no\n@Modifies at all. An empty closure was rejected, and a bare @Modifies\ncompiled with nothing checked because the transform overwrote the missing\nvalue member.\n\n@Modifies({}) and @Modifies({ [] }) now declare an empty frame. The\nmetadata is stored even when empty, so an empty frame is distinguishable\nfrom no annotation: ModifiesChecker rejects field writes, @Ensures may not\nreference old.\u003cfield\u003e, and a this-call to such a method is safe rather\nthan of unknown effect. A bare @Modifies is a compile error.\n"
    },
    {
      "commit": "98c2f9f106d2ee368278ca33d105e540bf23baf0",
      "tree": "e724569e3a81a51a60aab0adfd8754a54b563e42",
      "parents": [
        "4469969c75496868ea3fe492b6c7d32b94acedef"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 11:13:43 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 10:03:37 2026 +1000"
      },
      "message": "GROOVY-12461: @GrabConfig(systemProperties) sets JVM system properties at runtime even when Grape is disabled\n"
    },
    {
      "commit": "4469969c75496868ea3fe492b6c7d32b94acedef",
      "tree": "8c0bac0134c2c50ae554e13898a1fff188b67f4f",
      "parents": [
        "eb37ae9fe268ee06a9e5b14a5f24ce4d0e5c868d"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 06:02:04 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 06:02:12 2026 +1000"
      },
      "message": "tweak skill table heading\n"
    },
    {
      "commit": "eb37ae9fe268ee06a9e5b14a5f24ce4d0e5c868d",
      "tree": "1e3b980debb91ea577af48dba93904a2542aa42f",
      "parents": [
        "eb3f0af5edb3a2311b3babe371140014b79795c5"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Oct 24 04:02:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 04:02:08 2026 +0800"
      },
      "message": "GROOVY-12445: STC: refuse unknown SignatureCodec versions without reading payload bytes (#2972)"
    },
    {
      "commit": "eb3f0af5edb3a2311b3babe371140014b79795c5",
      "tree": "873dbfbdacb19168c3f63fc3840ace2411e948df",
      "parents": [
        "f599f91bdf5bd4886f024f52aa7130c63b3eb910"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sat Oct 24 03:57:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 03:57:39 2026 +0800"
      },
      "message": "GROOVY-12425: Refine error message for unclosed type argument and unclosed slashy string (#2944)\n\n* GROOVY-12425: Refine error message for unclosed type argument and unclosed slashy string\n\n* GROOVY-12425: Keep division after value keywords and member names\n\nAn unclosed slash at EOF was an unclosed string whenever the previous\ntoken sat outside REGEX_CHECK_SET, so String.class / 2 no longer\ncompiled. Keywords that end a value and do not introduce an expression\nare now division operands. return, assert, in, and the other expression\nintroducers still open a slashy string, unless the keyword is a member\nname.\n\nAn unclosed slashy GString stays on the existing end-of-input\ndiagnostic. The unrelated requireNonNull in record headers is removed."
    },
    {
      "commit": "f599f91bdf5bd4886f024f52aa7130c63b3eb910",
      "tree": "d054dc3653222dba492a0250e24232aaf4eae204",
      "parents": [
        "8187e3bf22e4f0d949c7be6de5fb933a6d760680",
        "30a3722c8b7e960f553d0c2266637b5a164b7c5f"
      ],
      "author": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Fri Oct 23 14:41:21 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 14:41:21 2026 -0500"
      },
      "message": "Merge pull request #3008 from apache/GROOVY-12473"
    },
    {
      "commit": "8187e3bf22e4f0d949c7be6de5fb933a6d760680",
      "tree": "42ce1fe6871dc5332c16c44eb9e1678367981a5d",
      "parents": [
        "b4ebbe0a9123470f3e7d784d6b9f7ca9117deb38"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 05:40:26 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 05:40:26 2026 +1000"
      },
      "message": "GROOVY-12459: minor follow-on: merge forwards only the values buffered when a failure is seen\n\nWhen one input of merge fails, the other input\u0027s relay now forwards the\nvalues buffered at that point and then stops, so a producer that keeps\nthe buffer full can no longer hold the failure back.\n\nAlso adds a regression test for the race between BroadcastChannel.subscribe\nand close, fixed in b4ebbe0a91: a subscriber added while close was running\nwas never closed.\n"
    },
    {
      "commit": "b4ebbe0a9123470f3e7d784d6b9f7ca9117deb38",
      "tree": "a030f03f71b003b72c1c3b8a9475c2cc1d63214e",
      "parents": [
        "fa53afab4ff811b7ed93560300cd626d0374842e"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 18 20:18:54 2026 +0900"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sat Oct 24 05:14:12 2026 +1000"
      },
      "message": "GROOVY-12459: Failed AsyncChannel producer never closes the channel so `for await` hangs and the exception is dropped\n"
    },
    {
      "commit": "30a3722c8b7e960f553d0c2266637b5a164b7c5f",
      "tree": "cfceb7491b2fc24b2d008f0bab5bc13ab07ad66e",
      "parents": [
        "2b08c7769b2ce074cde6a6d158214316eb2208cb"
      ],
      "author": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Fri Oct 23 13:53:08 2026 -0500"
      },
      "committer": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Fri Oct 23 13:53:08 2026 -0500"
      },
      "message": "extra safety check"
    },
    {
      "commit": "2b08c7769b2ce074cde6a6d158214316eb2208cb",
      "tree": "bbe6cb09774da0791cbed08ac234c73024adbf66",
      "parents": [
        "d66bb867237ffd136011e01a66aa17d00a8eaa9e"
      ],
      "author": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Fri Oct 23 11:02:31 2026 -0500"
      },
      "committer": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Fri Oct 23 11:06:41 2026 -0500"
      },
      "message": "propagate type arguments for implicit-receiver metadata"
    },
    {
      "commit": "fa53afab4ff811b7ed93560300cd626d0374842e",
      "tree": "4a1a5520edd3aeb75db659f8e83e22cbbb2c5d41",
      "parents": [
        "5a81281ec6e894b194017a880d26149cb79dd033"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Sep 03 06:23:20 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 14:31:52 2026 +1000"
      },
      "message": "GROOVY-12340: record the serializable proxy handlers and how to bound them\n\nf010 reported that ConversionHandler and its subclasses deserialize with\nno gate, rebuilding a proxy whose interface calls route into closures the\nstream supplied - ConvertedMap by method name, toString included, so\nlogging such an object can run that code. The finding is accurate and the\ncapability is real.\n\nIt is not gated, because the same path is a supported feature: a closure\ncoerced to an interface round-trips today, which distributed-compute and\ncaching users depend on. §11c\u0027s bucket 1 requires both that a named\ncapability exists and that gating it would lose no legitimate round trip;\nhere the second does not hold. That is a bucket 1/2 collision, and §11c\nonly offered a hinge for 1 versus 3, so the rule for this case is now\nwritten down: keep the feature, say what it exposes, and record the\ncontrol - gating by default is right only where nothing legitimate is\nlost, as with MethodClosure.\n\nThe control is the platform\u0027s, not ours. A JDK serial filter bounds the\nwhole gadget surface in one expression, applies per stream, per JVM, or to\ndeserialization inside a library the application does not control, and is\nverified here to refuse these handlers while ordinary closure\nserialization keeps working. A Groovy-specific switch beside it would be\nthe per-class whack-a-mole §11c already warns about, in a knob fewer\npeople would find, so none is added.\n\nRecorded where each audience looks: §11 for the mechanism, §5a beside the\nother knobs for the control, §11c for the rule, and the class javadoc for\nwhoever is reading the code.\n"
    },
    {
      "commit": "5a81281ec6e894b194017a880d26149cb79dd033",
      "tree": "3e547b2d9f1d1ee0e4a55f4d4ed40761c17bbdf7",
      "parents": [
        "8d2980fd1249cb24b22b91524a4ad71c2c25fb45"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 12:30:41 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 12:30:54 2026 +1000"
      },
      "message": "add skill to see status of recent jira tickets\n"
    },
    {
      "commit": "d66bb867237ffd136011e01a66aa17d00a8eaa9e",
      "tree": "b97e8006e1806442cbb3cc90ef7fa7b5ab3e874c",
      "parents": [
        "8d2980fd1249cb24b22b91524a4ad71c2c25fb45"
      ],
      "author": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Thu Oct 22 17:23:21 2026 -0500"
      },
      "committer": {
        "name": "Eric Milles",
        "email": "eric.milles@thomsonreuters.com",
        "time": "Thu Oct 22 17:41:52 2026 -0500"
      },
      "message": "GROOVY-12473: SC: read class property from static getter or static field\n\nof specific type, then finally from `java.lang.Class`"
    },
    {
      "commit": "8d2980fd1249cb24b22b91524a4ad71c2c25fb45",
      "tree": "7ed093a38795e5706fcd0670f0fef5d5789ca097",
      "parents": [
        "1260413247f4550c793facb5f6fb6dc3f9848b1e"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 17:27:01 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 05:38:46 2026 +1000"
      },
      "message": "GROOVY-12455: Regression: NegativeArraySizeException during Groovy compilation\n"
    },
    {
      "commit": "1260413247f4550c793facb5f6fb6dc3f9848b1e",
      "tree": "040d71f072dba73308cd76edcbecdb3be748ebce",
      "parents": [
        "61949271fc13446e8cf385d3e3e5968c6c72f92b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 09:21:41 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 04:10:13 2026 +1000"
      },
      "message": "GROOVY-12468: Add a @Spec annotation as an informal contract holder\n"
    },
    {
      "commit": "61949271fc13446e8cf385d3e3e5968c6c72f92b",
      "tree": "ef186574c906529b908608c1b7675c6c79e8379c",
      "parents": [
        "03bcbbe8ffefc8e2227e5ea538f87bf56b0e18f7"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 22 14:56:34 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 04:03:10 2026 +1000"
      },
      "message": "GROOVY-12476: STC: toString() on an interface-typed receiver selects DGM toString(Object) over the runtime override (regression from 4.x)\n\nWhen toString() is called on a receiver whose static type does not declare\nit, static compilation binds to a DefaultGroovyMethods toString extension.\nThose extensions now call the runtime class\u0027s own toString() when dynamic\ndispatch would select it: one declared below AbstractCollection, AbstractMap\nor Object (whichever the class extends) and visible to Groovy. Otherwise\nthey format as before. The answer is cached per class.\n\nStatically compiled toString() now matches dynamic Groovy, including through\nObject-typed receivers and for JDK classes with their own public toString()\nsuch as CopyOnWriteArrayList, ConcurrentHashMap and Properties.\n\nString concatenation (plus/minus) and ConvertedMap.toString() keep the Groovy\nformatting, matching GString interpolation.\n"
    },
    {
      "commit": "03bcbbe8ffefc8e2227e5ea538f87bf56b0e18f7",
      "tree": "d1511c4bbeed1cca7d9a18d63830abb5449fcbc3",
      "parents": [
        "434b75d05fa8bb2628b8908ecac0abd8158474cd"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 22 14:54:25 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 23 04:03:10 2026 +1000"
      },
      "message": "GROOVY-12470: SC: super-method calls do not work under static compilation\n\nWhen the best candidate for super.m() is an extension method, select from\nthe superclass\u0027s own non-abstract methods instead, as Java and dynamic\nGroovy do. super.toString() previously bound to the DGM toString(Object)\nextension, which formats via the receiver\u0027s virtual toString(), so an\noverriding toString() that called super.toString() recursed until a\nStackOverflowError. In List and Map subclasses super.toString() now gives\nthe JDK superclass output, matching dynamic Groovy.\n"
    },
    {
      "commit": "434b75d05fa8bb2628b8908ecac0abd8158474cd",
      "tree": "aadd1b33495c13d2d2227dd5f5c334a27cecf2ad",
      "parents": [
        "7a6f67fc6121965ea27850486014bf946df887d8"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 13:34:25 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 22 16:11:40 2026 +1000"
      },
      "message": "groovy-lsp: publishDiagnostics could return before a concurrent publisher cleared removed URIs\n"
    },
    {
      "commit": "7a6f67fc6121965ea27850486014bf946df887d8",
      "tree": "b439fcf74172a9ef2c4f83571398504af08cdd2b",
      "parents": [
        "8778bce1a0da05b5bffe27f02819262c849f9d56"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 22:28:50 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 22 13:22:09 2026 +1000"
      },
      "message": "GROOVY-12460: PurityChecker: allow @Pure on closure parameters and locals, and accept closure-taking GDK methods with pure closures\n\n@Pure may now be placed on parameters and local variables. An argument for\na @Pure parameter, or a value assigned to a @Pure local, must be a closure or\nlambda whose body is pure and writes no captured variable, a method\nreference to a @Pure method, or another @Pure variable. Inside a @Pure\nmethod, invoking a @Pure parameter or local is pure, and closure-taking GDK\nand java.util.stream methods (collect, inject, findAll, map, filter, ...)\nare accepted when their functional arguments are pure.\n"
    },
    {
      "commit": "8778bce1a0da05b5bffe27f02819262c849f9d56",
      "tree": "c877676fe8f5cf34c3b953f0968d3e1ec371257b",
      "parents": [
        "309602266264fc46a407549d56d38fb0cf578480"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Thu Oct 15 13:11:06 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 21 10:42:12 2026 +1000"
      },
      "message": "GROOVY-12451: A record with a boolean component x and a hand-written isX() gets no x() accessor\n"
    },
    {
      "commit": "309602266264fc46a407549d56d38fb0cf578480",
      "tree": "e0f815208cfea65ab5c5f80324fda49cfea87d3d",
      "parents": [
        "b9a167467f8a8d256b6dc6b52841827a377306b2"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 16 05:39:06 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 18:28:29 2026 +1000"
      },
      "message": "GROOVY-12453: ArrayIndexOutOfBoundsException during compilation with an assert and map-constructor-call\n"
    },
    {
      "commit": "b9a167467f8a8d256b6dc6b52841827a377306b2",
      "tree": "e5922c32ecb70c11bc9cc55dea60e390c397366a",
      "parents": [
        "dcf5462908edae076de1fd6642400cd07087ae0b"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 16:21:29 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 18:18:46 2026 +1000"
      },
      "message": "GROOVY-12436: GroovyConsole key bindings lost after runtime theme switch on JDK27\n"
    },
    {
      "commit": "dcf5462908edae076de1fd6642400cd07087ae0b",
      "tree": "0dce6ff54abd803ded8ba5765ebf5a0f61af9269",
      "parents": [
        "6cb3262da514e67b71fd2a8213f92045068fea22"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 13:34:57 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 16:38:22 2026 +1000"
      },
      "message": "GROOVY-12463: groovy-contracts: postcondition and class invariant not checked on a trailing implicit return when the method also has an explicit early return\n"
    },
    {
      "commit": "6cb3262da514e67b71fd2a8213f92045068fea22",
      "tree": "299758bff98cc9e5da74f78f2ca93abaad302c1d",
      "parents": [
        "29ccbe89f6e62c0f936546a19b18e99e62297ae9"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 12:18:37 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 12:18:37 2026 +1000"
      },
      "message": "bump gradle to 9.8.2\n"
    },
    {
      "commit": "29ccbe89f6e62c0f936546a19b18e99e62297ae9",
      "tree": "7121cc504c4ddf0fa46882db659bb55a10893100",
      "parents": [
        "186d9e3887c08bec05c42eae93d10e9a82649420"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 09:26:10 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 09:26:10 2026 +1000"
      },
      "message": "GROOVY-12465: Bump asm to 9.11.1 (also build-logic reference)\n"
    },
    {
      "commit": "186d9e3887c08bec05c42eae93d10e9a82649420",
      "tree": "2c9ccbc9cc76dfa6088a68951d31080eddaf2294",
      "parents": [
        "c227066191b1a0c95b12c3672cc5f333fc4f27d7"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 06:56:36 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 06:56:36 2026 +1000"
      },
      "message": "update outdated Android doco\n"
    },
    {
      "commit": "c227066191b1a0c95b12c3672cc5f333fc4f27d7",
      "tree": "fd8499aa4590c8017751d4d7ddaa3be376bf909e",
      "parents": [
        "4be16cef7c79082b1d9ecd0af3ad3220a29ab0dd"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 16:48:32 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 05:57:59 2026 +1000"
      },
      "message": "GROOVY-12465: Bump asm to 9.11.1 (tweaks related to ASMs new size knobs)\n"
    },
    {
      "commit": "4be16cef7c79082b1d9ecd0af3ad3220a29ab0dd",
      "tree": "f51e438756257934cf99bd302e5116e6260e5e43",
      "parents": [
        "f8a6ba2520394cc2f0e527bbc56b8e6c4041a3b7"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 15:56:21 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 05:57:59 2026 +1000"
      },
      "message": "GROOVY-12465: Bump asm to 9.11.1\n"
    },
    {
      "commit": "f8a6ba2520394cc2f0e527bbc56b8e6c4041a3b7",
      "tree": "3fcbcc9b58501565a39171c8189cf70d069ba176",
      "parents": [
        "0a09ca602e042ff32c069872033b264662a99450"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Sun Oct 11 20:40:31 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 20 04:52:00 2026 +1000"
      },
      "message": "GROOVY-12437: type variable reference from bytecode/reflection is resolved\n"
    },
    {
      "commit": "0a09ca602e042ff32c069872033b264662a99450",
      "tree": "4f32f7de8cdeb3a9f5d29a95fbb76e3380d2ef0d",
      "parents": [
        "bfdb983141c9735e35af6cef84ed5834e435ade9"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 21:33:00 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 21:33:00 2026 +1000"
      },
      "message": "Bump io.github.ben-manes.versions to 0.66.0\n"
    },
    {
      "commit": "bfdb983141c9735e35af6cef84ed5834e435ade9",
      "tree": "6a8cb6cc97132f4de05f4f58d8da41525b026b8e",
      "parents": [
        "d77e6df56a8d59ca30afbfa4c66afb9c685a22db"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 09 05:22:57 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Mon Oct 19 18:33:23 2026 +1000"
      },
      "message": "GROOVY-12426: @Delegate generates no methods returning a nested class of a joint-compiled Java source, and breaks other implementors of the interface\n"
    },
    {
      "commit": "d77e6df56a8d59ca30afbfa4c66afb9c685a22db",
      "tree": "d1fb5c899b971ecfe044bff908500739a3389b15",
      "parents": [
        "74d20cd3cb171365fc3edba6c63a4701d7d8ddea"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Fri Sep 25 09:52:29 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "realbluesun@hotmail.com",
        "time": "Sun Oct 18 13:47:58 2026 +0800"
      },
      "message": "GROOVY-12429: GroovyConsole error link does not place the caret on the reported column\n"
    },
    {
      "commit": "74d20cd3cb171365fc3edba6c63a4701d7d8ddea",
      "tree": "3798a9cc60a5e8a5dc613a7c3fed17a82072f592",
      "parents": [
        "29a16f96854fa63de0b72b8088b2d2656ced268e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 18 01:23:09 2026 +0000"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "realbluesun@hotmail.com",
        "time": "Sun Oct 18 10:17:50 2026 +0800"
      },
      "message": "Bump github/codeql-action from 4.38.2 to 4.38.3\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.38.2 to 4.38.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.38.2...v4.38.3)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.38.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": "29a16f96854fa63de0b72b8088b2d2656ced268e",
      "tree": "5fb460e3d59f75091fe41d340be8df4ba4e0c7cd",
      "parents": [
        "9e625d0f0675115c727a30b76bceff78182a6283"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 18 01:22:36 2026 +0000"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "realbluesun@hotmail.com",
        "time": "Sun Oct 18 10:08:59 2026 +0800"
      },
      "message": "Bump gradle-wrapper from 9.8.0 to 9.8.1\n\nBumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.8.0 to 9.8.1.\n- [Release notes](https://github.com/gradle/gradle/releases)\n- [Commits](https://github.com/gradle/gradle/compare/v9.8.0...v9.8.1)\n\n---\nupdated-dependencies:\n- dependency-name: gradle-wrapper\n  dependency-version: 9.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": "9e625d0f0675115c727a30b76bceff78182a6283",
      "tree": "39b01ffae9c333b6e3162b2f37e3bea8f47564d0",
      "parents": [
        "400d8a7df85d08b1d92d07c268c07e06a29ff471"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 11 17:44:43 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "realbluesun@hotmail.com",
        "time": "Fri Oct 16 23:49:14 2026 +0800"
      },
      "message": "GROOVY-12446: STC: stop writing UnionTypeClassNode into inferred-return signatures\n"
    },
    {
      "commit": "400d8a7df85d08b1d92d07c268c07e06a29ff471",
      "tree": "58bbf79ca8177ea18e9c4bca5ae81214d07aae2b",
      "parents": [
        "237fdb54b39c4f9d27064aeca0870eadb0888da3"
      ],
      "author": {
        "name": "Daniel Sun",
        "email": "sunlan@apache.org",
        "time": "Sun Oct 11 18:34:45 2026 +0900"
      },
      "committer": {
        "name": "Daniel Sun",
        "email": "realbluesun@hotmail.com",
        "time": "Fri Oct 16 03:14:02 2026 +0800"
      },
      "message": "GROOVY-12447: STC: treat a complete native sealed type-case set as an exhaustive switch expression\n"
    },
    {
      "commit": "237fdb54b39c4f9d27064aeca0870eadb0888da3",
      "tree": "f93f8d75ffbfd1a2e4ecaaaa11c6af6bfb7173e9",
      "parents": [
        "dc3e57b4d5c4ecaf1af394604639b089455a7fb4"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Fri Oct 09 02:27:09 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 14 21:59:19 2026 +1100"
      },
      "message": "GROOVY-12427: Joint compilation stub declares a precompiled trait\u0027s static methods \"static abstract\" on implementing classes\n"
    },
    {
      "commit": "dc3e57b4d5c4ecaf1af394604639b089455a7fb4",
      "tree": "b7519e51e397338bc6fb6e819b4b556073bda420",
      "parents": [
        "23a75d2fc22c6956b21eb866b16413e9e43b63a8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 11 01:24:14 2026 +0000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 14 21:56:44 2026 +1100"
      },
      "message": "Bump gradle/actions/setup-gradle from 6.3.0 to 6.4.0\n\nBumps [gradle/actions/setup-gradle](https://github.com/gradle/actions) from 6.3.0 to 6.4.0.\n- [Release notes](https://github.com/gradle/actions/releases)\n- [Commits](https://github.com/gradle/actions/compare/9c971963bec38e04b3d30dcc455b5382be2fdbfb...3f5f9adaf7d9fecd50b5935e54106014257a94e6)\n\n---\nupdated-dependencies:\n- dependency-name: gradle/actions/setup-gradle\n  dependency-version: 6.4.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": "23a75d2fc22c6956b21eb866b16413e9e43b63a8",
      "tree": "365931a58653207cb9e97d0428f757d9bddb9444",
      "parents": [
        "74128844ad1b99a51ecedb0af5b1ed446dcd95e9"
      ],
      "author": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Tue Oct 13 19:58:11 2026 +1000"
      },
      "committer": {
        "name": "Paul King",
        "email": "paulk@asert.com.au",
        "time": "Wed Oct 14 15:08:43 2026 +1100"
      },
      "message": "GROOVY-12450: Provide some of Groovy\u0027s enhanced record features (getAt, toMap, toList, size) for groovy.time.Timed\n"
    }
  ],
  "next": "74128844ad1b99a51ecedb0af5b1ed446dcd95e9"
}
