)]}'
{
  "log": [
    {
      "commit": "64c9beff0b55bfe424b9825e4cd92230daf47199",
      "tree": "8ff276944eabf610ec067d4f6241e5bb2ce4dbf2",
      "parents": [
        "41259bf0058246a03588ec154ac00fc1efa183f0"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Sun Sep 06 01:03:24 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Sun Sep 06 01:03:24 2026 -0400"
      },
      "message": "refactor: extract Grails Micronaut into a standalone repository\n\nThe PMC voted to move grails-micronaut out of grails-core into\napache/grails-micronaut. This 8.0.x tree now contains only the plugin,\nMicronaut-specific BOMs, integration examples, and the build/CI needed\nto consume published Grails Core artifacts.\n"
    },
    {
      "commit": "41259bf0058246a03588ec154ac00fc1efa183f0",
      "tree": "be9091cc88952082a69ab6c85175aeec50f06ac6",
      "parents": [
        "17b9ded93b23bc050ab860cb697e0a9d1ec0d3b3",
        "6fce5e1b4642fa7322dc46bf4ef881af38da7e01"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 18:52:50 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 18:52:50 2026 -0400"
      },
      "message": "Merge pull request #16178 from apache/fix/disable-groovy-indy-build\n\nbuild: disable Groovy invokedynamic for the Grails 8 compile"
    },
    {
      "commit": "6fce5e1b4642fa7322dc46bf4ef881af38da7e01",
      "tree": "be9091cc88952082a69ab6c85175aeec50f06ac6",
      "parents": [
        "b34c0eeafc9b176f92ea6ed392ed93e961f44aa6",
        "17b9ded93b23bc050ab860cb697e0a9d1ec0d3b3"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 18:48:06 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 18:48:06 2026 -0400"
      },
      "message": "Merge branch \u00278.0.x\u0027 into fix/disable-groovy-indy-build\n"
    },
    {
      "commit": "17b9ded93b23bc050ab860cb697e0a9d1ec0d3b3",
      "tree": "2f660ef39677a28d856d8ad90c2b98112ddb912f",
      "parents": [
        "5670a65bc81c9a17a658d02447df1a146c10d918",
        "854938f029512272cc47407312f3fc470e874f0c"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 17:02:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 17:02:10 2026 -0400"
      },
      "message": "Merge pull request #16167 from apache/build/ci-daemon-heap-vs-runner-ram\n\nbuild(ci): bound concurrent JVMs on the macOS runner"
    },
    {
      "commit": "854938f029512272cc47407312f3fc470e874f0c",
      "tree": "2f660ef39677a28d856d8ad90c2b98112ddb912f",
      "parents": [
        "e2d55173dec278e8b6b1bb8b48e67dbea3190a3e"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 13:48:56 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 13:52:08 2026 -0400"
      },
      "message": "fix: include runtime jars on groovydoc classpath\n\nHibernate 7 publishes jboss-logging as a runtime-only transitive.\nGroovydoc Class.forName\u0027s referenced types, so\n:grails-data-hibernate7-dbmigration-core:groovydoc failed in CI\n(Forge/e2e publish) with NoClassDefFoundError: org/jboss/logging/Logger.\n"
    },
    {
      "commit": "e2d55173dec278e8b6b1bb8b48e67dbea3190a3e",
      "tree": "5019e507a154c9c29bdd4c905fa7bb4d7e2b7aef",
      "parents": [
        "4062b15fcf675e4f943e5e13fc7a271ec3535ead",
        "5670a65bc81c9a17a658d02447df1a146c10d918"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 12:58:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 12:58:44 2026 -0400"
      },
      "message": "Merge branch \u00278.0.x\u0027 into build/ci-daemon-heap-vs-runner-ram"
    },
    {
      "commit": "b34c0eeafc9b176f92ea6ed392ed93e961f44aa6",
      "tree": "c289cb63c3b60938ce4d7ab82353373cfac5b784",
      "parents": [
        "25b7937cff71c7f959f7a71d5540e027873e686d",
        "5670a65bc81c9a17a658d02447df1a146c10d918"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Sep 04 09:27:08 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 09:27:08 2026 -0400"
      },
      "message": "Merge branch \u00278.0.x\u0027 into fix/disable-groovy-indy-build"
    },
    {
      "commit": "5670a65bc81c9a17a658d02447df1a146c10d918",
      "tree": "1c7197c37b110b60bb705f63a2b82587d94b0875",
      "parents": [
        "def2c9b9bc4f648726fb69101d7d20b1376f6076",
        "e9cf8b186491c0cb0912e90de610c5e5577f376c"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 10:26:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 10:26:14 2026 +0200"
      },
      "message": "Merge pull request #16315 from apache/ci/asf-approved-pins-8.0.x\n\nci: pin the remaining actions to ASF-approved SHAs on 8.0.x"
    },
    {
      "commit": "e9cf8b186491c0cb0912e90de610c5e5577f376c",
      "tree": "1c7197c37b110b60bb705f63a2b82587d94b0875",
      "parents": [
        "def2c9b9bc4f648726fb69101d7d20b1376f6076"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 10:14:26 2026 +0200"
      },
      "committer": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 10:14:26 2026 +0200"
      },
      "message": "ci: pin the remaining actions to ASF-approved SHAs on 8.0.x\n\nThe 7.2.x forward merge could not reach these. 7.2.x has 29\n`setup-gradle` sites; 8.0.x has 45, and 16 of them live in workflows\nthat do not exist on 7.2.x at all (`benchmark`, `codeanalysis`,\n`coverage`, `end-to-end`, `sitemesh2`, `validate-actions`,\n`groovy-snapshot-canary`) or in `gradle.yml` jobs added since. A merge\ncannot carry a fix into a file the source branch does not have, so\nthose kept the unapproved `50e97c2` (v6.1.0) pin and every one of\nthose workflows still failed at startup:\n\n    CI, Coverage, Code Analysis, End to End, Groovy Snapshot Canary\n    and Validate GitHub Actions - all startup_failure\n\n`validate-actions.yml` was itself pinned to the unapproved SHA, so the\none check that exists to catch this died at startup and could never\nreport it.\n\n- `gradle/actions/setup-gradle` -\u003e `9c971963` (v6.3.0), 16 sites. The\n  current approved entry with no expiry; matches 7.0.x/7.1.x/7.2.x.\n  v6.1.1 is also approved but expires 2026-09-05.\n- SHA-pin the floating `actions/cache`, `actions/cache/restore` and\n  `actions/cache/save` refs to `0057852b` (v4.3.0).\n- `actions/setup-java` in `release.yml` (the Micronaut JDK 25 switch and\n  the JDK 21 restore) to `be666c2f` (v5.2.0), matching the three other\n  `setup-java` refs already pinned in that same file. Inputs unchanged.\n\nVerified with the task that exists for this: `./gradlew validateActions`\nfails with exit 1 and these 16 findings before the change, and reports\n\"Checked 20 workflow file(s) - all compliant\" after. SHAs checked\nagainst apache/infrastructure-actions/actions.yml as of 2026-09-04.\n"
    },
    {
      "commit": "def2c9b9bc4f648726fb69101d7d20b1376f6076",
      "tree": "53ce114743625e92b46e0ee3a0d357a9b9752eb2",
      "parents": [
        "55d5076aa516829e931ced1d073a5dcbcc534060",
        "5075ff30b5baec5c1f0d4df008d9a18ab5598d4d"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 09:50:10 2026 +0200"
      },
      "committer": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 09:50:10 2026 +0200"
      },
      "message": "Merge remote-tracking branch \u0027origin/7.2.x\u0027 into merge/7.2.x-into-8.0.x\n\n# Merge conflicts resolved.\n\n# By James Fredley (2) and others\n# Via GitHub (5) and Søren Berg Glasius (2)\n* origin/7.2.x:\n  Add test coverage and fix real bugs in grails-datamapping-core\u0027s services package (#16156)\n  ci: pin every action to an ASF-approved SHA\n  Give TemplateLookupCachingSpec its own command fixture\n  Fix fields template lookup leak from accessor-keyed memoization\n\n# Conflicts:\n#\t.github/workflows/codestyle.yml\n#\t.github/workflows/gradle.yml\n#\t.github/workflows/groovy-joint-workflow.yml\n#\t.github/workflows/vulnerability-scan.yml\n#\tgrails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractServiceImplementer.groovy\n#\tgrails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/services/DefaultTenantServiceSpec.groovy\n#\tgrails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/services/DefaultTransactionServiceSpec.groovy\n"
    },
    {
      "commit": "5075ff30b5baec5c1f0d4df008d9a18ab5598d4d",
      "tree": "fa53345ae46295e5d2769b58455eda273f0c5efa",
      "parents": [
        "377a0ee8f853082d48aa7c31b35cbf977d05abe6",
        "473230b7329552d74c91f79b09fab3701bb837bc"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 07:57:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 07:57:50 2026 +0200"
      },
      "message": "Merge pull request #16314 from apache/merge/7.1.x-into-7.2.x\n\nmerge: 7.1.x into 7.2.x"
    },
    {
      "commit": "473230b7329552d74c91f79b09fab3701bb837bc",
      "tree": "fa53345ae46295e5d2769b58455eda273f0c5efa",
      "parents": [
        "377a0ee8f853082d48aa7c31b35cbf977d05abe6",
        "53d9c1eddb61c2e8e6313ef32110c64ef0fb06ac"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 07:56:25 2026 +0200"
      },
      "committer": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 07:56:25 2026 +0200"
      },
      "message": "Merge remote-tracking branch \u0027origin/7.1.x\u0027 into merge/7.1.x-into-7.2.x\n\n* origin/7.1.x:\n  Add test coverage and fix real bugs in grails-datamapping-core\u0027s services package (#16156)\n  ci: pin every action to an ASF-approved SHA\n  Give TemplateLookupCachingSpec its own command fixture\n  Fix fields template lookup leak from accessor-keyed memoization\n"
    },
    {
      "commit": "53d9c1eddb61c2e8e6313ef32110c64ef0fb06ac",
      "tree": "021fd5c7bb6873b8ef6312ad7849d1c4f8b2eab1",
      "parents": [
        "9f8deded0425e63e585aada506aa5481a7ddaa3b",
        "049fee3917dc33a6a9d207cec7f076080caea55e"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 07:54:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 07:54:29 2026 +0200"
      },
      "message": "Merge pull request #16313 from apache/merge/7.0.x-into-7.1.x\n\nmerge: 7.0.x into 7.1.x"
    },
    {
      "commit": "049fee3917dc33a6a9d207cec7f076080caea55e",
      "tree": "021fd5c7bb6873b8ef6312ad7849d1c4f8b2eab1",
      "parents": [
        "9f8deded0425e63e585aada506aa5481a7ddaa3b",
        "3b668223da1f34bebc0bd62beb0a2218d9645c3c"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 07:52:23 2026 +0200"
      },
      "committer": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Fri Sep 04 07:52:23 2026 +0200"
      },
      "message": "Merge remote-tracking branch \u0027origin/7.0.x\u0027 into merge/7.0.x-into-7.1.x\n\n* origin/7.0.x:\n  Add test coverage and fix real bugs in grails-datamapping-core\u0027s services package (#16156)\n  ci: pin every action to an ASF-approved SHA\n  Give TemplateLookupCachingSpec its own command fixture\n  Fix fields template lookup leak from accessor-keyed memoization\n"
    },
    {
      "commit": "4062b15fcf675e4f943e5e13fc7a271ec3535ead",
      "tree": "32b63a9418b953675132c282262f73b00e159b59",
      "parents": [
        "728f00f1a0ffdb80b28f2710b0ea3c741944b7d7",
        "55d5076aa516829e931ced1d073a5dcbcc534060"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Thu Sep 03 18:18:34 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Thu Sep 03 18:18:34 2026 -0400"
      },
      "message": "Merge branch 8.0.x into build/ci-daemon-heap-vs-runner-ram\n"
    },
    {
      "commit": "3b668223da1f34bebc0bd62beb0a2218d9645c3c",
      "tree": "c863e247529830b3059753bdc6532ad4a6f41a10",
      "parents": [
        "9bf5f6623fb5970e95334ab8996ac9e1672d340d",
        "ecb4a4d31effc8a6e718992d995f4a35097a7590"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Thu Sep 03 22:28:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 22:28:51 2026 +0200"
      },
      "message": "Merge pull request #16308 from apache/ci/asf-approved-action-pins\n\nci: pin every action to an ASF-approved SHA"
    },
    {
      "commit": "9bf5f6623fb5970e95334ab8996ac9e1672d340d",
      "tree": "7697d4b175ae284813c2c833ba77e82a59bbb622",
      "parents": [
        "1113d60e1d86542e85e8d626921ef05e486080cf"
      ],
      "author": {
        "name": "Walter B Duque de Estrada",
        "email": "wbduque@mac.com",
        "time": "Thu Sep 03 11:40:02 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 11:40:02 2026 -0500"
      },
      "message": "Add test coverage and fix real bugs in grails-datamapping-core\u0027s services package (#16156)\n\n* Add unit test coverage for DefaultTenantService/DefaultTransactionService\n\nBoth classes had zero test coverage in org.grails.datastore.gorm.services.\nMock-based Spock specs cover all public methods including the\nmulti-tenancy-mode/datastore-capability branch checks, bringing each\nclass to 100% line/branch/method coverage.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Add coverage for update/delete-where/projection service implementers\n\nCovers DSL shapes with zero or partial coverage: UpdateOneImplementer,\nDeleteWhereImplementer, FindOneInterfaceProjectionWhereImplementer,\nFindAllPropertyProjectionImplementer, FindOnePropertyProjectionImplementer,\nthe findById(id) shortcut in FindOneByImplementer, and the\nAbstractWriteOperationImplementer enhance() path for abstract-class\nservices with pre-existing concrete write methods.\n\nFixes a real bug found while writing the invalid-argument test for\nAbstractSaveImplementer: the error path referenced\nnewMethodNode.declaringClass.module (null on the synthesized\nimplementation method), crashing the compiler with a NullPointerException/\nGroovyBugError instead of reporting a clean compile error. Changed to\nabstractMethodNode.declaringClass.module.context, matching the pattern\nused elsewhere in this package (e.g. FindAllByImplementer).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Suppress IntelliJ warnings on getDetachedCriteriaType\u0027s unused parameter\n\ndomainClassNode is intentionally unused in the base implementation; the\nmethod is a protected extension point so subclasses can pick a different\nDetachedCriteria type per domain class. No current subclass overrides it,\nbut making the method static or dropping the parameter would remove that\npolymorphic extension point.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Suppress IntelliJ warnings on AbstractWhereImplementer\u0027s getDetachedCriteriaType\n\nSame shape as the AbstractDetachedCriteriaServiceImplementor fix: the\nunused domainClassNode parameter is a protected extension point for\nsubclasses, not dead code.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Suppress MethodMayBeStatic on lookupById(), which is polymorphic\n\nAbstractProjectionImplementer overrides lookupById() to return false,\nand doImplement() dispatches on it via virtual call. Making it static\nwould silently break that override rather than just being unnecessary,\nso it\u0027s suppressed with an explanation instead of \"fixed\".\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Remove unused newMethodNode parameter from bindParametersAndSave\n\nThe parameter became dead after the earlier error-reporting fix (which\nnow uses abstractMethodNode instead of the buggy newMethodNode-based\nlookup). No subclass overrides this method and it has only two call\nsites, both updated. Unlike the getDetachedCriteriaType/lookupById\nwarnings, this parameter has no polymorphic purpose, so it\u0027s removed\nrather than suppressed.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Remove dead transactionalDatastore/transactionService/findInstanceApiForConnectionId\n\nNone of these three protected helpers have any call site anywhere in\nthe repo (core, rx, hibernate5/7, mongodb) and nothing overrides them,\nunlike the earlier getDetachedCriteriaType/lookupById extension points.\nfindInstanceApiForConnectionId\u0027s live sibling, findStaticApiForConnectionId,\nis actively used by 5 implementers, but the instance-API equivalent was\nnever wired up the same way -- every save/delete implementer builds that\nlookup by hand instead. Drops the now-unused TransactionService/\nTransactionCapableDatastore imports too.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Suppress unused-parameter warnings on FindOneImplementer.findMethodToInvoke\n\nSame shape as the earlier getDetachedCriteriaType/lookupById fixes:\ndomainClassNode/newMethodNode are unused in the base \u0027find\u0027 return, but\nthe method is a protected extension point on a class with real subclasses\n(FindAndDeleteImplementer, FindOneInterfaceProjectionImplementer), so the\nparameters are kept and the warning is suppressed rather than the\nsignature changed.\n\nAlso includes minor pre-existing IDE cleanups picked up in this pass:\nClassHelper.VOID_TYPE.equals(x) -\u003e \u003d\u003d in DeleteImplementer/\nDeleteWhereImplementer, and using the already-statically-imported\nAstUtils.error instead of the fully-qualified call in FindAllByImplementer.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Suppress unused-parameter warnings on getFindMethodToInvoke\n\nSame shape as FindOneImplementer.findMethodToInvoke: classNode/methodNode\nare unused in the base implementation, but the method is a protected\nextension point and FindOneStringQueryImplementer has a real subclass\n(FindOneInterfaceProjectionStringQueryImplementer), so the parameters\nstay and the warning is suppressed instead.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Deduplicate interface-projection property compatibility check\n\nisInterfaceProjection()\u0027s per-property compatibility loop was copy-pasted\nalmost verbatim between InterfaceProjectionBuilder and\nIterableInterfaceProjectionBuilder (only the candidate type variable name\ndiffered). Extracted into a shared hasCompatibleProperties(domainClass,\ncandidateType) method on the base trait; the iterable variant now just\nresolves its generic type and delegates. Drops the now-unused\nAstPropertyResolveUtils import from IterableInterfaceProjectionBuilder.\n\nAlso fixes a cast IntelliJ\u0027s stricter Groovy static checker rejects in\nbuildInterfaceImpl: casting a List\u003cConstantExpression\u003e (from .collect{})\ndirectly to List\u003cExpression\u003e is generics-invariant-illegal even though\ngroovyc accepts it. Uses the double-cast-through-raw-List trick already\nestablished elsewhere in this codebase for the same class of warning.\n\nBoth isInterfaceProjection() variants and buildInterfaceImpl() are\nalready exercised by ServiceTransformSpec\u0027s existing interface/iterable\nprojection tests; full module suite + codeStyle pass unchanged.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Replace array range-slice with Arrays.copyOfRange in UpdateOneImplementer\n\nparameters[1..-1] as Parameter[] relies on Groovy\u0027s range-slicing getAt\non an array; IntelliJ\u0027s stricter @CompileStatic checker infers the 1..-1\nliteral as ObjectRange\u003cInteger\u003e and can\u0027t resolve a matching\nDefaultGroovyMethods.getAt overload for it, even though groovyc compiles\nit fine. Arrays.copyOfRange(parameters, 1, parameters.length) expresses\nthe same \"drop the first parameter\" intent unambiguously for both\ncompilers, with no cast needed.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Close the two real Codecov patch-coverage gaps from this PR\n\nDeleteWhereImplementer.isCompatibleReturnType and\nAbstractServiceImplementer.isValidParameter each had one branch missing\non lines Codecov flagged. Added a compile-error test for a @Where delete\nmethod with an incompatible (non-void, non-Number) return type, and a\nsave-with-id-named-parameter test that exercises isValidParameter\u0027s\nGormProperties.IDENTITY branch directly (SaveImplementer, unlike\nUpdateOneImplementer, doesn\u0027t strip the id parameter before validating\nit). Both branches now fully covered.\n\nThe third flagged line, FindAllByImplementer\u0027s matchSpec \u003d\u003d null error\npath, was verified empirically rather than assumed unreachable: a probe\ntest with an edge-case DSL input (findAllBy() with no property suffix)\nshowed doesImplement() already computes the identical memoized matchSpec\nbefore selecting this implementer, so doImplement() can never observe a\nnull matchSpec -- the method falls through to FindAllImplementer instead\nwhenever matchSpec would be null. Genuinely unreachable through the\npublic DSL, not a gap.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ecb4a4d31effc8a6e718992d995f4a35097a7590",
      "tree": "9685744b743c30c036f5ab87589002c156082e45",
      "parents": [
        "1113d60e1d86542e85e8d626921ef05e486080cf"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Thu Sep 03 18:23:50 2026 +0200"
      },
      "committer": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Thu Sep 03 18:23:50 2026 +0200"
      },
      "message": "ci: pin every action to an ASF-approved SHA\n\n`gradle/actions/setup-gradle@50e97c2` (v6.1.0) is not on the ASF\nallowlist, so every workflow that used it — CI, Code Style, End to End,\nCoverage, RAT, Vulnerability Scan, the Groovy canary and the release\nworkflows — failed at startup before any job ran:\n\n    The action gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e\n    is not allowed in apache/grails-core because all actions must be\n    from a repository owned by your enterprise, created by GitHub, or\n    match one of the patterns: ...\n\nMove it to `9c971963` (v6.3.0), the current approved entry with no\nexpiry date. v6.1.1 is also approved but expires 2026-09-05.\n\nAlso, so the same class of failure does not come back:\n\n- `aws-actions/configure-aws-credentials` → v6.2.3 (`e6de0542`). The\n  v6.2.0 pin it replaces expires from the allowlist on 2026-09-20.\n- SHA-pin the three floating `actions/*` refs left in\n  `vulnerability-scan.yml` and the twelve `actions/cache@v4` refs in\n  `gradle.yml`, matching the versions already used everywhere else in\n  the repo. These are allowed by namespace, so they were not breaking\n  anything, but CLAUDE.md asks for SHA pins for supply-chain\n  consistency.\n\n`apache/grails-github-actions/*@asf` is left on the branch ref\ndeliberately — it is the ASF-owned, intentionally floating pin.\n\nApproved SHAs verified against\nhttps://github.com/apache/infrastructure-actions/blob/main/actions.yml\n"
    },
    {
      "commit": "55d5076aa516829e931ced1d073a5dcbcc534060",
      "tree": "7bf78fb2d33a3ff7bb80897a573e9249360539ea",
      "parents": [
        "c6cdd02d6c6c971f44ada07a4f5f3eccac2d8dc9",
        "8d92089b3896bb0c4b70d04f49543239bfdf6e7e"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Thu Sep 03 10:56:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 10:56:44 2026 -0400"
      },
      "message": "Merge pull request #16027 from apache/feat/reenable-oracle-testcontainers\n\ntest(grails-data-hibernate7): re-enable Oracle in the RLikeHibernate7Spec dialect matrix"
    },
    {
      "commit": "25b7937cff71c7f959f7a71d5540e027873e686d",
      "tree": "fbfe80a1b2f796be183ff1fa03603354b6d299ef",
      "parents": [
        "505542f121404d4d3ed9552d25b1cb1953028641",
        "c6cdd02d6c6c971f44ada07a4f5f3eccac2d8dc9"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Thu Sep 03 10:27:50 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 10:27:50 2026 -0400"
      },
      "message": "Merge branch \u00278.0.x\u0027 into fix/disable-groovy-indy-build"
    },
    {
      "commit": "1113d60e1d86542e85e8d626921ef05e486080cf",
      "tree": "1149df3f9a89a9d3d9de6bab328442ca367ae406",
      "parents": [
        "54cd047fa7456e1d59c5b4ccae389d09ec652485",
        "05cefde0af44b7e48c78ae6f6153e7ca161cf4bb"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Thu Sep 03 10:23:09 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 10:23:09 2026 -0400"
      },
      "message": "Merge pull request #16302 from apache/fix/16162-fields-memoize-leak\n\nFix fields template lookup leak from accessor-keyed memoization"
    },
    {
      "commit": "05cefde0af44b7e48c78ae6f6153e7ca161cf4bb",
      "tree": "8e747e60396b98fce2352ffe936e79da45a991c6",
      "parents": [
        "13bf4405f8a3a6628964ea289466109dcda59fee"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 21:11:18 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 21:11:18 2026 -0400"
      },
      "message": "Give TemplateLookupCachingSpec its own command fixture\n\nThe regression for #16162 used TestBean from PlainObjectPropertyAccessorSpec.\nKeep the spec self-contained with a local non-domain fixture instead.\n"
    },
    {
      "commit": "c6cdd02d6c6c971f44ada07a4f5f3eccac2d8dc9",
      "tree": "99dbcd77fd4f601ec7f4b6eb9581c09906b80f85",
      "parents": [
        "19157d878a69b542c9546f28c255fb9543b48c52",
        "bb9780cab2b2dac35736ff50f29dfd17d8628983"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:57:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 20:57:31 2026 -0400"
      },
      "message": "Merge pull request #16305 from jamesfredley/merge/7.2.x-into-8.0.x\n\nMerge 7.2.x into 8.0.x"
    },
    {
      "commit": "bb9780cab2b2dac35736ff50f29dfd17d8628983",
      "tree": "99dbcd77fd4f601ec7f4b6eb9581c09906b80f85",
      "parents": [
        "19157d878a69b542c9546f28c255fb9543b48c52",
        "377a0ee8f853082d48aa7c31b35cbf977d05abe6"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:56:57 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:56:57 2026 -0400"
      },
      "message": "Merge branch \u00277.2.x\u0027 into 8.0.x\n"
    },
    {
      "commit": "377a0ee8f853082d48aa7c31b35cbf977d05abe6",
      "tree": "4b6862d0d83d4839569ef1406f24d94a4276dfc6",
      "parents": [
        "0e5a368372301dfb7e84d5608271cf5b0031f469",
        "a071dca78673563d2b76a8f6f66a26da887e6bc2"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:56:08 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 20:56:08 2026 -0400"
      },
      "message": "Merge pull request #16304 from jamesfredley/merge/7.1.x-into-7.2.x\n\nMerge 7.1.x into 7.2.x"
    },
    {
      "commit": "a071dca78673563d2b76a8f6f66a26da887e6bc2",
      "tree": "4b6862d0d83d4839569ef1406f24d94a4276dfc6",
      "parents": [
        "0e5a368372301dfb7e84d5608271cf5b0031f469",
        "9f8deded0425e63e585aada506aa5481a7ddaa3b"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:55:27 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:55:27 2026 -0400"
      },
      "message": "Merge branch \u00277.1.x\u0027 into 7.2.x\n"
    },
    {
      "commit": "9f8deded0425e63e585aada506aa5481a7ddaa3b",
      "tree": "04d03a757dc51b6d526bad5c62d9a73c9f048174",
      "parents": [
        "b96887f14a8cbe5260daab170e08714a9ecb5435",
        "cf57bce56118db242e2f62b65e14d270e1f24088"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:54:29 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 20:54:29 2026 -0400"
      },
      "message": "Merge pull request #16303 from jamesfredley/merge/7.0.x-into-7.1.x\n\nMerge 7.0.x into 7.1.x"
    },
    {
      "commit": "13bf4405f8a3a6628964ea289466109dcda59fee",
      "tree": "c3ddd9f1f66a2fc888c1d887224bd4451f9dd2b3",
      "parents": [
        "8d1fc7d249ad23f25e359a9960176c2dc08905f5"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:50:48 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:50:48 2026 -0400"
      },
      "message": "Fix fields template lookup leak from accessor-keyed memoization\n\nFormFieldsTemplateService memoized findTemplate on BeanPropertyAccessor\ninstances, which retain request beans and values. Cache by candidate\ntemplate paths instead so distinct accessors of the same property share\none lookup and request objects can be collected.\n\nFixes #16162\n"
    },
    {
      "commit": "cf57bce56118db242e2f62b65e14d270e1f24088",
      "tree": "04d03a757dc51b6d526bad5c62d9a73c9f048174",
      "parents": [
        "b96887f14a8cbe5260daab170e08714a9ecb5435",
        "54cd047fa7456e1d59c5b4ccae389d09ec652485"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:45:31 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:45:31 2026 -0400"
      },
      "message": "Merge branch \u00277.0.x\u0027 into 7.1.x\n"
    },
    {
      "commit": "54cd047fa7456e1d59c5b4ccae389d09ec652485",
      "tree": "b770113181dc83aec826480563da8170571d53eb",
      "parents": [
        "8d1fc7d249ad23f25e359a9960176c2dc08905f5",
        "946faaa9b0217c86dc00a48985c0ff0482df1b38"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:28:53 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 20:28:53 2026 -0400"
      },
      "message": "Merge pull request #16301 from jamesfredley/feat/forge-aws-slots-next-snapshot-older\n\nAdd Forge AWS next-snapshot and older slots"
    },
    {
      "commit": "946faaa9b0217c86dc00a48985c0ff0482df1b38",
      "tree": "b770113181dc83aec826480563da8170571d53eb",
      "parents": [
        "e1850655d26392983a155ba0f492994d3e96c354"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:27:09 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:27:09 2026 -0400"
      },
      "message": "docs(forge): stop hardcoding the shared ALB DNS name.\n\nUse SharedLoadBalancerDnsName as the Cloudflare CNAME target and fix CNAMEs pluralization.\n"
    },
    {
      "commit": "e1850655d26392983a155ba0f492994d3e96c354",
      "tree": "0fe6d65aff48b3931959ac440ce165bdf3c76032",
      "parents": [
        "8d1fc7d249ad23f25e359a9960176c2dc08905f5"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:22:20 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 20:22:20 2026 -0400"
      },
      "message": "Add Forge AWS next-snapshot and older slots.\n\nKeep Cloudflare as authoritative DNS for all seven hostnames and drop the unused Route 53 dns.yaml path.\n"
    },
    {
      "commit": "505542f121404d4d3ed9552d25b1cb1953028641",
      "tree": "2a4d7337e509e89c4d7e1f6ff42dbd9274e487b1",
      "parents": [
        "c4e794fc6d16d550a0c8398929a2a3cbcb587842"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 18:40:05 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 18:41:52 2026 -0400"
      },
      "message": "build: keep Grails 8 indy-off only in CompilePlugin\n\nHonor review: drop groovy-indy.gradle and subprojects applies. Unpublished build-logic uses Gradle\u0027s Groovy default.\n"
    },
    {
      "commit": "c4e794fc6d16d550a0c8398929a2a3cbcb587842",
      "tree": "c68fc01e069832ce12df0b42915672547e9fbcc1",
      "parents": [
        "085c0d2886484a6538fc30a01c851ccb14fdf146"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Thu Aug 20 15:48:52 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 18:41:52 2026 -0400"
      },
      "message": "fix: invoke Map constructors without Class.newInstance under indy-off\n\nClass.newInstance(Map) is not selected under @CompileStatic when\ninvokedynamic is disabled. Use InvokerHelper.invokeConstructorOf with\nan explicit Object[] so nested Map-constructor types still bind.\nAlso avoid `null as boolean` in the Map-constructor test fixture,\nwhich Groovy 5 throws on without indy after unbindable properties\nare filtered from constructor arguments.\n\nAssisted-by: Sisyphus:grok-4.6\n"
    },
    {
      "commit": "085c0d2886484a6538fc30a01c851ccb14fdf146",
      "tree": "2252ec2c03331f202a49428db0522173aa59bcf4",
      "parents": [
        "8dfa3636da797ad5c92724f78e3cef638cc7bff8"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Aug 19 20:49:24 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 18:41:51 2026 -0400"
      },
      "message": "fix: stop count() log.debug hitting GORM methodMissing\n\nWith indy off, log.debug inside GormStaticApi.count()\u0027s session\ncallback was dispatched as Domain.debug(...). Capture the @Slf4j\nlogger in a local first. Also trim -PgrailsIndy the same way as\nCompilePlugin and apply the shared groovy-indy script from\nbuild-logic.\n\nAssisted-by: Sisyphus:grok-4.6\n"
    },
    {
      "commit": "8dfa3636da797ad5c92724f78e3cef638cc7bff8",
      "tree": "c9ea4ecbb573be07f22351abe07ae4e7ef343a90",
      "parents": [
        "19157d878a69b542c9546f28c255fb9543b48c52"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Aug 19 19:41:25 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 18:41:50 2026 -0400"
      },
      "message": "build: disable Groovy invokedynamic for the Grails 8 compile\n\nGroovy 5 defaults indy on. Only modules that apply the Grails Gradle\nplugin inherited grails.indy\u003dfalse, so published framework artifacts\nwere mixed. Centralize indy\u003dfalse in CompilePlugin and apply\ngradle/groovy-indy.gradle from the grails-core, grails-gradle, and\ngrails-forge builds. CI can still opt in with -PgrailsIndy\u003dtrue.\n\nSee #15293\n\nAssisted-by: Sisyphus:grok-4.6\n"
    },
    {
      "commit": "8d1fc7d249ad23f25e359a9960176c2dc08905f5",
      "tree": "387cda02db7c9b6711adda1a8899433e0e2c4461",
      "parents": [
        "2f7a097e2473d4cbf85b178bb157fe9b3e4e31c1",
        "d92eadc0663874fb89c27755b9fdc38919fcdb9b"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Wed Sep 02 17:43:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 17:43:48 2026 -0400"
      },
      "message": "Merge pull request #16110 from apache/ci/remove-docs-publish-serialization\n\nAllow concurrent documentation publishing"
    },
    {
      "commit": "0e5a368372301dfb7e84d5608271cf5b0031f469",
      "tree": "79c6209dc9a79138f9ccd47b76b2a5d6349a2163",
      "parents": [
        "c08ff11d7d6ff858af764931e8428dae283f1902",
        "b96887f14a8cbe5260daab170e08714a9ecb5435"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 02 17:09:53 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 02 17:09:53 2026 -0400"
      },
      "message": "Merge remote-tracking branch \u0027upstream/7.1.x\u0027 into 7.2.x\n"
    },
    {
      "commit": "b96887f14a8cbe5260daab170e08714a9ecb5435",
      "tree": "8b52a8dd07f0d559d5d605746db169b247ad3df8",
      "parents": [
        "94e04a373c28ee80177b51c6a600ae9dc2e8a8b2",
        "2f7a097e2473d4cbf85b178bb157fe9b3e4e31c1"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 02 17:09:30 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 02 17:09:30 2026 -0400"
      },
      "message": "Merge remote-tracking branch \u0027upstream/7.0.x\u0027 into 7.1.x\n"
    },
    {
      "commit": "19157d878a69b542c9546f28c255fb9543b48c52",
      "tree": "d9daa6d1239e150feca13b924523dab01be58bd3",
      "parents": [
        "2550800ff54ad87846bc020732ebbc32061dee50",
        "c427432137509e4ae2e5f0e6b7078ab3a807a9c4"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Wed Sep 02 13:50:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 13:50:58 2026 -0700"
      },
      "message": "Merge pull request #16273 from codeconsole/feat/wildcard-resources-mapping\n\nSupport mapping every controller as a REST resource"
    },
    {
      "commit": "2550800ff54ad87846bc020732ebbc32061dee50",
      "tree": "fae35aebfd90fb944a574f09e990386861836772",
      "parents": [
        "6f254ca1dd478bf531cc8213414058da1a14025f",
        "5684ed158d9d9913fd58782fdccc6dc27451e022"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Wed Sep 02 09:42:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 09:42:41 2026 -0700"
      },
      "message": "Merge pull request #16114 from codeconsole/fix/gradle-97-groovy-config-script\n\nFix Groovy compilation on Gradle 9.7 and upgrade to 9.7.1"
    },
    {
      "commit": "6f254ca1dd478bf531cc8213414058da1a14025f",
      "tree": "9fbb34736c6289893c2f5133ce236d2a4c55bbcd",
      "parents": [
        "c1b532aef9fea7a634ba21c17b247935cb9f72c2",
        "dc214d94e1999b5a7463689e3d3b22dc179b8ccf"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Wed Sep 02 11:00:37 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 11:00:37 2026 -0400"
      },
      "message": "Merge pull request #16293 from apache/fix/16280-map-accessor-collisions\n\nFix params and attrs entries shadowed by bean accessors on Groovy 5"
    },
    {
      "commit": "dc214d94e1999b5a7463689e3d3b22dc179b8ccf",
      "tree": "9fbb34736c6289893c2f5133ce236d2a4c55bbcd",
      "parents": [
        "c1b532aef9fea7a634ba21c17b247935cb9f72c2"
      ],
      "author": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Wed Sep 02 11:50:27 2026 +0200"
      },
      "committer": {
        "name": "Søren Berg Glasius",
        "email": "soeren@glasius.dk",
        "time": "Wed Sep 02 11:50:27 2026 +0200"
      },
      "message": "Address map entries shadowed by bean accessors on Groovy 5\n\nGroovy 5 changed MetaClassImpl for classes that implement Map. In Groovy 4,\ngetProperty returned ((Map) object).get(name) unconditionally, before any getter\nlookup, and setProperty put into the map whenever no setter existed. In Groovy 5\nthe getter lookup runs first, and the map-put branch is guarded so a public\ngetter-only bean property throws ReadOnlyPropertyException instead.\n\nA public JavaBean accessor on such a class therefore shadows the map entry of the\nsame name. GrailsParameterMap declared getRequest() and getIdentifier(), so\nrequest parameters named request and identifier became unreadable, and assigning\nto either threw.\n\nRemove the collisions rather than intercepting property access. getProperty and\nsetProperty are runtime hooks the static compiler never reaches: in\nStaticTypesCallSiteWriter, makeGetPropertyWithGetter runs before\nwriteMapDotProperty and the mutator loop before the Map.put branch, so a\nstatically compiled caller binds to the declared accessor regardless of any\nmetaclass override.\n\n  GrailsParameterMap.getRequest()          -\u003e request()\n  GrailsParameterMap.getIdentifier()       -\u003e removed; read params.id\n  GroovyPageAttributes.isGspTagSyntaxCall() -\u003e gspTagSyntaxCall()\n\nsetGspTagSyntaxCall(boolean) is retained, so assignment to that one name still\ninvokes the setter as it did in Grails 7; TagOutput and GroovyPage rely on it.\nAbstractTypeConvertingMap documents the invariant so this does not recur.\n\ngrails-taglib had no junit-jupiter-engine on its test runtime classpath, so\nGroovyPageAttributesTests was never discovered while the module\u0027s Spock specs\nran. Added module-local; the convention-level gap is tracked in #16289.\n\nFixes #16280\n"
    },
    {
      "commit": "5684ed158d9d9913fd58782fdccc6dc27451e022",
      "tree": "52a97c912988f1910976241ed955e59d3086ee47",
      "parents": [
        "818d22b56f0057755f6fb34fda6ca9a7a3d82eac",
        "7714cded4120a4970794ee25941dc031e0233c77"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:24:01 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:24:01 2026 -0700"
      },
      "message": "Merge remote-tracking branch \u0027origin/fix/gradle-97-groovy-config-script\u0027 into fix/gradle-97-groovy-config-script\n"
    },
    {
      "commit": "818d22b56f0057755f6fb34fda6ca9a7a3d82eac",
      "tree": "52a97c912988f1910976241ed955e59d3086ee47",
      "parents": [
        "392edeba2f0646ece737a6cd8aef56e6140ea530"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:22:08 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:22:08 2026 -0700"
      },
      "message": "Wire every GroovyCompile task, and fail on a missing configurationScript\n\nTwo gaps found in review of the generator wiring.\n\nA GroovyCompile that no source set owns, one a build registers directly,\ngot no generator, so it compiled without the Grails star imports, a\nplugin\u0027s AST metadata, and the combined script. The generator is now\ncreated on demand when the compile task\u0027s dependencies are resolved,\nwhich happens while the task graph is built and outside any task\nconfiguration action, so the container is mutable there. The source-set\nhook stays for the tasks it already covered. The whenReady capture walks\nthe tasks about to run instead of realizing every GroovyCompile in the\nproject.\n\nA configurationScript pointing at a file that does not exist was dropped\nsilently: the compile task\u0027s own property had been replaced with the\ncombined file, so Gradle\u0027s validation no longer saw it, and the generator\nread nothing. The build\u0027s script is now an optional @InputFile of the\ngenerator rather than text folded into the @Input string, so Gradle fails\nthe build naming the missing file before the generator runs.\n"
    },
    {
      "commit": "c427432137509e4ae2e5f0e6b7078ab3a807a9c4",
      "tree": "29a1a09330885c65892775681e5a199d2216b750",
      "parents": [
        "d1a3e5c4e52c41832607bd4edec915bcf15e7ed4",
        "c1b532aef9fea7a634ba21c17b247935cb9f72c2"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:20:40 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 21:20:40 2026 -0700"
      },
      "message": "Merge branch \u00278.0.x\u0027 into feat/wildcard-resources-mapping"
    },
    {
      "commit": "392edeba2f0646ece737a6cd8aef56e6140ea530",
      "tree": "c748db7cfc5b94c5b79dfc1f2c7baf9ec6c1b932",
      "parents": [
        "03811759ea5b31017a453efb5d30790857d3e8aa",
        "c1b532aef9fea7a634ba21c17b247935cb9f72c2"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:13:24 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 21:13:24 2026 -0700"
      },
      "message": "Merge remote-tracking branch \u0027upstream/8.0.x\u0027 into fix/gradle-97-groovy-config-script\n"
    },
    {
      "commit": "c1b532aef9fea7a634ba21c17b247935cb9f72c2",
      "tree": "8be1beef7c6e14c51dd3710e1bc456bb01882dc7",
      "parents": [
        "3d3f4bbcff0314b3295f60e3432445318ceab032"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 19:19:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 21:19:05 2026 -0500"
      },
      "message": "M6 FIX: Require a username and password on the spring-boot-starter-security User (#16291)\n\n* Require a username and password on the spring-boot-starter-security User\n\nGrails 8 makes an unconstrained persistent property nullable by default\n(upgrading80x.adoc, \"GORM Properties Are Nullable by Default\"), so the\ntemplate\u0027s `blank: false` constraints stopped making the credentials\nrequired: a User with a null username and a null password validated\nclean, and the scaffolded admin would happily save one. Every other\ndomain template in the forge -- role, userClassic, userRole -- already\ndeclares `nullable: false`; this one was missed when the default flipped.\n\nThe generated UserSpec failed out of the box for the same reason. Its\n`!new User(username: \u0027\u0027, password: \u0027\u0027).validate()` never exercised the\nblank constraint at all: the map constructor binds through data binding\nwith convertEmptyStringsToNull, so both values arrived as null and then\npassed. Assign the blank values directly, which is the only way a blank\nstring reaches the property, and cover the nullable case as its own\nfeature so the two constraints are asserted separately.\n\n* Map the security User through the directive its data store understands\n\nThe template emitted `table \u0027users\u0027` for every data implementation, but\n`table` is a Hibernate directive. On MongoDB it was silently ignored, so\nthe intent behind it -- don\u0027t name the persistence unit `user`, which is\na reserved word in PostgreSQL, H2 and SQL Server -- was lost exactly\nwhere nothing warned about it. Booting a generated mongodb app showed\nthe documents landing in a `user` collection; with `collection \u0027users\u0027`\nthey land in `users`.\n\nPick the directive from the selected features, the way GrailsBase and\nDatabaseMigrationPlugin already do, rather than from the gorm option, so\nit holds whether the implementation was chosen with --data or by naming\nthe feature. Hibernate 5 and 7 keep `table \u0027users\u0027`, MongoDB gets\n`collection \u0027users\u0027`, and a store that uses neither -- Neo4j -- gets no\nmapping block at all rather than a directive it does not understand.\n\n* Map the classic security User through the directive its data store understands\n\nThe classic User/Role/UserRole domain model shared by grails-spring-security\nand grails-spring-security-ui hardcoded a Hibernate-only `table` mapping\ndirective, same defect this PR already fixes for the spring-boot-starter-security\nUser template. Neither feature is restricted to Hibernate, so selecting\ngorm-mongodb alongside either one silently dropped the directive.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01K4Wxz1HXEyfVWGm52jzvpR\n\n---------\n\nCo-authored-by: Walter Duque de Estrada \u003cwbduque@mac.com\u003e\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "3d3f4bbcff0314b3295f60e3432445318ceab032",
      "tree": "014efa05e8aa1294fd4f0c3b256eae120598e613",
      "parents": [
        "b0c351b92202cd0891f5314521c4304afd49fe61"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Tue Sep 01 17:44:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 19:44:49 2026 -0500"
      },
      "message": "Register a generated auto-configuration where it is generated (#16224)\n\n* Register a generated auto-configuration where it is generated\n\nThe class a beans closure compiles to is created during compilation and is not a\nsource file anyone can open, so listing it in AutoConfiguration.imports required\nknowing both that it exists and what the compiler decided to call it. Not knowing\neither produced a plugin whose beans were silently never registered, which is a\npoor thing to ask an author to notice.\n\nThe name is settled in createAutoConfigurationSibling and nowhere else, so that is\nwhere the entry is now written - into the compilation\u0027s target directory, beside\nthe grails-plugin.xml and grails.factories that are already generated there.\n\nA module that keeps the file by hand keeps it, and nothing is generated beside it:\ntwo copies of one resource cannot both go into the jar, and folding the hand\nauthored entries into a copy under the build directory would lose them as soon as\nanyone deleted the file they were written in. Such a module is warned at compile\ntime when the generated class is missing from its file, so the silent case is gone\neither way, and deleting the file is what opts in. Hand-authored entries have to\nstay possible: a class from another jar, one annotated with a composed annotation,\nor one carrying no annotation at all - the imports file being the registration and\n@AutoConfiguration only supplying ordering.\n\ngrails-databinding and the beans-dsl-plugin example no longer apply the\nautoconfiguration-imports convention plugin, which generated the same entries a\nsecond time. The beans-dsl example keeps it: what it registers is a standalone\n@GrailsBeans class, which is a source file its author can see and so is left to be\nregistered by hand, as any other auto-configuration is.\n\n* Drop an entry for a class that is no longer generated\n\nThe file was only ever added to. A descriptor that was renamed, deleted, or given\na different autoConfigurationName left an entry naming a class that no longer\nexists, and Spring Boot does not start on an auto-configuration it cannot load.\nAn incremental build is where this shows: the stale class file is cleaned and the\nentry that named it is not.\n\nAn entry is now kept only while the class it names is still generated into the\nmodule\u0027s own output, which is what the scanning task this replaced recalculated\nevery time. Anything the current compilation registered is kept regardless, since\nclass generation runs in a later phase than this does - without that, two\ndescriptors rebuilt together would each prune the other, neither class file having\nbeen written yet. The set is weakly keyed on the compilation, so it is per-build\nrather than per-JVM in a daemon that reuses one.\n\nThe specification now compiles through to OUTPUT rather than stopping at\nCLASS_GENERATION. Stopping earlier wrote no class files at all, so the output\ndirectory it asserts against was empty and could not have shown any of this.\n\n* Drop the entry when nothing is left to generate the class\n\nPruning ran only while writing, and writing happens only when a class is\ngenerated. A descriptor deleted outright, or left with no beans closure or an\nempty one, generates nothing and so said nothing about the entry naming the class\nit used to generate - a build that removed the class kept the entry, and Spring\nBoot does not start on an auto-configuration it cannot load. The rename covered\nbefore only passed because the class replacing it did the writing.\n\nReconciling is now something the compilation does rather than something generating\na class does: the global Grails transform, which runs for every source unit of a\nproject and already writes generated metadata to the same directory, drops entries\nwhose classes are no longer generated there. Names registered by the compilation in\nhand are kept, their class files being written in a later phase than any of this\nruns in.\n\nThe file is deleted rather than left empty when the last entry goes, an imports\nfile with nothing in it being a resource that says nothing.\n\n* Fix generated auto-configuration registration lifecycle\n\n* Persist a write that only drops a stale entry, and warn once\n\nTwo things register the same descriptor in a standard compilation - the local\ntransform, and the global one from the node metadata it leaves - and neither\nconsequence of that was handled.\n\nComparing the set about to be written against the pruned set rather than against\nwhat was on disk meant a call that only dropped a stale entry appeared to change\nnothing and wrote nothing, leaving on disk the entry it had just decided was\nnaming a class that no longer exists. It is compared against the file\u0027s own\ncontents now, which also makes the className check that followed it redundant.\n\nThe missing hand-authored entry was reported by both, so one entry to add read as\ntwo problems. The warning is gated on the name not already having been registered\nby this compilation.\n\nAlso restores the coverage for a descriptor that is named like one but does not\nextend Plugin: its closure is still compiled, onto the class itself, and nothing\nis registered for it - which is what pins the scope to the sibling generated for a\nplugin descriptor.\n\n* Reach the beans transform the way the registering already does\n\ncompileBeansDsl loaded GrailsBeansASTTransformation reflectively and returned\nquietly if it was absent, while the registering a few lines above referenced that\nclass and the imports writer directly. Only one of those can be describing the\nclass path truthfully.\n\nIt is the direct one: grails-core declares grails-beans-dsl api, which is what the\nguard\u0027s own comment gave as the reason the branch could never be taken. Left as it\nwas, the guard caught a condition that the next statement would have failed on\nanyway.\n\n* Register the sibling under Groovy-Eclipse too\n\nA descriptor carrying @GrailsBeans explicitly was registered by neither path\nthere. The local transform skipped its own write, the compiler configuration\nholding no directory it could trust; the global transform registers from node\nmetadata, and the metadata is not set yet when it runs - the local transform is\nwhat sets it, and for an annotated descriptor that happens afterwards. Only the\nconvention path, where the global transform compiles the closure itself, was\ncovered.\n\nThe global transform now seeds the directory it resolved onto every class of the\nsource unit before anything is transformed, and the local transform prefers it\nover the compiler\u0027s own. That is the Eclipse resolution being passed in rather\nthan reached for: it lives in grails-core, which grails-beans-dsl cannot depend\non. With a directory it can trust, the local transform no longer skips.\n\n* Register the sibling once, where its name is settled\n\nThe global transform registered from the node metadata the local transform leaves\nbehind, which was the only way the name reached a directory resolved for\nGroovy-Eclipse. Seeding that directory the other way round, so the local transform\nwrites to it, leaves this reading metadata that either was written moments earlier\nby a call that has already registered the same name, or - for a descriptor\ncarrying @GrailsBeans, compiled after this runs - is not there at all. Neither\ncase registers anything the local transform has not.\n\nRemoving it is what the duplicate reporting fixed earlier came from, so that guard\nis now defence rather than the thing standing between one entry to add and two\nreports of it.\n\nReconciling stays: it is not about a class being generated, but about entries for\nclasses that are not.\n\n* Stop guarding a duplicate that one call site cannot produce\n\nRegistering happens in exactly one place now, so the same name cannot reach the\nhand-authored branch twice in a compilation and the gate against that reported on\nnothing. Its specification passed with the gate taken out, which is the worse half\nof keeping it: a test that cannot fail reads as cover for a branch nobody is\nholding.\n\nWhat is left there is worth asserting, so the specification keeps the case and\ndrops the claim about counting - a hand-authored file missing the generated class\nis told which name to add, and no second file is generated beside it. That one\nfails when the warning is removed.\n\n* Drop the metadata nothing reads, and cover the annotated entry path\n\nThe generated name was put on the class node for the global transform to read,\nand the global transform no longer reads anything: the write and the constant\nwere the only references left, and the constant still described carrying a name\nsomewhere that stopped asking for it.\n\nThe specification also only reached the sibling through the convention, where the\nglobal transform compiles the closure itself. A descriptor carrying the annotation\ntakes the other entry path - the local transform runs after this one and writes to\nthe directory seeded for it - and that path registering nothing is exactly what\nwent unnoticed before. It is covered now, and fails when the registering is taken\naway from it.\n\nAlso removes a duplicate import of SourceUnit that codeStyle does not object to."
    },
    {
      "commit": "2f7a097e2473d4cbf85b178bb157fe9b3e4e31c1",
      "tree": "1161b12b8dfb86d68bc7bbd6db7e2fc78f493bf7",
      "parents": [
        "2ef59e19583c85d0f0758c29d828f56ace009767"
      ],
      "author": {
        "name": "Walter B Duque de Estrada",
        "email": "wbduque@mac.com",
        "time": "Tue Sep 01 19:30:08 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 19:30:08 2026 -0500"
      },
      "message": "Fix JsonScanner number parsing for bare exponents and -Infinity (#16284)\n\nTwo bugs found while adding test coverage for JsonReader/JsonWriter on\n8.1.x, cherry-picked here since JsonScanner is unchanged since 7.0.x:\n\n- SAW_EXPONENT_DIGITS was the only numeric scanner state whose\n  terminator switch omitted an explicit end-of-input case (every\n  sibling state treats EOF the same as a closing delimiter), so a\n  bare exponent-notation number with nothing following it (e.g. a\n  top-level \"1e2\") threw JsonParseException instead of parsing.\n\n- SAW_MINUS_I appended the character it read on every iteration of\n  its \"-Infinity\" match loop, including the terminator character read\n  immediately after matching the literal\u0027s final \u0027y\u0027 - so the buffer\n  handed to Double.parseDouble always carried one extra trailing\n  character, and \"-Infinity\" failed to parse in every context\n  (end-of-input, before a comma, before a closing bracket).\n\nThis branch has no prior JsonReader test coverage, so a minimal\nJsonReaderSpec is added here with just the two regression tests -\nbroader JsonReader/JsonWriter coverage exists only on 8.1.x.\n\n\nClaude-Session: https://claude.ai/code/session_01QAjfckcY4EJsxranv1RyGV\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b0c351b92202cd0891f5314521c4304afd49fe61",
      "tree": "6e58c0ceebed18b4431a6a9a1afc9f0306ae92f7",
      "parents": [
        "c8688ff761d8ee5f4acfe28e66b7fa4983888b59",
        "8bf277b05916b7ab020057ab3543fe755b11882f"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Sep 01 14:33:18 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 14:33:18 2026 -0400"
      },
      "message": "Merge pull request #16288 from apache/feat/async-group-8.0.x\n\nFix async group \u0026 add associated feature"
    },
    {
      "commit": "c8688ff761d8ee5f4acfe28e66b7fa4983888b59",
      "tree": "2f4c377e469457f6b281e222922bf4ddbbc3cb6e",
      "parents": [
        "30c1e776d75321d7300f8ae79a45cae09e24fb6e",
        "19f49f34c67a729594893f49cac160182d865e9c"
      ],
      "author": {
        "name": "Mattias Reichel",
        "email": "matrei@apache.org",
        "time": "Tue Sep 01 18:18:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 18:18:35 2026 +0200"
      },
      "message": "Merge pull request #16283 from apache/post-8.0.0-M6-release\n\nCorrect typo in grails-core docs generation step"
    },
    {
      "commit": "8bf277b05916b7ab020057ab3543fe755b11882f",
      "tree": "f95abe2fafa22d6e8727aada3882c7f7ee136039",
      "parents": [
        "30c1e776d75321d7300f8ae79a45cae09e24fb6e"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Sep 01 08:47:23 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Sep 01 08:47:23 2026 -0400"
      },
      "message": "Fix async group \u0026 add associated feature\n"
    },
    {
      "commit": "30c1e776d75321d7300f8ae79a45cae09e24fb6e",
      "tree": "0749f392e980b9aab5053bd4693d868ca19597dd",
      "parents": [
        "d71c2182591d06bb7dca0d213a031255812bad35",
        "e469c27e11a237b99691835b1b3f13ea1099ede1"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Sep 01 08:12:02 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 08:12:02 2026 -0400"
      },
      "message": "Merge pull request #16279 from codeconsole/chore/remove-dead-xml-apis-exclusions-8.0.x\n\nRemove dead xml-apis dependency exclusions"
    },
    {
      "commit": "2ef59e19583c85d0f0758c29d828f56ace009767",
      "tree": "010d8fd2777642c24c8dbc4014e55a39a1a054b1",
      "parents": [
        "381bc41296bd495c56357efc6b0900fb5c120b86",
        "4646adfa06b008408c6b666a06d3a493f9ec8817"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Tue Sep 01 06:54:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 06:54:58 2026 -0400"
      },
      "message": "Merge pull request #16005 from apache/fix/groovydoc-links"
    },
    {
      "commit": "d71c2182591d06bb7dca0d213a031255812bad35",
      "tree": "1fe90a51c7f41b7772322c48916b8ad59ad71f6b",
      "parents": [
        "03ef4979fc16abb871fe18444347e53d7575bd99",
        "cfb1b1e10ebc5cc61612de99c2246e048350a87c"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 15:12:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 15:12:22 2026 -0700"
      },
      "message": "Merge pull request #16221 from codeconsole/feat/beans-dsl-qualified-autoconfiguration-name-8.0.x\n\nLet autoConfigurationName name a package as well as a class"
    },
    {
      "commit": "03ef4979fc16abb871fe18444347e53d7575bd99",
      "tree": "2d31036ebf9527ef78809ee8c19170772a91e0b6",
      "parents": [
        "f3a91d366420f8d916ea63af5938d4ba21da9c94",
        "cf50292b2d063e93c61a0358a0e852be04f44a76"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 15:07:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 15:07:31 2026 -0700"
      },
      "message": "Merge pull request #16216 from codeconsole/fix/embedded-mongo-backend-reuse-8.0.x\n\nReuse an embedded MongoDB only when it is running the backend being asked for"
    },
    {
      "commit": "cfb1b1e10ebc5cc61612de99c2246e048350a87c",
      "tree": "69e2579c234ba7b538c9dd91b10d6bf8ed964916",
      "parents": [
        "c2e29e3e94724f4d13e6d335a487b48d02eea55e"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:50:09 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:50:09 2026 -0700"
      },
      "message": "Cover the qualified sibling end to end, not just at the AST level\n\nThe spec in grails-beans-dsl proves the sibling is generated under the qualified\nname, but the point of accepting one is that an excludeName, a before\u003d/after\u003d or\na test import still resolves it - and that runs through the class file landing in\nthe named package, the build\u0027s AutoConfiguration.imports scan recording it there,\nand Spring Boot discovering it. None of that was exercised.\n\nSalutationGrailsPlugin names a sibling in beandsl.example.plugin.web while\nSalutation itself stays in the descriptor\u0027s package, so the bean(...) referencing\nit unqualified also covers type resolution surviving the move.\n"
    },
    {
      "commit": "c2e29e3e94724f4d13e6d335a487b48d02eea55e",
      "tree": "bd54b4013249ff5229c6bc38500b065679a625ae",
      "parents": [
        "b3fa838ed370c67afca2a91b3967082f446cc377"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:43:32 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:43:32 2026 -0700"
      },
      "message": "State that a qualified autoConfigurationName is absolute\n\nA name containing a dot is taken as written, so a two-part value like\n\u0027web.ExampleAutoConfiguration\u0027 names a top-level web package rather than a\nsubpackage of the plugin\u0027s. That matches how Java reads a qualified name, but\nnothing said so.\n"
    },
    {
      "commit": "cf50292b2d063e93c61a0358a0e852be04f44a76",
      "tree": "a48dfc594ef4f2c2687fd409e2ed37f1b0fdaf61",
      "parents": [
        "1e74b1afc1c80d168a75b3d11676d1c588935974"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:38:08 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:38:08 2026 -0700"
      },
      "message": "Document the backend as a setting a restart is not handed a stale server for\n\nThe guide\u0027s \"Restarts and ports\" section enumerated the settings that force a\nreplacement - a database directory, a version, a replica set, transactions being\nswitched on - and left out the backend, which is the one the reuse check had been\nmissing. Reading as exhaustive, it described the fixed case as the bug.\n\nAdd it to that list, along with where being handed the wrong backend actually\nfails, and what naming a backend whose library is absent now does to a restart.\n\nThe same closed list appears in discard()\u0027s javadoc, and StartedServer still\ndescribed the settings alone as what a later context compares against.\n"
    },
    {
      "commit": "b3fa838ed370c67afca2a91b3967082f446cc377",
      "tree": "96475c619ba4c435908dd90f9bef59489e84c08b",
      "parents": [
        "5ca8537f362cf1f435d447943809cf1568ff2111",
        "10d7c84632cdba2515235c63570f159462877fe4"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:34:00 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:34:00 2026 -0700"
      },
      "message": "Merge remote-tracking branch \u0027origin/feat/beans-dsl-qualified-autoconfiguration-name-8.0.x\u0027 into feat/beans-dsl-qualified-autoconfiguration-name-8.0.x\n"
    },
    {
      "commit": "5ca8537f362cf1f435d447943809cf1568ff2111",
      "tree": "d61dc6d57b88b27b24d73420ffdd90f6ed7475bd",
      "parents": [
        "ae65d133c9e30e90030ea0c58d19bafcfb6727df"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:32:33 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:32:33 2026 -0700"
      },
      "message": "Correct the two remaining \"same package\" claims about the sibling\n\nBoth predate the qualified name and were left behind by it. The guide asserted\nthe sibling lands in the same package eight lines above the new paragraph saying\na qualified name puts it elsewhere, and the transformation\u0027s class javadoc said\nthe same thing while GrailsBeans\u0027 own javadoc had already been updated.\n"
    },
    {
      "commit": "7714cded4120a4970794ee25941dc031e0233c77",
      "tree": "6e8239077174ebd01fbadc4da2fb555276ba8839",
      "parents": [
        "03811759ea5b31017a453efb5d30790857d3e8aa",
        "f3a91d366420f8d916ea63af5938d4ba21da9c94"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Mon Aug 31 13:02:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:02:28 2026 -0700"
      },
      "message": "Merge branch \u00278.0.x\u0027 into fix/gradle-97-groovy-config-script"
    },
    {
      "commit": "4646adfa06b008408c6b666a06d3a493f9ec8817",
      "tree": "b7121c3e1359487a19bbed07cc49d1f136e3fbe8",
      "parents": [
        "4912fc36236f75a64b7ba25ead3888501f45a186"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Aug 31 14:53:58 2026 -0400"
      },
      "committer": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Aug 31 15:30:20 2026 -0400"
      },
      "message": "docs: fix Groovydoc external-type links and audit unresolvable links by cause\n\nFull compile classpath + lazy link providers for Groovydoc; audit fails only\non fixable links, warns (deduped) on Groovydoc template defects; make\nMultiTransactionStatus public so its linked page is generated.\n"
    },
    {
      "commit": "f3a91d366420f8d916ea63af5938d4ba21da9c94",
      "tree": "38a827b0b47acf9d2cebc59ba813225b85c720cd",
      "parents": [
        "4309d5b876614920b39721e425559f61779d9c12",
        "6408c369d952bbcad215d72ddd1054ad59bdd8a2"
      ],
      "author": {
        "name": "James Daugherty",
        "email": "jdaugherty@jdresources.net",
        "time": "Mon Aug 31 11:07:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 11:07:06 2026 -0400"
      },
      "message": "Merge pull request #16211 from apache/fix/bump-hibernate7-versions\n\nBump Hibernate 7 versions"
    },
    {
      "commit": "6408c369d952bbcad215d72ddd1054ad59bdd8a2",
      "tree": "430cd1c237c9aabbb4f84912991f2a419076ce5c",
      "parents": [
        "d088957e7edcb85cb8dcce9b050c572bf120e349"
      ],
      "author": {
        "name": "Mattias Reichel",
        "email": "mattias.reichel@gmail.com",
        "time": "Mon Aug 31 10:47:09 2026 +0200"
      },
      "committer": {
        "name": "Mattias Reichel",
        "email": "mattias.reichel@gmail.com",
        "time": "Mon Aug 31 10:47:09 2026 +0200"
      },
      "message": "fix(deps): Bump Hibernate 7 to 7.4.7.Final\n"
    },
    {
      "commit": "10d7c84632cdba2515235c63570f159462877fe4",
      "tree": "48db74927d2e5a21f034346e91ca874fef9d3aac",
      "parents": [
        "ae65d133c9e30e90030ea0c58d19bafcfb6727df",
        "4309d5b876614920b39721e425559f61779d9c12"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 21:19:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 30 21:19:46 2026 -0700"
      },
      "message": "Merge branch \u00278.0.x\u0027 into feat/beans-dsl-qualified-autoconfiguration-name-8.0.x"
    },
    {
      "commit": "d1a3e5c4e52c41832607bd4edec915bcf15e7ed4",
      "tree": "b61529b954958fe213f341acadaaa7d09fef3ec1",
      "parents": [
        "06a27a837b8301376d179e844db4e5ce711d937a",
        "6af0bf5d570422dd44422419ffaa43579eb4d08f"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 18:02:34 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 18:02:34 2026 -0700"
      },
      "message": "Merge remote-tracking branch \u0027origin/feat/wildcard-resources-mapping\u0027 into feat/wildcard-resources-mapping\n"
    },
    {
      "commit": "06a27a837b8301376d179e844db4e5ce711d937a",
      "tree": "94099021125f9354c7eaa83bd4ec1cf514e8cec8",
      "parents": [
        "e597f9740ad5cefeb40e3c116b2f1880583e8349"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 18:02:14 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 18:02:14 2026 -0700"
      },
      "message": "Cover the namespace form of a wildcard resources mapping\n\n\"/$namespace/$controller\"(resources: \u0027*\u0027) already worked, since the\nnamespace token registers its own constraint and RegexUrlMapping has a\nruntime evaluator for it, but nothing pinned that down. The constraint\nordering is what makes it work and is easy to break: namespace, then\ncontroller, then the id and format the resource mappings append, which\nhave to line up with the regex group positions.\n\nAdds a spec asserting all four bind correctly, that literal segments\nstill beat the id, and that a second namespace reuses the same eight\nmappings. Documents the form in the guide.\n"
    },
    {
      "commit": "e469c27e11a237b99691835b1b3f13ea1099ede1",
      "tree": "3651cc1f4da8033d7c4833838d81fab72bef05d8",
      "parents": [
        "4309d5b876614920b39721e425559f61779d9c12"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 16:00:59 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sun Aug 30 16:00:59 2026 -0700"
      },
      "message": "Remove dead xml-apis dependency exclusions\n\nxml-apis:xml-apis has not been reachable from any of these dependencies\nfor several major versions, so the exclusions are no-ops:\n\n- hibernate-core 7.4.1.Final and hibernate-core-jakarta 5.6.15.Final\n  never declare xml-apis. Hibernate\u0027s own POM already excludes it from\n  every one of its dependencies, and mapping XML has been bound with\n  JAXB (jakarta.xml.bind-api + jaxb-runtime) since Hibernate 6 dropped\n  dom4j.\n- commons-validator 1.9.0 no longer pulls commons-digester/xml-apis.\n\nThe resolved compileClasspath, runtimeClasspath and testRuntimeClasspath\nof all three modules are byte-identical with the exclusions removed. The\nonly publication change is the removal of three dead \u003cexclusion\u003e entries\nfrom the generated POMs.\n"
    },
    {
      "commit": "6af0bf5d570422dd44422419ffaa43579eb4d08f",
      "tree": "5805c920ebb956e23d5f1ae621da011889b2023a",
      "parents": [
        "e597f9740ad5cefeb40e3c116b2f1880583e8349",
        "4309d5b876614920b39721e425559f61779d9c12"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 21:52:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 21:52:49 2026 -0700"
      },
      "message": "Merge branch \u00278.0.x\u0027 into feat/wildcard-resources-mapping"
    },
    {
      "commit": "4309d5b876614920b39721e425559f61779d9c12",
      "tree": "01a91d35466a8b28c62a53f82cd4b89fd0699170",
      "parents": [
        "2e88f24297e8b4fce82e6c5583b1e3a7270a49fc",
        "6703374a16499e28cb16e79aad440a89b327bfb0"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 21:49:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 21:49:21 2026 -0700"
      },
      "message": "Merge pull request #16274 from codeconsole/fix/codec-metaclass-compile-static-8.0.x\n\nFix Grails Forge build on Gradle 9 by bumping Shadow to 8.3.11"
    },
    {
      "commit": "6703374a16499e28cb16e79aad440a89b327bfb0",
      "tree": "01a91d35466a8b28c62a53f82cd4b89fd0699170",
      "parents": [
        "9918f531e3aa4a8eabcc2338b1f86c134692aa3d"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 20:21:39 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 20:21:39 2026 -0700"
      },
      "message": "Bump Forge Shadow plugin to 8.3.11 for Gradle 9\n\nShadow 8.3.6\u0027s ShadowApplicationPlugin configures the startShadowScripts\ntask through conventionMapping.map(\u0027mainClassName\u0027). Gradle 9 removed the\ndeprecated CreateStartScripts.mainClassName in favour of the mainClass\nProperty, so the task can no longer be created and the Forge build fails\nat configuration time:\n\n    Could not determine the dependencies of task\n    \u0027:grails-forge-web-netty:shadowDistTar\u0027.\n    \u003e Could not create task \u0027:grails-forge-web-netty:startShadowScripts\u0027.\n       \u003e You can\u0027t map a property that does not exist: propertyName\u003dmainClassName\n\nShadow is only applied to grails-forge-web-netty because the AWS Elastic\nBeanstalk packaging came over from 7.2.x, which builds Forge on Gradle\n8.14.5 where mainClassName still exists. Shadow 8.3.7 backported Gradle 9\nsupport and 8.3.11 is the latest 8.3.x; the 8.x line is maintenance-only\nupstream, so Forge\u0027s own build should follow the generated applications to\nShadow 9 (already 9.2.2 in the Forge dependency catalog) in a later change,\nwhich needs the Transformer -\u003e ResourceTransformer migration in buildSrc.\n"
    },
    {
      "commit": "9918f531e3aa4a8eabcc2338b1f86c134692aa3d",
      "tree": "3f68d21f2fa7e3b455b6df7fb6287527d81152c6",
      "parents": [
        "2e88f24297e8b4fce82e6c5583b1e3a7270a49fc"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 19:32:11 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 19:32:11 2026 -0700"
      },
      "message": "Compile CodecMetaClassSupport statically\n\nThe static initializer added by #15800 builds its Caffeine cache through\nthree dynamic call sites:\n\n    ldc           class com/github/benmanes/caffeine/cache/Caffeine\n    invokedynamic invoke:(Ljava/lang/Class;)Ljava/lang/Object;   // newBuilder()\n    invokedynamic invoke:(Ljava/lang/Object;)Ljava/lang/Object;  // weakKeys()\n    invokedynamic invoke:(Ljava/lang/Object;)Ljava/lang/Object;  // build()\n\nIn a GraalVM native image there is no method handle to link, so Groovy\nfalls back to IndyInterface.aotDispatch and resolves through the\nmetaclass, which is built from Caffeine.getDeclaredMethods() -- empty\nunless the class is registered for reflection. The class initializer\nfails with\n\n    No signature of static method: newBuilder for class:\n    com.github.benmanes.caffeine.cache.Caffeine\n\nand codecLookup, gspTagLibraryLookup and groovyPagesTemplateEngine fail\nwith it, so the application never starts.\n\nSix of the ten methods already carried @CompileStatic. Moving it to the\nclass turns those three call sites into invokestatic/invokevirtual and\nneeds no reachability metadata at all. addMetaMethod stays dynamic: it\nresolves a metamethod by GString property name, which is the one thing\nstatic compilation cannot express.\n"
    },
    {
      "commit": "2e88f24297e8b4fce82e6c5583b1e3a7270a49fc",
      "tree": "1abf04a841f8424757de1adb7f3e665dbd0d233e",
      "parents": [
        "2fd29c6f411fe1625009cb30d0b151d159753dea",
        "811f25e8289c2dd589b6f72e844be5644c905789"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 17:01:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 17:01:02 2026 -0700"
      },
      "message": "Merge pull request #16271 from codeconsole/docs/rest-resources-patch\n\nDocument the PATCH mapping generated by resources and single"
    },
    {
      "commit": "e597f9740ad5cefeb40e3c116b2f1880583e8349",
      "tree": "0d6049cda577ff9b379b707337c8f3357911d0da",
      "parents": [
        "2fd29c6f411fe1625009cb30d0b151d159753dea"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 16:35:15 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 16:35:15 2026 -0700"
      },
      "message": "Support mapping every controller as a REST resource\n\nAn application whose controllers all follow the RESTful resource\nconventions had to declare a resources mapping per controller, or\nhand-write the eight equivalent method-prefixed mappings. The first\ngrows the mapping table with the controller count; the second copies a\nframework convention into application code, where it drifts when the\nconvention changes.\n\nPassing \u0027*\u0027 as the resources argument now generates the eight mappings\nonce and leaves the controller to be resolved from the URL\u0027s own capture\nwhen a request is matched, which the existing runtime constraint\nevaluator already supports. includes, excludes and group prefixes\ncompose as they do for a named resource.\n\nBecause the controller is not known until a request is matched, two\ncases are rejected when the mappings are evaluated rather than left to\nproduce mappings that cannot match: a URL that does not capture the\ncontroller, and a nested child resource, which would otherwise build a\nconstraint named \"nullId\".\n"
    },
    {
      "commit": "811f25e8289c2dd589b6f72e844be5644c905789",
      "tree": "1abf04a841f8424757de1adb7f3e665dbd0d233e",
      "parents": [
        "2fd29c6f411fe1625009cb30d0b151d159753dea"
      ],
      "author": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 16:21:42 2026 -0700"
      },
      "committer": {
        "name": "Scott Murphy Heiberg",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 16:21:42 2026 -0700"
      },
      "message": "Document the PATCH mapping generated by resources and single\n\nDEFAULT_RESOURCES_INCLUDES generates eight mappings (index, create,\nsave, show, edit, update, patch, delete) and DEFAULT_RESOURCE_INCLUDES\ngenerates seven, but the guide listed only seven and six. PATCH has\nbeen generated since the action was introduced and was never documented,\nincluding in the \"Explicit REST Mappings\" equivalence list.\n\nAlso corrects the nested resources table, which gave the edit URI as\n/books/${bookId}/authors/edit/${id}. The generated mapping appends\n/edit after the id, as asserted by RestfulResourceMappingSpec.\n"
    },
    {
      "commit": "2fd29c6f411fe1625009cb30d0b151d159753dea",
      "tree": "bb1d9ef05994ecc557ead833752db299dcb82141",
      "parents": [
        "9b58a8a8f00bc5aebceee9e7b449ff071fac187a",
        "ebee4507f7eff0884387d3d8ea9f7edbcfe9c453"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 16:18:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 16:18:09 2026 -0700"
      },
      "message": "Merge pull request #16222 from codeconsole/feat/gorm-native-id-type-8.0.x\n\nGORM Native Datastore Id Support "
    },
    {
      "commit": "ebee4507f7eff0884387d3d8ea9f7edbcfe9c453",
      "tree": "bb1d9ef05994ecc557ead833752db299dcb82141",
      "parents": [
        "d6dadf15727866275fddfa0048e0dc723d628bf1",
        "9b58a8a8f00bc5aebceee9e7b449ff071fac187a"
      ],
      "author": {
        "name": "Scott Murphy",
        "email": "scott@alwaysvip.com",
        "time": "Sat Aug 29 16:12:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 16:12:49 2026 -0700"
      },
      "message": "Merge branch \u00278.0.x\u0027 into feat/gorm-native-id-type-8.0.x"
    },
    {
      "commit": "9b58a8a8f00bc5aebceee9e7b449ff071fac187a",
      "tree": "969f60355a57c78d910a74a9364bdeee6843ad8b",
      "parents": [
        "59046ddcc34d25a4d9f432f3bad93402f84e3d2e",
        "314698d39f8c919409ad96551696ec632a0cf15e"
      ],
      "author": {
        "name": "Mattias Reichel",
        "email": "matrei@apache.org",
        "time": "Sat Aug 29 23:34:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 23:34:24 2026 +0200"
      },
      "message": "Merge pull request #16270 from apache/merge-back-8.0.0-M6\n\nchore: merge 8.0.0-M6-\u003e8.0.x; bump to 8.0.0-SNAPSHOT"
    },
    {
      "commit": "314698d39f8c919409ad96551696ec632a0cf15e",
      "tree": "4b991fb1e527bb9bf70c86d9d91867e13c38d7a2",
      "parents": [
        "80a2962457fd276d7b35251dccb0f8e15f01a8e3"
      ],
      "author": {
        "name": "matrei",
        "email": "matrei@users.noreply.github.com",
        "time": "Sat Aug 29 21:33:18 2026 +0000"
      },
      "committer": {
        "name": "matrei",
        "email": "matrei@users.noreply.github.com",
        "time": "Sat Aug 29 21:33:18 2026 +0000"
      },
      "message": "[skip ci] Bump version to 8.0.0-SNAPSHOT\n"
    },
    {
      "commit": "c08ff11d7d6ff858af764931e8428dae283f1902",
      "tree": "4b754202e066b0b7bc329ed8e91980ece1a29007",
      "parents": [
        "e0c5cf17e756630042b1a4fdc1417e4dd198f3df",
        "5a1e15c4fdfdffe580984003654827c8d4b67569"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:11:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 22:11:48 2026 -0400"
      },
      "message": "Merge pull request #16265 from apache/sync/forge-aws-gha-7.2\n\nfix: sync Forge AWS GitHub deploy with working 8.0.x"
    },
    {
      "commit": "5a1e15c4fdfdffe580984003654827c8d4b67569",
      "tree": "4b754202e066b0b7bc329ed8e91980ece1a29007",
      "parents": [
        "e0c5cf17e756630042b1a4fdc1417e4dd198f3df"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:11:25 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:11:25 2026 -0400"
      },
      "message": "Sync Forge AWS GitHub deploy with working 8.0.x\n\nCopy forge-deploy-aws.yml (no --process, fail fast on EB errors) and\nshared.yaml GitHubDeployRole managed policies from 8.0.x.\n"
    },
    {
      "commit": "94e04a373c28ee80177b51c6a600ae9dc2e8a8b2",
      "tree": "8d59055ae16b14ec31b2be874d87b5dc6df6261c",
      "parents": [
        "8c1561988a1591f6379dd3884fd1e9bdf734d4c7",
        "b3f3c253c5a4e9966ec4d6c3d0fa99edd62b9a81"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:11:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 22:11:11 2026 -0400"
      },
      "message": "Merge pull request #16264 from apache/sync/forge-aws-gha-7.1\n\nfix: sync Forge AWS GitHub deploy with working 8.0.x"
    },
    {
      "commit": "b3f3c253c5a4e9966ec4d6c3d0fa99edd62b9a81",
      "tree": "8d59055ae16b14ec31b2be874d87b5dc6df6261c",
      "parents": [
        "8c1561988a1591f6379dd3884fd1e9bdf734d4c7"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:11:03 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:11:03 2026 -0400"
      },
      "message": "Sync Forge AWS GitHub deploy with working 8.0.x\n\nCopy forge-deploy-aws.yml (no --process, fail fast on EB errors) and\nshared.yaml GitHubDeployRole managed policies from 8.0.x.\n"
    },
    {
      "commit": "381bc41296bd495c56357efc6b0900fb5c120b86",
      "tree": "78ce0e632101a141d83c46a63f271be98e1e61f2",
      "parents": [
        "fa8cec933f3d5e65ef47516cc40f4162539e7dc5",
        "5899f028cb0f96803a60955ccf9b9d430141ef93"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:10:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 22:10:25 2026 -0400"
      },
      "message": "Merge pull request #16263 from apache/sync/forge-aws-gha-7.0\n\nfix: sync Forge AWS GitHub deploy with working 8.0.x"
    },
    {
      "commit": "5899f028cb0f96803a60955ccf9b9d430141ef93",
      "tree": "78ce0e632101a141d83c46a63f271be98e1e61f2",
      "parents": [
        "fa8cec933f3d5e65ef47516cc40f4162539e7dc5"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:10:16 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 22:10:16 2026 -0400"
      },
      "message": "Sync Forge AWS GitHub deploy with working 8.0.x\n\nCopy forge-deploy-aws.yml (no --process, fail fast on EB errors) and\nshared.yaml GitHubDeployRole managed policies from 8.0.x.\n"
    },
    {
      "commit": "59046ddcc34d25a4d9f432f3bad93402f84e3d2e",
      "tree": "969f60355a57c78d910a74a9364bdeee6843ad8b",
      "parents": [
        "74b567eacf5fdacb0932f819c3faebcc8739c6c9",
        "d434859a1672816e5f05b8434594388bae828b30"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 21:42:46 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 21:42:46 2026 -0400"
      },
      "message": "Merge pull request #16262 from apache/fix/forge-aws-describe-star\n\nfix: Elastic Beanstalk managed policies for GitHub deploys"
    },
    {
      "commit": "d434859a1672816e5f05b8434594388bae828b30",
      "tree": "969f60355a57c78d910a74a9364bdeee6843ad8b",
      "parents": [
        "74b567eacf5fdacb0932f819c3faebcc8739c6c9"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 21:42:10 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 21:42:10 2026 -0400"
      },
      "message": "Use Elastic Beanstalk managed policies for GitHub deploys\n\nAttach AWSElasticBeanstalkWebTier, ManagedUpdates, and\nAdministratorAccess-AWSElasticBeanstalk to the deploy role, matching\nwhat einaregilsson/beanstalk-deploy documents. Create application\nversions without --process and fail fast on Elastic Beanstalk ERROR\nevents instead of waiting out the poll loop.\n"
    },
    {
      "commit": "74b567eacf5fdacb0932f819c3faebcc8739c6c9",
      "tree": "c6eb68f81a37ddf069db11d92a7c80c753393724",
      "parents": [
        "d18f8de20d454bffac3e7068f7dc54bf22e4c6eb",
        "0be4f672c51c277d2366d1541252602522afc305"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 21:16:18 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 21:16:18 2026 -0400"
      },
      "message": "Merge pull request #16261 from apache/fix/forge-aws-asg-describe\n\nfix: grant Forge AWS deploy role Auto Scaling describe"
    },
    {
      "commit": "0be4f672c51c277d2366d1541252602522afc305",
      "tree": "c6eb68f81a37ddf069db11d92a7c80c753393724",
      "parents": [
        "d18f8de20d454bffac3e7068f7dc54bf22e4c6eb"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 21:15:45 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 21:15:45 2026 -0400"
      },
      "message": "Allow Forge AWS deploys to describe Auto Scaling groups\n\nGitHub Actions UpdateEnvironment failed with\nautoscaling:DescribeAutoScalingGroups. Grant describe on Auto Scaling\nand EC2 instances so Elastic Beanstalk can inspect the environment.\n"
    },
    {
      "commit": "d18f8de20d454bffac3e7068f7dc54bf22e4c6eb",
      "tree": "b444c5303c88bcd43ef9812d8963235f082bd2ad",
      "parents": [
        "bb815fa39bb9f8edf71264b45bb696a0ade7dafe",
        "4bfe59dad2c086903fe19374f027bc09614157cd"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 20:41:53 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 20:41:53 2026 -0400"
      },
      "message": "Merge pull request #16260 from apache/fix/forge-aws-eb-s3-acl\n\nfix: grant Forge AWS deploy role S3 ACL on EB bucket"
    },
    {
      "commit": "4bfe59dad2c086903fe19374f027bc09614157cd",
      "tree": "b444c5303c88bcd43ef9812d8963235f082bd2ad",
      "parents": [
        "bb815fa39bb9f8edf71264b45bb696a0ade7dafe"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 20:41:18 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 20:41:18 2026 -0400"
      },
      "message": "Allow Forge AWS deploys S3 ACL and delete on the EB bucket\n\nGitHub Actions UpdateEnvironment failed with s3:PutObjectAcl and\ns3:DeleteObject on elasticbeanstalk-\u003cregion\u003e-\u003caccount\u003e. Grant those\non the artifact bucket and the Elastic Beanstalk storage bucket.\n"
    },
    {
      "commit": "bb815fa39bb9f8edf71264b45bb696a0ade7dafe",
      "tree": "6aa12160592ab2ba3c1483f76a26b8d2a72ce160",
      "parents": [
        "24fdfcec227a1ae2642e54537bde58900b95ca1b"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 18:38:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 17:38:26 2026 -0500"
      },
      "message": "Use SLF4J for runtime diagnostics (#15993)\n\n* Use SLF4J for runtime diagnostics\n\nAssisted-by: opencode:gpt-5.6-sol\n\n* Fix import order and isolate user.home in runner spec\n\nAssisted-by: opencode:gpt-5.6-sol\n\n* Document and de-duplicate the multi-SLF4J-provider test classpath\n\nCopilot flagged that grails-shell-cli\u0027s test classpath carries both\nslf4j-simple and logback-classic simultaneously, which SLF4J 2.x treats\nas an ambiguous binding. Verified this is real: `dependencies\n--configuration testRuntimeClasspath` resolves both providers together,\nand neither can simply be dropped - slf4j-simple is needed at runtime\nfor the actual `grails` CLI executable\u0027s production logging, and\nlogback-classic is needed by the new Logback-appender-based forked\nregression specs (SpringApplicationRunnerSpec, GrailsCliSpec).\n\nConfirmed no current regression from this (full :grails-shell-cli:test\nrun is green, no \"multiple SLF4J providers\" warning appears in any test\noutput) because both new specs that need a specific provider already\npin it explicitly via -Dslf4j.provider\u003d... in their forked child\nprocess. This commit removes the now-fully-redundant duplicate\n`testImplementation \u0027org.slf4j:slf4j-simple\u0027` line (already pulled in\nvia the runtimeOnly dependency, so this doesn\u0027t change the resolved\nclasspath) and documents the coexistence so a future forked-process\nfixture doesn\u0027t skip the explicit pin and hit non-deterministic\nprovider selection.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix broken imports in SchemaExportCommandSpec after upstream CLI package move\n\nThe 8.0.x branch relocated ApplicationCommand/ExecutionContext and each\nSchemaExportCommand into a dedicated cli source set with new packages\n(grails.dev.commands.ExecutionContext -\u003e org.apache.grails.core.cli.\nExecutionContext, grails.plugin.hibernate.commands.SchemaExportCommand\n-\u003e org.apache.grails.data.hibernate{5,7}.cli.SchemaExportCommand) as\npart of unrelated work that landed after this PR\u0027s base commit.\n\nMerging origin/8.0.x picked this up cleanly via rename tracking for the\nproduction SchemaExportCommand.groovy files (already updated to the new\npackage on merge), but the two new SchemaExportCommandSpec.groovy test\nfiles added by this PR had no prior history for git to track the rename\nthrough, so they were merged in unchanged - still importing the old\nExecutionContext package and referencing SchemaExportCommand unqualified\n(previously fine only because the spec shared its production class\u0027s old\npackage). Both left compileTestGroovy failing after the merge. Fixed by\nimporting both classes from their new locations.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* test: record coverage for SLF4J diagnostics paths\n\nCodecov reported 13.88% patch coverage because the fixture specs verify\nthe new logging behavior in forked JVMs that JaCoCo never instruments.\nForward the test JVM\u0027s JaCoCo -javaagent argument into the forked\nprocesses so their execution data appends to the module exec file, and\nexercise the remaining ProfilingGrailsPluginManager configuration\nphases in-process with a probe plugin.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Walter Duque de Estrada \u003cwbduque@mac.com\u003e\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "24fdfcec227a1ae2642e54537bde58900b95ca1b",
      "tree": "4b1f554925f54e9966a9ef65dae77e91a6d46689",
      "parents": [
        "fc95f7890655b5cfcaeafe58b310301a6a22492a",
        "5469a7fcaa0e66e8281bc6a5fb4e59ceba4515f5"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:21:33 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 16:21:33 2026 -0400"
      },
      "message": "Merge pull request #16257 from apache/merge/7.2.x-into-8.0.x\n\nMerge 7.2.x Forge AWS docs into 8.0.x"
    },
    {
      "commit": "5469a7fcaa0e66e8281bc6a5fb4e59ceba4515f5",
      "tree": "4b1f554925f54e9966a9ef65dae77e91a6d46689",
      "parents": [
        "52da3494143496ca12016598f14871fa816d8a47"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:20:57 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:20:57 2026 -0400"
      },
      "message": "Allow Forge AWS deploys DescribeStackResource and S3 object ACL\n\nElastic Beanstalk UpdateEnvironment failed from GitHub Actions:\ncloudformation:DescribeStackResource and s3:GetObjectAcl.\n"
    },
    {
      "commit": "52da3494143496ca12016598f14871fa816d8a47",
      "tree": "c954c47013ee79e988cae6bed1c772dee323a4ca",
      "parents": [
        "fc95f7890655b5cfcaeafe58b310301a6a22492a",
        "e0c5cf17e756630042b1a4fdc1417e4dd198f3df"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:20:12 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:20:12 2026 -0400"
      },
      "message": "Merge branch \u00277.2.x\u0027 into 8.0.x\n"
    },
    {
      "commit": "e0c5cf17e756630042b1a4fdc1417e4dd198f3df",
      "tree": "b0dc10e6af244c9dec3ab29921199b705200f8c2",
      "parents": [
        "9d92ce129bf2d09ebed2ceb1f5333f87002faa9c",
        "ae4ed3c200f4956ee87fcefa070a843b7d51c553"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:16:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 16:16:49 2026 -0400"
      },
      "message": "Merge pull request #16256 from apache/merge/7.1.x-into-7.2.x\n\nMerge 7.1.x Forge AWS docs into 7.2.x"
    },
    {
      "commit": "ae4ed3c200f4956ee87fcefa070a843b7d51c553",
      "tree": "b0dc10e6af244c9dec3ab29921199b705200f8c2",
      "parents": [
        "e7b2b6875b76b2db4b2527566d7d8d8adecf558c",
        "8c1561988a1591f6379dd3884fd1e9bdf734d4c7"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:16:22 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:16:22 2026 -0400"
      },
      "message": "Merge branch \u00277.1.x\u0027 into 7.2.x\n"
    },
    {
      "commit": "e7b2b6875b76b2db4b2527566d7d8d8adecf558c",
      "tree": "91b1cc2288b97cf5b1069c20f88f5d9e010c4d9e",
      "parents": [
        "9d92ce129bf2d09ebed2ceb1f5333f87002faa9c",
        "d0aa6edbaedc76506ee500ab0d80e23b825d6886"
      ],
      "author": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:16:11 2026 -0400"
      },
      "committer": {
        "name": "James Fredley",
        "email": "jamesfredley@users.noreply.github.com",
        "time": "Fri Aug 28 16:16:11 2026 -0400"
      },
      "message": "Merge branch \u00277.1.x\u0027 into 7.2.x\n"
    }
  ],
  "next": "8c1561988a1591f6379dd3884fd1e9bdf734d4c7"
}
