)]}'
{
  "log": [
    {
      "commit": "5ebe419f3bffd4e451bcdf737dfe3d56871af821",
      "tree": "e463282db0d74d151654174769531b18a80c9692",
      "parents": [
        "7d325c2a5bfb61991020f46585ae78a34546527e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 28 07:15:33 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 28 07:15:33 2026 -0400"
      },
      "message": "Keep RandomStringUtils.random rejection cap from failing valid ranges\n(#1843)\n\nClarify RandomStringUtils rejection-cap assumptions and strengthen\ntests.\n\nDocument the independence, uniformity, and remaining-length assumptions\nbehind the probability bound. Add regression tests for sparse code-point\nranges, counter resets, and all four rejection paths.\n"
    },
    {
      "commit": "7d325c2a5bfb61991020f46585ae78a34546527e",
      "tree": "840aa551e50dec0f2052f7f950d8f44f56028ec8",
      "parents": [
        "a5d6c5ed8847b2b14dacf062b646f94d6cc61a10"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Wed Oct 28 16:26:59 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 06:56:59 2026 -0400"
      },
      "message": "Keep RandomStringUtils.random rejection cap from failing valid ranges (#1843)\n\nThe cap on consecutive rejected draws was Math.max(64, gap * 10), but each\ndraw takes gapBits random bits, so a valid range with sparse acceptable\nvalues accepts a draw with probability as low as 1 / 2^gapBits. With 63\nof 64 chars rejected by the letters filter, random(100, 0, 64, true,\nfalse, chars, rng) threw IllegalArgumentException in about 45% of calls.\n\nScale the cap with the sample space (64L \u003c\u003c gapBits) so a range with at\nleast one acceptable value exhausts it with probability below e^-64 per\ncharacter, while a range with none still throws."
    },
    {
      "commit": "a5d6c5ed8847b2b14dacf062b646f94d6cc61a10",
      "tree": "8c96229a33b51e4beca358448e5935af9d309df4",
      "parents": [
        "75086d398acd1e5c64340e7276d775fbc4d767f5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Oct 27 08:29:59 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Oct 27 08:29:59 2026 -0400"
      },
      "message": "Keep DateUtils.ceiling and round inside a DST overlap hour (#1842)\n\nExpand DateUtils DST overlap regression coverage.\n\nParameterize millisecond values around the rounding threshold and verify\nrounding to seconds. Add explicit-zone Calendar tests that check\nresults,\ntime zone preservation, and input immutability with UTC as the default.\n\nClarify the test Javadoc to describe avoiding unintended overlap shifts.\n"
    },
    {
      "commit": "75086d398acd1e5c64340e7276d775fbc4d767f5",
      "tree": "20b7546bf06f12ce28274e3f15b56105f44c82a4",
      "parents": [
        "a8e08aef142048a88be63d3a60848f822af406fd"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Tue Oct 27 17:54:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 08:24:41 2026 -0400"
      },
      "message": "keep DateUtils.ceiling and round inside a DST overlap hour (#1842)\n\nmodify() removes the fields below the target field in two ways: the\nLANG-59 block subtracts milliseconds, seconds and minutes from the epoch\ntime, but only when the value rounds down, and the field loop then clears\nwhatever is left with Calendar.set(). Calendar.set() recomputes the\ninstant from the wall-clock fields, and GregorianCalendar resolves a wall\ntime inside a DST fall-back overlap to standard time, so ceiling and\nround of an instant in the daylight pass of the repeated hour were moved\ninto the standard-time pass an hour later. Remove the three sub-hour\nfields arithmetically in the loop as well, so the instant keeps its\noffset; DATE and larger fields still use Calendar.set() for wall-clock\nsemantics, and truncate is unchanged."
    },
    {
      "commit": "a8e08aef142048a88be63d3a60848f822af406fd",
      "tree": "bb6dcf339dc7fd41a271a0743c35a22bbdd12106",
      "parents": [
        "34a3bd9b7d15f5aac5f30af1b5b1fd4dd9bbd7c3"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 26 11:03:08 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 26 11:03:08 2026 -0400"
      },
      "message": "Bump github/codeql-action from 4.39.0 to 4.39.1\n"
    },
    {
      "commit": "34a3bd9b7d15f5aac5f30af1b5b1fd4dd9bbd7c3",
      "tree": "9be2b9480e66afa84ac7d459e5b28b3c2113a006",
      "parents": [
        "dd87a5244d5ae3afff503dc8e85512df2b9ac9a0"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 14:05:30 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 14:05:30 2026 -0400"
      },
      "message": "Add optional FIFO fairness to TimedSemaphore (LANG-1790) (#1840)\n\nUpdate changes.xml, add due-to."
    },
    {
      "commit": "dd87a5244d5ae3afff503dc8e85512df2b9ac9a0",
      "tree": "10cd8c7217e4f14a0a11f378f60b6f2680ab29f7",
      "parents": [
        "e5f7f1b56776fb2f6a77fc3a64bc47f7e849a425"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 14:00:39 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 14:00:39 2026 -0400"
      },
      "message": "Add optional FIFO fairness to TimedSemaphore (LANG-1790) (#1840)\n\nBump POM version from 3.21.1 to 3.22.0"
    },
    {
      "commit": "e5f7f1b56776fb2f6a77fc3a64bc47f7e849a425",
      "tree": "65ebc71e7e6dc4d89c2a56ba38731d7a029372eb",
      "parents": [
        "8876abff15187b992a540dbadb6ad38f5be0ec8a"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sun Oct 25 13:57:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 13:57:36 2026 -0400"
      },
      "message": "Add optional FIFO fairness to TimedSemaphore (LANG-1790) (#1840)\n\nAdd Builder.setFair(boolean) and queue blocking acquisitions in FIFO\norder\nwhen fairness is enabled. Preserve the default non-fair behavior and the\nexisting tryAcquire() API.\n\nKeep permit accounting synchronized, remove queued acquisitions on\ninterruption or shutdown, and allow new unlimited acquisitions to\nproceed\nwithout waiting. Share the wait-and-shutdown check between acquisition\npaths.\n\nDocument fairness guarantees and exceptions, and add regression coverage\nfor ordering, cancellation, limit changes, and builder reuse."
    },
    {
      "commit": "8876abff15187b992a540dbadb6ad38f5be0ec8a",
      "tree": "8c747798b83a4d8bea0f964273f0570344af6098",
      "parents": [
        "78c581d856e99c44a28fd60b054b2a3422de9a94"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 10:01:05 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 10:01:05 2026 -0400"
      },
      "message": "Refactor ExceptionUtils to share throwable search logic\n\nExtract a common search helper for indexOf() and throwableOf(),\npreserving null handling, starting indexes, and exact or subclass\nmatching. Simplify isChecked() by delegating to isUnchecked().\n"
    },
    {
      "commit": "78c581d856e99c44a28fd60b054b2a3422de9a94",
      "tree": "aedc5f3e7e4cc27730c024e79d0e45846fea121e",
      "parents": [
        "48532a6ed0e5995673a3181a8eb558058d027242"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:55:18 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:55:18 2026 -0400"
      },
      "message": "Deprecate ExceptionUtils.removeCommonFrames(), which is now used only.\nRoot-cause stack trace generation compares StackTraceElement objects\ndirectly."
    },
    {
      "commit": "48532a6ed0e5995673a3181a8eb558058d027242",
      "tree": "ce4903edc2df2bff3ba2f820977aca877e0cddea",
      "parents": [
        "57bd7dd094fd855f2ab3c969170933bbd7bafa2d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:45:36 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:45:36 2026 -0400"
      },
      "message": "Clarify LocaleUtils ASCII validation following #1838\n\nDocument ASCII language, country, and numeric area code requirements and\nnote that previously accepted non-ASCII codes now throw\nIllegalArgumentException. Expand regression coverage for non-ASCII\nparsing and cache exclusion.\n"
    },
    {
      "commit": "57bd7dd094fd855f2ab3c969170933bbd7bafa2d",
      "tree": "6916dba2da51ed9f2989a043cbbca5ea8e6a955e",
      "parents": [
        "ac026ed6e8892ae7ad93514cdbb47b8c2e3ad799"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Sun Oct 25 19:10:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 09:40:47 2026 -0400"
      },
      "message": "Keep LocaleUtils.toLocale to ASCII language and country codes (#1838)\n\n* keep LocaleUtils.toLocale to ASCII language and country codes\n\ntoLocale(String) documents strict validation, but its language, country\nand area-code checks used StringUtils.isAllLowerCase, isAllUpperCase,\nisNumeric and Character.isUpperCase, which accept any Unicode letter or\ndecimal digit. java.util.Locale defines these codes as [a-zA-Z]{2,8},\n[a-zA-Z]{2} and [0-9]{3}, so fullwidth letters, Latin-1 letters and\nArabic-Indic digits were turned into an ill-formed Locale instead of\nan IllegalArgumentException.\n\nCheck those characters against the ASCII ranges. Variants are unchanged.\n\n* Use a parameterized test for LocaleUtils non-ASCII codes"
    },
    {
      "commit": "ac026ed6e8892ae7ad93514cdbb47b8c2e3ad799",
      "tree": "665e0fe4fe9aafc06976311f7d1acd958c6ae783",
      "parents": [
        "19a58f50758239a613afbceca8a308648ecf2d55"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:35:31 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:35:31 2026 -0400"
      },
      "message": "Use structured stack frames for compact root cause traces\n\nUse StackTraceElement objects to build compact root cause stack traces,\navoiding text parsing and preventing exception message text from being\nmistaken for stack frames.\n\nRewrite ExceptionUtils.getRootCauseStackTraceList(Throwable) to read\nStackTraceElement arrays directly from Throwable.getStackTrace().\nCompare\nelements to remove each cause\u0027s shared trailing frames, then format only\nthe retained frames.\n\nThis avoids repeatedly printing and parsing complete exception traces.\nFrame-shaped exception message text can no longer be mistaken for frames\nor suppress real frames. Structured comparisons also preserve distinct\nframes whose string representations happen to match.\n\nPreserve root-cause-first ordering, wrapped exception markers, and all\npublic and protected signatures. Exception messages remain in headers,\nbut custom printStackTrace() output is no longer used.\n\nRemove the unused getStackFrameList(Throwable) parser and its tests.\nUpdate the related Javadoc to describe structured frame extraction.\n\nMain methods removed (private):\n\n- ExceptionUtils.getStackFrameList(Throwable)\n- ExceptionUtils.isStackFrame(String)\n\nTest methods removed:\n\n- ExceptionUtilsTest.testGetStackFrameListAcceptsAllRealFrameShapes()\n- ExceptionUtilsTest.testGetStackFrameListRejectsForgedMessageLines()"
    },
    {
      "commit": "19a58f50758239a613afbceca8a308648ecf2d55",
      "tree": "c3c00075c20d47f54ee26b9fcfc5e0d47ba85c21",
      "parents": [
        "0f76857f50615046721a883b5c2062a4e0030859"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:10:45 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:10:45 2026 -0400"
      },
      "message": "Simplify ExceptionUtils.getRootCauseStackTraceList(Throwable)\n\nSimplify root cause stack trace formatting.\n\nExtract the throwable string and use a conditional expression to add the\nwrapped marker, preserving existing behavior.\n"
    },
    {
      "commit": "0f76857f50615046721a883b5c2062a4e0030859",
      "tree": "e3124154764e25ede12d8878213d00bf0046a2ec",
      "parents": [
        "4060e60f45338ff337a145bd55bf1541353d8e3d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:02:36 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 09:02:36 2026 -0400"
      },
      "message": "Clarify ExceptionUtils common-frame removal and strengthen regression\ncoverage\n\nDocument shared-suffix matching, list mutation, and the distinction from\nJDK frame comparison. Add coverage for an immediate mismatch and verify\nthat wrapper frames remain unchanged.\n"
    },
    {
      "commit": "4060e60f45338ff337a145bd55bf1541353d8e3d",
      "tree": "d89f3718c35f26f93836079c6f0717ae7a9d8e23",
      "parents": [
        "235d07fd4a7259691248ecb61eea2d7eb89dbe37"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Sun Oct 25 18:22:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 08:52:27 2026 -0400"
      },
      "message": "Stop ExceptionUtils.removeCommonFrames at the first differing frame (#1831)\n\nCommon frames are the trailing run shared by the cause and wrapper\ntraces, as folded by Throwable.printStackTrace into \"... n more\".\nremoveCommonFrames kept comparing past the first mismatch and removed\nany frame that matched again at the same offset, so the root-cause\ntrace printed by getRootCauseStackTrace lost real frames, including\nthe frame where the cause was created when a shared factory method\nbuilds both exceptions."
    },
    {
      "commit": "235d07fd4a7259691248ecb61eea2d7eb89dbe37",
      "tree": "2fe04648d88b7296395b0ddc68a6e877f4388476",
      "parents": [
        "eadb17a23fec55115c830dd3f164ad463c2b8678"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 08:08:54 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 25 08:08:54 2026 -0400"
      },
      "message": "[javadoc] Correct StringUtils example methods and overloads (#1836)\n"
    },
    {
      "commit": "eadb17a23fec55115c830dd3f164ad463c2b8678",
      "tree": "04c67b5b15125e3de5f9c88bc6c542fe6e870ad9",
      "parents": [
        "4b1d8cb83c263ce7446fe573e7150042722a6044"
      ],
      "author": {
        "name": "AMin",
        "email": "imx.amin@gmail.com",
        "time": "Sun Oct 25 20:06:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 08:06:19 2026 -0400"
      },
      "message": "[javadoc] Correct StringUtils example methods and overloads (#1836)\n\nUse containsAnyIgnoreCase in its own examples, explicit arrays for single substring searches, and char literals for char parameters. Remove null-character guidance from the primitive char overload.\r\n\r\nGenerated-by: OpenAI Codex"
    },
    {
      "commit": "4b1d8cb83c263ce7446fe573e7150042722a6044",
      "tree": "b9b7babb6ae99f930a5b41eee488776d18d0573d",
      "parents": [
        "5124cca79e52b7e369d695d045a376de38c54875"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 13:29:36 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 13:29:36 2026 -0400"
      },
      "message": "Keep StrSubstitutor from treating a value\u0027s trailing $ as an escape\n(#1834)\n\nTests and Javadoc"
    },
    {
      "commit": "5124cca79e52b7e369d695d045a376de38c54875",
      "tree": "812f8bd7541af1512328861758c80f4a9b57f2e0",
      "parents": [
        "f4bdd4e1d2c99cdab12e5177989fc11e1add33d5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 13:27:11 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 13:27:11 2026 -0400"
      },
      "message": "Fix FastDateParser normalization of out-of-range ISO day-of-week values\n(#1839)\n"
    },
    {
      "commit": "f4bdd4e1d2c99cdab12e5177989fc11e1add33d5",
      "tree": "0adabd64d8c542e134224e062df0926efb91ee8e",
      "parents": [
        "390fe4027e331a77bc126d647fee3287c13827a6"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sat Oct 24 13:25:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 13:25:51 2026 -0400"
      },
      "message": "Fix FastDateParser normalization of out-of-range ISO day-of-week values (#1839)\n\nMatch SimpleDateFormat\u0027s lenient handling of week-year and calendar-year\npatterns. Reject zero for strict week-date parsing and add parameterized\nregression coverage."
    },
    {
      "commit": "390fe4027e331a77bc126d647fee3287c13827a6",
      "tree": "6d0d9199343de64082123747da914aa0c94856c3",
      "parents": [
        "cb3a20eafad7baf2d206bb1083e134c22021a574"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 08:29:50 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 08:29:50 2026 -0400"
      },
      "message": "Keep StrSubstitutor from treating a value\u0027s trailing $ as an escape\n(#1834)\n\nExpand StrSubstitutor escape boundary regression coverage.\n\nFollow up to PR #1834 with tests for preserved escapes, custom\ndelimiters,\ndefault and empty values, recursive substitutions, and nested variable\nnames. Clarify escape behavior in the class Javadoc.\n"
    },
    {
      "commit": "cb3a20eafad7baf2d206bb1083e134c22021a574",
      "tree": "275c14627bfcf63784e9496518d983b416e206dd",
      "parents": [
        "8d92fa6421e5446ff831f0f77975e2d05d8ae17c"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Sat Oct 24 17:52:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 08:22:47 2026 -0400"
      },
      "message": "keep StrSubstitutor from treating a value\u0027s trailing $ as an escape (#1834)\n\nAfter a variable is replaced, substituteRecursive resumes scanning at\nthe end of the inserted value, and the escape check looks at the char\nbefore the next prefix bounded only by the scan offset. A value ending\nin the escape char therefore escaped the variable that follows it in\nthe template: the value lost its last char and the next variable was\nleft unresolved, e.g. price\u003d5$ makes \"${price}${x}\" return \"5${x}\"\ninstead of \"5$X\".\n\nOnly accept an escape char at or after the end of the last\nsubstitution."
    },
    {
      "commit": "8d92fa6421e5446ff831f0f77975e2d05d8ae17c",
      "tree": "ab1372bdc3d5669ba8f2541361fb9ddf394d31e1",
      "parents": [
        "4bfbfeabe548f8e3aa4cc928b51f71939e6eb773"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 08:09:49 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 24 08:09:49 2026 -0400"
      },
      "message": "Reject leading whitespace in NumberUtils.createNumber (#1833)\n\nSimplify NumberUtils.createNumber empty-input validation.\n\nFollow up to #1833. Replace the redundant blank check with an\nempty-string\ncheck now that leading ASCII whitespace and control characters are\nrejected explicitly.\n\nAdd tests for empty and Unicode-whitespace inputs and all leading\ncharacters from U+0000 through U+0020 across numeric formats.\n"
    },
    {
      "commit": "4bfbfeabe548f8e3aa4cc928b51f71939e6eb773",
      "tree": "c7078dd5a1f95be88a90aa26f98112d883cc721f",
      "parents": [
        "b9b30efb01e861a16503232bb96b684107e73199"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Sat Oct 24 17:34:15 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 08:04:15 2026 -0400"
      },
      "message": "Reject leading whitespace in NumberUtils.createNumber (#1833)\n\ncreateNumber documents that it does not trim its input and that a\nstring with leading or trailing spaces throws NumberFormatException.\nThe integral paths honour this through Integer.decode, Long.decode and\nBigInteger, but input with a decimal point, an exponent or an f/F/d/D\nsuffix is handed to Float.valueOf and Double.valueOf, which strip\nleading characters up to U+0020 as if by String.trim(). So\ncreateNumber(\" 1.5\") returned 1.5 and isCreatable(\" 1.5d\") returned\ntrue while createNumber(\" 1111\") threw as documented.\n\nReject a leading character at or below U+0020 before any delegate is\nreached, so the decimal paths match the integral paths and the Javadoc.\nTrailing whitespace already fails through the type suffix check."
    },
    {
      "commit": "b9b30efb01e861a16503232bb96b684107e73199",
      "tree": "8abd8c3daf8fa53881957d27f929331baf9643e7",
      "parents": [
        "567bcda3de4d8768a2dc1e3ffc567b5879a9a74f"
      ],
      "author": {
        "name": "Sharang Gupta",
        "email": "sharang@sharanggupta.dev",
        "time": "Thu Oct 22 03:07:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 22:07:03 2026 -0400"
      },
      "message": "Rename ReflectionToStringBuilderOverrideExclude so Surefire runs it (#1830)\n\nThe test class name did not end in \"Test\", so it did not match the\nSurefire include pattern and its three tests never ran in the build.\nRename it to ReflectionToStringBuilderOverrideExcludeTest, matching the\nother ReflectionToStringBuilder*Test classes in the package."
    },
    {
      "commit": "567bcda3de4d8768a2dc1e3ffc567b5879a9a74f",
      "tree": "d033f41992f2d48c2edf7ee1cf5b83dded7cfb3e",
      "parents": [
        "09a5310be6a5b9531e94b585cd251bd279ad2eb7"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 21 15:23:49 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 21 15:23:49 2026 -0400"
      },
      "message": "Bump ossf/scorecard-action from 2.4.4 to 2.5.0\n"
    },
    {
      "commit": "09a5310be6a5b9531e94b585cd251bd279ad2eb7",
      "tree": "552685dc20817d4434c175a979593cde55ea1cce",
      "parents": [
        "fbd512f7ef16d4c2c60f92eed8d0dc204271dd58"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Oct 20 20:12:37 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Oct 20 20:12:37 2026 -0400"
      },
      "message": "Bump github/codeql-action from 4.38.3 to 4.39.0\n"
    },
    {
      "commit": "fbd512f7ef16d4c2c60f92eed8d0dc204271dd58",
      "tree": "706028f0bd81c6e13b7c98e16775f8c3a2d15955",
      "parents": [
        "d215e7fec92fcd4e89f5c834e34636ce7cc37f1e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Oct 20 17:47:40 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Oct 20 17:47:40 2026 -0400"
      },
      "message": "keep array encoding intact in ClassUtils.getAbbreviatedName (#1829)\n"
    },
    {
      "commit": "d215e7fec92fcd4e89f5c834e34636ce7cc37f1e",
      "tree": "5ccecc9dffd3cebc1d657ecbf625cb037bf7701c",
      "parents": [
        "2341c9cd7ed4b7f2e841e165b6077d1aa7a61b17"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Wed Oct 21 03:15:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 17:45:39 2026 -0400"
      },
      "message": "keep array encoding intact in ClassUtils.getAbbreviatedName (#1829)\n\ngetAbbreviatedName(Class, int) abbreviates Class.getName(), and for an\narray class the first \u0027.\u0027 segment carries the JVM array encoding, so\n\"[Ljava\" was shortened to \"[\" and the \u0027L\u0027 marker was lost:\nString[].class and String[][].class both abbreviated to \"[.l.String;\".\n\nKeep the leading [...[L prefix and trailing \u0027;\u0027 and abbreviate only the\nelement class name, the same encoding getPackageName(String) strips."
    },
    {
      "commit": "2341c9cd7ed4b7f2e841e165b6077d1aa7a61b17",
      "tree": "fef54fbde378958978176d2b7f7a4e1041655aca",
      "parents": [
        "acfa8b01f3335d8d71e48d5e3a7b6f32a3b114e3"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 19:00:38 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 19:00:38 2026 -0400"
      },
      "message": "Strengthen TypeUtils hash code regression coverage\n\nAdd upper-bounded wildcard cases for List\u003c? extends Number\u003e and\nList\u003c? extends T[]\u003e to the JDK hash interoperability tests. Compare\nthe generic array hash directly with its reflected JDK counterpart.\n"
    },
    {
      "commit": "acfa8b01f3335d8d71e48d5e3a7b6f32a3b114e3",
      "tree": "f3296a43aa606695d18c8bb0a3d17f8bc90f5052",
      "parents": [
        "a178159ec7a03dd05b60bf52b74c306be6dd6ac6"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 18:45:51 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 18:45:51 2026 -0400"
      },
      "message": "Remove extra layer of assertAll()\n"
    },
    {
      "commit": "a178159ec7a03dd05b60bf52b74c306be6dd6ac6",
      "tree": "8c6bf9f0b108d50e062f0d8a2f6f373a4bc7d82c",
      "parents": [
        "d626464952b57e665a83bf556cd0f0e7fd9983fb"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 18:31:39 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 18:31:39 2026 -0400"
      },
      "message": "[LANG-1323] Align built type hashes with JDK reflection (#1826)"
    },
    {
      "commit": "d626464952b57e665a83bf556cd0f0e7fd9983fb",
      "tree": "a66fb4f24a1eac78f67c8049b7b05e8933cc66ea",
      "parents": [
        "dba5d341792505fbe25c36dd4d0532a19caf2764"
      ],
      "author": {
        "name": "agamal026",
        "email": "agamal026@gmail.com",
        "time": "Tue Oct 20 00:29:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 18:29:42 2026 -0400"
      },
      "message": "[LANG-1323] Align built type hashes with JDK reflection (#1826)\n\n* [LANG-1323] Add reflection type hash interoperability regressions\n\nCompare built parameterized and generic array types with JDK reflection,\nincluding nested arguments and owner types. Exercise symmetric equality,\nhash equality, and HashMap/HashSet lookup in both directions.\n\nGenerated-by: OpenAI ChatGPT (GPT-6 Astra)\n\n* [LANG-1323] Align built type hashes with JDK reflection\n\nUse the component type hash for generic arrays and combine the argument,\nowner and raw type hashes for parameterized types. Equal built and JDK\nreflection types can then be used interchangeably as hash collection keys.\n\nThe 14 new regressions failed against unchanged production and pass with\nthis fix. The complete TypeUtilsTest run reports 510 tests, zero failures\nor errors, and one existing disabled test. Preserve the wildcard changes\nfrom #1807; this completes the two separate type kinds identified there.\n\nGenerated-by: OpenAI ChatGPT (GPT-6 Astra)"
    },
    {
      "commit": "dba5d341792505fbe25c36dd4d0532a19caf2764",
      "tree": "e2552bf74fc97d41c4898f9aea2ec867c09b7c09",
      "parents": [
        "5dede14ab1e385b6d972b8bcb4f1f0f941e59db2"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 16:37:21 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 19 16:37:21 2026 -0400"
      },
      "message": "Add reflection varargs boundary tests\n\nVerify that methods with two fixed parameters reject calls supplying\nonly one argument. Cover successful method and constructor invocation\nwith an empty varargs tail.\n"
    },
    {
      "commit": "5dede14ab1e385b6d972b8bcb4f1f0f941e59db2",
      "tree": "e83827b038d8ec7d74abb046ecf51157f6d29f84",
      "parents": [
        "45c80d99559017ea6efcb5db6156bb9a5c850d34"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Tue Oct 20 02:00:08 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 16:30:08 2026 -0400"
      },
      "message": "reject varargs candidates with too few arguments in MemberUtils (#1828)\n\nisMatchingExecutable accepted a varargs method or constructor without\nchecking that enough arguments were supplied for its fixed parameters,\nso getMatchingAccessibleMethod and getMatchingAccessibleConstructor\nreturned inapplicable members and invokeMethod, invokeStaticMethod and\ninvokeConstructor failed with ArrayIndexOutOfBoundsException from\ntoVarArgs instead of NoSuchMethodException."
    },
    {
      "commit": "45c80d99559017ea6efcb5db6156bb9a5c850d34",
      "tree": "106e7d0cdec3408106c03e0a81cdb72675599fca",
      "parents": [
        "9bf62e20594f049195d1eed167decec6dca42f3d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 18 18:33:12 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 18 18:33:12 2026 -0400"
      },
      "message": "Keep EventCountCircuitBreaker event count from wrapping on int overflow\n(#1825)\n\nPrevent EventCountCircuitBreaker counter overflow\n\nSaturate the event count at Long.MAX_VALUE so rollover cannot cause an\nopen circuit breaker to close after an overloaded interval. Document\nsaturation and counter resets.\n\nAdd tests for long overflow boundaries, repeated increments after\nsaturation, recovery after a quiet interval, and Integer.MAX_VALUE as\nthe opening threshold.\n"
    },
    {
      "commit": "9bf62e20594f049195d1eed167decec6dca42f3d",
      "tree": "b113ae4f1368b76a8eabb4e690f600f6878c7f94",
      "parents": [
        "c89cdf682fe21b0c39759cf58186ed5336a105d4"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Mon Oct 19 03:51:50 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 18:21:50 2026 -0400"
      },
      "message": "keep EventCountCircuitBreaker event count from wrapping on int overflow (#1825)\n\nCheckIntervalData.increment summed the increments of a check interval in\nint arithmetic. incrementAndCheckState(Integer) accepts any non-negative\nincrement, so once one interval\u0027s events pass Integer.MAX_VALUE the\ncount wraps negative: a closed breaker then never opens, and an open\nbreaker sees a count below the closing threshold and closes at the next\ninterval. Widen the private counter to long; thresholds stay int."
    },
    {
      "commit": "c89cdf682fe21b0c39759cf58186ed5336a105d4",
      "tree": "c98b73b6efd6659368dc76839190856928cb68ce",
      "parents": [
        "8b126aa9c30c16ea05ddcc79d9851ae3d64fb4fe"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 15:54:14 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 15:54:14 2026 -0400"
      },
      "message": "Bump actions/setup-java from 6.0.1 to 6.1.0\n"
    },
    {
      "commit": "8b126aa9c30c16ea05ddcc79d9851ae3d64fb4fe",
      "tree": "4d3e7784c6d55897b244e2c95ad800e90367a88c",
      "parents": [
        "af4b2a2ac010ae29ef3e219c5d5c7c26b7dd5acd"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 15:15:07 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 15:15:07 2026 -0400"
      },
      "message": "Fix resource paths for unnamed packages (#1824)\n"
    },
    {
      "commit": "af4b2a2ac010ae29ef3e219c5d5c7c26b7dd5acd",
      "tree": "ea17adc964f599ce4aed10534f38f6cca88c2c45",
      "parents": [
        "e985f2eec421adac19fbf070734cee0a1348d61f"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 15:06:39 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 15:06:39 2026 -0400"
      },
      "message": "Clarify ClassPathUtils unnamed-package behavior and expand tests\n\nDocument unchanged resource names for unnamed packages and exception\ncases\nfor class contexts. Add coverage for empty and null resource names,\nvoid,\nprimitive arrays, and unnamed-package arrays.\n"
    },
    {
      "commit": "e985f2eec421adac19fbf070734cee0a1348d61f",
      "tree": "c6293ca1941954821a28cf53a00ed449ee77a392",
      "parents": [
        "199a4d450d7630aaf1252e84dfc530b1c5b6a392"
      ],
      "author": {
        "name": "Aryan R. Ganjoo",
        "email": "51299383+AryanRG@users.noreply.github.com",
        "time": "Sun Oct 18 00:34:10 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 15:04:10 2026 -0400"
      },
      "message": "[LANG-1838] Fix resource paths for unnamed packages (#1824)\n\nReturn the unprefixed resource name for an empty Package name, and handle Java 8 unnamed-package classes whose getPackage() is null. Add focused regressions for class and Package overloads while retaining named-package and null behavior.\n\nAI-Assisted-by: OpenAI Codex"
    },
    {
      "commit": "199a4d450d7630aaf1252e84dfc530b1c5b6a392",
      "tree": "33bde878aa5e780b658a90e1d8c31efe84238b9e",
      "parents": [
        "a2c5760fbe545ffcf3046a87abc41ab2d70bfda1"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 14:58:23 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 17 14:58:23 2026 -0400"
      },
      "message": "Bump org.apache.commons:commons-parent from 105 to 106\n"
    },
    {
      "commit": "a2c5760fbe545ffcf3046a87abc41ab2d70bfda1",
      "tree": "a0d5c83408848226cbd8db5b4524b4859305bed3",
      "parents": [
        "9c86ffe308e7c682df3b1cf76f27dfc5bb6a2243"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sat Oct 17 14:57:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 14:57:10 2026 -0400"
      },
      "message": "Bump Apache Commons Parent from 105 to 106 (#1823)\n\n* Bump Apache Commons Parent from 105 to 106\n\n* Suppress false-positive SpotBugs warnings in FastDateParser\n\nStrategyParser is created locally within init(Calendar), consumed\nsynchronously, and never escapes that invocation. Its currentIdx field\nis therefore confined to the initializing thread, including when init()\nis called during deserialization.\n\nAdd a SpotBugs exclusion restricted to StrategyParser.currentIdx for\nAT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE and\nAT_STALE_THREAD_WRITE_OF_PRIMITIVE. This addresses all three reported\nwarnings without changing runtime behavior or adding unnecessary\nsynchronization.\n\nDocument the helper\u0027s confinement in its class Javadoc to explain why\nthe mutable cursor requires no cross-thread coordination."
    },
    {
      "commit": "9c86ffe308e7c682df3b1cf76f27dfc5bb6a2243",
      "tree": "b0b20dd32b912b3d4242c060740ab5070a0e1249",
      "parents": [
        "ab1656ca3f0e87c64e766880cef493b1dd7f5cf4"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 17:19:23 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 17:19:23 2026 -0400"
      },
      "message": "Clarify StringUtils.normalizeSpace contract and preserve NBSP handling\n\nDocument XPath normalize-space as the inspiration rather than an exact\nbehavioral contract. Explain Character.isWhitespace semantics, explicit\nU+00A0 conversion, preservation of other non-breaking spaces, and final\ntrimming. Clarify that adjacent converted NBSPs are not collapsed.\n\nThe method was introduced for LANG-640 in commit 823f2603a. LANG-910\nadded NBSP support to the regex implementation in f9b486a17, released\nin Commons Lang 3.2. LANG-1020 introduced the current manual whitespace\nnormalization and per-character NBSP conversion in bc8e23808 (PR #27).\nLANG-1226 restored final trimming in 7e85d1cf5 (PR #150).\n\nPR #1809 proposes removing NBSP conversion. Preserve the established\nbehavior here and resolve its mismatch with the old Javadoc explicitly.\nAdd regression tests for standalone, boundary, repeated, and mixed\nNBSPs, other non-breaking spaces, and Unicode whitespace.\n\nValidation: three focused tests passed; Javadoc generation with full\ndoclint and git diff --check passed.\n\nReferences:\nhttps://issues.apache.org/jira/browse/LANG-640\nhttps://issues.apache.org/jira/browse/LANG-910\nhttps://issues.apache.org/jira/browse/LANG-1020\nhttps://issues.apache.org/jira/browse/LANG-1226\nhttps://github.com/apache/commons-lang/pull/27\nhttps://github.com/apache/commons-lang/pull/150\nhttps://github.com/apache/commons-lang/pull/1809\n"
    },
    {
      "commit": "ab1656ca3f0e87c64e766880cef493b1dd7f5cf4",
      "tree": "42bdb49a48664d0e0c5467348c0db4ca67869b84",
      "parents": [
        "aafbf0c2aca057f37ec0783eefe002cd4587dc7f"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 15:43:48 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 15:43:48 2026 -0400"
      },
      "message": "[LANG-796] Clarify DateUtils calendar arithmetic and daylight saving\ntime behavior\n\nUpdate due-to in changes.xml\n"
    },
    {
      "commit": "aafbf0c2aca057f37ec0783eefe002cd4587dc7f",
      "tree": "6d21b9851668e7eff7180d010c77ad2214b49574",
      "parents": [
        "d97a916dedd5063b1320b34201ba41adb7281572"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 15:42:47 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 15:42:47 2026 -0400"
      },
      "message": "[LANG-796] Clarify DateUtils calendar arithmetic and daylight saving\ntime behavior\n\nUpdate due-to in changes.xml\n"
    },
    {
      "commit": "d97a916dedd5063b1320b34201ba41adb7281572",
      "tree": "f91de7f8aac96d7623ad20a490f0cca122b63188",
      "parents": [
        "4276f1ff387b2e05ef6e8c78e64868dd0621f2d6"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 15:38:11 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 15:38:11 2026 -0400"
      },
      "message": "[LANG-441] DateUtils Javadoc does not fully define round() behavior\n\nDocument minute, hour, month, year, and SEMI_MONTH thresholds, and link\nthe other overloads to the shared explanation. Document the exception\nfor unsupported fields."
    },
    {
      "commit": "4276f1ff387b2e05ef6e8c78e64868dd0621f2d6",
      "tree": "c6e6fc087d36dd3d5fc2251caeabba8f641b0209",
      "parents": [
        "d3975eccc4df04c67a4da23d4e1881e940c9389c"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:47:53 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:47:53 2026 -0400"
      },
      "message": "Prevent StringUtils padding from splitting surrogate pairs\n\nAdjust leftPad and rightPad padding boundaries to preserve surrogate\npairs,\nalso protecting center through delegation. Document the possible\none-char\nshortfall and use Unicode escapes in Javadoc examples.\n\nAdd tests for mixed padding, repeated patterns, centering, output\nlengths,\nand surrogate validity.\n\nApplied PR #1813 locally and implemented the follow-up changes:\n\n- Replaced Javadoc emoji literals with Unicode escapes.\n- Narrowed the Javadoc guarantee to avoiding newly split surrogate\npairs.\n- Added exact-output tests for mixed padding and centering.\n- Added length and input-preservation assertions.\n"
    },
    {
      "commit": "d3975eccc4df04c67a4da23d4e1881e940c9389c",
      "tree": "4e875861b0390ef641010eb7d46cd084ec42372c",
      "parents": [
        "5b3a81dcd5e4c8bcee87b5bb07f4c0672be48545"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:33:47 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:33:47 2026 -0400"
      },
      "message": "Treat an unmatched quote as closed in ExtendedMessageFormat (#1819)"
    },
    {
      "commit": "5b3a81dcd5e4c8bcee87b5bb07f4c0672be48545",
      "tree": "d10f8ce095195bebb101209d0565ab011a861969",
      "parents": [
        "fea9a785363ccb96f2afd8c399b205c8f04b27f0"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:29:52 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:29:52 2026 -0400"
      },
      "message": "Fix unmatched-quote handling in ExtendedMessageFormat\n\nThis is PR 1819 plus more work.\n\nTreat an unmatched single quote as closed at the end of the pattern,\nmatching MessageFormat and ExtendedMessageFormat without a registry.\nPreviously, supplying a non-null registry caused these patterns to\nthrow IllegalArgumentException.\n\nDocument quoting semantics in the class Javadoc, including doubled\nsingle quotes and literal format elements within quoted text. Clarify\nthat implicit quote closure does not close an unfinished format element.\n\nAdd regression coverage for unmatched and trailing quotes, custom\nformats, empty-registry parity with MessageFormat, and toPattern()\nround-tripping. Verify that unmatched quotes inside unfinished format\ndescriptions still cause IllegalArgumentException.\n"
    },
    {
      "commit": "fea9a785363ccb96f2afd8c399b205c8f04b27f0",
      "tree": "04359ecb919d0a340594ef45182a87ff5bbc5154",
      "parents": [
        "72dc55518577bdb18fc275188ee1204c94856fd4"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:13:57 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:13:57 2026 -0400"
      },
      "message": "[LANG-796] Clarify DateUtils calendar arithmetic and daylight saving\ntime behavior\n\nDocument calendar-based day, week, month, and year addition versus\nelapsed-time hour, minute, second, and millisecond addition.\n\nTest forward and backward day addition and 24-hour addition across both\nDST transitions. Preserve null-time-zone coverage and the active default\ntime zone during test setup.\n"
    },
    {
      "commit": "72dc55518577bdb18fc275188ee1204c94856fd4",
      "tree": "d97d10df2d2e53c8b8dd7166458b1b9e646d1959",
      "parents": [
        "ed29e9e2d76a7cc5cffc95ef45d8b10b6b665964"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:09:15 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 16 10:09:15 2026 -0400"
      },
      "message": "Organize imports\n"
    },
    {
      "commit": "ed29e9e2d76a7cc5cffc95ef45d8b10b6b665964",
      "tree": "ada227496b954f55386be4767c8441c040e07c76",
      "parents": [
        "0e22d821691c532c136698b5b19a6148b056f335"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 19:25:09 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 19:25:09 2026 -0400"
      },
      "message": "Expand JSON_STYLE CharSequence test coverage and documentation\n\nCover map values, object-array elements, and CharBuffer values. Verify\nescaping of quotes, backslashes, and control characters in ordinary\ntext. Document that CharSequence values are quoted and escaped even when\nthey resemble JSON objects or arrays.\n"
    },
    {
      "commit": "0e22d821691c532c136698b5b19a6148b056f335",
      "tree": "39d1440a1f9f27b07949d97d911864075e9c5119",
      "parents": [
        "1c1a7982206c915d3470e89af2366e34c1b21d23"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 19:20:55 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 19:20:55 2026 -0400"
      },
      "message": "Escape CharSequence values in ToStringStyle.JSON_STYLE (#1821)\n"
    },
    {
      "commit": "1c1a7982206c915d3470e89af2366e34c1b21d23",
      "tree": "443ac4d93c09ad71127008b6ead7af88d1f14f82",
      "parents": [
        "4c87656ee569063e44d9368ee6f7814a0c0a2d43"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Fri Oct 16 04:49:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 19:19:47 2026 -0400"
      },
      "message": "Escape CharSequence values in ToStringStyle.JSON_STYLE (#1821)\n\nJsonToStringStyle.appendDetail(StringBuffer, String, Object) quotes and\nescapes only String and Character values. Any other value whose\ntoString() is wrapped in {} or [] is appended raw, which is meant for\nnested objects that already render as JSON. A StringBuilder or other\nnon-String CharSequence holding brace-wrapped text therefore went out\nunescaped and could inject keys into the output. Treat every\nCharSequence as a string value."
    },
    {
      "commit": "4c87656ee569063e44d9368ee6f7814a0c0a2d43",
      "tree": "a0b8f36ba21b9b55f257fbe092f878ffa404d817",
      "parents": [
        "eda6e2d51607c278b32b16e06be2585c28bc5e84"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 17:36:35 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 17:36:35 2026 -0400"
      },
      "message": "[LANG-1837] Prevent null returns from lazily initialized string caches\n\nApply the fix from PR #1811 to read each cache once into a local\nvariable in CharRange.toString(), Range.toString(), Fraction.toString(),\nand Fraction.toProperString(). This prevents a second unsynchronized\nread from observing null after the first read observed a cached value.\n\nImprove existing tests to verify reuse of the first returned string\nacross formatting branches. Add inline comments explaining the cache\nreuse assertions. These checks strengthen functional coverage but do\nnot deterministically reproduce the concurrency bug."
    },
    {
      "commit": "eda6e2d51607c278b32b16e06be2585c28bc5e84",
      "tree": "07301f1513a51e9a50d42267b9fb165254e7774c",
      "parents": [
        "8d428af792181866a8500febc3526dc13987bdba"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 16:01:09 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 16:01:09 2026 -0400"
      },
      "message": "Replace LockingVisitorsTest delays with synchronization checks\n\nVerify lock selection, exclusive access, concurrent readers, and lock\nrelease after successful and throwing callbacks. Cover all accept/apply\nmethods for factory-created and builder-created visitors.\n\nUse sequential cross-thread probes to avoid interference and latches to\ncoordinate readers. Retain timeouts only as hang guards.\n\nOn my PC, all 19 tests pass in 0.107 seconds."
    },
    {
      "commit": "8d428af792181866a8500febc3526dc13987bdba",
      "tree": "16562deb23949851242bb778d4de1cc2158ef4e2",
      "parents": [
        "110683aa672b874d7ccecc1b1e89baf7774dd3c4"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 15:45:53 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 15:45:53 2026 -0400"
      },
      "message": "Strengthen TypeUtils substitution tests and Javadoc\n\nClarify generic array substitution and return values in\nunrollVariables().\nAdd direct tests for inherited array arguments and wildcard bounds, plus\ncoverage for cyclic array assignments and self-referencing generic\narrays.\n"
    },
    {
      "commit": "110683aa672b874d7ccecc1b1e89baf7774dd3c4",
      "tree": "bc041f230c6d3c23b0b961e22640df30b2b26b14",
      "parents": [
        "3973dd3a5aaaee2a99f080d600d4eaed82bd2a22"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 15:42:22 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 15:42:22 2026 -0400"
      },
      "message": "Follow up: Fix TypeUtils.isAssignable rejecting Class\u003cX\u003e to Class\u003c?\u003e\nassignments\n(#1820)\n\nFix nested type substitution in TypeUtils assignability.\n\nSubstitute inherited generic array components and preserve external type\nvariables nested in wildcard bounds when traversing parent types. Remove\nthe redundant assignment-map snapshot and correct the Javadoc.\n\nAdd regression coverage for array substitution and upper and lower\nwildcard bounds.\n"
    },
    {
      "commit": "3973dd3a5aaaee2a99f080d600d4eaed82bd2a22",
      "tree": "bb6ec71ccb9f440c69a2af60c1d412ff6f8c1da8",
      "parents": [
        "99618eb840cf18d31413c4fdfad2e4503322fd70"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 15:31:14 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 15:31:14 2026 -0400"
      },
      "message": "Fix TypeUtils.isAssignable rejecting Class\u003cX\u003e to Class\u003c?\u003e assignments\n(#1820)\n"
    },
    {
      "commit": "99618eb840cf18d31413c4fdfad2e4503322fd70",
      "tree": "63d6015ab8a14ab30beb4ba7f99c18c1e3238870",
      "parents": [
        "66f93099008bfe6485164166e4c0d70e5dade96a"
      ],
      "author": {
        "name": "XenoAmess",
        "email": "xenoamess@gmail.com",
        "time": "Fri Oct 16 03:28:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:28:48 2026 -0400"
      },
      "message": "Fix TypeUtils.isAssignable rejecting Class\u003cX\u003e to Class\u003c?\u003e assignments (#1820)\n\n* Fix TypeUtils.isAssignable() rejecting Class\u003cX\u003e to Class\u003c?\u003e assignments (#1548 follow-up)\n\nThe Class-specialized check added for #1548 (LANG-1749) requires the type\nargument of java.lang.Class to match exactly, but it did not account for\nwildcard type arguments on the target side. As a result, assignments that\nthe Java compiler accepts are rejected:\n\n  Class\u003cInteger\u003e -\u003e Class\u003c?\u003e                javac: OK, TypeUtils: false\n  Class\u003cString\u003e  -\u003e Class\u003c? extends Object\u003e javac: OK, TypeUtils: false\n  Class\u003cList\u003cString\u003e\u003e -\u003e Class\u003c? extends Collection\u003c?\u003e\u003e: false\n\nWhen the target type argument is a wildcard, check that the subject type\nargument is contained by the wildcard instead of demanding equality. A raw\ngeneric class still does not satisfy a parameterized bound, since Class is\ninvariant and javac does not apply unchecked conversion to its type\nargument, keeping the #1548 cases (e.g. Class\u003cTestImpl\u003e to\nClass\u003c? extends TestIF\u003c?\u003e\u003e) rejected.\n\n* Handle source wildcards and type variables in Class assignability\n\nReuse wildcard containment checks to support upper and lower bounds, and preserve source type variables declared outside java.lang.Class. Limit the raw generic argument guard to parameterized upper bounds so legal lower-bound assignments remain accepted.\n\nAdd regression tests for these cases. All five new test methods fail with the original upstream Class check; the default mvn build passes with the fix.\n\n* [LANG-1749] Reject unchecked wildcard bounds in Class assignability\n\nPropagate a no-unchecked-conversion mode through wildcard bounds, generic\narray components, and parameterized supertypes. Reject raw ancestors and\npreserve external type variables while resolving parameterized parents.\nThis applies the same subtype checks to upper and lower wildcard bounds.\n\nReturn false when unrelated source type variables have no matching bound\ninstead of throwing IllegalStateException.\n\nAdd 39 compiler-checked Class wildcard assignment cases and a direct type\nvariable regression test. The original PR implementation produces 16\nassertion failures and 6 errors with the new tests."
    },
    {
      "commit": "66f93099008bfe6485164166e4c0d70e5dade96a",
      "tree": "13ccc632250f6db96ebbc2f5195a35c3efbbb072",
      "parents": [
        "83d7606c930fd58b7ad274cb57a322524269952e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:51:41 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:51:41 2026 -0400"
      },
      "message": "Use standalone month names for month-only patterns in FastDatePrinter\n(#1815)\n\nCreate CalendarUtils only when a rule needs standalone month names.\n\nClarify the month-only pattern Javadoc and expand regression coverage\nfor Java 8, numeric months, literals, and mixed month fields. Use a\nCartesian test for locale, pattern, and month combinations.\nValidated with the default Maven build and focused tests on Java 8\nand Java 21."
    },
    {
      "commit": "83d7606c930fd58b7ad274cb57a322524269952e",
      "tree": "72f37487b6fb8895824fe146dc24621ed14cf9b4",
      "parents": [
        "6b98966dd7d440b8b8690e5790ed8c2a1414b9c0"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:38:50 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:38:50 2026 -0400"
      },
      "message": "Use standalone month names for month-only patterns in FastDatePrinter\n(#1815)\n"
    },
    {
      "commit": "6b98966dd7d440b8b8690e5790ed8c2a1414b9c0",
      "tree": "0b80b7d8e6d5fede2910c2faffe27138d6fe9855",
      "parents": [
        "65f00d83ca2d1ad5743f838a58eab01a3630e498"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Fri Oct 16 00:07:52 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 14:37:52 2026 -0400"
      },
      "message": "Use standalone month names for month-only patterns in FastDatePrinter (#1815)\n\n* use standalone month names for month-only patterns in FastDatePrinter\n\n* hoist CalendarUtils lookup in parsePattern and read parsed month in GMT\n\n* Update month patterns in FastDatePrinterTest\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "65f00d83ca2d1ad5743f838a58eab01a3630e498",
      "tree": "468b63a67442f638ca849f77b9918781ad3338c3",
      "parents": [
        "3d9466af830777b38c388aed95766faecea6ba27"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:29:49 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:30:37 2026 -0400"
      },
      "message": "Keep RandomUtils\u0027s randomDouble() and randomFloat() below the exclusive\nupper bound (#1817)\n\nDocument RandomUtils boundary behavior and extend regression tests\n\nAdd deterministic float and double tests for exclusive upper bounds,\nsubnormal ranges, maximum finite values, and positive infinity.\nDocument equal-bound and infinite-upper-bound behavior, and tighten\nexisting maximum-range assertions to enforce exclusive bounds.\n"
    },
    {
      "commit": "3d9466af830777b38c388aed95766faecea6ba27",
      "tree": "9281806702e6cd6251ec07a53b86c121d212df85",
      "parents": [
        "98fb6efc58ea63eeba75cddc077db4c33b9a40ed"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:25:34 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 14:25:34 2026 -0400"
      },
      "message": "Keep RandomUtils\u0027s randomDouble() and randomFloat() below the exclusive\nupper bound (#1817)\n"
    },
    {
      "commit": "98fb6efc58ea63eeba75cddc077db4c33b9a40ed",
      "tree": "06ebbb43671df79023fdea91283eaec18d26c66b",
      "parents": [
        "3705d8217e5676b04c890a58ec3f2e1bf6b463f9"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Thu Oct 15 23:54:25 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 14:24:25 2026 -0400"
      },
      "message": "Keep RandomUtils\u0027s randomDouble() and randomFloat() below the exclusive upper bound (#1817)\n\n* keep randomDouble and randomFloat below the exclusive upper bound\n\n* Clarify comment on clamping behavior for nextDouble\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* Rename instance exclusive-bound tests and align the float clamp comment\n\n* Use a constant for the exclusive-bound test trial count\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "3705d8217e5676b04c890a58ec3f2e1bf6b463f9",
      "tree": "58f470454ab66718a2a40d1311ad354a50672a9f",
      "parents": [
        "266e472d85c2329b4df50a9f2e8ee2a390c27df9"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 09:32:37 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 09:32:37 2026 -0400"
      },
      "message": "Preserve enclosing context and member names in\nClassUtils.getShortClassName(Class)\n\nAdd tests\n"
    },
    {
      "commit": "266e472d85c2329b4df50a9f2e8ee2a390c27df9",
      "tree": "7e6c6fb7a45b573ee0d2f7c9043ff6d36fb2962c",
      "parents": [
        "e871e5b3052df0e6047180ff9c5d2e8d17e06c85"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 09:29:31 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 09:29:31 2026 -0400"
      },
      "message": "Preserve enclosing context and member names in\nClassUtils.getShortClassName(Class) (#1818)\n"
    },
    {
      "commit": "e871e5b3052df0e6047180ff9c5d2e8d17e06c85",
      "tree": "735c72d087e3602926ffd25aa0f3009f790fc9bf",
      "parents": [
        "4775ef5bc839efffd66053e65a8b94212edb6136"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Thu Oct 15 18:58:56 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 09:28:56 2026 -0400"
      },
      "message": "Preserve enclosing context and member names in ClassUtils.getShortClassName(Class) (#1818)\n\n* fix getShortClassName(Class) for members of anonymous and local classes\n\n* Rename test method to follow Java naming conventions\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* Keep member simple names below an anonymous or local enclosure\n\nUse the name-based form only for the anonymous or local class in the\ndeclaring chain and append the simple names of the member classes\nbelow it, so a literal \u0027$\u0027 in a member name (Local.Inner$Name) is kept.\nMove the tests to ClassUtilsShortClassNameTest.\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "4775ef5bc839efffd66053e65a8b94212edb6136",
      "tree": "1e862da323d6c3ce0e7a91c9bcc5710b62fe65c0",
      "parents": [
        "6548e502f7c8f9fb8485364d22355cc51b8a38d8"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 09:20:35 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 09:20:35 2026 -0400"
      },
      "message": "Bump github/codeql-action/analyze from 4.37.5 to 4.38.3\n"
    },
    {
      "commit": "6548e502f7c8f9fb8485364d22355cc51b8a38d8",
      "tree": "8cc2aac3ce678982bcb75a815891ce77e8004f15",
      "parents": [
        "9961c54534a1bc1edcf5c03710d1a044b7c47487"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 08:29:08 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 08:29:08 2026 -0400"
      },
      "message": "Revert \"Bump github/codeql-action/analyze from 4.37.5 to 4.38.3\"\n\nThis reverts commit 9961c54534a1bc1edcf5c03710d1a044b7c47487.\n"
    },
    {
      "commit": "9961c54534a1bc1edcf5c03710d1a044b7c47487",
      "tree": "0c0396a17bb68f52554a30ea53242fdbac399810",
      "parents": [
        "2f9f9830bf0f052baf15c15a4b2ae284b2632105"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 06:33:27 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 06:33:27 2026 -0400"
      },
      "message": "Bump github/codeql-action/analyze from 4.37.5 to 4.38.3\n"
    },
    {
      "commit": "2f9f9830bf0f052baf15c15a4b2ae284b2632105",
      "tree": "8cc2aac3ce678982bcb75a815891ce77e8004f15",
      "parents": [
        "baa862fd56639d834705c19aa7c62d2d1126a799"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 06:25:08 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 15 06:25:08 2026 -0400"
      },
      "message": "Bump actions/upload-artifact from 7.0.1 to 7.0.2\n"
    },
    {
      "commit": "baa862fd56639d834705c19aa7c62d2d1126a799",
      "tree": "aae91a0cf94dd08e3606464d5d203615faa8e6a3",
      "parents": [
        "8c7c20dded9d45e5fd63f015a03e67d7016b563d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 14 19:32:23 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 14 19:32:23 2026 -0400"
      },
      "message": "Add regression test for dollar signs in local-class member names\n\nVerify that getShortClassName(Class) preserves the literal dollar sign\nin\nInner$Name when it is a member of a local class. Check only the suffix\nto\navoid depending on enclosing context or compiler-generated ordinals.\n\nThe test passes with the current implementation and fails with the\nwhole-name fallback proposed in\nhttps://github.com/apache/commons-lang/pull/1818."
    },
    {
      "commit": "8c7c20dded9d45e5fd63f015a03e67d7016b563d",
      "tree": "ab16c4030b1d4ad8635467b51835feae9541a6fb",
      "parents": [
        "86401ab86e2a752f2d0452e72ed2dfd6f53de12b"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 14 19:14:40 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 14 19:14:40 2026 -0400"
      },
      "message": "[javadoc] Correct CharUtils default-value conversion descriptions\n(#1816)\n"
    },
    {
      "commit": "86401ab86e2a752f2d0452e72ed2dfd6f53de12b",
      "tree": "297a014b000cd8a6c183bace9bacd789e3945c54",
      "parents": [
        "64375a58ee3ec6af67f318f389d3eeb8279db64e"
      ],
      "author": {
        "name": "Tarun Kishore",
        "email": "53224551+tarunkishore2303@users.noreply.github.com",
        "time": "Thu Oct 15 04:42:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 19:12:47 2026 -0400"
      },
      "message": "[javadoc] Correct CharUtils default-value conversion descriptions (#1816)\n\n* [javadoc] Correct CharUtils default-value conversion descriptions\n\nThe toIntValue overloads accepting a default return that value for non-ASCII-numeric characters. Describe the fallback instead of incorrectly promising an exception.\n\nCo-authored-by: OpenAI Codex \u003ccodex@openai.com\u003e\n\n* [javadoc] Specify the ASCII digit range for default conversions\n\nClarify both default-value toIntValue overloads accept digits \u00270\u0027 to \u00279\u0027, addressing the review\u0027s wording ambiguity.\n\nCo-authored-by: OpenAI Codex \u003ccodex@openai.com\u003e\n\n* [javadoc] Use the primitive return type in conversion descriptions\n\nDescribe the default-value overloads as returning int rather than Integer, matching their signatures and addressing review feedback.\n\nCo-authored-by: OpenAI Codex \u003ccodex@openai.com\u003e\n\n---------\n\nCo-authored-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "64375a58ee3ec6af67f318f389d3eeb8279db64e",
      "tree": "d41abec11d59da750c521e8a56944b8c727daf0d",
      "parents": [
        "f9a3e07dbece893d8ca39e0a8fd76544fbffbdbd"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 12 14:25:18 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 12 14:25:18 2026 -0400"
      },
      "message": "Expand AnnotationUtils nested annotation array hash tests\n\nMake the regression test deterministic by returning a deliberately\nincorrect hash instead of an identity hash. Add coverage for empty\narrays, multiple elements, element order, null elements, and deeper\nnesting. Clarify the helper Javadoc to describe recursive element\nhashing and Arrays.hashCode mixing."
    },
    {
      "commit": "f9a3e07dbece893d8ca39e0a8fd76544fbffbdbd",
      "tree": "aa36f9c06f781603cf61909d10bc1142e01c4ef6",
      "parents": [
        "89047990d0c1cb947fc8092fc1ba42881b611837"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 12 14:19:17 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Oct 12 14:19:17 2026 -0400"
      },
      "message": "Recurse into nested annotation arrays in AnnotationUtils.hashCode\n(#1814)\n"
    },
    {
      "commit": "89047990d0c1cb947fc8092fc1ba42881b611837",
      "tree": "c2a82796ed300f4c391fef4656ffe7d5f5e0a9b8",
      "parents": [
        "dd2c9e85784b288c7507c3736818040b3b457842"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Mon Oct 12 23:48:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 14:18:27 2026 -0400"
      },
      "message": "Recurse into nested annotation arrays in AnnotationUtils.hashCode (#1814)\n\n* recurse into nested annotation arrays in AnnotationUtils.hashCode\n\n* use the annotation interface\u0027s class loader for the test proxies"
    },
    {
      "commit": "dd2c9e85784b288c7507c3736818040b3b457842",
      "tree": "42200b8dc7408ed5c42991e10de9e6772049d453",
      "parents": [
        "cf50fbc4969a84dc5185b1681224d8025b929fc2"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 15:30:40 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 15:30:40 2026 -0400"
      },
      "message": "[LANG-1836] Make TypeUtils.containsTypeVariables and unrollVariables\nhonor the owner type of a ParameterizedType (#1812)\n\nAdd TypeUtils regression tests for variable unrolling\n\nCover wildcard bound substitution and input preservation, unchanged\nwildcard identity, self-referential and mutually cyclic variable\nassignments, and variable detection and substitution across multiple\nowner levels.\n"
    },
    {
      "commit": "cf50fbc4969a84dc5185b1681224d8025b929fc2",
      "tree": "7828d585987ea18b4f22a5e49a3854816abe5467",
      "parents": [
        "48bf95fb1326a0fb36254028095bab822dc054af"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 15:23:33 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 15:23:33 2026 -0400"
      },
      "message": "Sort members\n"
    },
    {
      "commit": "48bf95fb1326a0fb36254028095bab822dc054af",
      "tree": "bf8dccfb4043a313f2a30743b224bf50770c37ab",
      "parents": [
        "9800cfcbb372dc9e6f82a235b4568a627e897321"
      ],
      "author": {
        "name": "Sharang Gupta",
        "email": "sharang@sharanggupta.dev",
        "time": "Sat Oct 10 20:23:04 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 15:23:04 2026 -0400"
      },
      "message": "[LANG-1836] Make TypeUtils.containsTypeVariables and unrollVariables honour the owner type of a ParameterizedType (#1812)\n\n* [LANG-1836] Make TypeUtils.containsTypeVariables and unrollVariables honour the owner type of a ParameterizedType\n\ncontainsTypeVariables(Type) only inspected getActualTypeArguments() of a\nParameterizedType, so Outer\u003cT\u003e.Inner was reported as free of type\nvariables although its Javadoc promises a recursive check of the type\u0027s\nparameterization. Now the owner type is checked as well, unless it is a\nraw Class (for example Map.class owning Map.Entry\u003cString, Integer\u003e),\nbecause the Class branch reports true for any class that merely declares\ntype parameters.\n\nunrollVariables(Map, Type) had three related problems in its\nParameterizedType branch:\n\n- The owner type was never unrolled, so Outer\u003cT\u003e.Inner\u003cInteger\u003e kept the\n  unresolved owner even when T was mapped. The owner is now unrolled like\n  the type arguments (again leaving a raw Class owner untouched) and the\n  result is built with parameterizeWithOwner(unrolledOwner, raw, args).\n\n- When an owner was present, getTypeArguments(p) was merged over the\n  caller\u0027s map with putAll. For Outer\u003cT\u003e.Inner\u003cT\u003e that injects the\n  identity entry T -\u003e T, which silently discards the caller\u0027s T -\u003e String.\n  The merge is dropped: the actual type arguments of p are written in\n  terms of the enclosing scope\u0027s variables, which the caller\u0027s map is\n  responsible for, not in terms of the raw type\u0027s own parameters.\n\n- The \"visited\" guard introduced for LANG-1700 never released a variable\n  after it had been resolved, so a variable occurring more than once was\n  only unrolled the first time (Map\u003cT, T\u003e became Map\u003cString, T\u003e). The\n  variable is now removed from the set after its substitution has been\n  unrolled, which still breaks genuine cycles such as T -\u003e U -\u003e T.\n\nAdd regression tests for Outer\u003cT\u003e.Inner, Outer\u003cString\u003e.Inner,\nMap.Entry\u003cString, Integer\u003e, Outer\u003cT\u003e.Inner\u003cInteger\u003e, Outer\u003cT\u003e.Inner\u003cT\u003e,\nMap.Entry\u003cT, Integer\u003e and Map\u003cT, T\u003e, and a changes.xml entry.\n\n* [LANG-1836] Fix cyclic owner traversal and wildcard owner unrolling\n\nAdd cycle tracking to containsTypeVariables() to prevent StackOverflowError\nwhen a ParameterizedType has self-referential or mutually cyclic owners.\n\nPass the visited set through unrollBounds() to prevent wildcard owner\nunrolling from losing cycle state, which caused StackOverflowError with\nassignments like {T -\u003e Outer\u003c? extends T\u003e.Inner}.\n\n- containsTypeVariables(): Track visited types during owner traversal\n- unrollBounds(): Add overload accepting visited set for cycle preservation\n- unrollVariables(): Pass visited set to unrollBounds() for wildcard bounds\n\n* [LANG-1836] Remove unused unrollBounds overload and test cyclic owner types\n\nThe previous commit added unrollBounds(Map, Type[], Set) and left the\ntwo argument variant without callers, which fails the SpotBugs check\n(UPM_UNCALLED_PRIVATE_METHOD). Remove the unused private method.\n\nAdd regression tests for the cycle guards of that commit: a\nParameterizedType that is its own owner, and an assignment of\nT to Outer\u003c? extends T\u003e.Inner. Both fail with a StackOverflowError\nwithout the guards.\n\n* [LANG-1836] Harden TypeUtils owner type handling against cyclic types\n\nA custom ParameterizedType can have a cyclic owner chain, or be reached\nagain through its own type arguments, wildcard bounds or owners. Cycle\ndetection must not rely on hashCode() and equals() of such types, and\nunrolling must not follow a cycle forever.\n\n- containsTypeVariables(Type) detects cycles with an identity based set,\n  so it no longer calls the hashCode() of a custom owner type.\n- unrollVariables(Map, Type) leaves a parameterized type with a cyclic\n  owner chain unchanged and tracks the parameterized types and wildcard\n  types it is currently unrolling by identity.\n- Add tests for self owned types, owner chains that lead back to the\n  start from either type, and a cycle through a type argument.\n\n* Javadoc: Enhance unrollBounds with unrolling parameter\n\nAdd parameter \u0027unrolling\u0027 to unrollBounds method for recursion prevention.\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* [LANG-1836] Guard TypeUtils.containsTypeVariables against type argument cycles\n\n- Track every visited composite type by identity, so a custom\n  ParameterizedType, WildcardType or GenericArrayType that reaches itself\n  through its type arguments no longer overflows the stack.\n- Skip the identity set in unrollVariables for plain type variables and\n  classes, which need no containment check.\n\n* Refactor unrollVariables to handle visited removal safely\n\nRefactor unrollVariables method to use try-finally for visited removal.\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* [LANG-1836] Unroll type variables in a single pass\n\n- Drop the containsTypeVariables pre-checks from unrollVariables, which\n  walked the same nested types again at every level. Parameterized and\n  wildcard types are now unrolled once and returned as they are when\n  nothing changed.\n- A cycle through a type argument and an owner is now left as it is\n  instead of being rejected by the rebuild with an\n  IllegalArgumentException, like the other cyclic cases.\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "9800cfcbb372dc9e6f82a235b4568a627e897321",
      "tree": "2cefa2835df39047700d0e1838bd0d057333457a",
      "parents": [
        "5dc94f6ed328bf853af92158892aa849d63fb354"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 13:40:40 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 13:40:40 2026 -0400"
      },
      "message": "[LANG-1835] Ignore synthetic methods in AnnotationUtils (#1810)\n"
    },
    {
      "commit": "5dc94f6ed328bf853af92158892aa849d63fb354",
      "tree": "eb6e05388e92373051dd428c4475cbb0bc00c388",
      "parents": [
        "e588cc629f4b046cdf0ab2fe4d8ab8e297d8a484"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 13:40:03 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 13:40:03 2026 -0400"
      },
      "message": "[LANG-1835] Ignore synthetic methods in AnnotationUtils (#1810)\n\nAdd missing tests.\n\nTest AnnotationUtils with forced accessibility disabled.\n\nVerify that equals(), hashCode(), and toString() work with public\nannotations and preserve access failures for package-private annotations\nwhen AbstractReflection.forceAccessible is false.\n"
    },
    {
      "commit": "e588cc629f4b046cdf0ab2fe4d8ab8e297d8a484",
      "tree": "5d4e0b6ebfbff23a83f1c26af6157007c49c6465",
      "parents": [
        "c4b9e7dc85acf68ea9e577e2bd31838018ada4ce"
      ],
      "author": {
        "name": "안승현",
        "email": "108968316+zemiles@users.noreply.github.com",
        "time": "Sun Oct 11 02:31:47 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 13:31:47 2026 -0400"
      },
      "message": "[LANG-1835] Ignore synthetic methods in AnnotationUtils (#1810)\n\n* [LANG-1835] Ignore synthetic methods in AnnotationUtils\n\nOnly process public, abstract, non-synthetic annotation members\nin equals(), hashCode(), and toString().\n\nPrevent compiler-generated lambda methods from being invoked\nor affecting annotation hash codes and string representations.\n\nAdd regression tests for Runnable, Supplier, and Function constants,\nincluding equality checks between distinct annotation instances.\n\nValidate with the default Maven build on JDK 25.\n\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\n\n* [LANG-1835] Fix annotation equality test on older JDKs\n\nRemove the native annotation proxy equals() assertion that triggers\nAnnotationFormatError on Java 8 and 11.\n\nRetain the distinct-instance check and the AnnotationUtils.equals()\nregression assertion.\n\nValidate the default Maven build with -Ddoclint\u003dall on Windows\nwith Java 8, 11, 17, 21, 25, and 27.\n\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\n\n* [LANG-1835] Consolidate annotation member validation\n\nMove parameter count and return type checks into isAnnotationMember()\nand simplify the equals() and toString() call sites.\n\nRetain reflective access support for non-public annotation types.\n\nValidate the full default Maven build on Java 8, 11, 17, 21, 25, and 27.\n\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\n\n* [LANG-1835] Ensure distinct instances in annotation equality test\n\nCreate a fresh proxy instead of relying on annotation instance caching.\nRetain the identity assertion to ensure the regression exercises member comparison.\n\nSigned-off-by: 안승현 abeb3@naver.com\u003e\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\n\n* Add test for AnnotationUtils with throwing supplier\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* [LANG-1835] Add hashCode regression test for throwing supplier\n\nVerify that AnnotationUtils.hashCode() returns the expected value\nwithout invoking synthetic lambda-body methods.\n\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\n\n* [LANG-1835] Override annotation access only when needed\n\nInvoke annotation members normally first and adjust accessibility only\nafter IllegalAccessException. Preserve Java 8 compatibility, non-public\nannotation support, and the existing forceAccessible policy.\n\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\n\n---------\n\nSigned-off-by: 안승현 \u003cabeb3@naver.com\u003e\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "c4b9e7dc85acf68ea9e577e2bd31838018ada4ce",
      "tree": "ecfe9f3975f9aabef78982e1da94f931564c284b",
      "parents": [
        "32dc4c501e3acba29d53a466eebd611bb2f093a5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 08:01:35 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 10 08:01:35 2026 -0400"
      },
      "message": "Add github.autolink_jira\n"
    },
    {
      "commit": "32dc4c501e3acba29d53a466eebd611bb2f093a5",
      "tree": "ffe882653703c8d37d720a12a06acb35b7786579",
      "parents": [
        "a9104066058a3f98b25266d66df45f9b10b9eaee"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 07 19:50:12 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 07 19:50:12 2026 -0400"
      },
      "message": "[LANG-1655] Preserve Korean text in stripAccents (#1799)\n\nAdd stripAccents regression tests for Unicode recomposition\n\nCover Japanese and Bengali recomposition, modern and compatibility\nHangul Jamo, and mixed Korean and accented Latin text.\n"
    },
    {
      "commit": "a9104066058a3f98b25266d66df45f9b10b9eaee",
      "tree": "c60ed0779475b85f755897c00cc3107c1f5fa9bf",
      "parents": [
        "1f610bbd4553d147173270345cb09ee459494a1e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 07 15:47:23 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 07 15:47:23 2026 -0400"
      },
      "message": "[LANG-1655] Preserve Korean text in stripAccents (#1799)\n\nAdd stripAccents regression tests for Unicode recomposition\n\nCover Japanese and Bengali recomposition, modern and compatibility\nHangul Jamo, and mixed Korean and accented Latin text.\n"
    },
    {
      "commit": "1f610bbd4553d147173270345cb09ee459494a1e",
      "tree": "573392d5634ebb6d8c81d6aa15d114ed6ec0bfd5",
      "parents": [
        "9e0fd0787e64d3ba733268d75273b283874fc2d7"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 07 15:31:00 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Wed Oct 07 15:31:00 2026 -0400"
      },
      "message": "[LANG-1655] Preserve Korean text in stripAccents (#1799)"
    },
    {
      "commit": "9e0fd0787e64d3ba733268d75273b283874fc2d7",
      "tree": "148bf7eb6da5fe465419d9323f2cfea9e3a6f9a9",
      "parents": [
        "682a8ff5cddfeedecb98f62ac7c8d94b5ff65f33"
      ],
      "author": {
        "name": "Efe",
        "email": "gokdemirefe1903@gmail.com",
        "time": "Wed Oct 07 22:25:18 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 15:25:18 2026 -0400"
      },
      "message": "[LANG-1655] Recompose Hangul after stripping accents (#1799)\n\nSigned-off-by: Efe Gökdemir \u003cefe@rexcode.co.uk\u003e"
    },
    {
      "commit": "682a8ff5cddfeedecb98f62ac7c8d94b5ff65f33",
      "tree": "2fa15d9d6439bf3f7e5dd241a5db48d854ae2b29",
      "parents": [
        "c7f1a6d27707e8cd8cbed94f83e0c58d2c480614"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 04 16:19:51 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 04 16:19:51 2026 -0400"
      },
      "message": "Take FastDatePrinter era names from the locale\u0027s calendar (#1800)\n"
    },
    {
      "commit": "c7f1a6d27707e8cd8cbed94f83e0c58d2c480614",
      "tree": "46dab21f37eac185a4308f85f100422df6536356",
      "parents": [
        "324d9fbd091749a9c70aed4b038fd0b4a520b3cf"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Mon Oct 05 01:49:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 16:19:21 2026 -0400"
      },
      "message": "Take FastDatePrinter era names from the locale\u0027s calendar (#1800)\n\n* take FastDatePrinter era names from the locale calendar\n\nDateFormatSymbols.getEras() only knows the two Gregorian eras, but the printer formats with the locale\u0027s calendar, which is Buddhist for th_TH and Japanese Imperial for ja_JP_JP. Build the era table from that calendar\u0027s display names instead; Gregorian locales keep the symbols table.\n\n* resolve FastDatePrinter era name from the calendar being formatted\n\nformat(Calendar) applies the rules to the caller\u0027s calendar, so an era\ntable chosen from the printer\u0027s locale alone mislabels a calendar of\nanother type: a Gregorian calendar formatted by a ja_JP_JP printer has\nERA\u003d1 and printed the Meiji era name instead of the Gregorian AD name,\nand a th_TH printer printed the Buddhist era name for it.\n\nReplace the TextField era rule with an EraField rule that picks the\nname by the type of the calendar being formatted. The locale\u0027s own\ncalendar still uses the prebuilt table, a Gregorian calendar keeps\nDateFormatSymbols.getEras(), and any other calendar is asked for its\nown era display name, as SimpleDateFormat does. The lookups are bounds\nchecked, so a Japanese Imperial calendar formatted by a Gregorian\nlocale no longer throws ArrayIndexOutOfBoundsException either."
    },
    {
      "commit": "324d9fbd091749a9c70aed4b038fd0b4a520b3cf",
      "tree": "e3164f345025a665d3fb08487eee3d8311313498",
      "parents": [
        "43154e016ae213a0da5b727cd1aa18e6e0c56adb"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 04 15:55:34 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Oct 04 15:55:34 2026 -0400"
      },
      "message": "Default unbounded WildcardType upper bound to Object in TypeUtils\n(#1807)"
    },
    {
      "commit": "43154e016ae213a0da5b727cd1aa18e6e0c56adb",
      "tree": "f45afc7d1e3eca6fb55b596742396606872c072e",
      "parents": [
        "25c4bfcd6d9dc3a7333088bfc3031b05cd93837e"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Mon Oct 05 01:23:31 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 15:53:31 2026 -0400"
      },
      "message": "Default unbounded WildcardType upper bound to Object in TypeUtils (#1807)\n\n* default unbounded WildcardType upper bound to Object in TypeUtils\n\n* drop changes.xml entry\n\nThe maintainers keep src/changes/changes.xml themselves, so restore it to\nthe base version and leave it out of this change.\n\n* match the JDK hashCode in TypeUtils WildcardTypeImpl\n\nA wildcard built by TypeUtils is now equal to the JDK\u0027s in both\ndirections, but WildcardTypeImpl.hashCode() used its own shift/OR formula\nwhile the JDK computes Arrays.hashCode(lowerBounds) ^\nArrays.hashCode(upperBounds), so two equal wildcards hashed differently.\n\nUse the JDK algorithm and assert the hash codes agree in\ntestWildcardTypeImplicitUpperBound.\n\n* hash the bounds equals compares in TypeUtils WildcardTypeImpl\n\nWildcardTypeImpl.equals() compares normalised bounds: an absent lower\nbound and a lone null lower bound are the same, and redundant upper bounds\nare dropped. hashCode() hashed the raw arrays, so\nwildcardType().withLowerBounds((Type) null).withUpperBounds().build()\nequalled WILDCARD_ALL with a different hash code, and likewise a wildcard\nwith a redundant upper bound.\n\nHash the same forms equals() compares, keeping an absent lower bound as\nthe JDK\u0027s empty array so the hash code still matches a JDK wildcard."
    },
    {
      "commit": "25c4bfcd6d9dc3a7333088bfc3031b05cd93837e",
      "tree": "b173a182472b0bfa6848ee8df61c47ae257d34ff",
      "parents": [
        "7fce4c843fcd758da9b3408aaf9435c2471ab218"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 03 15:05:26 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Oct 03 15:05:26 2026 -0400"
      },
      "message": "Update GH CI from Java 26 to 27\n\nUpdate Java 27-ea to 28-ea.\n"
    },
    {
      "commit": "7fce4c843fcd758da9b3408aaf9435c2471ab218",
      "tree": "5b5148d64ce87f7ab77595bf2f1dd99aee65a17a",
      "parents": [
        "4ee346e59eecccdaefbdd74ac53698da4a1f348a"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 02 08:50:02 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Fri Oct 02 08:50:02 2026 -0400"
      },
      "message": "Improve RandomStringUtils boundary test coverage\n\nAssert exact generated lengths and check character boundaries for\nlength-range\noverloads and deprecated static graph and print methods. Reuse the\nboundary\nhelper for ASCII tests, fixing the missed check at index zero and\nremoving\ninaccurate Javadoc."
    },
    {
      "commit": "4ee346e59eecccdaefbdd74ac53698da4a1f348a",
      "tree": "0ab821a887107aeb3e486259a9227b06a12589c8",
      "parents": [
        "75d71af80ace2d75dab3f6bb82ac2ef91650634e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 01 08:22:26 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Thu Oct 01 08:22:26 2026 -0400"
      },
      "message": "Include 0x7E (~) in RandomStringUtils nextGraph and nextPrint (#1808)"
    },
    {
      "commit": "75d71af80ace2d75dab3f6bb82ac2ef91650634e",
      "tree": "3f2b9dd16c193043342bed7faa4c458322070f54",
      "parents": [
        "7b6048b7a9d1339a12d353cb85b2222df7bf5668"
      ],
      "author": {
        "name": "alhuda",
        "email": "50839256+alhudz@users.noreply.github.com",
        "time": "Thu Oct 01 17:51:12 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 08:21:12 2026 -0400"
      },
      "message": "Include 0x7E (~) in RandomStringUtils nextGraph and nextPrint (#1808)\n\n* include 0x7e in RandomStringUtils nextGraph and nextPrint\n\n* Update tests for RandomStringUtils to verify character ranges\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* Assert both range ends in the nextGraph and nextPrint tests\n\nThe range-only checks passed whether or not nextGraph and nextPrint were\nfixed, so they did not guard the off-by-one. Fold the range check and the\nboundary check into one helper that asserts the lowest and highest\ndocumented characters are both generated and that nothing outside the\ninclusive range is, and drop the hard-coded probability formula from the\nJavadoc in favour of referencing LOOP_COUNT.\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    }
  ],
  "next": "7b6048b7a9d1339a12d353cb85b2222df7bf5668"
}
