)]}'
{
  "log": [
    {
      "commit": "95695633b580a445617a791f05a02b61b65b3b74",
      "tree": "a92f219296ca4618200eb6200fa0f893b7eacf79",
      "parents": [
        "cbd43d5ca28bfe9eab4cd9040890e25eb060f34a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Oct 24 19:50:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 19:50:20 2026 +0200"
      },
      "message": "Bump io.github.hakky54:logcaptor from 2.12.7 to 2.13.0 (#1510)\n\nBumps [io.github.hakky54:logcaptor](https://github.com/Hakky54/log-captor) from 2.12.7 to 2.13.0.\n- [Changelog](https://github.com/Hakky54/log-captor/blob/master/CHANGELOG.MD)\n- [Commits](https://github.com/Hakky54/log-captor/compare/v2.12.7...v2.13.0)\n\n---\nupdated-dependencies:\n- dependency-name: io.github.hakky54:logcaptor\n  dependency-version: 2.13.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": "cbd43d5ca28bfe9eab4cd9040890e25eb060f34a",
      "tree": "c852a52fb959ae29e8732347e71e1aa4ef4ad3d3",
      "parents": [
        "5807d75b0ba43a4ad7c685678f6b2287a2d53c4b"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Fri Oct 23 09:59:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 09:59:37 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 5807d75b0ba43a4ad7c685678f6b2287a2d53c4b (#1504)"
    },
    {
      "commit": "5807d75b0ba43a4ad7c685678f6b2287a2d53c4b",
      "tree": "5978fc9554edf82ce46116c63b29eda3f5a64e3e",
      "parents": [
        "0e95db1ce38d2c4e220d9beb4e8ed461d70e4d9b"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Thu Oct 22 04:08:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 10:08:39 2026 +0200"
      },
      "message": "GH-1469: Add command-line tools for the feedforward dependency parser (#1473)\n\n* GH-1469: Add command-line tools for the feedforward dependency parser\n\nFeedforwardDependencyParserTrainer trains a FeedforwardDependencyModel from\nthe depparse sample formats. The -params file takes the trainer keys, and\nwithout a file the trainer defaults apply. -refineParams refines the model\nwith beam search; with -baseModel the tool refines a saved model instead\nof training one. FeedforwardDependencyParser parses tagged lines from\nstandard input and FeedforwardDependencyParserEvaluator logs UAS and LAS\nin the format of the maxent tools. Both take -beamSize, defaulting to the\nbeam size a refined model records in the manifest, or 1. The manual\u0027s\ndependency chapter documents the tools.\n\nModelLoader now reports a model of another component as \"Model has\ninvalid format\" for all loaders instead of a raw IllegalArgumentException.\nThe CoNLL-U output loop and the scoring step are shared with the maxent\ntools, and the depparse CLI tests use one fixture class.\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude Code 2.1.296 (Opus 5.5) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0e95db1ce38d2c4e220d9beb4e8ed461d70e4d9b",
      "tree": "311454ac349018d758776b728ec7ef9bf04f0308",
      "parents": [
        "95e9906364baba21625234dc30f198c7140bbc0c"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 22 09:53:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 09:53:56 2026 +0200"
      },
      "message": "GH-1506: Make AbstractClassPathModelFinder.findModels thread-safe (#1507)\n\nThe model cache was published before it was filled, and callers got the\nmutable cache itself. Concurrent first calls of a shared finder or\nDefaultClassPathModelProvider could therefore see no models, scan the\nclasspath several times, or fail with a ConcurrentModificationException.\n\nfindModels now builds the set locally and publishes it as an unmodifiable\nset through a volatile field, and a lock makes concurrent first calls scan\nonce. The Javadoc of the finder and provider types states their thread\nsafety."
    },
    {
      "commit": "95e9906364baba21625234dc30f198c7140bbc0c",
      "tree": "eb346d5a58189cb030818d33a63e3d04384336bc",
      "parents": [
        "d603165a548fd11e8e7b54a23f19d6b884ffb388"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Wed Oct 21 15:24:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 21:24:24 2026 +0200"
      },
      "message": "GH-1391: Cap the token positions of one SentenceVectorsDL.embedAll inference (#1468)\n\nTextEmbedder.embedAll and the manual say the implementation forms its\nown batches, so a caller may pass a list of any size. SentenceVectorsDL\ngrouped the texts by tokenized length and ran each group as one\ninference, however many texts it had. Each group is now split so that no\ninference takes more than 16384 token positions (rows times row length),\n32 rows at the BERT length of 512. An input longer than that runs in a batch of its own. Groups run in the\norder their length first appears in the call.\n\nVectors do not change: batches are not padded, so every row is computed\nfrom the same tensors as its single-input call.\n\nThe grouping moved into a package-private batches method so tests can\ncheck the inference plan. SentenceVectorsDLBatchLimitTest covers row\ncount boundaries (exact fit, one over, one under, lengths that do and do\nnot divide the cap), a length at and over the cap, an empty call, a mix\nwhere only one group splits, input order with alternating lengths, CLS\nand mean pooling, the pooled-output model and unit length scaling\nthrough a split group. The GPU parity test also runs a split group, and\nthe tiny model texts and expected vectors are shared in TinyVectorModels.\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude Code 2.1.296 (Opus 5.5) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "d603165a548fd11e8e7b54a23f19d6b884ffb388",
      "tree": "cc3da49b195704d2d8c31b86929a868e1ae0caf9",
      "parents": [
        "021b731d53a08f593790d056fcbdf7f9a3ecbccd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 21 21:20:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 21:20:40 2026 +0200"
      },
      "message": "Bump actions/setup-java from 6.0.1 to 6.1.0 (#1503)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 6.0.1 to 6.1.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/de7274f081f381c8f8158605e0321c36c376e2e6...b843ebf9b913146b38da2eaa7aeddf76074ae1ad)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "021b731d53a08f593790d056fcbdf7f9a3ecbccd",
      "tree": "b9131522ca3e0643353017bc9b5d0dc9a0c594b5",
      "parents": [
        "c58b4da615d815c39d929c5eb262e6c85555c9eb"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sun Oct 18 14:48:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 20:48:43 2026 +0200"
      },
      "message": "GH-1476: Let the parsers take a caller-supplied POSTagger and Chunker (#1478)\n\n* GH-1476: Let the parsers take a caller-supplied POSTagger and Chunker\n\nBoth bottom-up parsers get a public constructor that takes a POSTagger\nand a Chunker next to the ParserModel. The build, attach and check\nmodels and the head rules still come from the model; its tagger and\nchunker models are not used, so an application can plug in its own\ntagger without loading and discarding the model\u0027s. The model-only\nconstructors delegate to the new one.\n\nParserFactory.create(model, tagger, chunker, beamSize,\nadvancePercentage) picks the parser for the model\u0027s ParserType with the\nsupplied components. The existing create methods build the model\u0027s\nPOSTaggerME and ChunkerME and call it, so the type dispatch exists once.\n\nArguments are checked at the public boundary with an\nIllegalArgumentException: null model, tagger, chunker or head rules, a\nbeam size below 1, and an advance percentage outside (0, 1]. The range\nchecks are ParamChecks.requirePositive and the new\nParamChecks.requirePositiveFraction, and the README lists the stricter\nchecks as a breaking change. Tests pin that supplied components are\nused, that the model\u0027s own tagger and chunker models are not read, that\nthe model\u0027s components give the parses of the model-only factory\nmethod, and the accept and reject cases of each check. The manual shows\nthe new factory method in the parsing API section.\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude Code 2.1.296 (Opus 5.5) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c58b4da615d815c39d929c5eb262e6c85555c9eb",
      "tree": "f3235d4c33581f4ed76f41ebe2fe3d4947b4c685",
      "parents": [
        "2cad1f29ff8d980c0faaacec7e901af919531e22"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sun Oct 18 17:04:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 17:04:56 2026 +0200"
      },
      "message": "GH-1499: Update ClassGraph to 5.0.0 (#1500)"
    },
    {
      "commit": "2cad1f29ff8d980c0faaacec7e901af919531e22",
      "tree": "53a47914747a87d30839c5f44a44c5d59c2543cf",
      "parents": [
        "16f90fd6861cea523d460fb20f496e48f2a589ee"
      ],
      "author": {
        "name": "Martin Wiesner",
        "email": "mawiesne@users.noreply.github.com",
        "time": "Sun Oct 18 14:32:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 14:32:09 2026 +0200"
      },
      "message": "GH-1389, GH-1390: Let SentenceVectorsDL run on a GPU and fix the first CUDA request in a fresh JVM (#1462)\n\nSentenceVectorsDL always created default session options, so it ran on\nthe CPU even with opennlp-dl-gpu. A new constructor takes\nInferenceOptions, like NameFinderDL and DocumentCategorizerDL, and uses\nthe GPU settings and the lower case setting from them; a lower case\nsetting in the options takes precedence over the lowerCase argument. The\nexisting constructors keep their behavior.\n\nAbstractDL.sessionOptions added the CUDA provider before any\nOrtEnvironment existed. Loading the provider needs ONNX Runtime\u0027s default\nlogger, which only exists once an environment does, so the first GPU\nrequest in a fresh JVM failed with \"Attempt to use DefaultLogger but none\nhas been registered\". The environment is now created first. This affects\nNameFinderDL and DocumentCategorizerDL as well. When the provider cannot\nbe added, the session options created for the request are closed before\nthe exception is thrown.\n\nA test makes the first CUDA request of a child JVM and requires that the\nprovider is added or rejected for a reason other than the missing\ndefault logger; it runs in opennlp-dl-gpu and fails with the AbstractDL\nof main. Other tests request a device id no machine has and check that ONNX\nRuntime rejects it for SentenceVectorsDL, NameFinderDL and\nDocumentCategorizerDL, and compare vectors on CUDA device 0 with the CPU\nsession (skipped without a CUDA provider or device). The tiny model test\nfixtures are shared in TinyVectorModels.\n\nThe opennlp-dl-gpu test classpath no longer has the CPU onnxruntime next\nto onnxruntime_gpu. Since onnxruntime_gpu has native libraries for\nlinux-x64 and win-x64 only, the opennlp-dl-gpu tests are skipped on\nmacOS and aarch64. The machine learning chapter documents the GPU\nsetup and the supported platforms.\n\nFixes #1389\nFixes #1390\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Richard Zowalla \u003crzo1@apache.org\u003e\nCo-authored-by: Claude Code 2.1.296 (Opus 5.5) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "16f90fd6861cea523d460fb20f496e48f2a589ee",
      "tree": "7081ffdb9ce0d0a09503529592013be59d69ce4d",
      "parents": [
        "230f0a6836e87a04f5c8483b71131e1c60908110"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Thu Oct 15 09:06:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:06:25 2026 +0200"
      },
      "message": "OPENNLP-1991: Add a feedforward neural dependency parser (#1323)\n\nAdds FeedforwardDependencyParser, an arc-standard neural parser after Chen\nand Manning (2014) that implements the same DependencyParser API as\nDependencyParserME, with greedy and beam decoding. FeedforwardDependencyTrainer\ntrains the FeedforwardDependencyModel from TrainingParameters and refines it\nwith beam search and early updates; the model is a BaseModel with the network\nas an artifact. Words are lowered per code point with the Unicode final sigma\nrule before vocabulary lookup. The manual, the CoNLL-U usage test and the UD\nevaluation cover the new parser.\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude Code 2.1.296 (Opus 5.5) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "230f0a6836e87a04f5c8483b71131e1c60908110",
      "tree": "c7a0542c2d7898b563c9621eaa68a616a9ee4ab5",
      "parents": [
        "4713d82577dd3e9e48cd9855ccd891c2739324a4"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Thu Oct 15 14:04:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 14:04:56 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 4713d82577dd3e9e48cd9855ccd891c2739324a4 (#1493)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: rzo1 \u003crzo1@users.noreply.github.com\u003e"
    },
    {
      "commit": "4713d82577dd3e9e48cd9855ccd891c2739324a4",
      "tree": "43af9db722c2e716410c3fdd5905dec4be5ddc6d",
      "parents": [
        "40fa1e47db13444d61cc369dff3655ee2b8837e6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 15:18:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:18:33 2026 +0200"
      },
      "message": "Bump io.github.classgraph:classgraph from 4.8.196 to 4.8.197 (#1492)\n\nBumps [io.github.classgraph:classgraph](https://github.com/classgraph/classgraph) from 4.8.196 to 4.8.197.\n- [Release notes](https://github.com/classgraph/classgraph/releases)\n- [Commits](https://github.com/classgraph/classgraph/compare/classgraph-4.8.196...classgraph-4.8.197)\n\n---\nupdated-dependencies:\n- dependency-name: io.github.classgraph:classgraph\n  dependency-version: 4.8.197\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": "40fa1e47db13444d61cc369dff3655ee2b8837e6",
      "tree": "c33733e3f9ab23f0693150f3cd3f3626fbffc2fb",
      "parents": [
        "6a0928ecef932dd48b497b56e8ad0bdc5f70ab34"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 15:18:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:18:15 2026 +0200"
      },
      "message": "Bump onnxruntime.version from 1.30.0 to 1.31.0 (#1491)\n\n* Bump onnxruntime.version from 1.30.0 to 1.31.0\n\nBumps `onnxruntime.version` from 1.30.0 to 1.31.0.\n\nUpdates `com.microsoft.onnxruntime:onnxruntime` from 1.30.0 to 1.31.0\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseNotesWorkflow.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.30.0...v1.31.0)\n\nUpdates `com.microsoft.onnxruntime:onnxruntime_gpu` from 1.30.0 to 1.31.0\n- [Release notes](https://github.com/microsoft/onnxruntime/releases)\n- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseNotesWorkflow.md)\n- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.30.0...v1.31.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.microsoft.onnxruntime:onnxruntime\n  dependency-version: 1.31.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.31.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* Update NOTICE entries to ONNX Runtime 1.31.0\n\nThe root pom now sets onnxruntime.version to 1.31.0, so the bundled NOTICE entries for\nonnxruntime and onnxruntime_gpu must name the same version. No other file on main\nnames the old version.\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "6a0928ecef932dd48b497b56e8ad0bdc5f70ab34",
      "tree": "0425cadc395036aca2148b0b8e92b2e217f67c56",
      "parents": [
        "6c51e3dbc72fcef8648f38dd2aa780617170adb6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 15:18:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:18:00 2026 +0200"
      },
      "message": "Bump org.apache.commons:commons-secure-xml from 1.0.0 to 1.1.0 (#1490)\n\nBumps org.apache.commons:commons-secure-xml from 1.0.0 to 1.1.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.commons:commons-secure-xml\n  dependency-version: 1.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": "6c51e3dbc72fcef8648f38dd2aa780617170adb6",
      "tree": "0d5834c71cf3757e9541aaa84464796e19f50c45",
      "parents": [
        "9306b4698491032a358e9ea392f4f13635a02865"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 15:17:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:17:11 2026 +0200"
      },
      "message": "Bump actions/upload-artifact from 7.0.1 to 7.0.2 (#1487)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.1 to 7.0.2.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a...cf430e030ddbb5b0abf93d22962f4752f3646cd9)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: 7.0.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": "9306b4698491032a358e9ea392f4f13635a02865",
      "tree": "10f2ec5602c5515158d7d92a63b887dd8b988b73",
      "parents": [
        "c31792e9dfb2d56e3e906838012e6731e0e3ca33"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 15:15:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:15:17 2026 +0200"
      },
      "message": "Bump actions/download-artifact from 8.0.1 to 8.0.2 (#1484)\n\nBumps [actions/download-artifact](https://github.com/actions/download-artifact) from 8.0.1 to 8.0.2.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c...9000827ccba6bdab643e8b6fd33ac0654aef8333)\n\n---\nupdated-dependencies:\n- dependency-name: actions/download-artifact\n  dependency-version: 8.0.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": "c31792e9dfb2d56e3e906838012e6731e0e3ca33",
      "tree": "0cb3f28817f0ba87ff980266824480fe3ef94a8e",
      "parents": [
        "05092291972a7b6094ad730ae45849af72c696ad"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sun Oct 11 12:13:31 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 19:13:31 2026 +0200"
      },
      "message": "GH-1475: Say that opennlp-dl is not in the binary distribution (#1477)\n\nThe text embedding section said opennlp-dl is the one provider in the\ndefault distribution. The binary distribution does not include the\nopennlp-dl or opennlp-dl-gpu jars, and opennlp-tools does not depend on\nthem.\n\nFixes #1475\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "05092291972a7b6094ad730ae45849af72c696ad",
      "tree": "9779b13693288758f8806499fe9f1ef65512ef7d",
      "parents": [
        "4f22baa93eef99fc34ba7e001e6731e4cb57847b"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sun Oct 11 18:30:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 18:30:35 2026 +0200"
      },
      "message": "GH-1466: Describe current behaviour instead of 3.0 changes in the user manual (#1467)"
    },
    {
      "commit": "4f22baa93eef99fc34ba7e001e6731e4cb57847b",
      "tree": "bcb5a95846207ed7972c9b498b7f2b80d05382fc",
      "parents": [
        "7a560bd7a89478ea6d5c3768bf5c5c41d67052b4"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sun Oct 11 18:30:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 18:30:22 2026 +0200"
      },
      "message": "GH-1464: Release the per-thread stemmer state of a TermAnalyzer and reuse the matching analyzer (#1465)"
    },
    {
      "commit": "7a560bd7a89478ea6d5c3768bf5c5c41d67052b4",
      "tree": "5788c0b97d2c467130373a37f4479c14c6d32bbc",
      "parents": [
        "46d9d96a10570bdd69523c92303e00936a49eab4"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sat Oct 10 04:45:40 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 11:45:40 2026 +0200"
      },
      "message": "OPENNLP-1935: Regex removal (10/10): Forbid java.util.regex in production code (#1348)\n\nAdd a forbiddenapis check for production classes in every module. Reject\njava.util.regex and regex-based String and Scanner methods at\nprocess-classes, before tests run. Exclude test classes and point error\nmessages to the StringUtil replacements.\n\nAdd SuppressForbidden for documented APIs that accept user-supplied\nregular expressions. Require a reason for each exception and apply it\nto RegexNameFinder and RegexNameFinderFactory.\n\nDocument the rule, dev/forbidden-regex.txt and allowed exceptions in\nCONTRIBUTING.md. The build will fail until the remaining production\nregex uses are removed by the related PRs.\n\n* OPENNLP-1935: Share one non-empty split loop in StringUtil\n\nEventFields, MascIdentifiers, MecabDictionary and HunspellDictionary each had the same\nsplit loop with a different character test. StringUtil has it as one private loop behind\nsplitNonEmpty, splitOnUnicodeWhitespace and the new mode-aware splitOnWhitespace, and the\nfour classes call those.\n\n* OPENNLP-1935: Name the StringUtil helpers in the forbidden list message\n\n* OPENNLP-1935: Allow the user-supplied tokenizer pattern and head-rule tags\n\nMark the tokenizer alphanumeric-pattern API and the AnCora head-rule tag matching with\n@SuppressForbidden, since both regular expressions are public, user-supplied contracts."
    },
    {
      "commit": "46d9d96a10570bdd69523c92303e00936a49eab4",
      "tree": "3221f9607d470719487a8e360a3b60bb6ed6c9f2",
      "parents": [
        "a6f19f91e1df0e445e1312309d282db29c018407"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 10 11:07:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 11:07:54 2026 +0200"
      },
      "message": "GH-1456: Tighten normalizer, tokenizer, introduction and language detector chapters (#1457)"
    },
    {
      "commit": "a6f19f91e1df0e445e1312309d282db29c018407",
      "tree": "935b7ea3de7e1b30602c581e3095e3765be9682d",
      "parents": [
        "e286928a162a8097ced8c11fe9c433843de8fc3e"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 20:50:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 20:50:26 2026 +0200"
      },
      "message": "GH-1449: Align DocumentCategorizerDLEval with the shared ONNX failure message (#1463)\n\n#1450 moved the inference of DocumentCategorizerDL to AbstractDL.runModel, which reports\nfailures as \"Unable to run the ONNX model: \u003ccause\u003e\"."
    },
    {
      "commit": "e286928a162a8097ced8c11fe9c433843de8fc3e",
      "tree": "92bf2da4af969247bd5baeb60c140d4a6d056467",
      "parents": [
        "84a1d626800528c768558f0b724c21150541ffdf"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 19:51:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 19:51:20 2026 +0200"
      },
      "message": "GH-1458: Parse name-finder tags and parse-tree strings without regular expressions (#1459)\n\n* GH-1458: Parse name-finder tags and parse-tree strings without regular expressions\n\n* GH-1458: Name the separator characters of start tags and parse strings\n\nReplaces the character literals in the new scans with named constants and reuses\nUnicodeWhitespace.SPACE and CARRIAGE_RETURN in StringUtil.isAsciiWhitespace.\n\n* GH-1458: Split the start tag and constituent oracle tests by outcome\n\nValid inputs, the rejected empty type and invalid inputs are now separate tests with\nexplicit expected values; the former regular expressions remain as cross-checks.\n\n* GH-1458: Use TAG_END for the closing character of a start tag\n\n* GH-1458: Phrase the start tag check as Checks whether"
    },
    {
      "commit": "84a1d626800528c768558f0b724c21150541ffdf",
      "tree": "deda16ae83ea46a454db001f2bb29849a44b0efc",
      "parents": [
        "ef814bdbaf126e98e441cf6894f1f1bbfd4edc71"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 19:51:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 19:51:01 2026 +0200"
      },
      "message": "GH-1460: Match escaped tags in the bundled Spanish head rules (#1461)\n\n* GH-1460: Match escaped tags in the bundled Spanish head rules\n\nThe Spanish head rules file wrote tags such as GRUP\\\\.VERB with a double\nbackslash, so they required a literal backslash and never matched types\nsuch as GRUP.VERB, GRUP.NOM, GRUP.A, GRUP.ADV or S.A. Use single\nbackslashes in both copies and test the bundled rules against the\nintended constituent types.\n\n* GH-1460: Load the Spanish head rules test copy from the test classpath\n\nThe test reads a copy of es-head-rules from the runtime test resources instead of\nlocating opennlp-tools/lang through the working directory."
    },
    {
      "commit": "ef814bdbaf126e98e441cf6894f1f1bbfd4edc71",
      "tree": "511920f8410db8e90b27477219c1e64a2e1c8bbd",
      "parents": [
        "eef3909dc72b557041ef616fcd82ff78f490ea0b"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 10:16:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 10:16:49 2026 +0200"
      },
      "message": "GH-1454: Tidy document, stemmer, corpora and doccat chapters and README (#1455)\n\nRemove test-class references, design rationale and implementation details\nfrom the document, stemmer, corpora and doccat chapters, and add the\nterm-vector layer to the layer table. Extend the README breaking-change\nlist with the whitespace default, CoNLL-U, PlainTextByLineStream and\nRealBasicEventStream changes."
    },
    {
      "commit": "eef3909dc72b557041ef616fcd82ff78f490ea0b",
      "tree": "f20831a3ffab00eefcbf640e107a45d01dd9cd5f",
      "parents": [
        "8d2a8c3101262f539f242bfb0e9c17218646c981"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 10:13:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 10:13:19 2026 +0200"
      },
      "message": "GH-1420: Remove duplication and add readResolve in opennlp-runtime (#1427)\n\n* GH-1420: Remove duplication and add readResolve in opennlp-runtime\n\nAdds readResolve to the normalizer singletons, reuses shared helpers in place of\nlocal copies in main and test code, and rejects POS dictionary entries without tags."
    },
    {
      "commit": "8d2a8c3101262f539f242bfb0e9c17218646c981",
      "tree": "6fe9eaf5b382167624f332a41c565fc06adf4f72",
      "parents": [
        "779420863888159f725518934d79e1081a7d0f33"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 10:11:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 10:11:26 2026 +0200"
      },
      "message": "GH-1419: Correct and trim opennlp-runtime Javadoc (#1426)\n\n* GH-1419: Correct and trim opennlp-runtime Javadoc\n\nCorrect inaccurate stemmer, normalizer and sentence detector Javadoc, drop design history and issue references, and link cited specifications.\nAdd missing summaries, @since tags and {@inheritDoc}, and use the \"@throws X Thrown if\" phrasing.\nEmojiFlags formats its hex code point with Locale.ROOT and PorterStemmer.stem(CharSequence) gains @Override."
    },
    {
      "commit": "779420863888159f725518934d79e1081a7d0f33",
      "tree": "7b36bbf8821bc01630f6d2daae3143ef30668e17",
      "parents": [
        "ce2da53578d2e9113e666acd5818680a2ca247d8"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 09:39:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 09:39:40 2026 +0200"
      },
      "message": "GH-1451: Share staged install, checksum and tar helpers across the dictionary installers (#1452)\n\n* GH-1451: Share staged install, checksum and tar helpers across the dictionary installers\n\n- MecabDictionaryInstaller installs through an internal\n  ResourceInstaller.installSelected staging hook instead of its own scratch,\n  promote and delete code; selected destinations must stay inside the target\n- One package-private Checksums helper for ResourceInstaller, DownloadUtil and\n  DictionaryCatalog\n- DictionaryCatalog.install overload with an explicit opt-in and Limits\n- Empty tar detection moved to TarStream\n- HunspellDictionaryDownload.downloadFromCatalog renamed to\n  HunspellDictionaryInstaller.installFromCatalog (breaking against 3.0.0-M6)\n\n* GH-1451: Reject a destination with a root but no drive on Windows\n\nA path such as \\x is not absolute on Windows but resolves to the root of the\ntarget\u0027s drive. The test now expects the platform\u0027s path separator in the message.\n\n* GH-1451: Rename the empty tar check and name the path characters\n\nRename TarStream.startsWithEndOfArchive to isEmptyArchive and describe what it detects.\nReplace the path character literals in ResourceInstaller with named constants."
    },
    {
      "commit": "ce2da53578d2e9113e666acd5818680a2ca247d8",
      "tree": "b820bd3ee145a8b673e62cae7355c8f3ada60180",
      "parents": [
        "139b9ddb385d00d685e812e3babed2638241b7bb"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 09:32:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 09:32:53 2026 +0200"
      },
      "message": "GH-1447: Reject self-closing AD markup tags as opening tags (#1448)\n\nThe AD reader no longer treats \u003cs /\u003e, \u003cs id\u003d\"1\"/\u003e or any other tag with a\nslash right before the closing angle bracket as an opening tag, matching\nthe existing handling of \u003cs/\u003e. Tests pin both sides, and the manual and\nREADME describe the change."
    },
    {
      "commit": "139b9ddb385d00d685e812e3babed2638241b7bb",
      "tree": "3fc909297ec6e53c3d055f82991f4a0aa196fb11",
      "parents": [
        "deb80bae8a07262cf79b5ae540fdeca6494a8533"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 09 09:32:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 09:32:43 2026 +0200"
      },
      "message": "GH-1449: Share ONNX inference between DocumentCategorizerDL and NameFinderDL with one failure message (#1450)\n\nMove tensor building, session execution and error wrapping into\nAbstractDL.runModel and copy InferenceOptions once into an\nInferenceSettings record. Both components now report a failed model run\nas \"Unable to run the ONNX model: \u003ccause\u003e\". Add the missing Javadoc and\n@throws, trim implementation narrative, and keep only current behavior\nin the README."
    },
    {
      "commit": "deb80bae8a07262cf79b5ae540fdeca6494a8533",
      "tree": "0b3edcee0e15696413e9f4f0c62270796da1872a",
      "parents": [
        "e039a7fb7dc76ca6fd67c33cc1303e59816f0243"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Thu Oct 08 14:52:42 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 21:52:42 2026 +0200"
      },
      "message": "OPENNLP-547: Add a transition-based dependency parser component (#1236)\n\n* OPENNLP-547: Add a transition-based dependency parser\n\nAdd an arc-standard dependency parser with maxent and perceptron training,\nmodel persistence, and an immutable dependency tree. Skip and count\nnon-projective training sentences.\n\nRead UTF-8 CoNLL-U samples with universal or language-specific POS tags.\nAdd CLI tools for training, parsing, evaluation and cross-validation,\nincluding attachment scores, evaluation listeners and -misclassified\noutput.\n\nAdd treebank evaluations for English, German, Spanish and French, and a\nmanual chapter with tested examples.\n\n* OPENNLP-547: Share token and tag validation through ParamChecks\n\nAdd one internal check for non-empty parallel arrays and use it from the\nprivate validators in DependencySample and DependencyParserME. Preserve\nthe validation order and name null elements by their parameter and index.\n\nTest the shared check directly and verify that samples and parsers report\nthe same errors for invalid input."
    },
    {
      "commit": "e039a7fb7dc76ca6fd67c33cc1303e59816f0243",
      "tree": "8fb1cb78b6b815f3f46df3a6beae8d075ed5a70c",
      "parents": [
        "a9d226ce906e57d3b7489baa3e1ef01ee41c7358"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 14:30:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 14:30:02 2026 +0200"
      },
      "message": "GH-1393: Cache the downloaded test models between CI runs (#1444)\n\n* GH-1393: Cache the downloaded test models between CI runs\n\n* GH-1393: Create missing parent directories of the test model download home\n\nThe test download helpers used File#mkdir, which fails silently when the\nconfigured download home itself does not exist yet, e.g. a fresh\n~/.opennlp-ci on a CI cache miss. Use Files#createDirectories instead.\n\n---------\n\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "a9d226ce906e57d3b7489baa3e1ef01ee41c7358",
      "tree": "bca0d6d41d2365683a43110914f3c7320cbe3cd4",
      "parents": [
        "617d38996f3796f16fdb65b3e915ff58eadd59f9"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 13:37:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 13:37:39 2026 +0200"
      },
      "message": "GH-1445: Run the CI build once per job and render README.html from README.md only (#1446)\n\nListing both test and verify made Maven run the lifecycle twice, so every\ntest suite ran twice per CI job. The markdown plugin in opennlp-distr now\nreads a copy of README.md instead of copying the whole repository tree."
    },
    {
      "commit": "617d38996f3796f16fdb65b3e915ff58eadd59f9",
      "tree": "f1ced2d4b3f27e84f843f8a106987c0e1507bf5a",
      "parents": [
        "cf81387cc1483590b8adf4228ca5519c529260ea"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 12:01:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:01:06 2026 +0200"
      },
      "message": "GH-1440: Isolate WordpieceTokenizer from the shared WhitespaceTokenizer and share punctuation isolation (#1442)\n\nWordpieceTokenizer now splits words with its own WhitespaceTokenizer, so\nsetKeepNewLines(true) on WhitespaceTokenizer.INSTANCE no longer adds\nline-separator tokens. BertNormalization.isolatePunctuation(String) delegates\nto the MappedText routine used by WordpieceEncoder."
    },
    {
      "commit": "cf81387cc1483590b8adf4228ca5519c529260ea",
      "tree": "833ac4c1241af1906b25cd28e605d49f708ef25d",
      "parents": [
        "5a6347ac29bacb7fc680180cb0f8e755cf9c0db4"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 12:00:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:00:45 2026 +0200"
      },
      "message": "GH-1438: Share code point validation and trim scans in CharClass and CodePointSet (#1439)\n\nCharClass validates replacement code points through CodePointSet and trims\nwith shared forward and backward scan helpers. CodePointSet.parse rejects a\nnull section with IllegalArgumentException, and the CodePointSet.ofRange\nmessage for descending bounds no longer ends with a period. The\nUnicodeDash.Category and UnicodeWhitespace.Category Javadoc explains that\nthe constant names are Unicode general category abbreviations."
    },
    {
      "commit": "5a6347ac29bacb7fc680180cb0f8e755cf9c0db4",
      "tree": "9ca75c9eb904131f936e7bf7c018da1ceffa2a14",
      "parents": [
        "013b789b150027699bf322c51ef4e57220b6cd0d"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 12:00:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:00:23 2026 +0200"
      },
      "message": "GH-1436: Document thread-safety limits of WhitespaceTokenizer.INSTANCE and the process-wide modes (#1437)\n\nWhitespaceTokenizer.INSTANCE must not be reconfigured; callers needing\nkeepNewLines\u003dtrue use newInstance(boolean). WhitespaceMode and\nCompatibilityMode state that setActive and reset are for tests and\napplication startup only. Tests no longer mutate the shared instance."
    },
    {
      "commit": "013b789b150027699bf322c51ef4e57220b6cd0d",
      "tree": "f5de5c78df2906207b9739998c33b5a580991842",
      "parents": [
        "bca31bb7c2847ce1532187ae71ee056e45077cf6"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 11:44:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:44:23 2026 +0200"
      },
      "message": "GH-1394: Load downloaded models by language when the model host cannot be reached (#1435)\n\n* DownloadUtil keeps a local copy of the model index\n\nLooking up a model by language reads the model index from the model\nhost on every run, so a reset connection failed the lookup even when\nthe model itself was already downloaded. DownloadUtil now keeps a copy\nof the last index it read in the download directory and uses it when\nthe index cannot be read. A failed read no longer gives a partial index.\n\nAssisted-by: Claude Code 2.1.289\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* GH-1394: Do not keep an empty model index and test the empty-page fallback\n\nRetry the index on the next call when neither the index nor its local copy\nlists models, log a failed read as a warning, drop the test-only parser\nconstructor and reject a null index URL via ParamChecks.\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "bca31bb7c2847ce1532187ae71ee056e45077cf6",
      "tree": "53352f84c8d5f9ab59cf35fba3f6c95b1a629557",
      "parents": [
        "11a136cc64f0e5014bd69dbf1947839824dd1dc7"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Thu Oct 08 04:31:02 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:31:02 2026 +0200"
      },
      "message": "OPENNLP-1988: Load WordPiece vocabularies from tokenizer.json (#1319)\n\nAccept Hugging Face tokenizer.json files as WordPiece vocabularies in\nopennlp-dl. Read model.vocab and include added_tokens with their declared\nIDs. Reject token or ID conflicts, malformed entries, unsupported model\ntypes and subword prefixes other than ##.\n\nReject a normalizer.lowercase setting that differs from the constructor\u0027s\nlowerCase argument. Other tokenizer settings are not imported.\n\nError messages name the member and offset of a value of the wrong type.\n\nAdd tests for vocabulary loading, invalid input and a leading byte order\nmark, using fixtures created for the tests. Document the vocabulary rules\nin the document categorizer chapter and link to them from the name finder\nand embedder sections.\n\nAssisted-by: Claude Code 2.1.281\n\n\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "11a136cc64f0e5014bd69dbf1947839824dd1dc7",
      "tree": "d98c311c321c98c3661998fa01fa2a52db20e6b9",
      "parents": [
        "9a6a927a5eee6835eb8f5e8b228628ee700bd33a"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 11:14:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:14:06 2026 +0200"
      },
      "message": "GH-1441: Report malformed lattice dictionary content as InvalidFormatException (#1443)\n\nMecabDictionary, CategoryTable and UnigramSegmenter now throw\nInvalidFormatException for malformed content; missing files, read\nfailures and size limits stay plain IOException."
    },
    {
      "commit": "9a6a927a5eee6835eb8f5e8b228628ee700bd33a",
      "tree": "4b38b6e741a0bc018d6f128846faff44ad519ac3",
      "parents": [
        "ef04afe6da15bf918375ffe115e6a26c687d8d17"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 11:13:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:13:45 2026 +0200"
      },
      "message": "GH-1422: Remove duplication in StringUtilTest and the chunker listener test (#1433)\n\nMerge the per-mode isWhitespace boundary tests, share the info separator source,\nturn sample loops into parameterized tests and drop history comments.\nReuse the evaluate helper in ChunkerDetailedFMeasureListenerTest.testEvaluator."
    },
    {
      "commit": "ef04afe6da15bf918375ffe115e6a26c687d8d17",
      "tree": "00c8da45d9ea201714dae546cc724db3e29de14b",
      "parents": [
        "0ca2462305b2ce60add1e93dfabd372c92a098e3"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 08 11:13:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:13:11 2026 +0200"
      },
      "message": "GH-1416: Correct and trim opennlp-api Javadoc (#1423)\n\n* GH-1416: Correct and trim opennlp-api Javadoc\n\nFix inaccurate return, copy and allocation claims, drop design history and\nimplementation commentary, add missing @since tags and literature links.\n\n* GH-1416: Reference Unicode 17.0.0 PropList.txt in UnicodeDash and UnicodeWhitespace"
    },
    {
      "commit": "0ca2462305b2ce60add1e93dfabd372c92a098e3",
      "tree": "a46bbc85417301dc07de69690c87ba5f1e949c98",
      "parents": [
        "97e4fb13fda670217d0be85c35b8868bf0eadda9"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Wed Oct 07 21:09:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 21:09:31 2026 +0200"
      },
      "message": "GH-1417: Remove duplicated logic in opennlp-api and the lattice tokenizer (#1424)\n\n* GH-1417: Remove duplicated logic in opennlp-api\n\nShares the document merge checks, BERT token checks, punctuation isolation,\nCharClass run collapsing and the lattice whitespace loop.\nFreezes the Unicode tables once and trims definition files with the Unicode whitespace rule.\n\n* GH-1417: Check the special tokens with ParamChecks\n\n* GH-1417: Address review feedback\n\nMove SPACE, CARRIAGE_RETURN and LINE_FEED to UnicodeWhitespace as public\nconstants, mirroring UnicodeDash.HYPHEN_MINUS. Document and check the\nMappedText contract (negative capacity, overflow-safe growth, index\nbounds), statically import CONTINUATION_PREFIX, link the referenced types\nin Javadoc and make MecabDictionary.MATRIX_DEF package-private like its\nsiblings.\n\n* GH-1417: Wrap the Unicode reference collections instead of copying them\n\nThe static initializers build the maps and lists locally, so an unmodifiable view\nis enough; Map.copyOf and List.copyOf allocated a second collection for nothing.\n\n* GH-1417: Clamp the initial MappedText capacity\n\nThe capacity is only a sizing hint, so a value above the largest array the buffers\ngrow to is clamped instead of failing the allocation."
    },
    {
      "commit": "97e4fb13fda670217d0be85c35b8868bf0eadda9",
      "tree": "20f80d53e87c97aebaca1bc463bb19fe8387f236",
      "parents": [
        "0a363d573750b32d92b9836670a704b48fea8a79"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Wed Oct 07 21:09:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 21:09:20 2026 +0200"
      },
      "message": "GH-1418: Clean up event parsing and context generators in the ml modules (#1425)\n\n* GH-1418: Clean up event parsing and context generators in the ml modules\n\nShare line splitting and value checks between the event parsers, report\nvalue errors from RealValueFileEventStream.read() as InvalidFormatException,\ngive each SimpleEventStreamBuilder stream its own position, and trim Javadoc.\n\n* GH-1418: Check event values with ParamChecks\n\n* GH-1418: Address review feedback\n\nRestore the @throws contract on ContextGenerator.getContext and link ObjectStream in\nthe SimpleEventStreamBuilder.build Javadoc."
    },
    {
      "commit": "0a363d573750b32d92b9836670a704b48fea8a79",
      "tree": "0b9c84a07a6a15d5cd72b986bccce56286eae5d1",
      "parents": [
        "d7eadeda2fd358f62f5b2223b119e17ccc2cca1f"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Wed Oct 07 21:09:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 21:09:04 2026 +0200"
      },
      "message": "GH-1421: Clean up the AD, MASC, CoNLL-U and Brat readers (#1428)\n\n* GH-1421: Clean up the AD, MASC, CoNLL-U and Brat readers\n\nShare the AD metadata id check, parse ids with the JDK and make the tag checks static.\nTrim implementation notes from Javadoc, reuse helpers in Brat and MASC test code, and\ndocument that MASC region offsets are ASCII digits only.\n\n* GH-1421: Inline the metadata message and keep the tag checks non-static\n\n* GH-1421: Throw InvalidFormatException for bad AD metadata ids\n\nInvalid or overflowing AD metadata ids now raise an InvalidFormatException from read()\ninstead of a RuntimeException, and HYPHEN_CHAR in ADNameSampleStream is renamed to HYPHEN."
    },
    {
      "commit": "d7eadeda2fd358f62f5b2223b119e17ccc2cca1f",
      "tree": "8d97b1b17116eba8c2ad0ffd1c5bdb9c28526abc",
      "parents": [
        "95b1ac5ffe11589b7e0b38926cb7c9194228d020"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Wed Oct 07 09:13:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 09:13:04 2026 +0200"
      },
      "message": "GH-1422: Clean up the stemmer, Hunspell and NameFinderDL evals (#1434)\n\nShare one timed concurrency helper in AbstractEvalTest, move the Hunspell\nclassification check into a data-free test, and release the loaded dictionaries.\nDocument the stemmer eval, name its constants, and cover null tokens in NameFinderDLEval."
    },
    {
      "commit": "95b1ac5ffe11589b7e0b38926cb7c9194228d020",
      "tree": "c27de6e0f63b74aab900e5973430c69f413e01bc",
      "parents": [
        "42f446a5aa82a75001b3d3fa3ee96e3a2a16983a"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Wed Oct 07 09:12:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 09:12:39 2026 +0200"
      },
      "message": "GH-1422: Clean up the report listeners in opennlp-cli (#1429)\n\nExtract the label category lookup into one helper, name the repeated\nMessageFormat patterns, and document the Locale used by createReport()."
    },
    {
      "commit": "42f446a5aa82a75001b3d3fa3ee96e3a2a16983a",
      "tree": "24d2ddbb3f2f5722a0024a232dbbd7b87ed7abca",
      "parents": [
        "e1a807c47dfb42ac5baecb7ea1f02a8a316f1932"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 22:10:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 22:10:42 2026 +0200"
      },
      "message": "GH-1422: Clean up the spellcheck normalizer and loader (#1431)"
    },
    {
      "commit": "e1a807c47dfb42ac5baecb7ea1f02a8a316f1932",
      "tree": "0c50e13a341ec57c6552d1c2ace194ef69b9433f",
      "parents": [
        "af742d8bdc444f4f2bba27c6d6963f712b5ef0b4"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 21:34:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 21:34:27 2026 +0200"
      },
      "message": "GH-1388: Load bundled Unicode data through one recoverable loader (#1373)\n\n* Minor: Load bundled Unicode data through one recoverable loader\n\nAdd the internal BundledUnicodeData helper for opening, reading and lazily\nholding the bundled data files, and switch the normalizer and UAX #29 loaders\nto it. A missing or unreadable resource now throws the documented\nIllegalStateException or UncheckedIOException on every call instead of\nExceptionInInitializerError followed by NoClassDefFoundError. The public\naccessors document these exceptions, and a lazy holder whose loader returns\nnull fails with IllegalStateException.\n\n* Reference the bundled Unicode 17.0 emoji-data.txt instead of the latest URL"
    },
    {
      "commit": "af742d8bdc444f4f2bba27c6d6963f712b5ef0b4",
      "tree": "b89b6c3a135ee7d7774e8f69ed62ccc3cad28ec9",
      "parents": [
        "8b8a4dc86f4970963d64faa2bbdcd91e99df8598"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 21:34:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 21:34:04 2026 +0200"
      },
      "message": "GH-1422: Clean up NumberUtil and its tests in opennlp-uima (#1432)"
    },
    {
      "commit": "8b8a4dc86f4970963d64faa2bbdcd91e99df8598",
      "tree": "3f7b7c95ff0fe5489a17f6da17f8d74335aa7597",
      "parents": [
        "1fd51808e531c838f37628d5f99a7aa0b2b89e68"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 21:30:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 21:30:18 2026 +0200"
      },
      "message": "GH-1422: Clean up opennlp-morfologik builder and Javadoc (#1430)"
    },
    {
      "commit": "1fd51808e531c838f37628d5f99a7aa0b2b89e68",
      "tree": "3a2aadce99f7ae22b6f13413f755e45259f31895",
      "parents": [
        "c98b7629840a6e08af4901eec6be3eceec02e99a"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Tue Oct 06 14:12:03 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 21:12:03 2026 +0200"
      },
      "message": "Spellcheck correction loses the capital of a supplementary-plane initial (#1385)\n\nSpellCheckingCharSequenceNormalizer checked and recapitalized the\nfirst char of a token, not the first code point. A token starting with\na supplementary-plane capital such as U+10400 lost its capital in the\ncorrection, and a token made only of supplementary letters was treated\nas having no letters. Both now work on code points.\n\nAssisted-by: Claude Code 2.1.288\n\n\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c98b7629840a6e08af4901eec6be3eceec02e99a",
      "tree": "56770e5c57aec7439ecc5474c13cb2fc2c3bc63d",
      "parents": [
        "19f201e80c798dae88ba9cf00d57a40437185362"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 20:44:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:44:23 2026 +0200"
      },
      "message": "GH-1398: Add requireNonEmpty and requireNonNegative to ParamChecks (#1413)\n\n* GH-1398: Add requireNonEmpty and requireNonNegative to ParamChecks\n\nAdds requireNonEmpty (CharSequence, Collection), requireNonBlank and\nrequireNonNegative (int, long) to ParamChecks and switches the inline\nchecks whose condition and message already match, keeping behavior.\n\n* Use StringUtil.isUnicodeBlank in ParamChecks.requireNonBlank"
    },
    {
      "commit": "19f201e80c798dae88ba9cf00d57a40437185362",
      "tree": "0f32bd8fb616498f7d0478c3c3615a8711e39944",
      "parents": [
        "66b1719bdb331acab2e92c3b04d3cfb8f1d0509b"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 20:36:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:36:16 2026 +0200"
      },
      "message": "GH-1414: Store mvnw.cmd with LF line endings (#1415)\n\n* GH-1414: Store mvnw.cmd with LF line endings\n\nThe Maven wrapper bump in #1405 stored mvnw.cmd with CRLF, against the\neol\u003dcrlf rule in .gitattributes, so every checkout showed it as modified.\n\n* Fail CI when a file is stored with line endings .gitattributes does not allow"
    },
    {
      "commit": "66b1719bdb331acab2e92c3b04d3cfb8f1d0509b",
      "tree": "1f9ac7f8446847029b71cc62d26a84fb46a151fa",
      "parents": [
        "169827669f87c9f6ad3c91cd790d29577d33a71d"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 20:08:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:08:55 2026 +0200"
      },
      "message": "GH-1395: Reject null arguments in opennlp-api with IllegalArgumentException (#1410)"
    },
    {
      "commit": "169827669f87c9f6ad3c91cd790d29577d33a71d",
      "tree": "2b77b808926c16fde5a9d22db3a1e833b190decd",
      "parents": [
        "6c8fdd5c763020ec231a7091840b063233467488"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 20:07:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:07:29 2026 +0200"
      },
      "message": "GH-1396: Use ParamChecks for null arguments in opennlp-runtime (#1411)"
    },
    {
      "commit": "6c8fdd5c763020ec231a7091840b063233467488",
      "tree": "70a9aa53e4d5d32d8419444e56c0e8f875ec3ffd",
      "parents": [
        "a6871186bfb125a48fbd934faa1029a018de67ea"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 20:05:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 20:05:40 2026 +0200"
      },
      "message": "GH-1397: Reject null spellcheck arguments with IllegalArgumentException (#1412)"
    },
    {
      "commit": "a6871186bfb125a48fbd934faa1029a018de67ea",
      "tree": "ed17ce018ad818c693369b17f935ebc5e9168896",
      "parents": [
        "dd45c004205457c6e03e26f5acc49daa48be6253"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Tue Oct 06 19:48:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 19:48:32 2026 +0200"
      },
      "message": "GH-1408: Rename ArgumentChecks to ParamChecks (#1409)\n\nRename the internal argument check helper and its test, and update all\nreferences across modules."
    },
    {
      "commit": "dd45c004205457c6e03e26f5acc49daa48be6253",
      "tree": "30b9f3686536e2a38e02f81a69f0a85b3a2a4517",
      "parents": [
        "b2e843340006379b711a9cafda8ebb1fe59872d2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 05 19:12:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 19:12:57 2026 +0200"
      },
      "message": "Bump com.puppycrawl.tools:checkstyle from 13.3.0 to 14.3.0 (#1407)\n\n* Bump com.puppycrawl.tools:checkstyle from 13.3.0 to 14.3.0\n\nBumps [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) from 13.3.0 to 14.3.0.\n- [Release notes](https://github.com/checkstyle/checkstyle/releases)\n- [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-13.3.0...checkstyle-14.3.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.puppycrawl.tools:checkstyle\n  dependency-version: 14.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* Fix Javadoc links for Checkstyle 14.3.0 compatibility\n\n* Fix remaining array links for Checkstyle 14.3.0\n\n* Fix invalid Javadoc break tag for Checkstyle 14.3.0\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Kristian Rickert \u003ckrickert@gmail.com\u003e"
    },
    {
      "commit": "b2e843340006379b711a9cafda8ebb1fe59872d2",
      "tree": "95e191cf836419e8a4490c62b214048b1e8f1913",
      "parents": [
        "d742b18f0813144dee67dbe0f41a189fd5448ed6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 05 19:12:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 19:12:17 2026 +0200"
      },
      "message": "Bump org.apache.maven:apache-maven from 3.9.16 to 3.10.0 (#1405)\n\nBumps org.apache.maven:apache-maven from 3.9.16 to 3.10.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.maven:apache-maven\n  dependency-version: 3.10.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": "d742b18f0813144dee67dbe0f41a189fd5448ed6",
      "tree": "613d6611f1152801455c585bbc5e6640d5f94756",
      "parents": [
        "35e97920d95009d1542704e6a23ce67c355b2360"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Mon Oct 05 12:11:28 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 19:11:28 2026 +0200"
      },
      "message": "MorfologikTagDictionary is not thread-safe and fails on entries without a tag (#1382)\n\ngetTags shared one stateful DictionaryLookup, so concurrent calls\ncorrupted its buffers. It now keeps one DictionaryLookup per thread over\nthe shared immutable Dictionary, exposes clearThreadLocalState() like the\nME classes, and skips entries without a tag instead of throwing a\nNullPointerException.\n\nAssisted-by: Claude Code 2.1.288\n\n\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "35e97920d95009d1542704e6a23ce67c355b2360",
      "tree": "08d27945f6538a11d5cb6d2209ea521e77a56ffd",
      "parents": [
        "c8536d2c124e51681537a114379d9e966c8d5432"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Mon Oct 05 19:09:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 19:09:33 2026 +0200"
      },
      "message": "Minor: Use ArgumentChecks for the remaining inline null checks in runtime (#1401)\n\nReplaces 65 inline null checks in 24 files of opennlp-runtime with\nArgumentChecks.requireNonNullArg. Exception type and message are\nunchanged, so there is no behavior change."
    },
    {
      "commit": "c8536d2c124e51681537a114379d9e966c8d5432",
      "tree": "e1cc050276f7349e2ccd4614f1af20b922c314ec",
      "parents": [
        "fce5fdbd6f33fa329f8d5f4ac0972decd3faea31"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Mon Oct 05 19:09:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 19:09:17 2026 +0200"
      },
      "message": "Minor: Use ArgumentChecks for inline null checks in ml, model-resolver, spellcheck (#1402)\n\nConverts 16 inline null checks in 9 files to ArgumentChecks.requireNonNullArg.\nException type and message stay identical, no behavior change."
    },
    {
      "commit": "fce5fdbd6f33fa329f8d5f4ac0972decd3faea31",
      "tree": "80c3ab41841b55c2e2a8f5acfaa6da7516618425",
      "parents": [
        "42877392f55a28b4595c877e63f3b5b422f923cf"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Mon Oct 05 17:19:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 17:19:52 2026 +0200"
      },
      "message": "Minor: Use ArgumentChecks for the inline null checks in opennlp-api (#1399)"
    },
    {
      "commit": "42877392f55a28b4595c877e63f3b5b422f923cf",
      "tree": "b01e0e83fe82fa6b6c400ed0e8de0dcfef1122e9",
      "parents": [
        "197933cf976d9fb29a2813b99b17e62c0ba522fd"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Mon Oct 05 16:37:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 16:37:33 2026 +0200"
      },
      "message": "Minor: Use ArgumentChecks for inline null checks in normalizer and tokenize (#1400)"
    },
    {
      "commit": "197933cf976d9fb29a2813b99b17e62c0ba522fd",
      "tree": "97cca7226e16deda717c0983b44590afff87fbd3",
      "parents": [
        "a368de9cdd8a1b0c7c97eb9baae47170f8c565d0"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sun Oct 04 10:46:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 13:46:33 2026 -0400"
      },
      "message": "OPENNLP-1934: Add explicit tokenizer character policies (#1349)\n\nAdd TokenizerCharacterPolicy, an immutable Predicate\u003cCharSequence\u003e built\nfrom explicit letter, digit and mark sets, with an ASCII preset. Accept\nmarks after letters or digits, including repeated marks, but reject a\nleading mark. Support supplementary characters and return false for\nmalformed UTF-16.\n\nRequire at least one letter or digit. Reject null sets, overlapping\ncategories, whitespace and surrogate code points. Include tests for\nvalidation, character rules and the manual example.\n\nThe policy does not yet configure tokenizer training or inference. The\nexisting regex configuration is unchanged.\n\nAssisted-by: Claude Code 2.1.281\n\n\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a368de9cdd8a1b0c7c97eb9baae47170f8c565d0",
      "tree": "b2351d529b7cb0c7cdc6eb990e067b668e6e0cec",
      "parents": [
        "47369544cc41759d56a85acd003aa58cb00c899d"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sun Oct 04 09:50:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 18:50:56 2026 +0200"
      },
      "message": "(fix) GH-1379: Morpheme accepts a surface that does not match its span (#1384)\n\n* Morpheme accepts a surface that does not match its span\n\nThe constructor now rejects a surface whose length differs from its\nspan and features that contain null, and reports a null and an empty\nsurface separately. Callers passing such values get an\nIllegalArgumentException.\n\nAssisted-by: Claude Code 2.1.288\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Use ArgumentChecks for the Morpheme null checks\n\nReview feedback on #1384. The messages do not change.\n\nAssisted-by: Claude Code 2.1.288\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "47369544cc41759d56a85acd003aa58cb00c899d",
      "tree": "a629b1ac1668176e2573a2b6a7cf32dc6b533d43",
      "parents": [
        "9ca5e038537191a2171b3a4aca8df6b0a06762ce"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sun Oct 04 09:49:50 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 18:49:50 2026 +0200"
      },
      "message": "(fix) GH-1378: MeCab CSV reader accepts unterminated quoted fields (#1383)\n\n* MeCab CSV reader accepts unterminated quoted fields\n\nA lexicon line whose quoted field never closed was read as if the\nquote ran to the end of the line, so a broken entry loaded silently\nwith wrong fields. MecabDictionary now throws an IOException naming\nthe file and line, and the malformed entry messages share one prefix\nconstant. The tokenizer manual notes where the reader deviates from\nMeCab\u0027s own quoting.\n\nAssisted-by: Claude Code 2.1.288\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Build the malformed entry message in one helper\n\nReview feedback on #1383: drop the MALFORMED_ENTRY constant and build the\nmessage in a small helper instead. The messages do not change.\n\nAssisted-by: Claude Code 2.1.288\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9ca5e038537191a2171b3a4aca8df6b0a06762ce",
      "tree": "14754d1875252442d2a4bbb7028f45b62ea5e565",
      "parents": [
        "e7b9f2e3efe052fbd85f288ea9e1d34dde412aa1"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Sat Oct 03 13:30:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 22:30:16 2026 +0200"
      },
      "message": "StringUtil.toUpperCase does not uppercase supplementary-plane letters (#1381)\n\ntoUpperCase mapped one char at a time, so a letter outside the Basic\nMultilingual Plane, such as DESERET SMALL LETTER LONG I (U+10428),\nstayed lower case. It now maps by code point, like toLowerCase.\n\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "e7b9f2e3efe052fbd85f288ea9e1d34dde412aa1",
      "tree": "51d36c61faa318d851f6938587796753e660ef36",
      "parents": [
        "deaae403dd8923a96187152cff7b72f5156931d1"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 22:11:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 16:11:21 2026 -0400"
      },
      "message": "Minor: Reject a char.def range end without the 0x prefix (#1370)\n\nMecabDictionary checked the 0x prefix only on the range start and dropped\nthe first two characters of the range end unchecked, so 0x0020..10FF\nloaded as 0x0020..0xFF. Every code point field now needs the prefix, in\neither case, and a missing one fails the load with an IOException."
    },
    {
      "commit": "deaae403dd8923a96187152cff7b72f5156931d1",
      "tree": "be390a23e060b74aeae37bba49f3d7951a752d50",
      "parents": [
        "942edcb992879aa597ba594d200e94944a75b724"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 22:08:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 22:08:14 2026 +0200"
      },
      "message": "Minor: Build the jar mask from getJarModelPrefix on each model finder scan (#1387)"
    },
    {
      "commit": "942edcb992879aa597ba594d200e94944a75b724",
      "tree": "29018d773d4feb59eceed52f8773df9477638335",
      "parents": [
        "56e4eb27ec8de2ab0d14f6e7637d435550646030"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 22:05:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 22:05:14 2026 +0200"
      },
      "message": "Minor: Run SpellCorrectingTokenStream per token for any normalizer (#1372)\n\nSpellCorrectingTokenStream now derives a PER_TOKEN copy of a COMPOUND\nnormalizer, so a token is never split and the length, number and URL\nguards apply. Adds SpellCheckingCharSequenceNormalizer.withMode and\npins the null, empty-delimiter and COMPOUND cases in tests."
    },
    {
      "commit": "56e4eb27ec8de2ab0d14f6e7637d435550646030",
      "tree": "ada11da2372901f56b282b5a01b07c08cf69ffc9",
      "parents": [
        "4c523a0832cd7a718a534c0e21e2eca726f91f09"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 21:56:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 21:56:12 2026 +0200"
      },
      "message": "Minor: Format outcome probabilities thread-safely in AbstractModel (#1371)"
    },
    {
      "commit": "4c523a0832cd7a718a534c0e21e2eca726f91f09",
      "tree": "ee87d1bea93b09616720758541b12b9599899dcc",
      "parents": [
        "ffc43e688e830eb875f568c146e364b3b4495374"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 21:55:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 21:55:55 2026 +0200"
      },
      "message": "Minor: Make the RAT check read rat-excludes and fail on unapproved files (#1386)\n\n* Minor: Make the RAT check read rat-excludes and fail on unapproved files\n\nUse inputExcludeFile so RAT 0.18 reads rat-excludes from the repo root\nand drop the numUnapprovedLicenses override so any unapproved file fails.\nExclude the remaining test fixtures and CaseFolding.txt, and add the ASF\nheader to the poms, docs and config files that were missing it.\n\n* Keep the OPENNLP issue keys in the rat-excludes comments"
    },
    {
      "commit": "ffc43e688e830eb875f568c146e364b3b4495374",
      "tree": "c85d00c4842d0587f9eb6bb979848aae91f4b0a6",
      "parents": [
        "4962c2d04df86f45eb2656937c48b0f2e563dbb2"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 21:52:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 21:52:37 2026 +0200"
      },
      "message": "Minor: Share BERT tokens and softmax in opennlp-dl, load vocab files with empty lines (#1359)\n\n* Minor: Share BERT tokens and softmax in opennlp-dl, skip empty vocab lines\n\nNameFinderDL SEPARATOR, CLS_TOKEN and SPECIAL_TOKENS use WordpieceTokenizer constants.\nDocumentCategorizerDL.softmax delegates to AbstractDL.softmaxProbabilities and\nNameFinderDL.labelProbability to the allocation-free AbstractDL.softmaxProbability;\nboth share one documented non-finite score rule.\nPlain-text vocab loading skips empty lines but keeps line-based ids.\n\n* One pass over the scores in the shared softmax, deprecate the NameFinderDL aliases\n\nsoftmaxProbabilities and softmaxProbability gathered the +Infinity count and\nthe maximum in separate passes, and the distribution called Math.exp twice per\nscore. The summary is now one pass, and the distribution keeps exp(score - max)\nin the output array and divides in place, as DocumentCategorizerDL did before.\nThe private softmaxProbability overload, which took a score where the protected\none takes an index, is gone. Results are bit-identical.\n\n* Use ArgumentChecks in the shared softmax, remove the milestone-only NameFinderDL aliases\n\n* Keep the non-finite logit comment in DocumentCategorizerDL.softmax and document the rejection\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "4962c2d04df86f45eb2656937c48b0f2e563dbb2",
      "tree": "651f4c603d43f08c3087fbc2c693dd8bab3fa5cc",
      "parents": [
        "a033e05f0e556f0f3f780d9714dc5868e4efa690"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 21:50:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 21:50:23 2026 +0200"
      },
      "message": "Minor: Correct factually wrong Javadoc and manual statements (#1375)"
    },
    {
      "commit": "a033e05f0e556f0f3f780d9714dc5868e4efa690",
      "tree": "3c1e0570b28fcde2894ea2ce489fd0b9751f6e33",
      "parents": [
        "c70dc9196acfaf02b44b17b9a7a8687be3493489"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 21:44:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 21:44:42 2026 +0200"
      },
      "message": "Minor: Share the jar scan of the Simple and Directory model finders (#1374)"
    },
    {
      "commit": "c70dc9196acfaf02b44b17b9a7a8687be3493489",
      "tree": "2ab4eebb3605e5abeb7ea5ba3485cc2b875cfe35",
      "parents": [
        "1f7d2604de5219f59a965f516fb5cb65813516c9"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 19:21:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 19:21:01 2026 +0200"
      },
      "message": "Minor: Exclude bundled CaseFolding.txt from the RAT check (#1369)\n\nCaseFolding.txt is the upstream Unicode file declared in LICENSE and\nNOTICE and cannot carry an Apache header, so list it next to the other\nbundled Unicode data files in rat-excludes."
    },
    {
      "commit": "1f7d2604de5219f59a965f516fb5cb65813516c9",
      "tree": "1e74bf7e3088ad94188cbc056bca1184ecde3b7a",
      "parents": [
        "41c00ed9e61bab71df3b49e949e06d0066b51bf1"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 18:03:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 18:03:43 2026 +0200"
      },
      "message": "Minor: Document RealValueFileEventStream.parseEvent as public API (#1365)"
    },
    {
      "commit": "41c00ed9e61bab71df3b49e949e06d0066b51bf1",
      "tree": "20028abb32e315de0c271f5699df348fb703bd91",
      "parents": [
        "c4c596c435ee2f1fd039e9693e65c4d0a469340a"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 18:01:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 18:01:46 2026 +0200"
      },
      "message": "Minor: Align the manual with the TermAnalyzer stemmer thread-safety contract (#1366)"
    },
    {
      "commit": "c4c596c435ee2f1fd039e9693e65c4d0a469340a",
      "tree": "e46a246452ca8f4194c7ddbea0a9b51443d6a2a6",
      "parents": [
        "06a9a49467b8eef9f95c2bc04f650543f57fc8e1"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 18:00:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 18:00:28 2026 +0200"
      },
      "message": "Minor: Mark AbstractDL chunking and normalization helpers @Internal (#1368)"
    },
    {
      "commit": "06a9a49467b8eef9f95c2bc04f650543f57fc8e1",
      "tree": "d1ac8bfd824aeb8d9372f70826b777b8bf34e4c9",
      "parents": [
        "f25fefa8269bf8d7bce6aa6ae52b948d7a0a4731"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 17:58:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 17:58:49 2026 +0200"
      },
      "message": "Minor: Compose AlignedText stages with AlignedText.andThen (#1358)"
    },
    {
      "commit": "f25fefa8269bf8d7bce6aa6ae52b948d7a0a4731",
      "tree": "af7d9b39481ddc037396d7cf35a2b01a24f37d85",
      "parents": [
        "5dbadc2537362e4d1b01565a6b1dbb2990961ce7"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 17:52:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 17:52:43 2026 +0200"
      },
      "message": "Minor: Keep OffsetAwareNormalizer and StringUtil Javadoc to api contracts (#1364)"
    },
    {
      "commit": "5dbadc2537362e4d1b01565a6b1dbb2990961ce7",
      "tree": "04ba2971c2849b2891ba6b3f658302d97d4fc2db",
      "parents": [
        "1c240a26c22a706aa0e7c5644e6f94964e10f282"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 17:51:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 17:51:42 2026 +0200"
      },
      "message": "Minor: Move Wordpiece and chunker report tests next to their code (#1363)"
    },
    {
      "commit": "1c240a26c22a706aa0e7c5644e6f94964e10f282",
      "tree": "088a67b1e5e865ea901507e54750d679a27aea65",
      "parents": [
        "e3d644c3cdbee7831486f6f9301be689a995b2cc"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 17:49:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 17:49:51 2026 +0200"
      },
      "message": "Minor: Move the lattice tokenizer package to opennlp-runtime (#1367)"
    },
    {
      "commit": "e3d644c3cdbee7831486f6f9301be689a995b2cc",
      "tree": "3384aa4007637ace10d5e7436ac9d8b3156bb746",
      "parents": [
        "be98633a95a5656ff47020235537d613b70a2772"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 14:27:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 08:27:37 2026 -0400"
      },
      "message": "Minor: Reuse the runtime email scan in the spellcheck URL guard (#1360)\n\n* Minor: Reuse the runtime email scan in the spellcheck URL guard\n\nMailAddressScan in opennlp-runtime is now public @Internal with isAddress.\nSpellCheckingCharSequenceNormalizer replaces its URL_LIKE regex with a\ncursor scan that uses MailAddressScan.isAddress for the email branch.\n\n* Tidy the URL guard: constants, Javadoc wording, one normalizer in the test\n\nisNumberLike compares against the DOT and a new COMMA constant instead of\nliterals, the MailAddressScan @throws reads \"Thrown if\", and the normalizer\ntest builds one SpellCheckingCharSequenceNormalizer in setUp instead of one\nper call in the generated-token loops. The test uses the imported Pattern and\none literal for the emoji token.\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Use ArgumentChecks in MailAddressScan.isAddress, Checks in its Javadoc\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "be98633a95a5656ff47020235537d613b70a2772",
      "tree": "fe59581dea3b1c228e798d8cb5de8b68fcaa0562",
      "parents": [
        "e3bd9c49b131e113267d0505c1f19314ae13bb20"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 14:04:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 08:04:30 2026 -0400"
      },
      "message": "Minor: Share one hex code point parser and comment stripper in opennlp-api (#1354)\n\n* Minor: Share one hex code point parser and comment stripper in opennlp-api\n\nMove HexCodePoints from runtime to opennlp-api as an @Internal class and\nadd stripComment plus a decodeSequence overload that splits on exactly one\nseparator character. CodePointSet and MecabDictionary use stripComment and\nkeep their own number parsing and error messages. FullCaseFold,\nEmojiEmoticons, Confusables, WordBreakProperty and ExtendedPictographic use\nthe shared parser; CaseFolding and emoticon mapping fields still require a\nsingle U+0020 between code points.\n\nWordBreakProperty and ExtendedPictographic now reject code points above\nU+10FFFF and descending ranges with IllegalArgumentException, and\nFullCaseFold rejects a source code point above U+10FFFF. Before,\nExtendedPictographic accepted such values silently or failed with\nIndexOutOfBoundsException. The bundled data is unaffected.\n\n* Pin that a signed hex code point is rejected\n\nHexCodePoints.parseCodePoint and parseRange accept \"+0041\" and \"-0\" because\nInteger.parseInt accepts a sign, while the Javadoc promises that any character\nthat is not a hex digit is rejected. CodePointSet.parse accepts \"+0041\" as\nwell. The new cases fail on the current code:\n\n  HexCodePointsTest.parseCodePointRejectsMalformedDigits [6] [7]\n  HexCodePointsTest.parseRangeRejectsOutOfRangeOrPaddedEnds [4] [5]\n  CodePointSetTest.testParseRejectsSignedCodePoints [1] [2] [3]\n  Expected java.lang.IllegalArgumentException to be thrown\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Reject a sign in HexCodePoints and route the remaining parsers through it\n\nHexCodePoints.parseCodePoint now checks that the first character is a hex\ndigit before Integer.parseInt, so \"+0041\" and \"-0\" are rejected as the Javadoc\npromises. CodePointSet.parseCodePoint and MecabDictionary.parseCodePoint were\nthe last private copies of the hex parser in opennlp-api; both now call\nHexCodePoints and wrap the exception with the line number or file as before.\nCodePointSet detects the U+ and 0x prefix by character instead of lowercasing\nthe token.\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Use ArgumentChecks in HexCodePoints, Checks in the CodePointSet Javadoc\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "e3bd9c49b131e113267d0505c1f19314ae13bb20",
      "tree": "c7dbfe0a9c2b2a683bf74a971e08645611dba7e0",
      "parents": [
        "a6c5243909721eab7c52b8e5c45ff49122b31ccb"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 14:01:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 08:01:02 2026 -0400"
      },
      "message": "Minor: Route limit lookup and entry-count checks through ResourceLimits (#1355)\n\n* Minor: Route limit lookup and entry-count checks through ResourceLimits\n\nResourceLimits.initLimit(String, long) is @Internal public; ResourceInstaller\nuses it instead of its own longProperty copy.\nNew ResourceLimits.requireWithinMaxEntries replaces the hand-written count\nchecks in AbstractModelReader and SymSpellModelSerializer.\nAbstractModelReader drops the post-M5 MAX_ENTRIES alias and deprecates\nMAX_ENTRIES_PROPERTY in favour of ResourceLimits.\nThe checks in MecabDictionary and UnigramSegmenter stay as they are on\npurpose: they count entries one by one, report no count in the message, and\nUnigramSegmenter uses a configurable maxEntries.\n\n* Pin that initLimit(String, int) rejects a null property\n\nThe long overload throws IllegalArgumentException for a null property name,\nthe int overload still hands it to System.getProperty. The new assertion fails\non the current code:\n\n  ResourceLimitsTest.testNullPropertyIsRejected\n  Unexpected exception type thrown, expected: IllegalArgumentException\n  but was: NullPointerException: key can\u0027t be null\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Keep AbstractModelReader.MAX_ENTRIES as a deprecated alias\n\nMAX_ENTRIES is part of 3.0.0-M6, next to MAX_ENTRIES_PROPERTY from M5, so\nboth aliases get the same deprecation and a pin test that they still equal\nthe ResourceLimits values. ResourceLimits.initLimit(String, int) now rejects\na null property with IllegalArgumentException like the long overload.\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Remove the AbstractModelReader MAX_ENTRIES aliases, use ArgumentChecks in ResourceLimits\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "a6c5243909721eab7c52b8e5c45ff49122b31ccb",
      "tree": "ebb5fe3d0b57740c2897f334d1a26dc0e40c18de",
      "parents": [
        "0e267666744ba51c379fdd6fa149aff41086e755"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 13:58:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 07:58:19 2026 -0400"
      },
      "message": "Minor: Reuse StringUtil split, BOM, digit and line-terminator helpers (#1352)\n\n* Minor: Reuse StringUtil split, BOM, digit and line-terminator helpers\n\nEventFields, MascIdentifiers, ADNameSampleStream, FrequencyDictionaryLoader,\nMecabDictionary and UnigramSegmenter split through StringUtil.\nHunspellDictionary and FrequencyDictionaryLoader strip the BOM with StringUtil,\nShrinkCharSequenceNormalizer uses StringUtil.isLineTerminator.\nNew StringUtil.isUnpairedSurrogate replaces the copies in BasicContextGenerator\nand UrlCharSequenceNormalizer.\n\nMecabDictionary (matrix.def, char.def) and UnigramSegmenter (lexicon) now split\nfields on Unicode White_Space independent of WhitespaceMode, matching the\ntrimUnicodeWhitespace already applied to those lines. Under the default mode\nnothing changes; under WhitespaceMode.LEGACY U+001C..U+001F no longer separate\nfields and U+0085 does.\n\n* Run the lattice separator tests under both whitespace modes\n\nThe four tests added here claim the matrix.def, char.def and lexicon field\nseparator is independent of WhitespaceMode, but ran only under the default\nUNICODE mode, where the replaced loops already gave the same result. The\ndifference is in LEGACY mode: U+0085 now separates fields and U+001C to\nU+001F no longer do. The tests are now parameterized over WhitespaceMode and\nreset the mode after each test.\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Use Checks in the isUnpairedSurrogate Javadoc\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "0e267666744ba51c379fdd6fa149aff41086e755",
      "tree": "c74733c04e2fd3f63d2cc16ef0fc1284e4c33f33",
      "parents": [
        "20e63af11197fb20beff52598fee1747f3183286"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 13:40:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 13:40:01 2026 +0200"
      },
      "message": "Minor: Fix StringUtil.isEmpty and isBlank null checks after the ArgumentChecks move (#1362)\n\n#1353 removed the private StringUtil.requireNonNullArg while #1361 added\ntwo callers of it, so opennlp-api no longer compiles on main. Both now\ncall ArgumentChecks.requireNonNullArg."
    },
    {
      "commit": "20e63af11197fb20beff52598fee1747f3183286",
      "tree": "299b42eaccb0f2df7e03e8a5268213f10117fa63",
      "parents": [
        "36cd43a8c30283980d946cc85857dbb4a086e730"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 13:17:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 13:17:39 2026 +0200"
      },
      "message": "Minor: Share one requireNonNullArg helper across modules (#1353)\n\n* Minor: Share one requireNonNullArg helper across modules\n\nAdd @Internal ArgumentChecks.requireNonNullArg in opennlp-api opennlp.tools.util.\nStringUtil, CharClass, WordTokenizer, StopwordFilterStream, the dl classes, the\nspellcheck streams and the CharSequenceNormalizer implementations in\nopennlp-runtime and opennlp-spellcheck call it instead of private copies or\ninline checks; messages now read \"\u003cname\u003e must not be null\" instead of\n\"The \u003cname\u003e must not be null.\". AbstractDL.requireNonNullArg is a deprecated\ndelegate and reports the new message as well.\n\n* Use ArgumentChecks for the vocab check in AbstractDL\n\ncreateWordpieceEncoder kept a hand-written null check in a file that otherwise\nmoved to ArgumentChecks.requireNonNullArg. Same message, same exception.\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "36cd43a8c30283980d946cc85857dbb4a086e730",
      "tree": "9378a1bbe9031223d81b803fc536967722d7d151",
      "parents": [
        "932dbd94c65a21167187d961da3e338c31409670"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 13:13:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 13:13:47 2026 +0200"
      },
      "message": "Minor: Share ISO 639 code conversion via LanguageCodeValidator (#1356)\n\n* Minor: Share ISO 639 code conversion via LanguageCodeValidator\n\nAdd LanguageCodeValidator.toIso6391 and toIso6393 in opennlp-api.\nStopwordLists drops its private ISO 639-3 to 639-1 map and uses toIso6391.\nNormalizationProfiles.forLanguage uses toIso6393, so it now also\nresolves the bibliographic codes ger, fre and dut.\n\n* Use StringUtil.toLowerCase in LanguageCodeValidator and align the Javadoc\n\nThe conversion methods lower-case through StringUtil.toLowerCase instead of String.toLowerCase(Locale.ROOT).\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "932dbd94c65a21167187d961da3e338c31409670",
      "tree": "edfd0000ee5ad32eea5f6b2cb8ed146fd356b53c",
      "parents": [
        "773f107c4338840c76de91f6d86751ab27b8c9ee"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 11:59:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 11:59:23 2026 +0200"
      },
      "message": "Minor: Share layer alignment and span mapping across document annotators (#1357)\n\n* Minor: Share layer alignment and span mapping across document annotators\n\nDocumentAnnotators gains requireAligned, values and toCharacterSpan.\nChunkerAnnotator, LemmatizerAnnotator and NameFinderAnnotator use them\ninstead of their own alignment check, tag gather and span mapping.\nTermVectorAnnotator uses DocumentAnnotators.requireLayers.\n\n* Pin that requireAligned reports an absent layer as absent\n\nThe Javadoc of DocumentAnnotators.requireAligned asks for a document that\ncarries both layers, but the method compares sizes only. Document.get returns\nan empty list for an absent layer, so one absent layer is reported as\nmisaligned and a document without either layer passes.\n\n* Check layer presence in requireAligned and map parser spans through the helper\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "773f107c4338840c76de91f6d86751ab27b8c9ee",
      "tree": "0818823a6324bf5320422b5c68c56438fa028570",
      "parents": [
        "86bab9d57c80aa508ce6fbca518e4a67b9054483"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Sat Oct 03 11:48:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 11:48:01 2026 +0200"
      },
      "message": "Minor: Move StringUtil tests to opennlp-api, share test fixtures, reject null in StringUtil.isEmpty and isBlank (#1361)\n\n* Minor: Move StringUtil tests to opennlp-api and share test fixtures\n\nStringUtilTest moves from opennlp-tools to opennlp-api/src/test.\nStringUtil.isBlank rejects null with IllegalArgumentException.\nopennlp-api publishes a test-jar with RestoreDefaultLocale,\nResetWhitespaceMode and PinWhitespaceMode, used by 15 test classes.\n\n* Pin that StringUtil.isEmpty rejects null like isBlank\n\nisBlank now rejects null with IllegalArgumentException, isEmpty next to it\nstill throws NullPointerException and the Javadoc claims it returns true for\nnull. The changed test fails on the current code:\n\n  StringUtilTest.testIsEmptyWithNullString\n  Unexpected exception type thrown, expected: IllegalArgumentException\n  but was: NullPointerException\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* Align StringUtil.isEmpty with isBlank and use the project groupId for the test-jar\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "86bab9d57c80aa508ce6fbca518e4a67b9054483",
      "tree": "6512c624609aaf4f7da15d570c03268c314e9f0c",
      "parents": [
        "83c1283df39d780cad92640568b7c4eead674a6c"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 02 06:47:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 06:47:56 2026 +0200"
      },
      "message": "OPENNLP-1975: Address follow-up review comments from #1314 (#1351)"
    },
    {
      "commit": "83c1283df39d780cad92640568b7c4eead674a6c",
      "tree": "0814c7a6a402e3f927d115642ef49dcc6379321f",
      "parents": [
        "55d1dd0c01bf502142eaf08abe2a337a7bed647f"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 06:20:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 06:20:18 2026 +0200"
      },
      "message": "Minor: Regenerated NOTICE File for 55d1dd0c01bf502142eaf08abe2a337a7bed647f (#1350)\n\nSigned-off-by: GitHub \u003cnoreply@github.com\u003e\nCo-authored-by: rzo1 \u003crzo1@users.noreply.github.com\u003e"
    },
    {
      "commit": "55d1dd0c01bf502142eaf08abe2a337a7bed647f",
      "tree": "22ac05ffbe30085e70f6cef105b6e37a3a487465",
      "parents": [
        "ceb2bd880b3cd0a8a1dac8dd5de42c42ed4f57fd"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Fri Oct 02 06:14:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 06:14:46 2026 +0200"
      },
      "message": "OPENNLP-1975: Regex removal (9/10): Correct the output of TokenSampleStream, ParserTool, ConlluStream, DownloadUtil and FeatureGeneratorUtil (#1314)\n\n* OPENNLP-1975: Correct token, parser and resource scan behavior\n\nReplace the remaining scans in the English token sample reader, parser\nbracket spacing, CoNLL-U ranges, download links and checksums, and token\nfeature classification. Include single-quoted HTML links, Unicode\ncapital-period features and the English token sample stream evaluation.\n\nSquash the reviewed public history without changing its final tree.\nHosted Java CI passed on the original head 3e43b02eacb7a647d45dc34a97c90708b1a4a664.\nThe evaluation source is present; a completed evaluation run still needs\nconfirmation before merge.\n\n* OPENNLP-1975: Test the capital-period token class under the legacy mode\n\nUnder opennlp.compat.mode\u003dLEGACY a token is cp only for an ASCII capital or a German umlaut\ncapital followed by a period, with at most one line terminator after it, as before 3.0.0.\n\n* OPENNLP-1975: Keep the pre-3.0.0 capital-period class under the legacy mode\n\nFeatureGeneratorUtil classifies a single capital followed by a period as cp for any script in\nthe default mode. Under opennlp.compat.mode\u003dLEGACY the old set applies, A to Z and the three\nGerman umlaut capitals, with the one trailing line terminator the old pattern accepted, so\nmodels trained before 3.0.0 see the features they were trained with.\n\n* OPENNLP-1975: Re-pin the Swedish quasi-Newton POS accuracy\n\nThe cp token class accepts a capital of any script since this change, and the Swedish\ntalbanken05 training data holds one token of that shape outside the old set, \"Å.\". With that\nfeature the quasi-Newton trainer converges to a slightly different model, 0.934052333804809\ninstead of 0.9377652050919377 on the test set. The GIS model trained on the same features\nkeeps its pinned accuracy, and the old value returns under opennlp.compat.mode\u003dLEGACY, so the\ndifference is the optimizer path, not a worse feature.\n\n---------\n\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "ceb2bd880b3cd0a8a1dac8dd5de42c42ed4f57fd",
      "tree": "50649ba57ecf04c45ce76fabcde189be2187862c",
      "parents": [
        "ac0281a98912bad0a09233d427170554fbd9e469"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 01 20:56:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 20:56:40 2026 +0200"
      },
      "message": "OPENNLP-1974: Normalize complete Unicode emoji sequences (#1313)\n\n* OPENNLP-1974: Normalize complete Unicode emoji sequences\n\nUse a code-point matcher and pinned Unicode Emoji 18 data. Preserve non-emoji text and malformed candidates. Document training and inference implications.\n\nRed: 6 of 8 intended-behavior checks failed on the former implementation; 11 Emoji 18 cases failed with the Emoji 17 inventory. Green: 50 focused tests pass, including all 3963 bundled sequences.\n\n* OPENNLP-1974: Include Unicode emoji license in runtime JAR\n\nAppend the Unicode V3 license and Emoji 18 source attribution to the runtime artifact metadata. Include the data license when the runtime JAR is distributed separately.\n\n* OPENNLP-1974: Fix Unicode Emoji version in LanguageDetectorFactory Javadoc\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* OPENNLP-1974: Use Emoji 17.0 data for removal and preserve LEGACY output\n\nUse Unicode Emoji 17.0 data for emoji removal: 3,944 sequences and 10\ncomponent ranges. Pin the release, source checksums and sequence count\nin the generator. Load the data lazily and reject malformed entries.\n\nKeep emoji next to stray joiners, modifiers, selectors, flag letters or\ntags, and remove other complete emoji in the same run. Remove one extra\nU+FE0F after a complete emoji with that emoji. Skip non-emoji text before\nthe trie lookup.\n\nPreserve the old output under opennlp.compat.mode\u003dLEGACY with a cursor\nscan instead of regex. Compare it with the old pattern over 5,000\nrandomized inputs, and test the normalizer chain in both compatibility\nmodes.\n\nRemove the class deprecation and use it in the default normalizer chain.\nDocument the behavior in Javadoc and the language detector chapter, and\nupdate the runtime jar LICENSE and NOTICE for the bundled Unicode data.\n\nAssisted-by: Claude Code 2.1.281\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* OPENNLP-1974: Address review findings in the emoji normalizer\n\n- Trie nodes keep sorted primitive arrays instead of HashMap\u003cInteger, Node\u003e,\n  so a lookup does not box.\n- Lazy loading uses a holder class instead of double-checked locking.\n- The normalizer checks the candidate start set before decoding a second time.\n- Javadoc names the pre-3.0.0 regex once instead of \"the former pattern\".\n- HexCodePoints no longer claims to be shared by the other data loaders.\n- The generator reads each source file once and accepts a bare output name.\n- The characterization tests are parameterized so a failing input is named.\n- The docbook entry keeps two sentences in the table and moves the LEGACY note\n  below it.\n\n* OPENNLP-1974: Parse hex code points of all normalizer data files with HexCodePoints\n\nConfusables and EmojiAnnotations used their own Integer.parseInt(..., 16)\nloops. They now use HexCodePoints like UnicodeEmojiSequences, so an out of\nrange code point fails with the line number instead of a bare exception\nfrom appendCodePoint.\n\n* OPENNLP-1974: Remove minimally-qualified emoji sequences as well\n\nemoji-test.txt lists 1,029 minimally-qualified sequences, mostly gendered and\nskin tone ZWJ sequences written without U+FE0F after a later element, such as\nU+1F64B U+1F3FF U+200D U+2640. They were kept whole as malformed candidates.\nThe generator now keeps them next to the fully-qualified ones, so the\ninventory holds 4,973 sequences. Unqualified sequences, whose first code\npoint lacks a needed U+FE0F, are still kept as text.\n\n* OPENNLP-1974: Drop static from helpers that do not need it\n\n- UnicodeEmojiSequences: adding a sequence is an instance method of the trie\n  node instead of a static helper taking the root.\n- UnicodeEmojiSequenceGenerator: main creates an instance; the helpers are\n  instance methods.\n- Tests: helpers called only from test methods are instance methods.\n\nFactories (getInstance, load, parse), the HexCodePoints utility, JUnit\nmethod sources and the helpers they call stay static.\n\n* OPENNLP-1974: Test that hex code point sequences accept whitespace runs\n\nThe normalizer data loaders read code point sequences separated by any whitespace run,\nwith leading and trailing whitespace ignored, instead of single spaces only.\n\n* OPENNLP-1974: Split hex code point sequences on whitespace runs\n\nHexCodePoints tokenizes a sequence with StringUtil.splitOnUnicodeWhitespace, so the\nconfusables and annotation loaders and the emoji trie accept tabs and repeated spaces between\ncode points and ignore surrounding whitespace. The single space separator constant is gone.\nThe getInstance Javadoc of UnicodeEmojiSequences names the error the holder idiom produces.\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ac0281a98912bad0a09233d427170554fbd9e469",
      "tree": "79f9898bb52bf090ed3192b331e44d42e76f6f87",
      "parents": [
        "33fd09c9385b04358a676bb18b81da6eacd46ace"
      ],
      "author": {
        "name": "Richard Zowalla",
        "email": "13417392+rzo1@users.noreply.github.com",
        "time": "Thu Oct 01 13:49:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 13:49:55 2026 +0200"
      },
      "message": "Isolate ObjectInputFilter usage in BaseModel to allow model loading on Android (#1346)\n\n* Isolate ObjectInputFilter usage in BaseModel to allow model loading on Android\n\njava.io.ObjectInputFilter is not available on Android, so referencing it\nfrom the static initializer of BaseModel broke loading of every model.\nThe filter now lives in a nested holder class which is only touched by\nBaseModel.deserialize(...). On platforms without ObjectInputFilter,\ndeserialize(...) fails instead of reading objects without the allowlist.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* Address review: reference issue in test, close stream if filter installation fails\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "33fd09c9385b04358a676bb18b81da6eacd46ace",
      "tree": "a2320fbebf93cd1671ab005f955b11ab2262e137",
      "parents": [
        "b53d6a3b9decd76dd9a919ea06cdb91f9743c6d2"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Thu Oct 01 07:48:18 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 13:48:18 2026 +0200"
      },
      "message": "OPENNLP-1929: Regex Removal (7/10): BasicContextGenerator takes the separator literally and splits on Unicode whitespace by default (#1280)\n\nBasicContextGenerator(String) takes the separator as written instead of\ncompiling it as a regular expression on every call. \"|\" and \".\" now split\non that character, and \"+\" or \"(\" no longer throw PatternSyntaxException\nat prediction time. A separator containing a backslash, such as \"\\\\|\" or\n\"\\\\s+\", throws IllegalArgumentException at construction, so a separator\nwritten for 2.x fails at startup instead of silently not splitting.\n\nThe default constructor splits on runs of Unicode whitespace, independent\nof opennlp.whitespace.mode. Empty predicates are no longer returned. A\nnull input and a null, empty or unpaired-surrogate separator throw\nIllegalArgumentException.\n\nThe README lists the change under \"Breaking changes\", and the manual has\na table of 2.x separators and what to pass in 3.x.\n\nCo-authored-by: Richard Zowalla \u003crzo1@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e"
    },
    {
      "commit": "b53d6a3b9decd76dd9a919ea06cdb91f9743c6d2",
      "tree": "72b119656a18117c0311ad414283109c3f44a520",
      "parents": [
        "13d8ecf972411da3426296552cef654769b9974a"
      ],
      "author": {
        "name": "Kristian Rickert",
        "email": "kristian@apache.org",
        "time": "Wed Sep 30 14:48:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 20:48:28 2026 +0200"
      },
      "message": "OPENNLP-1989: Regex removal (5b/10): Preserve feature identities in event parsing (#1321)\n\n* OPENNLP-1989: Fix event parsing and preserve Unicode feature names\n\nThis fixes event parsing to use the delimiters defined by the file format. Unicode spaces that are not delimiters stay in feature names. It also fixes RealBasicEventStream stopping at a line that contains only an outcome.\n\nAI assisted summary, AI added for accuracy and detail and I manually edited for clarity.  All fact claims have been manually verified through an IDE and tests:\n\n\u003e FileEventStream, RealValueFileEventStream and RealBasicEventStream read\n\u003e fields using a shared, package-private EventFields splitter. The\n\u003e delimiters are space, tab, carriage return, line feed and form feed,\n\u003e matching FileEventStream.toLine. No-break and ideographic spaces remain\n\u003e part of feature names. Leading and repeated delimiters are skipped.\n\n\u003e A line with only an outcome produces an event with no contexts. Blank\n\u003e lines throw InvalidFormatException. Non-numeric, negative, NaN and\n\u003e infinite values throw IllegalArgumentException in all three streams\n\u003e and in SimpleEventStreamBuilder. The builder also preserves slashes\n\u003e after the outcome separator. RealValueFileEventStream.parseEvent is\n\u003e now public so RealBasicEventStream can use it.\n\n\u003e The manual explains the format with an example and notes the change\n\u003e to outcome-only lines since 3.0. Tests cover the delimiters, Unicode\n\u003e feature names, blank and outcome-only lines, and invalid values.\n\nAssisted-by: Claude Code 2.1.281\nCo-authored-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nReviewed-by: Kristian Rickert \u003ckristian@apache.org\u003e\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\n\n* OPENNLP-1989: Say what the delimiter tests check and rewrap the manual paragraph\n\n---------\n\nSigned-off-by: Kristian Rickert \u003ckristian@apache.org\u003e\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    }
  ],
  "next": "13d8ecf972411da3426296552cef654769b9974a"
}
