)]}'
{
  "log": [
    {
      "commit": "014c0182a6d1028b2034ad0fe060096078e7544e",
      "tree": "3f83b46caae75ed212473e5b578aeee044d7b16f",
      "parents": [
        "71e1fd94faa4871186c2fecb040c4c73ec51d1e4"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Jul 28 21:12:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 21:12:13 2026 +0200"
      },
      "message": "OPENNLP-1899: Harden SymSpell model deserialization against oversized count fields (#1197)"
    },
    {
      "commit": "71e1fd94faa4871186c2fecb040c4c73ec51d1e4",
      "tree": "c1c17a704bb1a2858591793cb08a555a9f0642fb",
      "parents": [
        "a8642301ffd5f883954d2582c9b39975fa83dc39"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Tue Jul 28 08:31:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 14:31:23 2026 +0200"
      },
      "message": "OPENNLP-1898: Address the OPENNLP-1876 review follow-ups (#1196)\n\nThese notes were raised in the review of OPENNLP-1876 and addressed before\nPR #1151 merged, but the commit was never pushed, so the work is absent\nfrom main.\n\n- Document IllegalArgumentException and IllegalStateException on the public\n  spellcheck normalizer, which throws both but declared neither\n- Restore the SpellCorrectingTokenStream class javadoc, including the\n  contrast with SpellCorrectingObjectStream in compound mode that explains\n  why the stream is token count preserving\n- Hoist the former-regex Pattern constants out of the four characterization\n  test bodies, where they were recompiled on every one of the 5000\n  randomized inputs per case, and name what each pattern represents\n- Turn the adversarial URL pins into a parameterized test so a regression\n  names the shape that broke instead of only the test"
    },
    {
      "commit": "a8642301ffd5f883954d2582c9b39975fa83dc39",
      "tree": "7055eafffb6d25394de8f71e55444d907b4e6132",
      "parents": [
        "66526b528bc2af9c7ebe90cbfa0d9e44e88f7dd7"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "martin.wiesner@hs-heilbronn.de",
        "time": "Tue Jul 21 14:45:06 2026 +0200"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Fri Jul 24 08:47:01 2026 +0200"
      },
      "message": "[maven-release-plugin] prepare for next development iteration\n"
    },
    {
      "commit": "66526b528bc2af9c7ebe90cbfa0d9e44e88f7dd7",
      "tree": "9af2a3c2f54a217031f585915f2e4173112b39a7",
      "parents": [
        "8eef045b696857bc04126a372e8dd9874a3abcbf"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "martin.wiesner@hs-heilbronn.de",
        "time": "Tue Jul 21 14:45:02 2026 +0200"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Fri Jul 24 08:47:01 2026 +0200"
      },
      "message": "[maven-release-plugin] prepare release opennlp-3.0.0-M5\n"
    },
    {
      "commit": "8eef045b696857bc04126a372e8dd9874a3abcbf",
      "tree": "7055eafffb6d25394de8f71e55444d907b4e6132",
      "parents": [
        "9951bfd0ae0aee8ca77eb436702e5544fbea2afc"
      ],
      "author": {
        "name": "mawiesne",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jul 21 12:21:28 2026 +0000"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Jul 21 14:28:54 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 9951bfd0ae0aee8ca77eb436702e5544fbea2afc\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\n"
    },
    {
      "commit": "9951bfd0ae0aee8ca77eb436702e5544fbea2afc",
      "tree": "76e1d6a0a6f2a3edddad35e96dec91a92bfe17ef",
      "parents": [
        "55eaaaaf6db5051fd0d721ec9e02ffe4c9c7ccb9"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Tue Jul 21 08:20:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 14:20:51 2026 +0200"
      },
      "message": "OPENNLP-1870: Add opt-in emoji annotations for NameFinder, Doccat, and Sentiment (#1177)\n\nAdds the bundled-facts layer of the emoji annotation record store: a\nprovenance-tagged, project-authored attribute table (emoji-annotations.txt)\nloaded by EmojiAnnotations into per-symbol EmojiAnnotation records.\n\n- Attribute-row format (codepoints ; attribute ; value ; source ; notes), so\n  adding an attribute later is new rows plus loader support instead of a file\n  format break, and every value carries its own provenance.\n- Attributes: name (CLDR short name, CLDR:annotation), sentiment (project\n  judgment on a coarse -2..2 scale, UNSPECIFIED), entityType and category\n  (assigned from the emoji-test.txt subgroup/group headers, UCD:emoji-test).\n  No third-party sentiment data set is copied; in particular the CC BY-SA\n  Emoji Sentiment Ranking is not used in any form.\n- The loader fails loud on an unknown attribute or malformed row\n  (IllegalArgumentException naming the resource and line): the data and the\n  code move together, so an unrecognized attribute is corruption, not\n  extensibility. Values are validated into their typed domains at load.\n- Lookups strip U+FE0F, since presentation selection does not change a\n  symbol\u0027s identity.\n- Audit tests pin coverage (every EMOJI-direction source of\n  emoji-emoticons.txt has a complete four-attribute record), per-attribute\n  provenance tags, typed domains, and the record/row counts (40/160).\n- LICENSE/NOTICE/NOTICE.template attribution for the Unicode-derived values\n  (CLDR short names, emoji-test.txt group/subgroup classifications) in the\n  otherwise project-authored table.\n\nFlag emoji intentionally have no bundled rows; their region decodes from the\ncode point sequence itself in the derived-facts layer (next commit), and\ngazetteer identifiers are never baked into bundled data."
    },
    {
      "commit": "55eaaaaf6db5051fd0d721ec9e02ffe4c9c7ccb9",
      "tree": "65bbe03a80d034973658db529a5bd0deac5d10f3",
      "parents": [
        "ef0a354cf11ae0ca00dcd7ab8d0d473b48e6fd8e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 21 09:01:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 09:01:25 2026 +0200"
      },
      "message": "Bump actions/checkout from 7.0.0 to 7.0.1 (#1189)"
    },
    {
      "commit": "ef0a354cf11ae0ca00dcd7ab8d0d473b48e6fd8e",
      "tree": "b6f39d45986cb3f816a0f71428b4494c7fc8b42a",
      "parents": [
        "6038bf503d35b6f90e6fa40a3c52994eb61a9d25"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Mon Jul 20 11:15:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 17:15:41 2026 +0200"
      },
      "message": "OPENNLP-1883: Make stemmers thread-safe, add StemmerFactory and per-thread stem caching (#1163)\n\n* SnowballStemmer now routes each call to a per-thread generated engine via\nOwnerOrPerThreadState, the same pattern as the thread-safe *ME components,\nso one instance can be shared across threads without touching the\ngenerated Snowball code. StemmerFactory (api) captures stemmer\nconfiguration as an immutable, thread-safe seam for stateful engines;\nSharingStemmer adapts a factory into a shareable Stemmer for\nimplementations that are not thread-safe themselves (e.g. PorterStemmer).\nNormalizationProfile.matchingAnalyzer() and TermAnalyzer are now safe to\nshare across threads when stemming.\n\n* Add multi-threaded stemmer eval and expand concurrency unit tests\n\n* Add SnowballStemmer JMH benchmark: thread-safe vs pre-patch baseline\n\n* Add CachingStemmer: per-thread LRU memoization of word-to-stem mappings\n\nNatural text is Zipf-distributed, so the same words are stemmed\nconstantly. CachingStemmer wraps a StemmerFactory with a bounded\nper-thread LRU (default 1024 entries) following the same\nOwnerOrPerThreadState pattern as the *ME components: no cross-thread\nsharing, thread-safe regardless of the delegate. On the JMH zipf\nworkload the cache is a ~34x throughput multiplier; on a cache-hostile\nuniform workload over 8x the cache capacity it still breaks even.\nResults and a corrected JMH invocation are documented in BENCHMARKS.md.\n\n* Route TermAnalyzer factory-based stemming through CachingStemmer\n\n* Extract a DelegatingStemmer base to share the per-thread wrapper plumbing\n\n* Add a stemmer manual chapter with a mirror-tested usage example via docbkx/stemmer.xml documenting the Stemmer interface, StemmerFactory,\nand the sharing and caching wrappers"
    },
    {
      "commit": "6038bf503d35b6f90e6fa40a3c52994eb61a9d25",
      "tree": "80f0ff256edf930889f4086953e2d2b027949600",
      "parents": [
        "011195f3492d5b4e3845ee36e0ea34d7a51940c5"
      ],
      "author": {
        "name": "subbudvk",
        "email": "115633743+subbudvk@users.noreply.github.com",
        "time": "Sun Jul 19 16:13:59 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 12:43:59 2026 +0200"
      },
      "message": "OPENNLP-1892: Precompile Tag patterns to avoid repeated pattern compilation (#1187)\n\n* Extracts and precompile tag patterns\n* Adds new tests related to pattern compilation"
    },
    {
      "commit": "011195f3492d5b4e3845ee36e0ea34d7a51940c5",
      "tree": "b40de6b9e2a6544fb5cf9a184ed9ed83a60bfd6a",
      "parents": [
        "728186acc51e384c51f71cd62a7fd0e09fdf3e58"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Sun Jul 19 06:40:27 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 12:40:27 2026 +0200"
      },
      "message": "OPENNLP-1878: Non-breaking performance follow-up for normalization and tokenization hot paths (#1161)\n\n* OPENNLP-1878: Performance follow-up for normalization and tokenization hot paths\n\nExtract CodePoints for shared BMP-aware decoding, add member-free identity\nshort-circuits and Confusables fast paths, pre-size Alignment.Builder and DL collections. Output-preserving; JMH shows up to ~4.3x on clean whitespace\nfolds and ~1.7x on Confusables skeleton for ASCII tokens.\n\nNew tests pin the previously unverified behavior: CodePointsTest exercises\nat() and before() against Character.codePointAt/codePointBefore for BMP text, a supplementary pair, and lone high and low surrogates, and an aligned digit fold test asserts the span mapping over mixed ASCII and non-ASCII digits so the equal-run treatment of ASCII digits stays pinned against Alignment\nchanges."
    },
    {
      "commit": "728186acc51e384c51f71cd62a7fd0e09fdf3e58",
      "tree": "c817c6ea2973a40fc7ce780cf19e5041360a5670",
      "parents": [
        "2ae4146b999bb3c4091cb0497d0b3a321e4fb66c"
      ],
      "author": {
        "name": "subbudvk",
        "email": "115633743+subbudvk@users.noreply.github.com",
        "time": "Sat Jul 18 17:13:57 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 13:43:57 2026 +0200"
      },
      "message": "OPENNLP-1891: Harden Deserialization in BaseModel (#1185)\n\n* Support deserialization filter in BaseModel\n\n* Create BaseModelTest.java\n\n* Train test model on demand instead of using a 1.x model file\n\n---------\n\nCo-authored-by: Richard Zowalla \u003crzo1@apache.org\u003e"
    },
    {
      "commit": "2ae4146b999bb3c4091cb0497d0b3a321e4fb66c",
      "tree": "c129450ec086b2f5405dd9ee9dba6275f1e8c2bd",
      "parents": [
        "16b82540d4ba7599070739566a457d98ef8bbafd"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jul 17 23:14:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 05:14:04 2026 +0200"
      },
      "message": "OPENNLP-1875: Align whitespace handling with the Unicode White_Space property (#1150)\n\n* Migrate CLI, spellcheck and UIMA whitespace splits to Unicode White_Space\n\n\u003d Replace the ASCII \\s regex whitespace handling on the remaining\nuser-text paths with the standards-sourced Unicode White_Space set from\nOPENNLP-1850:\n\nBehavior delta, pinned by the flipped characterization tests: for the\nregex sites the change is purely additive (NBSP, figure/narrow space,\nNEL, the Unicode line and paragraph separators and the other Zs\nseparators now separate or strip; U+001C..U+001F never matched \\s and\nstill do not split). For the PER_TOKEN normalizer, which used\nCharacter.isWhitespace, U+001C..U+001F additionally stop being token\nboundaries. None of these components feeds trained-model features.\n\n* SimpleTokenizer now splits on the Unicode White_Space set, so the NEL (U+0085) and C0 separator (U+001C-U+001F) characters in the eng_news_2010_300K corpus retokenize. Update the pinned MD5 in verifyTrainingData to match. The accuracy evals and the sentence-model digest are unchanged.\n\n* Narrow to user-text paths; keep the trained-model tokenizers on legacy whitespace\n\n* The general tokenizers (SimpleTokenizer, WhitespaceTokenizer), Span.trim and SentenceDetectorME feed trained models, so moving them to the Unicode White_Space set changed their tokenization on the NEL and C0-separator code points and shifted\nevery SourceForgeModelEval fingerprint. Revert those to main so existing models are unaffected, and apply White_Space only to the genuine user-text paths: the spellcheck normalizer and SymSpell splitting, and the UIMA number normalizer. StringUtil gains\nisUnicodeWhitespace as the standard user-text predicate; the legacy isWhitespace stays for trained-model feature generation.\n\n* Switch whitespace classification to Unicode White_Space with a legacy compatibility mode\n\n* StringUtil.isWhitespace now resolves through the new WhitespaceMode: the Unicode White_Space set by default, or the 1.x/2.x definition (Character.isWhitespace plus the Zs category) when the opennlp.whitespace.mode system property selects LEGACY.\nEvery caller shares that one decision, so the general tokenizers, Span.trim, corpus parsing and the context generators follow White_Space by default, and models trained\nunder the legacy definition decode identically by selecting LEGACY. The mode resolves once at class initialization and applies process-wide; setActive and reset let tests\nand embedders override it, selecting LEGACY logs a one-time removal warning, and the mode is scheduled for removal in 4.0. SourceForgeModelEval and the sentence-span characterization tests pin LEGACY for their legacy-trained models. \n\n* Documented in the\nmanual next to the other system properties."
    },
    {
      "commit": "16b82540d4ba7599070739566a457d98ef8bbafd",
      "tree": "d02815e0791fa493b5bcfe1beb89f435404f163b",
      "parents": [
        "db7adf0a6aa92a5524d058ec1dc7c0e4c0bf61e3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 17 07:33:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 07:33:58 2026 +0200"
      },
      "message": "Bump actions/setup-java from 5.5.0 to 5.6.0 (#1184)"
    },
    {
      "commit": "db7adf0a6aa92a5524d058ec1dc7c0e4c0bf61e3",
      "tree": "1a6e591e738c6909642c80d23be4950e385e68ae",
      "parents": [
        "fa79a524382734d997a2754c9acfb628e3d74f3d"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Thu Jul 16 15:20:33 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 21:20:33 2026 +0200"
      },
      "message": "OPENNLP-1876: Replace regex with cursor scans in the legacy CharSequenceNormalizers (#1151)\n\nOPENNLP-1876: Replace regex with cursor scans in the legacy CharSequenceNormalizers\n\n* Add characterization tests for NumberCharSequenceNormalizer\n* Replace the regex in NumberCharSequenceNormalizer with a cursor scan\n* Add characterization tests for ShrinkCharSequenceNormalizer\n* Replace the regexes in ShrinkCharSequenceNormalizer with cursor scans\n* Add characterization tests for TwitterCharSequenceNormalizer\n* Replace the regexes in TwitterCharSequenceNormalizer with cursor scans\n* Add characterization tests for UrlCharSequenceNormalizer\n* Replace the regexes in UrlCharSequenceNormalizer with cursor scans\n* Add characterization tests for the spellcheck token guards\n* Convert the spellcheck token guards to cursor scans\n* Split on the literal delimiter without regex in SpellCorrectingTokenStream"
    },
    {
      "commit": "fa79a524382734d997a2754c9acfb628e3d74f3d",
      "tree": "4dc05fd1975584b0fb112919491d4958c1027f4a",
      "parents": [
        "4a435d3c39b2cd0d78c4ece35343d364f2de438b"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Thu Jul 16 15:31:54 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Jul 16 15:48:17 2026 +0200"
      },
      "message": "OPENNLP-1890: Using allowlist based class loading in StringInterners\n"
    },
    {
      "commit": "4a435d3c39b2cd0d78c4ece35343d364f2de438b",
      "tree": "0051bb726f55e8e2f3a715a692c7ec9ca9cb93f2",
      "parents": [
        "9796b1a094b314ce1a76a10ea3c04bbbf3b68243"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Thu Jul 16 15:30:00 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Jul 16 15:48:17 2026 +0200"
      },
      "message": "OPENNLP-1890: Using allowlist based class loading in StreamFactoryRegistry\n"
    },
    {
      "commit": "9796b1a094b314ce1a76a10ea3c04bbbf3b68243",
      "tree": "076eeb0f60c5dcb8d93f4e26d24a9f00a98fd7aa",
      "parents": [
        "dfd0c94db83175a8ea9f874ad33ace667562d0d0"
      ],
      "author": {
        "name": "subbudvk",
        "email": "115633743+subbudvk@users.noreply.github.com",
        "time": "Thu Jul 16 18:55:33 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:25:33 2026 +0200"
      },
      "message": "Allowlist based class Instantiation (#1178)\n\n* Using allowlist based class loading\n\n* Using allowlist based class loading"
    },
    {
      "commit": "dfd0c94db83175a8ea9f874ad33ace667562d0d0",
      "tree": "4444feba43c69e6eda0d06c7d0a5597888790b65",
      "parents": [
        "725b1f30737c1a3fd1100293ba44816f8efe6db1"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Thu Jul 16 05:37:54 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:37:54 2026 +0200"
      },
      "message": "OPENNLP-1869: Support offset-aware bidirectional emoji and emoticon expansion and contraction (#1164)\n\n* OPENNLP-1869: Support offset-aware bidirectional emoji and emoticon expansion and contraction\n\nAdds an opt-in, offset-aware fold between emoji and ASCII emoticons in both\ndirections, backed by a bundled, project-authored provenance-tagged table\n(emoji-emoticons.txt; no third-party data set is copied).\n\n- EmojiEmoticons: lazy loader plus the shared longest-match sequence\n  substitution pass; both directions substitute code point sequences (an\n  emoticon source is multi-character, an emoji-presentation source is a\n  pictograph plus U+FE0F folding as one unit), which the per-code-point\n  CharClass primitive cannot express.\n- EmojiToEmoticonCharSequenceNormalizer: emoji to canonical ASCII emoticon,\n  many to one, unguarded (a pictograph is unambiguous in running text).\n- EmoticonToEmojiCharSequenceNormalizer: emoticon to canonical pictograph,\n  folding only a whitespace-delimited unit so embedded sequences such as the\n  :/ in https:// are never corrupted; a missed fold costs nothing, a false\n  fold is irreversible.\n- The two directions close over each other (audited by test), so a round\n  trip converges on canonical forms.\n- Wiring: Dimension.EMOJI_FOLD (emoji-to-emoticon, the per-token-meaningful\n  direction), TermAnalyzer.Builder.emojiFold(), TextNormalizer.Builder\n  emojiToEmoticon()/emoticonToEmoji(); both rungs compose into buildAligned().\n- Deprecates EmojiCharSequenceNormalizer: its surrogate-block pattern blanks\n  every supplementary-plane code point (not only emoji) and misses BMP\n  pictographs, and deleting the symbol destroys the signal downstream.\n- Settles the epic\u0027s WordType question with no tokenizer change: folding\n  emoticons to emoji before tokenization makes both one EMOJI class, proven\n  by test against the UAX #29 word tokenizer.\n- Manual updates in the Text Normalization chapter."
    },
    {
      "commit": "725b1f30737c1a3fd1100293ba44816f8efe6db1",
      "tree": "35e8c56aaa9a8df0072b40d199f181394884b486",
      "parents": [
        "cf83a1375c564691acfd22fb6f64be3d67e5861d"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Thu Jul 16 05:25:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:25:06 2026 +0200"
      },
      "message": "OPENNLP-1868: Add Unicode full case folding to text normalization (#1138)\n\n* OPENNLP-1868: Bundled full case-folding rung with provenance and audit\n\nAdds Unicode full case folding (UTS #21) as an offset-aware rung, backed by a bundled CaseFolding.txt table. Unlike the existing locale-based caseFold(), full case folding includes the expanding folds plain lower casing does not perform: sharp s to ss, the Latin ligatures, and the Greek and Armenian multi-character folds.\n\nBecause the table is authored with known source and target lengths, the rung builds its Alignment during the substitution pass, so it is offset-aware with no ICU4J dependency. This is the offset-aware pipeline\u0027s first authored expanding fold beyond the OPENNLP-1850 CharClass rungs, and it proves the buildAligned() contract end to end on real data rather than just the engine\u0027s own folds."
    },
    {
      "commit": "cf83a1375c564691acfd22fb6f64be3d67e5861d",
      "tree": "623ecf0876c046bdc9a1f4dc4dca3149b4084047",
      "parents": [
        "b4f52fa021c068d97b892454f27b2f9641112feb"
      ],
      "author": {
        "name": "jerry317395616",
        "email": "140782009+jerry317395616@users.noreply.github.com",
        "time": "Thu Jul 16 16:28:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:28:39 2026 +0200"
      },
      "message": "OPENNLP-1742: Use the MaxEnt training default for NameFinderME (#1171)\n\n* OPENNLP-1742: Use the MaxEnt training default for NameFinderME\n\n* OPENNLP-1742: Stabilize the CLI output test"
    },
    {
      "commit": "b4f52fa021c068d97b892454f27b2f9641112feb",
      "tree": "fd649125ec166d48003aedb5e83dd08248b1a49b",
      "parents": [
        "7cfd7f2dc1c865cc137765504043d54c7b231412"
      ],
      "author": {
        "name": "jerry317395616",
        "email": "140782009+jerry317395616@users.noreply.github.com",
        "time": "Thu Jul 16 16:26:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:26:43 2026 +0200"
      },
      "message": "OPENNLP-244: Document the BioNLP converter (#1175)"
    },
    {
      "commit": "7cfd7f2dc1c865cc137765504043d54c7b231412",
      "tree": "7011dec06360711ef650f03db71a18475c75e9cc",
      "parents": [
        "64a8439a5ef88f0df242d8dce6b80619ae536e97"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Jul 16 10:25:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:25:38 2026 +0200"
      },
      "message": "Change the notification pattern so dev list is not flooded with emails. (#1176)"
    },
    {
      "commit": "64a8439a5ef88f0df242d8dce6b80619ae536e97",
      "tree": "cca865d9ede4359c13984de00ddbda07ae358fd9",
      "parents": [
        "47367ddf86299e0372c7668b9eabe4dfff07f35b"
      ],
      "author": {
        "name": "jerry317395616",
        "email": "140782009+jerry317395616@users.noreply.github.com",
        "time": "Thu Jul 16 14:46:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 08:46:30 2026 +0200"
      },
      "message": "OPENNLP-587: Document the Entity Linker framework (#1169)"
    },
    {
      "commit": "47367ddf86299e0372c7668b9eabe4dfff07f35b",
      "tree": "a9b7ccec460f8ba0e3d38d8f2b69a81b71ff0260",
      "parents": [
        "7dae2ca001fd19e21def7a7003f949e28cf7b72a"
      ],
      "author": {
        "name": "jerry317395616",
        "email": "140782009+jerry317395616@users.noreply.github.com",
        "time": "Mon Jul 13 15:45:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 09:45:13 2026 +0200"
      },
      "message": "OPENNLP-1233: Link the POS and chunk tag references (#1170)"
    },
    {
      "commit": "7dae2ca001fd19e21def7a7003f949e28cf7b72a",
      "tree": "29028e3ff7f571b838391f6b50e8ef657f64faed",
      "parents": [
        "77fed15cc3c56edb5f23b58eafed4de854269a35"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 06:29:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 06:29:41 2026 +0200"
      },
      "message": "OPENNLP-1856: Update JUnit to 6.1.2 (#1172)\n\nBumps `junit.version` from 6.1.1 to 6.1.2.\n\nUpdates `org.junit.jupiter:junit-jupiter-api` from 6.1.1 to 6.1.2\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)\n\nUpdates `org.junit.jupiter:junit-jupiter-engine` from 6.1.1 to 6.1.2\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)\n\nUpdates `org.junit.jupiter:junit-jupiter-params` from 6.1.1 to 6.1.2\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)\n\n---\nupdated-dependencies:\n- dependency-name: org.junit.jupiter:junit-jupiter-api\n  dependency-version: 6.1.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.junit.jupiter:junit-jupiter-engine\n  dependency-version: 6.1.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.junit.jupiter:junit-jupiter-params\n  dependency-version: 6.1.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "77fed15cc3c56edb5f23b58eafed4de854269a35",
      "tree": "4f630fba7020ccc6c0c24cfd9d10e89207129dc6",
      "parents": [
        "4275cee06c9d8f7047b3aa15a895fb27d25a3b5b"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Wed Jul 08 14:32:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 20:32:06 2026 +0200"
      },
      "message": "OPENNLP-1882: Stop excluding stemmer tests and fix stale Turkish expectations (#1162)"
    },
    {
      "commit": "4275cee06c9d8f7047b3aa15a895fb27d25a3b5b",
      "tree": "3589c04e0c98161ee26f84548dad462cc979b246",
      "parents": [
        "1ed5f4ddb7f974e9d567deadda9bbf155f6cf9ae"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Wed Jul 08 10:38:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 16:38:24 2026 +0200"
      },
      "message": "OPENNLP-1866: Update Dev Manual on Unicode normalization and the UAX #29 tokenizer (#1106)\n\n* OPENNLP-1866: Update Dev Manual on Unicode normalization and the UAX #29 tokenizer (4-docs/7)\n* For broader context, see epic: https://issues.apache.org/jira/browse/OPENNLP-1850"
    },
    {
      "commit": "1ed5f4ddb7f974e9d567deadda9bbf155f6cf9ae",
      "tree": "eb64fc10886aef004d15b93e9f53631a1b85a7a8",
      "parents": [
        "ffa80ffb4fc8e8dbb162d290008bc2d9f3dfed19"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 09:41:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 09:41:00 2026 +0200"
      },
      "message": "Bump actions/setup-java from 5.4.0 to 5.5.0 (#1157)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.4.0 to 5.5.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/1bcf9fb12cf4aa7d266a90ae39939e61372fe520...0f481fcb613427c0f801b606911222b5b6f3083a)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.5.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ffa80ffb4fc8e8dbb162d290008bc2d9f3dfed19",
      "tree": "0d789f7e99b054df6c8bc2d9733549e8054bb9fe",
      "parents": [
        "e2f6fbc61b03bc7e0ee103b9510e109c62d039bd"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Wed Jul 08 08:08:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 08:08:45 2026 +0200"
      },
      "message": "OPENNLP-1881: Pin Pester to 6.0.0 and fix Invoke-Pester -Path param (#1159)\n\nPester v6 removed the legacy -Script parameter from Invoke-Pester,\nbreaking the Windows shell-tests job since Install-Module always\npulls the latest release. Pin the version and switch to -Path so the\njob stays reproducible across future Pester releases."
    },
    {
      "commit": "e2f6fbc61b03bc7e0ee103b9510e109c62d039bd",
      "tree": "4bad87507be3c85d4bd9febb037f05e2906dbc7b",
      "parents": [
        "d5d37dca2088aa41ec167c863ee368481b4a2bcc"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Wed Jul 08 00:38:29 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 06:38:29 2026 +0200"
      },
      "message": "OPENNLP-1865: Support offset-safe input normalization in the DL components (#1105)\n\n* OPENNLP-1865 Offset-safe, Unicode-aware input normalization in the DL components\n* For broader context, see epic: https://issues.apache.org/jira/browse/OPENNLP-1850\n\nFollow-up:\n* OPENNLP-205: Update the stale SourceForgeModelEval golden hash for evalSentenceModel\nThe Jenkins eval-tests-configurable job failed evalSentenceModel after\nOPENNLP-205 (d5d37dca, #1141) landed: it pins a SHA digest of every\nsentence SentenceDetectorME produces over the Leipzig\neng_news_2010_300K corpus using the SourceForge en-sent.bin model, and\nOPENNLP-205 deliberately changed which characters SentenceDetectorME\ntrims as whitespace (Unicode White_Space, not StringUtil.isWhitespace).\nThe corpus contains at least one boundary affected by that documented\ndelta, so the digest changed. No other test in the class touches\nSentenceDetectorME, and every other digest in the 138-test run was\nunaffected, which is consistent with an isolated, expected fallout of\nthe OPENNLP-205 fix rather than a regression."
    },
    {
      "commit": "d5d37dca2088aa41ec167c863ee368481b4a2bcc",
      "tree": "514bdbc81e2951ae60eb3cf4329bb2b2613cc7d4",
      "parents": [
        "784e9c85b5c19dcbf6e36f8393ab617375862403"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Mon Jul 06 13:17:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 19:17:48 2026 +0200"
      },
      "message": "OPENNLP-205: Refactor the end-of-sentence position to span mapping in SentenceDetectorME (#1141)"
    },
    {
      "commit": "784e9c85b5c19dcbf6e36f8393ab617375862403",
      "tree": "10a3542dccf92303931cfef4da80077fbe82079d",
      "parents": [
        "5a7b3aa6d68a02c03f6a5fc2246f0829ef77847e"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Mon Jul 06 09:26:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 15:26:34 2026 +0200"
      },
      "message": "OPENNLP-1864: Per-language NormalizationProfile registry (2c/7) (#1149)\n\n* OPENNLP-1850 Per-language NormalizationProfile registry (2c)\n\nThe language-to-settings registry split out of the former tokenizer PR (#1104) on review request.\nNormalizationProfiles maps a language code to its stemmer and diacritic fold (the way OpenNLP already\nselects a Snowball stemmer by language) and builds a search-oriented TermAnalyzer; NormalizationProfile\nis the per-language record. Builds on the Term model in 2b.\n\n* OPENNLP-1850 Resolve Norwegian nb/nn to the Norwegian profile (profiles)\n\nforLanguage(\"nb\")/(\"nn\") returned empty: the registry keyed Norwegian under the macrolanguage\n\"nor\", but the standard written codes nb/nn convert to ISO 639-3 nob/nno, which were absent from the\nmap -- so Norwegian text got no profile, and the LanguageDetector (which emits nob/nno) hit the same\nhole for a language supportedLanguages() advertises. Added nob/nno aliases to the Norwegian stemmer.\n\n* OPENNLP-1850 Review nits: add Turkish profile; derive coverage from the enum (profiles)\n\nAdd a Turkish (tur) normalization profile -- it was the one Snowball language with no profile. Soften\nthe class doc: the covered set is every Snowball algorithm that names a language, i.e. all of them\nexcept PORTER (an English-only algorithm variant, not a language). Replace the magic size\u003d\u003d21 coverage\nassertion with one that derives the expected algorithm set from the enum, and add a test for the\nforLanguage() two-letter fallback when getISO3Language() throws MissingResourceException.\n\n* OPENNLP-1850 Review nits: rename searchAnalyzer-\u003ematchingAnalyzer; drop \u0027search\u0027 framing in profile docs\n\nOpenNLP is not search-specific; rename NormalizationProfile.searchAnalyzer() to matchingAnalyzer() and\nsoften the \u0027search form/variants\u0027 wording in the profile javadocs and the Turkish comment.\n\n* OPENNLP-1850 Review: validate NormalizationProfile components\n\nReject null/blank language and a null stemmerAlgorithm in a compact\nconstructor; accentFold stays nullable by design.\n\n* OPENNLP-1850 Review: IllegalArgumentException on null args; link profile in javadoc\n\nAddresses mawiesne\u0027s review on #1112:\n- Replace Objects.requireNonNull with fail-loud IllegalArgumentException in the\n  NormalizationProfile compact constructor (language, stemmerAlgorithm) and in\n  NormalizationProfiles.forLanguage/detect, with matching @throws javadoc.\n- Link the profile term with {@link NormalizationProfile profile} in the\n  forLanguage and detect javadoc.\n- Flip the null-argument tests to expect IllegalArgumentException and add a\n  detect(null, ...) / detect(..., null) test."
    },
    {
      "commit": "5a7b3aa6d68a02c03f6a5fc2246f0829ef77847e",
      "tree": "febda59e37460c3115bd7c0ca70dff867d9da8ba",
      "parents": [
        "945a3079f560d8e50882d2b5ec64cf309b886738"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Mon Jul 06 08:29:19 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 14:29:19 2026 +0200"
      },
      "message": "OPENNLP-1863: Layered Term model — Term, TermAnalyzer (#1111)\n\n* OPENNLP-1863: Layered Term model: Term, TermAnalyzer (2b)\n\nThe token analysis layer split out of the former tokenizer PR (#1104) on review request. A Term is\none token projected through the ordered Dimension stack (original, NFC, NFKC, whitespace, dash, case\nfold, accent fold, confusable fold, stem, lemma), keeping its source Span and every intermediate\nform; TermAnalyzer segments with the UAX #29 WordTokenizer (from 2a) and applies the configured\ndimension prefix. Restores Dimension\u0027s {@link Term}/{@link TermAnalyzer} javadoc now that they exist.\nBuilds on the tokenizer in 2a.\n\n* For broader context, see epic: https://issues.apache.org/jira/browse/OPENNLP-1850"
    },
    {
      "commit": "945a3079f560d8e50882d2b5ec64cf309b886738",
      "tree": "20b08b255aedd636d568dbde0ea4ea7d2d0bba20",
      "parents": [
        "1712f32dbe657792f9a80fa960018ab2a9eb2206"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Jul 06 09:40:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 09:40:43 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 1712f32dbe657792f9a80fa960018ab2a9eb2206 (#1147)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "1712f32dbe657792f9a80fa960018ab2a9eb2206",
      "tree": "e1364710c6892b8db4c115bda602bf533a13383e",
      "parents": [
        "74092e1c9cc7176e4513af47dd29f325c776b334"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 06 08:20:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 08:20:10 2026 +0200"
      },
      "message": "OPENNLP-1874: Update Log4J to 2.26.1 (#1144)\n\nBumps org.apache.logging.log4j:log4j-slf4j2-impl from 2.26.0 to 2.26.1.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.logging.log4j:log4j-slf4j2-impl\n  dependency-version: 2.26.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "74092e1c9cc7176e4513af47dd29f325c776b334",
      "tree": "71f091404763a9c4d9755083806a86ea2f93be36",
      "parents": [
        "2260b55ec77d9f0e52c4101734592bd135783b33"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 06 08:13:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 08:13:57 2026 +0200"
      },
      "message": "OPENNLP-1873: Update ONNX runtime to 1.27.0 (#1143)\n\nBumps `onnxruntime.version` from 1.26.0 to 1.27.0.\n\nUpdates `com.microsoft.onnxruntime:onnxruntime` from 1.26.0 to 1.27.0\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseManagement.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.26.0...v1.27.0)\n\nUpdates `com.microsoft.onnxruntime:onnxruntime_gpu` from 1.26.0 to 1.27.0\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseManagement.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.26.0...v1.27.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.microsoft.onnxruntime:onnxruntime\n  dependency-version: 1.27.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n- dependency-name: com.microsoft.onnxruntime:onnxruntime_gpu\n  dependency-version: 1.27.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2260b55ec77d9f0e52c4101734592bd135783b33",
      "tree": "ae06d811660a824b0a3d4760c3c1a53971afc9a0",
      "parents": [
        "e2ffecd8a278653969d39045dff4dccfbdc9569c"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Fri Jul 03 10:22:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 10:22:51 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for e2ffecd8a278653969d39045dff4dccfbdc9569c (#1142)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "e2ffecd8a278653969d39045dff4dccfbdc9569c",
      "tree": "e9d10c40dc76576ad934e5bc3fc25d4d9ffaf553",
      "parents": [
        "47fd462a0d3f41d8a2b228f87691587a7b49ed87"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jul 03 04:06:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 10:06:44 2026 +0200"
      },
      "message": "OPENNLP-1862: UAX #29 word tokenizer — WordSegmenter, WordTokenizer, WordType (#1110)\n\n* OPENNLP-1850 UAX #29 word tokenizer: WordSegmenter, WordTokenizer, WordType (2a/7)\n* For broader context, see epic: https://issues.apache.org/jira/browse/OPENNLP-1850"
    },
    {
      "commit": "47fd462a0d3f41d8a2b228f87691587a7b49ed87",
      "tree": "fa50b4107c1c968755aa4df468b53812954769b9",
      "parents": [
        "c3d3ffd57e87b2b7c76431177f046523d2e4c1c7"
      ],
      "author": {
        "name": "Vasiliy Mikhailov",
        "email": "vasiliy-mikhailov@users.noreply.github.com",
        "time": "Thu Jul 02 16:42:58 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 15:42:58 2026 +0200"
      },
      "message": "OPENNLP-1859: Add tests for BilouCodec encode/decode and outcome compatibility (#1135)\n\n* Add edge-case tests for BilouCodec encode/decode and outcome compatibility\n\n* Rewrite test comments to describe behaviour instead of production line numbers\n\n* Make testCompatibilityContinueWithoutStartOrLast a distinct case ({B_CONTINUE, A_UNIT}) per review: it duplicated WithoutStart and short-circuited in the last-validation loop instead of exercising the cont-with-no-matching-start-or-last branch; 81 tests green"
    },
    {
      "commit": "c3d3ffd57e87b2b7c76431177f046523d2e4c1c7",
      "tree": "552b0d36c3f446d0f6a53aba0889b432be1dda1d",
      "parents": [
        "a485a8dc8730e185625e7929b09458a81f25082b"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Thu Jul 02 07:21:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 13:21:23 2026 +0200"
      },
      "message": "OPENNLP-1871: Add the stopword-list BSD section to the binary distribution LICENSE (#1140)\n\nThe root LICENSE carries a BSD section for the stopword lists bundled\nunder opennlp/tools/stopword (derived from Apache Lucene, which\nredistributes them from the Snowball project; the Bulgarian list by\nJacques Savoy), but the hand-maintained binary distribution LICENSE did\nnot, although the binary distribution ships the lists inside the\nopennlp-runtime jar. The existing Snowball stemmers section covers the\nstemmers, not the lists, so the section is added next to it. The distr\nNOTICE is regenerated from NOTICE.template and needs no change."
    },
    {
      "commit": "a485a8dc8730e185625e7929b09458a81f25082b",
      "tree": "33f8a7128e9d85dba35377c67ddc940a18737a80",
      "parents": [
        "d76737daa5a52e72df45caaf081555fcbac8b234"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Thu Jul 02 07:19:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 13:19:10 2026 +0200"
      },
      "message": "OPENNLP-1861: Offset/alignment layer — Alignment, AlignedText, buildAligned (1b/7) (#1109)\n\n* OPENNLP-1850 Offset/alignment layer: Alignment, AlignedText, buildAligned, *Aligned (1b)\n\nThe conceptually hard half of the former foundation PR, split out on review request: the\nbidirectional Alignment edit-sequence and AlignedText, the OffsetAwareNormalizer capability\ninterface, TextNormalizer.buildAligned(), the *Aligned CharClass variants and the offset-aware\nrungs, the line-break-preserving rung, and the dense span-mapping tests (binary-search span\nmapping, expansion/deletion edge cases, andThen composition including the insertion-in-expansion\ncase). Builds on the engine in 1a.\n\n* OPENNLP-1850 Review nits: soften DL forward-link; fix LineBreakPreserving opener (alignment)\n\nOffsetAwareNormalizer no longer {@link}s OffsetMappingNameFinder (introduced in the DL layer) so the\njavadoc resolves when this PR is read on its own. LineBreakPreservingWhitespaceCharSequenceNormalizer\u0027s\nopener now reads \u0027An OffsetAwareNormalizer\u0027 to match the interface it implements.\n\n* OPENNLP-1850 Review: make AlignedText.normalized a CharSequence; add normalizedString()\n\nBoth sides of AlignedText are now CharSequence so the record is symmetric with\nthe caller\u0027s original input. Callers that need the materialized normalized form\nuse normalizedString(); engine paths still build via StringBuilder.toString(), so\nthere is no extra allocation on the hot path when normalized is already a String.\n\nAdd AlignedTextTest and adjust two runtime tests to use normalizedString() where\na String is required.\n\n* OPENNLP-1850 Review: IAE null contract, @ThreadSafe, UID regeneration, line-break rung test\n\nAddresses the 1b review round:\n- CharClass reports IllegalArgumentException for null parameters across\n  the whole class (not requireNonNull\u0027s NullPointerException), so an\n  invalid parameter and an invalid code point surface through the same\n  exception type; @throws documented on every affected method, and the\n  sweep covers the non-aligned twins too so normalize and\n  normalizeAligned share one contract. A null-contract test pins every\n  entry point.\n- Alignment carries @ThreadSafe; Builder.equal/replace document their\n  IllegalArgumentException for negative counts.\n- serialVersionUID regenerated via serialver for the ten classes that\n  now implement OffsetAwareNormalizer.\n- New dedicated LineBreakPreservingWhitespaceCharSequenceNormalizerTest:\n  horizontal collapse, break preservation incl. CRLF and U+2028/U+2029,\n  edge trimming, whitespace-only input, aligned mapping through the\n  collapse-then-trim composition, and null rejection."
    },
    {
      "commit": "d76737daa5a52e72df45caaf081555fcbac8b234",
      "tree": "638aaa19590d41fadcb84e243b4d754dda576370",
      "parents": [
        "7407f2419f7d9d623976cfb3da4a37e714a9e4a4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 01 03:50:09 2026 +0000"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Jul 02 13:17:35 2026 +0200"
      },
      "message": "Bump actions/upload-artifact from 4.6.2 to 7.0.1\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.2 to 7.0.1.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/ea165f8d65b6e75b540449e92b4886f43607fa02...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: 7.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "7407f2419f7d9d623976cfb3da4a37e714a9e4a4",
      "tree": "76ee081de754cd892a0e705ca2a50158436892d3",
      "parents": [
        "b101e777a92cbacd4867ee6fba73fb8392403642"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 01 03:50:15 2026 +0000"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Jul 02 13:17:19 2026 +0200"
      },
      "message": "Bump actions/download-artifact from 4.3.0 to 8.0.1\n\nBumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.3.0 to 8.0.1.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/d3f86a106a0bac45b974a628896c90dbdf5c8093...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c)\n\n---\nupdated-dependencies:\n- dependency-name: actions/download-artifact\n  dependency-version: 8.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "b101e777a92cbacd4867ee6fba73fb8392403642",
      "tree": "0d3c28a08bf98e3715ec04f1392d76fa9ba80c21",
      "parents": [
        "fe8b722bc9b47a17d5f552a84a7f0617e524915e"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Thu Jul 02 11:52:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 11:52:41 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for fe8b722bc9b47a17d5f552a84a7f0617e524915e (#1139)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "fe8b722bc9b47a17d5f552a84a7f0617e524915e",
      "tree": "b960f2f39ce18e0bea848d34073ba2df4e61a01a",
      "parents": [
        "a49cebfdd5c6e23f0ab8d65f50bf1a72f6108ec2"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Thu Jul 02 05:28:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 11:28:34 2026 +0200"
      },
      "message": "OPENNLP-1860: Unicode normalization engine — CharClass, rungs, Dimension, confusables (1a/7) (#1108)\n\n* Unicode normalization engine: CharClass, rungs, Dimension, confusables (1a/7)\n* For broader context, see epic: https://issues.apache.org/jira/browse/OPENNLP-1850"
    },
    {
      "commit": "a49cebfdd5c6e23f0ab8d65f50bf1a72f6108ec2",
      "tree": "2b34ca05a513ed6e3d19fd14ddea6801c8184ae4",
      "parents": [
        "ed0656642f90b315c2ae994834a249c5ea172753"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Mon Jun 29 19:29:58 2026 +0200"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jun 30 07:01:25 2026 +0200"
      },
      "message": "Add ASF allowlist-check workflow and require it via .asf.yaml\n\nRun apache/infrastructure-actions/allowlist-check on every PR and on pushes\nthat touch .github/**, so disallowed Actions (e.g. introduced via Dependabot\ngithub-actions updates) are caught before merge. Mark asf-allowlist-check as\na required status check for main and opennlp-2.x in .asf.yaml.\n"
    },
    {
      "commit": "ed0656642f90b315c2ae994834a249c5ea172753",
      "tree": "16804f414548d2e1043cf2c78e5ab1947497f620",
      "parents": [
        "f01f7a0a7f2554eb04ffcac869a3374c8a89282c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 29 03:43:35 2026 +0000"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jun 30 06:59:52 2026 +0200"
      },
      "message": "Bump actions/cache from 6.0.0 to 6.1.0\n\nBumps [actions/cache](https://github.com/actions/cache) from 6.0.0 to 6.1.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/2c8a9bd7457de244a408f35966fab2fb45fda9c8...55cc8345863c7cc4c66a329aec7e433d2d1c52a9)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "f01f7a0a7f2554eb04ffcac869a3374c8a89282c",
      "tree": "e9bfa1dab793d162a347fff3c8f170c7e12cf10a",
      "parents": [
        "dd97d8b942d1e0bf66aa54fc2f7c2b33a39d074d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jun 30 04:41:34 2026 +0000"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jun 30 06:59:38 2026 +0200"
      },
      "message": "Bump actions/setup-java from 5.3.0 to 5.4.0\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.3.0 to 5.4.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/ad2b38190b15e4d6bdf0c97fb4fca8412226d287...1bcf9fb12cf4aa7d266a90ae39939e61372fe520)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "dd97d8b942d1e0bf66aa54fc2f7c2b33a39d074d",
      "tree": "505749d68cc1727688f59d99633c293c6abfb864",
      "parents": [
        "d60f15a56e30e75172253a8e60ea13b4a3daba82"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 29 04:10:55 2026 +0000"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Jun 30 06:57:23 2026 +0200"
      },
      "message": "Bump org.apache:apache from 38 to 39\n\nBumps [org.apache:apache](https://github.com/apache/maven-apache-parent) from 38 to 39.\n- [Release notes](https://github.com/apache/maven-apache-parent/releases)\n- [Commits](https://github.com/apache/maven-apache-parent/commits)\n\n---\nupdated-dependencies:\n- dependency-name: org.apache:apache\n  dependency-version: \u002739\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "d60f15a56e30e75172253a8e60ea13b4a3daba82",
      "tree": "83211c7bcb3b2d4a61d15db5b4c259778c82786f",
      "parents": [
        "50861d8618722fdfbc8dcd2ed437ff6bde1f7908"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 29 04:10:47 2026 +0000"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Jun 30 06:56:51 2026 +0200"
      },
      "message": "Bump junit.version from 6.1.0 to 6.1.1\n\nBumps `junit.version` from 6.1.0 to 6.1.1.\n\nUpdates `org.junit.jupiter:junit-jupiter-api` from 6.1.0 to 6.1.1\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)\n\nUpdates `org.junit.jupiter:junit-jupiter-engine` from 6.1.0 to 6.1.1\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)\n\nUpdates `org.junit.jupiter:junit-jupiter-params` from 6.1.0 to 6.1.1\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.0...r6.1.1)\n\n---\nupdated-dependencies:\n- dependency-name: org.junit.jupiter:junit-jupiter-api\n  dependency-version: 6.1.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.junit.jupiter:junit-jupiter-engine\n  dependency-version: 6.1.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.junit.jupiter:junit-jupiter-params\n  dependency-version: 6.1.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "50861d8618722fdfbc8dcd2ed437ff6bde1f7908",
      "tree": "694ec2220d724b50e99a9c624c79f6f2fa31b89e",
      "parents": [
        "86d21301305f1ca4c7180a8c575604f6be790317"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Thu Jun 25 15:18:51 2026 +0200"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jun 30 06:40:08 2026 +0200"
      },
      "message": "Merge shell tests into the Java CI pipeline\n\nRun the shell (bats/Pester) tests as a stage after the regular build in\nmaven.yml instead of in a separate workflow that rebuilt OpenNLP from\nscratch on each OS.\n\nThe binary distribution is pure-Java and platform-independent, so it is\nnow built once (Ubuntu/JDK 21), uploaded as an artifact, and reused by the\nper-OS shell-test jobs via needs/download-artifact. This removes three\nredundant Maven builds per run.\n\nactions/upload-artifact and actions/download-artifact are in the actions/*\nnamespace, which is automatically allowed under the ASF GitHub Actions\npolicy, so no INFRA allowlist change is required.\n"
    },
    {
      "commit": "86d21301305f1ca4c7180a8c575604f6be790317",
      "tree": "88aece5f5ea98c0db3c802c701394657646005e1",
      "parents": [
        "879c16d99767e23501cd3127823ca04a71b7d584"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "martin.wiesner@hs-heilbronn.de",
        "time": "Thu Jun 25 13:40:47 2026 +0200"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jun 30 06:39:02 2026 +0200"
      },
      "message": "[maven-release-plugin] prepare for next development iteration\n"
    },
    {
      "commit": "879c16d99767e23501cd3127823ca04a71b7d584",
      "tree": "49db9babcf2bbc64b40d9c5c60ff0129cf748872",
      "parents": [
        "b2c0a901957bf27a5123731d02000fa4805679bf"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "martin.wiesner@hs-heilbronn.de",
        "time": "Thu Jun 25 13:40:43 2026 +0200"
      },
      "committer": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Tue Jun 30 06:39:02 2026 +0200"
      },
      "message": "[maven-release-plugin] prepare release opennlp-3.0.0-M4\n"
    },
    {
      "commit": "b2c0a901957bf27a5123731d02000fa4805679bf",
      "tree": "88aece5f5ea98c0db3c802c701394657646005e1",
      "parents": [
        "c3ce060c03c95e8b12344ab0f3075d78bc37b7f3"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Jun 25 13:34:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 13:34:14 2026 +0200"
      },
      "message": "OPENNLP-1854: Resolve DocBook DTD from local catalog instead of remote URL (#1117)"
    },
    {
      "commit": "c3ce060c03c95e8b12344ab0f3075d78bc37b7f3",
      "tree": "eb92e004ec5e095f07f755bfde79572b04cd26f1",
      "parents": [
        "f2f1cd2a8c79173bb38e2481e77143394f5c1344"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Thu Jun 25 09:40:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 09:40:32 2026 +0200"
      },
      "message": "Include APIdocs in assembly of binary distr (#1116)\n\n* Includes opennlp-spellcheck extension apidocs in assembly of binary distr files\n* Includes opennlp-ml-libsvm apidocs in assembly of binary distr files\n* Updates Dockerfile to ship with Java 21 alpine image"
    },
    {
      "commit": "f2f1cd2a8c79173bb38e2481e77143394f5c1344",
      "tree": "62b9648af7b9cc5f6cedd0b1df4ec713d5fdec55",
      "parents": [
        "6115b18c9ab3f1ad17c4184be509cabc7e677c32"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Thu Jun 25 07:58:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 07:58:31 2026 +0200"
      },
      "message": "Include opennlp-spellcheck extension in opennlp-distr aggregator (#1115)\n\n- Includes opennlp-spellcheck extension in opennlp-distr aggregator\n- Fine-tunes extension module names"
    },
    {
      "commit": "6115b18c9ab3f1ad17c4184be509cabc7e677c32",
      "tree": "af71655797a393747bbb03fbb9a34865eb27270e",
      "parents": [
        "30f127cf34b0f2726b73e57e3892a6aea41a131e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 24 11:56:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 11:56:11 2026 +0200"
      },
      "message": "Bump actions/cache from 5.0.5 to 6.0.0 (#1113)"
    },
    {
      "commit": "30f127cf34b0f2726b73e57e3892a6aea41a131e",
      "tree": "633905df84d44991ccbf2f65f96f0ec5532aeb11",
      "parents": [
        "6963b1cb2e06fbf65dc9ff2c4f97223d7bc4ebf8"
      ],
      "author": {
        "name": "Vasiliy Mikhailov",
        "email": "vasiliy-mikhailov@users.noreply.github.com",
        "time": "Tue Jun 23 02:02:02 2026 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 00:02:02 2026 +0200"
      },
      "message": "OPENNLP-1853: Extend DictionaryStopwordFilterTest towards edge cases (#1107)\n\nAdditive unit tests only - no existing test or production code changed."
    },
    {
      "commit": "6963b1cb2e06fbf65dc9ff2c4f97223d7bc4ebf8",
      "tree": "3e356ae19d03a4978feb47f6afe12bfb6cba8397",
      "parents": [
        "4dcf7eff4cee296d9fdd9bee28479b8716942bfa"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Sun Jun 21 04:22:09 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 21 10:22:09 2026 +0200"
      },
      "message": "OPENNLP-1851: Fix DocumentCategorizerDLEval.categorizeFailsLoudlyOnFailure (#1102)"
    },
    {
      "commit": "4dcf7eff4cee296d9fdd9bee28479b8716942bfa",
      "tree": "68fb404294a6005f7460cbbf9417af407b6db48c",
      "parents": [
        "758fcf4fdc560664becea9209ad78d34dd7c9ded"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jun 19 07:13:37 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 13:13:37 2026 +0200"
      },
      "message": "OPENNLP-1846: Fix NameFinderDL only worked with Person, expand to all types (#1086)\n\nNameFinderDL only decoded B-PER/I-PER and put the matched text in\nSpan.getType() instead of the entity label. Decode the BIO sequence\ngenerically and harden it:\n\n- Any B-\u003cTYPE\u003e begins a span whose type is the label minus the B- prefix\n  (B-ORG -\u003e ORG), extending while the following labels are I-\u003csame type\u003e.\n  Span.getType() now reports the entity label (PER, ORG, LOC, ...) and\n  ids2Labels fully drives recognition for any BIO-tagged model.\n- isBeginLabel() requires a non-empty type after \"B-\", so a malformed \"B-\"\n  label no longer starts an empty-type span. An argmax index with no entry\n  in ids2Labels fails loudly instead of being silently skipped.\n- Span.getProb() is now a numerically stable softmax over the token\u0027s label\n  scores (bounded to [0,1]) instead of the raw max logit; handles +Inf,\n  all-(-Inf) and NaN edge cases.\n- find() inference is fail-loud and consistent with the sibling\n  DocumentCategorizerDL: failures surface as IllegalStateException (cause\n  preserved) and an unexpected/empty model-output shape is its own loud\n  failure, rather than a bare RuntimeException or raw ClassCastException.\n- Floor the character-search cursor at each sentence\u0027s start (via\n  sentPosDetect) and thread it forward across that sentence\u0027s chunks, so a\n  repeated entity surface form is located at its own occurrence instead of\n  being re-matched against an earlier one -- which previously emitted\n  duplicate or mis-located spans for multi-sentence/multi-chunk input.\n- Span text reconstruction matches the source with flexible whitespace\n  (\\s*), so entities whose wordpiece tokenization splits internal\n  punctuation or \"\u0026\" apart (U.S.A, AT\u0026T) are still located instead of\n  silently dropped.\n- Remove the now-unused SpanEnd record.\n- Extract decodeSpans()/predictLabel()/findEntityEnd()/buildSpanText() and\n  expose labelProbability()/maxIndex() for unit testing without an ONNX\n  model; add NameFinderDLTest coverage for entity types, bounded and\n  edge-case probabilities, malformed begin labels, wordpiece\n  reconstruction, internal-punctuation and case-insensitive matching,\n  missing labels, and cursor-threaded span location.\n- Reconcile the OPENNLP-1844 concurrency/snapshot eval tests with the new\n  all-types output (the George-Washington input now yields PER + LOC) and\n  assert span types and covered text.\n\nKeep unmapped label ids graceful, bound decoded span lookup to the current sentence, add diagnostics for unlocated decoded spans, and tighten exception types/messages plus helper documentation.\n\nMake the public no-space token constants immutable (Set.of instead of\nmutable arrays) while keeping them public for third-party use.\n\nFail loud on an unmapped model output index: predictLabel now throws an\nIllegalStateException naming the index instead of degrading the token to\n\"O\", and the constructors document that ids2Labels must be exhaustive over\nthe model\u0027s output indices. Also document the IllegalArgumentException that\nfind() can raise on a vocabulary/model mismatch.\n\nAdd edge-case decoding tests: token/score count mismatch, orphan I- labels,\nadjacent entities of different types, multi-token minimum-probability\nsemantics, repeated entities at distinct offsets within one call, regex\nmetacharacters in span text, and search-start clamping past end of text."
    },
    {
      "commit": "758fcf4fdc560664becea9209ad78d34dd7c9ded",
      "tree": "5b0569e785694f35e62f144c65d6dfc102484433",
      "parents": [
        "39d8cb6b907d748aba241f035a32f0b345ddcc4f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jun 19 07:55:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 07:55:22 2026 +0200"
      },
      "message": "Bump actions/checkout from 6.0.3 to 7.0.0 (#1098)"
    },
    {
      "commit": "39d8cb6b907d748aba241f035a32f0b345ddcc4f",
      "tree": "ba30cf386e19274e2655315861ee223c13fd6b11",
      "parents": [
        "136633b4b04a8557918443451d20f6ccd2450b6d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 17 12:57:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 12:57:45 2026 +0200"
      },
      "message": "Bump actions/setup-java from 5.2.0 to 5.3.0 (#1096)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.2.0 to 5.3.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/be666c2fcd27ec809703dec50e508c2fdc7f6654...ad2b38190b15e4d6bdf0c97fb4fca8412226d287)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "136633b4b04a8557918443451d20f6ccd2450b6d",
      "tree": "e100fcf835ac1a143d753fd6496f54c1bd01f38b",
      "parents": [
        "288ecd6f3e159e32330f0d2a15f69f125c7216ca"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Tue Jun 16 08:07:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 08:07:14 2026 -0400"
      },
      "message": "OPENNLP-1844 - Make opennlp-dl components thread-safe (#1084)\n\nMerging then prepping for 1086 -"
    },
    {
      "commit": "288ecd6f3e159e32330f0d2a15f69f125c7216ca",
      "tree": "a4101fdac2ea8ba379f2977ba7439f74a59e4907",
      "parents": [
        "889ceab12a932d26214cbec524d684589a370ca1"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Tue Jun 16 11:35:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 11:35:07 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 36f4eb5bd7ee6859d912c730c0b524b9cb343bcc (#1093)"
    },
    {
      "commit": "889ceab12a932d26214cbec524d684589a370ca1",
      "tree": "6c3cee1f5fcf109bfe7dd4376e92a1d714bb4347",
      "parents": [
        "36f4eb5bd7ee6859d912c730c0b524b9cb343bcc"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Tue Jun 16 05:34:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 11:34:31 2026 +0200"
      },
      "message": "OPENNLP-1845: Fix numerically unstable softmax in DocumentCategorizerDL (#1085)\n\n* Fix DocumentCategorizerDL softmax and error result handling\n\n* Fail loudly instead of 0 result"
    },
    {
      "commit": "36f4eb5bd7ee6859d912c730c0b524b9cb343bcc",
      "tree": "e5793edb0ba4dd6c336b4dc9c4ceae84e4747a1f",
      "parents": [
        "4af83ca9e2aa24c507f52ebac97dc3c2c5079d9d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jun 16 10:18:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 10:18:41 2026 +0200"
      },
      "message": "OPENNLP-1849: Update junit5-system-exit to 2.0.3 (#1089)\n\nBumps [com.ginsberg:junit5-system-exit](https://github.com/tginsberg/junit5-system-exit) from 2.0.2 to 2.0.3.\n- [Release notes](https://github.com/tginsberg/junit5-system-exit/releases)\n- [Changelog](https://github.com/tginsberg/junit5-system-exit/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/tginsberg/junit5-system-exit/compare/v2.0.2...v2.0.3)\n\n---\nupdated-dependencies:\n- dependency-name: com.ginsberg:junit5-system-exit\n  dependency-version: 2.0.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4af83ca9e2aa24c507f52ebac97dc3c2c5079d9d",
      "tree": "95228fbf4101082181a30e4260fa99268d54eef7",
      "parents": [
        "9ebcaaa2367ebf0725f4c489c877fdd9da4d1ed7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jun 16 10:13:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 10:13:37 2026 +0200"
      },
      "message": "OPENNLP-1848: Update Morfologik to 2.2.0 (#1087)\n\nBumps `morfologik.version` from 2.1.9 to 2.2.0.\n\nUpdates `org.carrot2:morfologik-stemming` from 2.1.9 to 2.2.0\n- [Release notes](https://github.com/morfologik/morfologik-stemming/releases)\n- [Changelog](https://github.com/morfologik/morfologik-stemming/blob/master/CHANGES.txt)\n- [Commits](https://github.com/morfologik/morfologik-stemming/compare/2.1.9...2.2.0)\n\nUpdates `org.carrot2:morfologik-tools` from 2.1.9 to 2.2.0\n- [Release notes](https://github.com/morfologik/morfologik-stemming/releases)\n- [Changelog](https://github.com/morfologik/morfologik-stemming/blob/master/CHANGES.txt)\n- [Commits](https://github.com/morfologik/morfologik-stemming/compare/2.1.9...2.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.carrot2:morfologik-stemming\n  dependency-version: 2.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.carrot2:morfologik-tools\n  dependency-version: 2.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9ebcaaa2367ebf0725f4c489c877fdd9da4d1ed7",
      "tree": "bd5f7ea0ef3020d612a4044b619c787a2b682d89",
      "parents": [
        "f1044a02392bd5ce3c2a05a95f9a8f3ae95770c9"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Sat Jun 13 15:16:30 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 21:16:30 2026 +0200"
      },
      "message": "OPENNLP-1838: Adopt BertTokenizer in opennlp-dl components (#1075)"
    },
    {
      "commit": "f1044a02392bd5ce3c2a05a95f9a8f3ae95770c9",
      "tree": "a33d988e67e7a545cce58d969b0aea7243d9b96d",
      "parents": [
        "97c77b72c463a05b674f17eec47bae843198b820"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jun 12 16:06:16 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 22:06:16 2026 +0200"
      },
      "message": "OPENNLP-1843: Override surefire skip so eval tests run again (#1082)\n\nThe base build of opennlp-eval-tests disables surefire with skip\u003dtrue,\nand neither the eval-tests nor the high-memory-tests profile sets it\nback to false. Maven merges the profile configuration into the base\nconfiguration, so the module compiled its eval sources but executed\nzero tests, even with -Peval-tests. Set skip\u003dfalse in both profiles."
    },
    {
      "commit": "97c77b72c463a05b674f17eec47bae843198b820",
      "tree": "0c3126d4efa2c9ca950ff87d28275c2a136761c8",
      "parents": [
        "aaf1b1fc43d1ededa9ab469befcaa457bc31978c"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jun 12 10:02:46 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 16:02:46 2026 +0200"
      },
      "message": "OPENNLP-1836: Fix input encoding in SentenceVectorsDL (#1072)\n\n* OPENNLP-1836 - Fix input encoding in SentenceVectorsDL\n\nSentenceVectorsDL sent an all-zero attention_mask and all-one\ntoken_type_ids, so the model attended to nothing. Use the standard\nsingle-segment BERT encoding (mask\u003d1, types\u003d0), consistent with\nDocumentCategorizerDL. Also close OnnxTensor/Result resources, replace\nthe NPE on a vocabulary miss with a descriptive exception, add a unit\ntest for the encoding, and update the eval test expectations (verified\nagainst the same MiniLM ONNX export). Vectors produced by the previous\nencoding are not comparable with the corrected output.\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* OPENNLP-1836 - Document breaking vector change in SentenceVectorsDL Javadoc\n\nAdd a release-note paragraph so downstream users know persisted embeddings\nfrom the previous encoding must be re-embedded. Addresses review on #1072.\n\n* OPENNLP-1836 - Document provenance of expected eval vector values\n\nThe pinned values are the [CLS]-position hidden state of the\nall-MiniLM-L6-v2 ONNX export and can be reproduced independently with\nthe HuggingFace tokenizers and onnxruntime Python packages; the comment\nincludes the recipe.\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "aaf1b1fc43d1ededa9ab469befcaa457bc31978c",
      "tree": "ffddb92f6293288b9cec5cf7f73803f215108d33",
      "parents": [
        "b6af87589770ca8c39ef94d2726a21cad6d9f32f"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jun 12 08:19:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 14:19:48 2026 +0200"
      },
      "message": "OPENNLP-1840: Fix native memory leak and vocabulary NPE in NameFinderDL (#1076)\n\nEvery find() call leaked the OnnxTensor inputs and the OrtSession.Result\nfor each sentence chunk. Tensors are now closed in a finally block and\nthe result with try-with-resources.\n\nTokens absent from the vocabulary caused an opaque NullPointerException\nthrough auto-unboxing. The token-to-id mapping now throws\nIllegalArgumentException naming the missing token, indicating a\nvocabulary/model mismatch."
    },
    {
      "commit": "b6af87589770ca8c39ef94d2726a21cad6d9f32f",
      "tree": "3223a37519a773068dc0565c084c13b1b55fb712",
      "parents": [
        "e7e1189b4350b18e850557b5034209d6058a9124"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jun 12 08:04:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 14:04:24 2026 +0200"
      },
      "message": "OPENNLP-1839 : Fix native memory leak and vocabulary NPE in DocumentCategorizerDL (#1074)\n\nEvery categorize() call leaked the OnnxTensor inputs and the\nOrtSession.Result for each document chunk. Tensors are now closed in a\nfinally block and the result with try-with-resources.\n\nTokens absent from the vocabulary caused an opaque NullPointerException\nthrough auto-unboxing, which the broad catch in categorize() swallowed.\nThe token-to-id mapping now throws IllegalArgumentException naming the\nmissing token, indicating a vocabulary/model mismatch."
    },
    {
      "commit": "e7e1189b4350b18e850557b5034209d6058a9124",
      "tree": "a176b175154fece41b8fcaaa188863ea8a2943f8",
      "parents": [
        "8649b6ba3f173b33fa7b2404a7a33313f56d0655"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "krickert@gmail.com",
        "time": "Fri Jun 12 07:52:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 13:52:31 2026 +0200"
      },
      "message": "OPENNLP-1837: Add BertTokenizer with BERT basic tokenization (#1073)\n\n* OPENNLP-1837 - Add BertTokenizer with BERT basic tokenization\n\nWordpieceTokenizer performs only the wordpiece stage, so uncased models\nmap every capitalized or accented word to the unknown token. The new\nBertTokenizer adds the missing normalization stage: control character\ncleanup, whitespace normalization, CJK isolation, optional lower casing\nwith accent stripping, and per-character punctuation splitting.\n\nAlso fixes three WordpieceTokenizer defects: punctuation runs were\nsplit as one token, partially matched words emitted prefix pieces\ninstead of a single unknown token, and tokenizePos returned null.\n\n* Potential fix for pull request finding\n\nLGTM\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* OPENNLP-1837 - Address review comments\n\nTreat all C* categories as control characters matching the reference\nimplementation, hoist shared character predicates into a package-private\nBertNormalization helper, validate constructor arguments, and document\nthe WordpieceTokenizer behavior changes.\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "8649b6ba3f173b33fa7b2404a7a33313f56d0655",
      "tree": "64ab8b27419cc8f76f2ceae2c587cb1bb4b2b933",
      "parents": [
        "d37cc36f3ee6b62ca15afc647837b7f2c6882049"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Fri Jun 12 13:42:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 13:42:05 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for d37cc36f3ee6b62ca15afc647837b7f2c6882049 (#1077)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "d37cc36f3ee6b62ca15afc647837b7f2c6882049",
      "tree": "1ea7ac0a203468b490171287604ba745451dc168",
      "parents": [
        "522e5dca8dd437680fbf2903c3943ccc4fe41657"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Jun 12 13:39:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 13:39:43 2026 +0200"
      },
      "message": "OPENNLP-1832: Add SymSpell-based SpellChecker component (#1057)\n\n* OPENNLP-1832: Add SymSpell-based SpellChecker component\n\nAdd a native, language-agnostic spell-correction component backed by the\nSymSpell (Symmetric Delete) algorithm as a new opennlp-spellcheck module\nunder opennlp-extensions.\n\n- SpellChecker API: lookup with TOP/CLOSEST/ALL verbosity and a configurable\n  maximum edit distance, plus context-aware lookupCompound (handles split,\n  merged and misspelled words) following the SymSpell reference and backed by\n  a bigram dictionary\n- SymSpell engine with a precomputed delete index and a pluggable edit\n  distance (Damerau-OSA default, Apache Commons Text Levenshtein alternative)\n- Configurable Naive-Bayes corpus size N (SymSpellConfig.corpusWordCount,\n  derived from the dictionary by default), persisted in the model\n- Serializable model (SerializableArtifact/ArtifactSerializer) with\n  model.properties for classpath model-resolver loading of\n  opennlp-models-spellcheck-{lang} artifacts; the resolver verifies model.sha256\n- Frequency-dictionary loaders for the SymSpell text format (unigram and\n  bigram, whitespace-separated, tolerant of a UTF-8 byte-order mark)\n- Pipeline integration: SpellCheckingCharSequenceNormalizer and\n  FilterObjectStream adapters (line- and token-level)\n- Command-line tools: SpellCheckModelBuilder and CorrectText (with a -suggest\n  mode that lists candidates honoring -verbosity)\n- ArgumentParser: support Long parameter return types\n- Unit tests plus an opennlp-eval-tests benchmark reporting a correction\n  confusion matrix, an edit-distance sweep, a Damerau-OSA vs Levenshtein\n  comparison, lookup throughput, and bigram-backed compound accuracy\n- Manual chapter, README/project-structure updates, and NOTICE/licensing\n\n* Fix TempDir issue in Windows tests (similar how OpenNLP handles it elsewhere)\n\n* Fix TempDir issue in Windows tests (similar how OpenNLP handles it elsewhere)\n\n* OPENNLP-1832: Drop package-info.java files from spellcheck module\n\n* OPENNLP-1832: Address review feedback on SpellChecker component\n\n- Drop the commons-text dependency: replace the LevenshteinDistance adapter\n  with an in-house bounded, code-point-aware implementation (now consistent\n  with DamerauOSADistance); remove commons-text from both poms.\n- Share code-point/min3 helpers between the two metrics via CodePoints.\n- Throw IllegalArgumentException (not NPE) for null inputs in the distance\n  metrics, for consistency with the max-parameter check; update test.\n- Document parameter checks via @throws across EditDistance, SpellChecker,\n  SymSpell, SymSpellConfig and SpellCorrectingTokenStream; clarify max\u003d0\n  semantics and blank-String handling.\n- Add @see links to the SymSpell reference implementation on SymSpellConfig\n  and Verbosity; add constructor Javadoc on SymSpell."
    },
    {
      "commit": "522e5dca8dd437680fbf2903c3943ccc4fe41657",
      "tree": "46359996db48eed19f0cb2ead6d36bf9d94c9d78",
      "parents": [
        "a3aae11b8b0533621fe848b4b86e09172f054c0d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 08 08:30:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 08:30:24 2026 -0400"
      },
      "message": "Bump org.jacoco:jacoco-maven-plugin from 0.8.14 to 0.8.15 (#1071)\n\nBumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.14 to 0.8.15.\n- [Release notes](https://github.com/jacoco/jacoco/releases)\n- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.14...v0.8.15)\n\n---\nupdated-dependencies:\n- dependency-name: org.jacoco:jacoco-maven-plugin\n  dependency-version: 0.8.15\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a3aae11b8b0533621fe848b4b86e09172f054c0d",
      "tree": "eafd0e11443beff3c121b907f3cfa211d7f745f8",
      "parents": [
        "a811e9ed40fe2a69a0c3f56d0b97324c0155d55a"
      ],
      "author": {
        "name": "Artem Smirnov",
        "email": "artem@smirnov.page",
        "time": "Fri Jun 05 14:46:21 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 13:46:21 2026 +0200"
      },
      "message": "OPENNLP-1835: Tolerate unsupported XML parser security options (#1067)"
    },
    {
      "commit": "a811e9ed40fe2a69a0c3f56d0b97324c0155d55a",
      "tree": "b17031227a35f4a0c8d45974de9e87973518f590",
      "parents": [
        "ac93115ef10bb3f70f5c4425837f8e7dc7a57e7a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jun 05 13:35:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 13:35:18 2026 +0200"
      },
      "message": "Bump actions/checkout from 6.0.2 to 6.0.3 (#1068)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ac93115ef10bb3f70f5c4425837f8e7dc7a57e7a",
      "tree": "8ef48dd99b3a528290139e88c11df85a9ddc7091",
      "parents": [
        "d9170d633ffee268434dafdb8851c3fe720b4121"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Jun 01 21:01:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 21:01:25 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for d9170d633ffee268434dafdb8851c3fe720b4121 (#1062)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "d9170d633ffee268434dafdb8851c3fe720b4121",
      "tree": "378e18f5bc8f6c154dcb0cbc13828d105fd134de",
      "parents": [
        "7235b2584031bf323964bf8968d45ec986063b58"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 01 12:52:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 12:52:29 2026 +0200"
      },
      "message": "Bump org.apache.maven.plugins:maven-failsafe-plugin from 3.5.5 to 3.5.6 (#1063)"
    },
    {
      "commit": "7235b2584031bf323964bf8968d45ec986063b58",
      "tree": "239f9f9b599788897d04a78effe96355e6bbf11d",
      "parents": [
        "d0328be075ed32f03c8d5fc566ee58d73e3af8ee"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 01 08:48:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 08:48:12 2026 +0200"
      },
      "message": "OPENNLP-1834: Update JUnit to 6.1.0 (#1061)\n\nBumps `junit.version` from 6.0.3 to 6.1.0.\n\nUpdates `org.junit.jupiter:junit-jupiter-api` from 6.0.3 to 6.1.0\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0)\n\nUpdates `org.junit.jupiter:junit-jupiter-engine` from 6.0.3 to 6.1.0\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0)\n\nUpdates `org.junit.jupiter:junit-jupiter-params` from 6.0.3 to 6.1.0\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.junit.jupiter:junit-jupiter-api\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.junit.jupiter:junit-jupiter-engine\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.junit.jupiter:junit-jupiter-params\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d0328be075ed32f03c8d5fc566ee58d73e3af8ee",
      "tree": "1573da6caffe7be797db4e77381268c3837f5d38",
      "parents": [
        "40cb9bc37283af60d89e78c25746a7123efe0628"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri May 29 19:03:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 19:03:23 2026 +0200"
      },
      "message": "OPENNLP-660: Template needs to hold the NOTICE content too (#1059)"
    },
    {
      "commit": "40cb9bc37283af60d89e78c25746a7123efe0628",
      "tree": "787cc83bdaac4cb94ceaff2e741407ebc79623c7",
      "parents": [
        "3b436f3bb6c73e16a984c6881df5e81443ac8097"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sun May 24 13:10:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 13:10:28 2026 +0200"
      },
      "message": "OPENNLP-660: Include list of stop words for various languages (#1056)\n\n* OPENNLP-660: Include list of stop words for various languages\n\nAdds an immutable, thread-safe StopwordFilter API with bundled 1-gram lists\nfor 11 languages (bg, da, de, en, es, fi, fr, it, nl, pt, ru) derived from\nApache Lucene snowball; original copyright headers preserved verbatim and\nattributed in NOTICE. n-gram support via greedy longest-first window scan,\nplus a StopwordFilteringTokenizer decorator, a StopwordFilterStream, and a\nnew \"opennlp StopwordFilter \u003clang\u003e\" CLI tool. Docs chapter included.\n\n* OPENNLP-660: Address review comments\n\n- Expand Finnish (fi.txt) Snowball paradigm rows to one token per line so\n  each pronoun/determiner form is registered as an individual stopword.\n- Apply the same greedy longest-match window scan in\n  StopwordFilteringTokenizer.tokenizePos so n-gram entries are dropped\n  consistently across tokenize, tokenizePos and StopwordFilterStream.\n- Cache bundled, immutable filters per normalized language code in\n  StopwordLists.forLanguage to avoid re-parsing the resource on every call.\n- Precompute the ISO 639-3 to 639-1 lookup once at class init instead of\n  scanning Locale.getAvailableLocales() on each call.\n- Add a BSD-license entry for the bundled stopword lists to LICENSE.\n- Add tests covering the Finnish forms, the cache, and the Span-based\n  multi-word handling.\n\n* OPENNLP-660: Address further review comments\n\n- StopwordFilterTool CLI now accepts either a bundled ISO 639 code or a path\n  to a custom stopword list file (bundled code takes precedence; tokens are\n  still read from stdin). Update help text and the DocBook CLI section.\n- Drop the unused boolean parameter from the private DictionaryStopwordFilter\n  constructor by removing it and having Builder.build() use the public\n  constructor.\n- Correct the DocBook note that wrongly stated the bundled lists are\n  Apache-2.0 licensed; they retain their original BSD license.\n- Add CLI tests for the custom-list file path and the unknown source error."
    },
    {
      "commit": "3b436f3bb6c73e16a984c6881df5e81443ac8097",
      "tree": "95bd7a8ce24afa1fcba2f571af3f17e1861fc87b",
      "parents": [
        "736cc29e4c49825d454d23d6d99c13ed797f36a7"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Tue May 19 07:49:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 07:49:49 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 736cc29e4c49825d454d23d6d99c13ed797f36a7 (#1055)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "736cc29e4c49825d454d23d6d99c13ed797f36a7",
      "tree": "f59a6771440ffdc6343e8b52c070c068801152b8",
      "parents": [
        "a46fef49641916df5774ca1c516d4f65eaf18d50"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue May 19 07:11:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 07:11:49 2026 +0200"
      },
      "message": "OPENNLP-1827: Update log4j2 to 2.26.0 (#1049)\n\nBumps org.apache.logging.log4j:log4j-slf4j2-impl from 2.25.4 to 2.26.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.logging.log4j:log4j-slf4j2-impl\n  dependency-version: 2.26.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a46fef49641916df5774ca1c516d4f65eaf18d50",
      "tree": "26727acab632be04a363c3dc1d64fbc2175e54ea",
      "parents": [
        "d7e17cef170ee9910594ff0e689e70b97f2018bd"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon May 18 11:09:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 11:09:27 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for d7e17cef170ee9910594ff0e689e70b97f2018bd (#1052)"
    },
    {
      "commit": "d7e17cef170ee9910594ff0e689e70b97f2018bd",
      "tree": "da579f0b353d926560318cdeefacd8d3614a9c12",
      "parents": [
        "12b7b196cf434cecbf7ad87b5a57dea4c6324e48"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 18 10:25:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 10:25:53 2026 +0200"
      },
      "message": "OPENNLP-1824: Update ONNX runtime to 1.26.0 (#1046)\n\nBumps `onnxruntime.version` from 1.25.1 to 1.26.0.\n\nUpdates `com.microsoft.onnxruntime:onnxruntime` from 1.25.1 to 1.26.0\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseManagement.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.25.1...v1.26.0)\n\nUpdates `com.microsoft.onnxruntime:onnxruntime_gpu` from 1.25.1 to 1.26.0\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseManagement.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.25.1...v1.26.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.microsoft.onnxruntime:onnxruntime\n  dependency-version: 1.26.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n- dependency-name: com.microsoft.onnxruntime:onnxruntime_gpu\n  dependency-version: 1.26.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "12b7b196cf434cecbf7ad87b5a57dea4c6324e48",
      "tree": "d8cc3b2e3fa8b25ea7344a662dfc70f76d8a9115",
      "parents": [
        "531be81ca125bb195d93d033420fa685dcee801d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 18 09:30:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:30:49 2026 +0200"
      },
      "message": "Bump com.ruleoftech:markdown-page-generator-plugin to 2.5.2 (#1051)\n\nBumps [com.ruleoftech:markdown-page-generator-plugin](https://github.com/walokra/markdown-page-generator-plugin) from 2.4.3 to 2.5.2.\n- [Release notes](https://github.com/walokra/markdown-page-generator-plugin/releases)\n- [Changelog](https://github.com/walokra/markdown-page-generator-plugin/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/walokra/markdown-page-generator-plugin/compare/2.4.3...2.5.2)\n\n---\nupdated-dependencies:\n- dependency-name: com.ruleoftech:markdown-page-generator-plugin\n  dependency-version: 2.5.2\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "531be81ca125bb195d93d033420fa685dcee801d",
      "tree": "3ad1dc93ba2c54d8024f9da0a83c8d03ba705eaf",
      "parents": [
        "10068de47fec65427223abbec9986b5527bce4b2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 18 09:21:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:21:39 2026 +0200"
      },
      "message": "OPENNLP-1831: Update Slf4j to 2.0.18 (#1050)\n\nBumps `slf4j.version` from 2.0.17 to 2.0.18.\n\nUpdates `org.slf4j:slf4j-api` from 2.0.17 to 2.0.18\n\nUpdates `org.slf4j:slf4j-simple` from 2.0.17 to 2.0.18\n\n---\nupdated-dependencies:\n- dependency-name: org.slf4j:slf4j-api\n  dependency-version: 2.0.18\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n- dependency-name: org.slf4j:slf4j-simple\n  dependency-version: 2.0.18\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "10068de47fec65427223abbec9986b5527bce4b2",
      "tree": "e382638e3e9211bdc4c3d3c7ad2d2a65f6edfcee",
      "parents": [
        "054c884ac409c7476ce6a82e8b759efa1bd12683"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 18 09:15:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:15:18 2026 +0200"
      },
      "message": "OPENNLP-1828: Move to Apache Parent 38 (#1048)\n\nBumps [org.apache:apache](https://github.com/apache/maven-apache-parent) from 37 to 38.\n- [Release notes](https://github.com/apache/maven-apache-parent/releases)\n- [Commits](https://github.com/apache/maven-apache-parent/commits)\n\n---\nupdated-dependencies:\n- dependency-name: org.apache:apache\n  dependency-version: \u002738\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "054c884ac409c7476ce6a82e8b759efa1bd12683",
      "tree": "8c535da620fbcc672f494e30f9117182148b33f0",
      "parents": [
        "77393307fcdc36d519e3377d63354243e5dbfb71"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Fri May 15 17:23:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 17:23:37 2026 +0200"
      },
      "message": "OPENNLP-1829: Transfer DirectoryModelFinder to OpenNLP core (#1045)"
    },
    {
      "commit": "77393307fcdc36d519e3377d63354243e5dbfb71",
      "tree": "7f4a862a3f4133196d54c701003e6b8b9f27355d",
      "parents": [
        "e19116ae7be18a2da319fe806afcf2aa2d4375e3"
      ],
      "author": {
        "name": "subbudvk",
        "email": "115633743+subbudvk@users.noreply.github.com",
        "time": "Sat May 09 00:24:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 20:54:41 2026 +0200"
      },
      "message": "OPENNLP-1826 : Prevent OOM during Array Allocation (#1035)\n\n* Prevent OOM due to Array Allocation\n\n* Prevent OOM due to Array Allocation\n\n* Prevent OOM due to Array Allocation\n\n* Prevent OOM due to Array Allocation\n\n* Prevent OOM due to Array Allocation\n\n* Prevent OOM due to Array Allocation"
    },
    {
      "commit": "e19116ae7be18a2da319fe806afcf2aa2d4375e3",
      "tree": "a7cabe79263b39566dc175994152e9c002302d0b",
      "parents": [
        "f7febfa9723549651d15d2a3a657dbf13f69adbe"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Tue May 05 12:41:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 12:41:00 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for f7febfa9723549651d15d2a3a657dbf13f69adbe (#1033)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: mawiesne \u003cmawiesne@users.noreply.github.com\u003e"
    },
    {
      "commit": "f7febfa9723549651d15d2a3a657dbf13f69adbe",
      "tree": "6151dbe5710b80cda62ce3c408fe87ec8eb7c416",
      "parents": [
        "3cf42d4a0145cefd9dd06138873a91312052c767"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue May 05 11:45:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 11:45:36 2026 +0200"
      },
      "message": "OPENNLP-1824: Update ONNX runtime to 1.25.1 (#1031)\n\nBumps `onnxruntime.version` from 1.25.0 to 1.25.1.\n\nUpdates `com.microsoft.onnxruntime:onnxruntime` from 1.25.0 to 1.25.1\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseManagement.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.25.0...v1.25.1)\n\nUpdates `com.microsoft.onnxruntime:onnxruntime_gpu` from 1.25.0 to 1.25.1\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseManagement.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.25.0...v1.25.1)\n\n---\nupdated-dependencies:\n- dependency-name: com.microsoft.onnxruntime:onnxruntime\n  dependency-version: 1.25.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n- dependency-name: com.microsoft.onnxruntime:onnxruntime_gpu\n  dependency-version: 1.25.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3cf42d4a0145cefd9dd06138873a91312052c767",
      "tree": "c64ca7455b6b9e833723e8f8df3294dbf20106e8",
      "parents": [
        "3cb7232ecaccc788e32bf76b7c031fb166840da5"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat May 02 16:58:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 16:58:43 2026 +0200"
      },
      "message": "OPENNLP-1823: Harden SvmDoccatModel.deserialize() with ObjectInputFilter and resource limits (#1029)\n\n* OPENNLP-1823: Harden SvmDoccatModel.deserialize() with ObjectInputFilter and resource limits\n\nApply a JEP 290 ObjectInputFilter to SvmDoccatModel.deserialize() that\nallow-lists only the classes reachable from a legitimate model graph and\nbounds graph depth, references, and array length. Foreign payloads are\nnow rejected with InvalidClassException before readObject() returns,\nrather than after the cast.\n\nAdd a public DeserializationLimits record and a\ndeserialize(InputStream, DeserializationLimits) overload so callers with\nunusually large models can raise the resource limits without touching\nthe class allow-list. The original deserialize(InputStream) signature is\npreserved and now delegates to DeserializationLimits.DEFAULT.\n\n* OPENNLP-1823: Add null-stream tests for SvmDoccatModel.deserialize() overloads\n\n* OPENNLP-1823: Reject null streams with IllegalArgumentException and clarify allow-list comment\n\nValidate stream and limits arguments to SvmDoccatModel.serialize() and\nSvmDoccatModel.deserialize() up front and throw IllegalArgumentException\nfor null inputs instead of letting a NullPointerException surface from\ninside the JDK stream constructors. Document the contract on each\nmethod\u0027s Javadoc.\n\nUpdate the comment on the JDK section of the deserialization filter\nallow-list to explain why the abstract supertypes java.lang.Number and\njava.lang.Enum must remain on the list — ObjectInputStream invokes the\nfilter for every class descriptor in the inheritance chain, not only\nfor the runtime class."
    },
    {
      "commit": "3cb7232ecaccc788e32bf76b7c031fb166840da5",
      "tree": "b78dd469a498b5212acac63d4d6f046e28946dbe",
      "parents": [
        "d1fd64b580c669c4765fa445fd09e8688e3da5b2"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Tue Apr 28 10:54:59 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri May 01 19:37:32 2026 +0200"
      },
      "message": "[maven-release-plugin] prepare for next development iteration\n"
    },
    {
      "commit": "d1fd64b580c669c4765fa445fd09e8688e3da5b2",
      "tree": "09b20d7c1249a5524acc13d179a5698f25575864",
      "parents": [
        "ce36b401c14f2bd8cf67bdd3dd20d66e48d776e4"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Tue Apr 28 10:54:55 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri May 01 19:37:32 2026 +0200"
      },
      "message": "[maven-release-plugin] prepare release opennlp-3.0.0-M3\n"
    },
    {
      "commit": "ce36b401c14f2bd8cf67bdd3dd20d66e48d776e4",
      "tree": "b78dd469a498b5212acac63d4d6f046e28946dbe",
      "parents": [
        "1d740060ba5d4bbe20ffeb036fe7757666042d50"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Tue Apr 28 10:50:48 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri May 01 19:37:32 2026 +0200"
      },
      "message": "Remove module on active profile as it confuses maven release plugin.\n"
    },
    {
      "commit": "1d740060ba5d4bbe20ffeb036fe7757666042d50",
      "tree": "81e0cbb1e04aca4d098b661693dbe3032f2db794",
      "parents": [
        "2e1d40bcd1d206fb6f4fd06f70f9e48037e9c06b"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Tue Apr 28 10:40:24 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri May 01 19:37:32 2026 +0200"
      },
      "message": "Add eval-tests to preparation profile\n"
    },
    {
      "commit": "2e1d40bcd1d206fb6f4fd06f70f9e48037e9c06b",
      "tree": "df285532ef3887dc96aa8548fbfbff5867cd7dbe",
      "parents": [
        "6da32a6e72c0436074afc77de5db8da8b3b3f972"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "rzo1@apache.org",
        "time": "Tue Apr 28 10:29:17 2026 +0200"
      },
      "committer": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri May 01 19:37:32 2026 +0200"
      },
      "message": "Make checkstyle config path absolute and skip deploy/install for eval-tests\n\nResolve checkstyle.xml via ${maven.multiModuleProjectDirectory} so the\nplugin finds it from any sub-module (notably during release:prepare\nwhich forks Maven). Also mark opennlp-eval-tests as skip-deploy and\nskip-install so the module is built/checked but not published, while\nkeeping its parent version aligned during release.\n"
    }
  ],
  "next": "6da32a6e72c0436074afc77de5db8da8b3b3f972"
}
