)]}'
{
  "log": [
    {
      "commit": "e0e1f16b6bbed7b2069bbef6c30b8bae535880ff",
      "tree": "43562d3807eaa90706ca7eb0204cef18b0499a71",
      "parents": [
        "7107fa10b6958cd03823f591ab5549f2d0bf0e36"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 22:33:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 16:33:48 2026 -0400"
      },
      "message": "Split the Security and Threat Model pages (#83)\n\n* Leave only the model on the threat model page\n\nThe page opened with the stock Commons security boilerplate and closed with a\nvulnerability list and a deserialization pointer, all of which the Security\npage already carries. Repeated on a page whose whole job is the model, they\ndilute it for a reader and feed irrelevant context to an agent consuming it.\n\nDrop the three repeated sections and the \"Threat Model\" wrapper heading, and\npromote what is left one level: the nine sections become top-level, and the\nbold pseudo-headings inside \"Assumptions about the environment\" become real\nsubsections. \"Reserved Settings (must not be loosened)\" loses the\nparenthetical from its title, which would otherwise land in the anchor, and\ncarries it in the opening sentence instead.\n\nPoint the intra-page links at the anchors Doxia actually emits. They used\nGitHub slugs (#what-is-in-scope) where the rendered page has What_is_in_Scope,\nso all 23 were dead on the site. The subsections are addressable now, so the\nreferences that read \"see **Supported runtimes** under [Assumptions about the\nenvironment]\" become direct links.\n\nRetarget the \"Supported runtimes\" link that pointed at index.html, which has\nno such section, to the Javadoc overview section that does.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841\n\n* Migrate the security page to Markdown\n\nEvery hand-written page on this site is Markdown; the security page was the\nlast hand-written xdoc, the other xdocs being commons-build-plugin output.\nDoxia derives heading ids the same way for both formats, so the section titles\ncarry the anchors over unchanged.\n\nAdd the supported release line while converting: it was stated only in the\nrepository\u0027s SECURITY.md and nowhere on the site.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841\n\n* Fix the site links that never resolved\n\nThe Javadoc overview renders as apidocs/index.html, so its relative links to\nthe threat model and to the Maven coordinates resolved inside apidocs/ and\n404ed; they need to climb one level. The coordinates sentence also carried a\nleftover Markdown link after the working anchor.\n\nThe site descriptor still named the project Apache Commons Text, which the\nskin printed in every page title.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841\n\n* Give every case on the threat model page its own heading\n\nThe bullets under \"What is out of scope\" and \"Settings you may modify\" were\nsubsections in disguise: several run seven to twelve lines with their own\nparagraphs and nested lists, held together only by list indentation, and\nnothing outside could link to one. Promote all fourteen to headings. The\nbullet with no bold lead-in becomes \"Non-conforming JAXP implementations\",\nmatching the disposition the triage table already names, and \"Android, on any\nAPI level\" loses its comma, which would otherwise land in the anchor.\n\nLift \"Reserved settings\" and \"Settings you may modify\" out of \"Assumptions\nabout the environment\" first, so their cases sit at the same level as the\nout-of-scope ones. Neither is an assumption about the environment: supported\nruntimes, honored JAXP contracts, XInclude resolution and system properties\nare, while those two state the contract with the caller. Doxia derives ids\nfrom heading text, so both keep the anchors they had.\n\nWith every case addressable, the last two-hop references collapse, and the\ntriage table points at the specific case a disposition maps to instead of at\nthe whole section.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841"
    },
    {
      "commit": "7107fa10b6958cd03823f591ab5549f2d0bf0e36",
      "tree": "4eeee86950e5a1e0ec21093a32b310cd1d98170d",
      "parents": [
        "8a000f40bd98ec7952889ff36f10ae01be9f4ebc"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 14:03:24 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 14:03:24 2026 -0400"
      },
      "message": "Fix broken English.\n"
    },
    {
      "commit": "8a000f40bd98ec7952889ff36f10ae01be9f4ebc",
      "tree": "c276c1e8627212a2187e0c2233bbe7064902a527",
      "parents": [
        "9e86f658dd093d996393a69bbb1c84cdbd8d7170"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 14:01:44 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 14:01:44 2026 -0400"
      },
      "message": "Javadoc @link to our own classes.\n"
    },
    {
      "commit": "9e86f658dd093d996393a69bbb1c84cdbd8d7170",
      "tree": "71b6d2455154e0901f84d13e00c2d980a2f2f9de",
      "parents": [
        "4a116db4f14542fabc692e89f65e827a9563e956"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 13:11:51 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 13:11:51 2026 -0400"
      },
      "message": "Javadoc @link to our own classes.\n"
    },
    {
      "commit": "4a116db4f14542fabc692e89f65e827a9563e956",
      "tree": "7a2c1e2a3e0c4d8d899190ff074e57d4ec381ee0",
      "parents": [
        "9d251f7641cc5049d59ef7c86aa7680d88a181d8"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 12:53:26 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 12:53:26 2026 -0400"
      },
      "message": "Import class instead of using a FQCN.\n"
    },
    {
      "commit": "9d251f7641cc5049d59ef7c86aa7680d88a181d8",
      "tree": "68d525e2f3841d61f398c81532e803582d571c1e",
      "parents": [
        "6c2b4413dbe92f4a53f6dbd2272c2d45d307138e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 12:50:35 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 12:50:35 2026 -0400"
      },
      "message": "SchemaContentModelLimitTest.MAX_OCCURS only needs to be just over 5,000.\n"
    },
    {
      "commit": "6c2b4413dbe92f4a53f6dbd2272c2d45d307138e",
      "tree": "fa054a3e818b1390623dc19f5d2b242d78553a85",
      "parents": [
        "1497239b852693775fdc409b736ddeb82cf06d99"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 18:21:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 12:21:17 2026 -0400"
      },
      "message": "Document resolvers in the Javadoc overview (#81)\n\n* Document how to opt a resource back in with a resolver\n\nA secured factory inverts what a resolver means: returning null leaves the\nreference unresolved and the floor answers it with empty content, instead\nof handing the reference back to the parser to fetch. A resolver is\ntherefore the only way to allow a fetch, and the identifier to match\nagainst an allow-list differs per API, absolute for EntityResolver and\nrelative plus a base URI everywhere else.\n\nAdd a Resolvers section to the Javadoc overview with one worked example per\nresolver API, name the channels each one covers, and link the JAXP, SAX and\nDOM types to the Java 25 API documentation at their first mention.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841\n\n* Escape the lambda arrows in the overview code samples\n\nThe JDK 11 javadoc HTML checker reads the bare \"\u003e\" of \"-\u003e\" as stray markup\nand fails the build with \"bad use of \u0027\u003e\u0027\"; the JDK 17 and later checkers\naccept it, so the samples passed locally. Write the arrow as \"-\u0026gt;\", which\nrenders identically.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841"
    },
    {
      "commit": "1497239b852693775fdc409b736ddeb82cf06d99",
      "tree": "0081c9160d9f3327d4f808a9672ed31634d7e90c",
      "parents": [
        "d3aa9eed02ce8bb092b8f1610b963c3f7e881b38"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 17:30:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 17:30:46 2026 +0200"
      },
      "message": "Sharpen the threat model: honored JAXP contracts, XInclude, and expansion limits (#66)\n\n* Document honored JAXP contracts in the threat model\n\nMake explicit, under \"Assumptions about the environment\", that the\nsecuring recipes rely on the JAXP implementation honoring the SAXSource\nand StAXSource contracts: the reader supplied inside the Source is the\none that performs the parse. An implementation that substitutes an\ninternal parser of its own violates that contract, so a report built on\nsuch a substitution is triaged OUT-OF-SCOPE: foreign implementation;\ndefending against it would be hardening, not a fix.\n\nAlso bump the modeled release line to 1.0.x.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Scope the XInclude guarantee to the Xerces convention\n\nJAXP specifies no contract for XInclude resolution: setXIncludeAware\nturns the processor on, but nothing in the API says which resolver a\nprocessor consults for an xi:include href. The securing gates XInclude\nthrough the entity-resolver floor, so the guarantee holds on the\nimplementations that follow the Xerces convention of routing the fetch\nthrough the EntityResolver, and a report demonstrated only on an\nimplementation that resolves an href without consulting it is out of\nscope.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Correct a stale factory class name in the threat model\n\nThe caller-supplied-parser exclusion pointed at\nHardeningSAXParserFactory, a class this library does not ship; the\nentry point that returns a secured reader is SecureSAXParserFactory.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Require the schema resolver contract in the threat model\n\nThe schema recipe rests on the SchemaFactory, Validator and\nValidatorHandler contracts for setResourceResolver: each locates the\nexternal resources it needs through the resolver installed on it, with\nthe schema language defining what counts as one. Record that alongside\nthe reader-injection contracts, together with the same contract\u0027s\nstatement that a factory\u0027s resolver is not inherited by the objects it\ncreates, which is why the floor is installed on each of them.\n\nAn implementation that stores a resolver but reaches an external\nresource without consulting it works outside the securing, on the same\nterms as one that ignores an injected reader.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Separate expansion count from expansion volume in the threat model\n\nThe model claimed every implementation\u0027s secure default bounds entity\nexpansion tightly enough to reject an entity-expansion denial of\nservice. That holds for the exponential shape it names, Billion Laughs,\nbecause the defaults bound the number of expansions; it over-claims for\nthe volume those expansions produce, which is a separate limit the\nstock JDK sets by default and Woodstox and external Xerces leave unset.\n\nState the two dimensions apart, and place the volume bound where the\nother processing limits already sit: with the operator, who sizes it or\nprovisions for the load instead. A matching entry under Known\nNon-Findings routes a report of that shape.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Name the source of the entity-expansion bound in the package Javadoc\n\nThe guarantee said internal expansion is bounded \"by the platform\u0027s\nsecure-processing limit\", which is inaccurate for StAX: JSR-173 defines\nno secure-processing feature, and the stock JDK\u0027s XMLInputFactory\nrejects it outright. The bound there comes from the implementation\u0027s\nown defaults, applied unconditionally, which is why the StAX recipe\nsets no limit of its own and has nothing to probe.\n\nSay where the limits come from instead. The other two guarantees are\nunchanged: the resolver floor is universal.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* fix: improve entity expansion disclaimer\n\n* fix: review threat model\n\n* fix: bundled -\u003e external"
    },
    {
      "commit": "d3aa9eed02ce8bb092b8f1610b963c3f7e881b38",
      "tree": "6ec1f0641c18e91ad94f3f5765c73935700d6201",
      "parents": [
        "1ff8851d810fe74981312de78b3c8b317f9092a5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 10:41:50 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 10:41:50 2026 -0400"
      },
      "message": "Remove unused import.\n"
    },
    {
      "commit": "1ff8851d810fe74981312de78b3c8b317f9092a5",
      "tree": "b415670a67506245e3d387fd4c6d262ea9d28324",
      "parents": [
        "5731ac39d5b3f2cee7c2ba1dab9df2fc9a6d1cab"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 16:00:21 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 16:13:20 2026 +0200"
      },
      "message": "Use the ASF id in the changelog and the developer entry\n\nThe changes.xml dev attribute and the pom developer id name the\ncommitter by ASF id, as Gary\u0027s ggregory entries do; ppkarwasz is a\nGitHub id.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841\n"
    },
    {
      "commit": "5731ac39d5b3f2cee7c2ba1dab9df2fc9a6d1cab",
      "tree": "ab9c99f0283fd4112a30ad7c9be1bf37dd923a43",
      "parents": [
        "94898e312a4536abfcc53d1e0756ebcaac67d2ec"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 16:00:09 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 16:13:20 2026 +0200"
      },
      "message": "Credit Elliotte Rusty Harold\u0027s clean-up in the changelog\n\nCovers the two merged pull requests (#77, #79) and the two still open\n(#78, #80): a protected modifier dropped from a final class, modern\nJUnit assertions in the tests, unthrown exceptions removed from method\nsignatures, and copy edits to the Javadoc overview and the site.\n\nAssisted-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01XVaEa2R2sHtBgJh8Mhv841\n"
    },
    {
      "commit": "94898e312a4536abfcc53d1e0756ebcaac67d2ec",
      "tree": "77883b9a715035718c74e5afff3af4c100e25887",
      "parents": [
        "c00a06601b945db6502f463a7b872a084bf11b9b"
      ],
      "author": {
        "name": "Elliotte Rusty Harold",
        "email": "elharo@users.noreply.github.com",
        "time": "Tue Sep 01 14:10:57 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 10:10:57 2026 -0400"
      },
      "message": "Remove unthrown exceptions (#78)\n\nCo-authored-by: Piotr P. Karwasz \u003cpkarwasz-github@apache.org\u003e"
    },
    {
      "commit": "c00a06601b945db6502f463a7b872a084bf11b9b",
      "tree": "af2a92dc1a4a81e8afb638e09ec9ebf1064aa4da",
      "parents": [
        "d53659197974fd15ad14f469175b68a80013fafa"
      ],
      "author": {
        "name": "Elliotte Rusty Harold",
        "email": "elharo@users.noreply.github.com",
        "time": "Tue Sep 01 14:09:14 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 10:09:14 2026 -0400"
      },
      "message": "Copy editing (#80)"
    },
    {
      "commit": "d53659197974fd15ad14f469175b68a80013fafa",
      "tree": "e62ee23409014fe1d107daa22a1e719b427e8657",
      "parents": [
        "1bbbc91e8a1d3a0c97276f9b6396e261233f9361"
      ],
      "author": {
        "name": "Elliotte Rusty Harold",
        "email": "elharo@users.noreply.github.com",
        "time": "Tue Sep 01 13:52:14 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 15:52:14 2026 +0200"
      },
      "message": "Small simplifications (#79)\n\n1. use assertInstanceOf instead of assertTrue\n2. use Collections.emptyIterator() instead of an empty list"
    },
    {
      "commit": "1bbbc91e8a1d3a0c97276f9b6396e261233f9361",
      "tree": "7c51332d5222bef4b79f931bbfccaedaed817bc8",
      "parents": [
        "b08f73ef1a48952bddfdf4818dc8cc834c998374"
      ],
      "author": {
        "name": "Elliotte Rusty Harold",
        "email": "elharo@users.noreply.github.com",
        "time": "Tue Sep 01 13:34:14 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 15:34:14 2026 +0200"
      },
      "message": "Don\u0027t need protected method in final class (#77)"
    },
    {
      "commit": "b08f73ef1a48952bddfdf4818dc8cc834c998374",
      "tree": "a3dcd71712c7fcfa4af77101e7188d0dadbdcb5a",
      "parents": [
        "2a70b09fb7e05da8062e4df5aae4f78b3c00267a"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:19:40 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:19:40 2026 -0400"
      },
      "message": "Javadoc\n"
    },
    {
      "commit": "2a70b09fb7e05da8062e4df5aae4f78b3c00267a",
      "tree": "f5f1adf3f8403e71712f056a8ceeee317c3b7ba2",
      "parents": [
        "e1dde41efc20a00ef27c6bfa184178c5f33964a6"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:18:49 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:18:49 2026 -0400"
      },
      "message": "Javadoc\n"
    },
    {
      "commit": "e1dde41efc20a00ef27c6bfa184178c5f33964a6",
      "tree": "a383a0d55deb2b7bed19c85d699c3e46eb181178",
      "parents": [
        "6e3ec49e9e9d0b640dc147e0f6a649148941f116"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:06:37 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:06:37 2026 -0400"
      },
      "message": "Generate binary assembly.\n"
    },
    {
      "commit": "6e3ec49e9e9d0b640dc147e0f6a649148941f116",
      "tree": "0317c98a6d18465735742e08e30b2623a568f304",
      "parents": [
        "18dcc5f74a1227bfe5ac96ef54fbe804ef3c6be8"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:06:25 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:06:25 2026 -0400"
      },
      "message": "Javadoc\n"
    },
    {
      "commit": "18dcc5f74a1227bfe5ac96ef54fbe804ef3c6be8",
      "tree": "4473709108b27e702f323b0161c5356a3d3a95de",
      "parents": [
        "16f4829576d54444feb459f158737cb1806ea33c"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:03:20 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:03:20 2026 -0400"
      },
      "message": "Sort members.\n"
    },
    {
      "commit": "16f4829576d54444feb459f158737cb1806ea33c",
      "tree": "84668b9ed686ae5d7888542d174a70d4f01287b7",
      "parents": [
        "7404ac6325828b7f2f5140fa78e2824495e3d5a5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:01:47 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 08:01:47 2026 -0400"
      },
      "message": "Add android-tests to source assembly.\n\nRemove redundant entries.\n"
    },
    {
      "commit": "7404ac6325828b7f2f5140fa78e2824495e3d5a5",
      "tree": "c9f09a48c339e15ede6a531281d7c6b1341c84be",
      "parents": [
        "4ae7b9c4be0b3f54eb376405112d21ba50dc2a87"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 07:50:29 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 07:50:29 2026 -0400"
      },
      "message": "Next RC will be RC2.\n"
    },
    {
      "commit": "4ae7b9c4be0b3f54eb376405112d21ba50dc2a87",
      "tree": "a0cd08d76049786c934e967266611991b812ffe5",
      "parents": [
        "632cb04d3ce06303387f370338cb942a719cef7a"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 07:50:03 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Tue Sep 01 07:50:03 2026 -0400"
      },
      "message": "Package-private FallbackIgnoreEntityResolver2 can be final.\n"
    },
    {
      "commit": "632cb04d3ce06303387f370338cb942a719cef7a",
      "tree": "0e531c673de70087d1a8478efc2f29d9ef41d9b7",
      "parents": [
        "73b6bbf7ce7f94730fc5023553f709ff5bb64afb"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:48:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:48:31 2026 -0400"
      },
      "message": "Delegate the Java 18 XPathFactory property methods (#76)\n\nJava 18 added setProperty and getProperty to XPathFactory, with\ndefaults that throw UnsupportedOperationException and an override in\nthe JDK implementation that accepts its jdk.xml.xpath* limits. The\nwrapper is compiled against the Java 8 API, so it inherited those\ndefaults and answered for the delegate: on Java 18 or later a caller\ncould neither tighten nor read a limit through a secure factory, though\nnothing could be loosened either.\n\nDelegate both through method handles, the way newDefaultInstance\nalready reaches a later-release static method. Neither carries\n@Override, which would not compile at release 8; each overrides at run\ntime where the platform declares the method, and reports the inherited\nUnsupportedOperationException where it does not.\n\nThe tests reach the pair reflectively for the same reason, which is\nalso how a Java 18 caller resolves it, and skip on a platform without\nthe methods.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e"
    },
    {
      "commit": "73b6bbf7ce7f94730fc5023553f709ff5bb64afb",
      "tree": "55bcead21d41fae2823a9e59e68342b3ac9632fc",
      "parents": [
        "91929333d96bf213f97040de63b7c34690fd98f6"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:41:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:41:37 2026 -0400"
      },
      "message": "Install a fresh StAX resolver floor per hook instead of mutating one (#75)\n\nRouting a caller resolver by calling setDelegate on the floor already\ninstalled treated that floor as private to the hook being set, which it\nis not. Woodstox routes setXMLResolver to both its DTD-subset and\nentity hooks, so one floor object sits on several of them, and its\nReaderConfig.createNonShared copies the reference into every reader it\ncreates. Mutating the object therefore answered hooks the call never\nnamed, and changed the resolution policy of readers created earlier,\nincluding ones already parsing on another thread.\n\nInstall a new floor on the named hook instead. Each hook then keeps the\nfloor it was given and each reader the one it captured, so a resolver\nis scoped to the hook it was set on and bound when the reader was made.\nNothing is mutated after publication any more, which also removes the\nunsynchronized cross-thread write.\n\nThe com.ctc.wstx.* hooks had no tests; they have two now, both verified\nto fail without the main-code change. The existing setXMLResolver test\nasserted the mutation itself, so it now asserts the contract it was\nstanding in for: the hook keeps a floor and the caller sits behind it.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33"
    },
    {
      "commit": "91929333d96bf213f97040de63b7c34690fd98f6",
      "tree": "c711de871e5017bc35ad9068085d39b4b216f61c",
      "parents": [
        "6d40c0ecce299481290ad587c5748ea236d20aee"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:38:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:38:43 2026 -0400"
      },
      "message": "Secure getAssociatedStylesheet, and pin the CI Zulu job to JDK 8u152 (#74)\n\n* Pin the CI Zulu job to JDK 8u152\n\nThe Zulu job exists to cover the oldest JDK 8 behavior the securing has\nto work against, but 8u201 already carries the 8u162 backport wave. Pin\nit to 8u152, the last release before XSLTC\u0027s getAssociatedStylesheet\nbegan honoring the XMLReader carried by a SAXSource: through 8u152 it\nself-provisions a parser instead, which the newer job cannot exercise.\n\njdk.xml.overrideDefaultParser arrived in the same wave, so\nOverrideDefaultParserTest now skips where the runtime does not\nrecognize the feature rather than failing on it.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Secure both untrusted inputs of getAssociatedStylesheet\n\nThe PI scan and the href it yields are each derived from the scanned\ndocument, and each reached an implementation unfiltered.\n\nThe scan: Apache Xalan provisions its own parser instead of using the\none a SAXSource carries (XALANJ-2849), and the JDK\u0027s XSLTC did the same\nbefore 8u162, so on Java 8 the document was scanned by a parser this\nlibrary never configured. Pre-parse to a DOM for those engines, keying\non Java 8 as a whole since the patch levels are indistinguishable\nthrough any API. Include a SAXSource that carries the caller\u0027s own\nreader: an engine that reaches this path drops that reader anyway, so\nthe choice is only between this parse and the engine\u0027s own.\n\nThe href: XSLTC-lineage engines resolve it during the scan, before the\nfactory\u0027s URIResolver is installed, and hand back a live Source naming\nthe absolutized URI, which compiling would then fetch. Route it through\nthe floor like any other content-named reference, so a caller resolver\nopts it in and everything else resolves to empty. Saxon already behaved\nthis way, so the engines now agree.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Add comment.\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e"
    },
    {
      "commit": "6d40c0ecce299481290ad587c5748ea236d20aee",
      "tree": "2c4b48460e4c5e4b266801723e6e82a38fe66dda",
      "parents": [
        "6fcb5718dede6858ad1c13a96121bc24b40d3353"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:34:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:34:32 2026 -0400"
      },
      "message": "Bound the content model a schema expands into (#73)\n\n* Bound the content model a schema expands into\n\nA schema loader expands a repeated particle into content-model nodes\nwhile building the DFA. That happens after parsing and without the\nreader, so the limits the injected reader carries never reach it, and a\ncompact schema with a large maxOccurs was expanded unbounded on an\nimplementation whose limit is opt-in: external Xerces applies it only\nunder FEATURE_SECURE_PROCESSING, which the wrapper did not set (the\nstock JDK applies it unconditionally).\n\nSet FEATURE_SECURE_PROCESSING on the wrapped factory, failing closed as\nthe other recipes do. The JAXP 1.5 ACCESS_EXTERNAL_* properties stay\nunset, so the caller-resolver opt-in path is unaffected; the schema\ntests covering it pass on Java 8 as well.\n\nThe expansion is lazy on Xerces, so the new test validates an instance\nrather than only compiling the schema, and skips its unbounded control\nwhere the implementation applies the limit unconditionally.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Clarify test description in SchemaContentModelLimitTest\n\nUpdated the test class description for clarity.\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e"
    },
    {
      "commit": "6fcb5718dede6858ad1c13a96121bc24b40d3353",
      "tree": "6bc6b580c2b6919dde364171f3e7d1af78fcaa49",
      "parents": [
        "80674832f7e98580826c2d14317792a0b04aa6e8"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:31:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:31:35 2026 -0400"
      },
      "message": "Keep the resolver floor on a reader obtained before reset() (#72)\n\nA JAXP parser hands out one reader for its lifetime, and reset() reverts\nthat reader to its just-created state, which removes the floor the\nwrapper installed after creation. SecureSAXParser only dropped its\ncached views, so the floor came back on the next getXMLReader() call\nwhile a reader a caller already held kept parsing without one.\n\nRe-secure the reader in place instead, through the view already vended,\nas SecureDocumentBuilder.reset() has always done. Keeping one wrapper\nalso keeps a caller resolver set on that view routed through the floor\nthat is actually installed.\n\nResetSecureTest covers the retained reader; the SecureSAXParser unit\ntest now asserts the views survive a reset with the floor in place,\nrather than that they are recreated.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33"
    },
    {
      "commit": "80674832f7e98580826c2d14317792a0b04aa6e8",
      "tree": "12871a20988dd86f043784f3c8308cdcb0a9d19b",
      "parents": [
        "54b8d4b29f6283f479395c7528001ea5a797a33e"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:30:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:30:07 2026 -0400"
      },
      "message": "Cover Saxon\u0027s unparsed-text family and json-doc on the TrAX path (#71)\n\n* Cover Saxon\u0027s unparsed-text family and json-doc on the TrAX path\n\nThe XPath 3.1 unparsed-text functions and json-doc do not go through\nthe JAXP URIResolver that governs document() and xsl:include; Saxon\nroutes them through the Configuration\u0027s resource resolver. Only the\nXPath path had tests for that chain, leaving the stylesheet side of it\nunverified even though the factory wrapper\u0027s floor already covers it.\n\nAdd the TrAX companion of SaxonXPathExternalCallsTest: the three\ncontent functions are checked as leak pairs (unconfigured Saxon copies\nthe marker into the output, the secured factory does not), and\nunparsed-text-available as an existence oracle the secured factory must\nnot answer from the real filesystem. No production change: the secured\nfactory already blocks every one of these.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Update test class description for clarity\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e"
    },
    {
      "commit": "54b8d4b29f6283f479395c7528001ea5a797a33e",
      "tree": "c6112e8355cbb1dd327fa886ba35f548309dec2e",
      "parents": [
        "fa90fe81ddc9db5d6315382d199450a0c9c7d23e"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:28:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:28:33 2026 -0400"
      },
      "message": "Rethrow JVM errors unchanged in MethodHandleFactory.invokeExact (#70)\n\nAn undeclared Error raised through the MethodHandle lookup path (an\nOutOfMemoryError, for example) was wrapped in IllegalStateException,\ndemoting it from Error to RuntimeException and hiding it from\nsupervisors that handle Error separately. Rethrow it unchanged; the\nIllegalStateException wrap now covers runtime exceptions only, since\nthe looked-up factory methods declare no other checked exceptions.\nAssert instance identity, not just type, on both rethrow paths.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33"
    },
    {
      "commit": "fa90fe81ddc9db5d6315382d199450a0c9c7d23e",
      "tree": "9fc74c3ee63f4663a8259fc3d52ed6b88e98d273",
      "parents": [
        "a06bb687673c218053c5075ce6fb3a06948e3770"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:27:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:27:53 2026 -0400"
      },
      "message": "Resolve each unresolved URI to a fresh empty document (#69)\n\nThe URIResolver floor answered every unresolved reference with a\nDOMSource over one shared static Document; the Source escapes to the\nconsumer, so a component mutating a document it received would surface\nits changes in every later resolution, process-wide. Follow the JDK\u0027s\nXSLTC pattern and build a fresh empty document per resolution, using\nthe same secured, namespace-aware factory selection as the Source\nrewrite (an upgrade over the previous raw JAXP lookup, and it now\nhonors overrideDefaultParser). Creation failure is wrapped in\nIllegalStateException per call instead of ExceptionInInitializerError.\n\nThe threat model now states the matching scope rule: modifying a\nmutable object a JAXP method returned or stored (the capability behind\nthe SpotBugs expose-internal-representation patterns) presumes an\nadversary already running in the process, which the model does not\ndefend against — the isolation here is robustness, not a defended\nboundary.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33"
    },
    {
      "commit": "a06bb687673c218053c5075ce6fb3a06948e3770",
      "tree": "b84ed5bb8fc610983faeec3b76339278f18f8fc0",
      "parents": [
        "c716c20ea70e5b6c624b145e2e2551952a02e739"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:23:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:23:41 2026 -0400"
      },
      "message": "Forward getExternalSubset to a caller EntityResolver2 (#68)\n\nThe entity-resolver floor inherited DefaultHandler2\u0027s always-null\ngetExternalSubset, so a caller resolver installed through\nsetEntityResolver never had its synthetic external subset consulted and\nDOCTYPE-less documents parsed without the declarations the caller\nsupplied. Forward the call to an EntityResolver2 delegate; without one\nthe \"no synthetic subset\" default stands. A null return means the parse\ncontinues without a subset, not that a resource went unresolved, so the\nignore fallback stays out of this path.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33"
    },
    {
      "commit": "c716c20ea70e5b6c624b145e2e2551952a02e739",
      "tree": "6bd0d321c1c1fbceceecdd9a55174cc92a706f04",
      "parents": [
        "2457a9adfb087ac259204659841684a9f5ddb6cc"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 13:19:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:19:46 2026 -0400"
      },
      "message": "Restructure SECURITY.md into a full security policy (#67)\n\n* Restructure SECURITY.md into a full security policy\n\nSplit the page into four sections: supported versions (the 1.x release\nline), private reporting through the Apache Commons Security Page, the\nlibrary threat model reports are triaged against, and the supply-chain\ntrust assumptions of the repository workflows. The latter documents\nthat apache/commons-* repositories are fully trusted and that trusting\nGitHub-owned actions/* and github/* actions is an accepted risk, so\nreports about unpinned references into either are out of scope.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n\n* Style tweak.\n\n---------\n\nCo-authored-by: Gary Gregory \u003cgarydgregory@users.noreply.github.com\u003e"
    },
    {
      "commit": "2457a9adfb087ac259204659841684a9f5ddb6cc",
      "tree": "a235e13d0f396a9eb089f75f194d6f96689dc7d0",
      "parents": [
        "754b0a1eab7deacca8c63e86ea013199a4a598f5"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 09:51:17 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 09:51:17 2026 +0200"
      },
      "message": "Verify the Gradle wrapper and distribution by checksum\n\nAdd distributionSha256Sum for gradle-8.10-bin.zip to the wrapper\nproperties, so the wrapper verifies the downloaded distribution before\nexecuting it, and run gradle/actions/wrapper-validation in the Android\nCI job, so the checked-in gradle-wrapper.jar is checked against\nGradle\u0027s published checksums before anything invokes ./gradlew.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n"
    },
    {
      "commit": "754b0a1eab7deacca8c63e86ea013199a4a598f5",
      "tree": "b6264c454421b34a20c027748193ddc9b47db2bc",
      "parents": [
        "ce48b10c7c05267821f799d7e00a8bb92bbdb44f"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 09:42:23 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 09:42:23 2026 +0200"
      },
      "message": "Disable Mockito-based tests in the native image\n\nMockito generates mock classes and plugin proxies at run time, which a\nclosed-world native image cannot do, so the two tests stubbing JAXP\nfactories for their error paths failed the GraalVM job. Annotate them\nwith @DisabledInNativeImage, as the XSLTC-pinning transform test\nalready is; the rest of both classes stays enabled natively.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n"
    },
    {
      "commit": "ce48b10c7c05267821f799d7e00a8bb92bbdb44f",
      "tree": "82d11a81ca2ba5121eea66e1f1d1fba9ca3986a6",
      "parents": [
        "60a0d2a600814cad94fc165dbd87dbb14ea67ef1"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 08:44:16 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 09:00:40 2026 +0200"
      },
      "message": "Rework the DOM default parser selection test.\n\nSplits the explicit factory class case out, collapses the selection\ncases into one test that observes the wrapped delegate, and gates both\non Android, where the secure factory returns the platform\nimplementation unwrapped.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n"
    },
    {
      "commit": "60a0d2a600814cad94fc165dbd87dbb14ea67ef1",
      "tree": "a1d4e1d6a4071b5af220d435513e2a10795c88f3",
      "parents": [
        "8935fb55ae5f36af64afed90235b7035d092f846"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 08:44:15 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 09:00:40 2026 +0200"
      },
      "message": "Rework the SAX default parser selection tests.\n\nCollapses the selection cases into one test that observes the wrapped\ndelegate, covers every exception declared on the\nnewSAXParser().getXMLReader() chain, and gates the tests that rely on\nthe javax.xml.parsers.SAXParserFactory system property on Android,\nwhere the standard lookup is pinned to the platform implementation.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CLnTBsvmYtxzNTWVGNyz33\n"
    },
    {
      "commit": "8935fb55ae5f36af64afed90235b7035d092f846",
      "tree": "9dca59eb43f731c54d658318227e5c9730d2241e",
      "parents": [
        "39df65a45dac5cff0be0a8424c0a350d48abb294"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 07:07:09 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Tue Sep 01 07:07:09 2026 +0200"
      },
      "message": "fix: add Mockito as Gradle dependency\n"
    },
    {
      "commit": "39df65a45dac5cff0be0a8424c0a350d48abb294",
      "tree": "a238b8bf2d308c32c69bab7bf5fd2c076fd2710c",
      "parents": [
        "123b72b9ab8c8d102529cf46801619d3c7a3caeb"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 17:54:41 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 17:54:41 2026 -0400"
      },
      "message": "Add assembly folder.\n"
    },
    {
      "commit": "123b72b9ab8c8d102529cf46801619d3c7a3caeb",
      "tree": "9d41719bc7b444adbfb70352ce4735624dc21fc2",
      "parents": [
        "554e5673745685642b02f649fbf0a67538b9b1cf"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 21:46:12 2026 +0000"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 21:46:12 2026 +0000"
      },
      "message": "Prepare for the release candidate\n"
    },
    {
      "commit": "554e5673745685642b02f649fbf0a67538b9b1cf",
      "tree": "5bb91c6838980845118f604e5762ac011a2f1f19",
      "parents": [
        "ced43e2b7e29e7a73a2ec0e8c56a300229b5f1e2"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:34:22 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:34:22 2026 -0400"
      },
      "message": "Add inline comments\n\nSome APIs should never return null for a specification-compliant\nfactory.\n"
    },
    {
      "commit": "ced43e2b7e29e7a73a2ec0e8c56a300229b5f1e2",
      "tree": "662679741388c1e33be8ead4cd64a420d67de63a",
      "parents": [
        "e54cb670c02927aa46381b1b1e0a1c116e8b9709"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:23:30 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:23:30 2026 -0400"
      },
      "message": "Internal refactoring\n"
    },
    {
      "commit": "e54cb670c02927aa46381b1b1e0a1c116e8b9709",
      "tree": "69ee4bc0fa261b2516642d54a8395d74d2ce29bc",
      "parents": [
        "630bfd30f006276f102624d6a707bc8aada09709"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:19:38 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:19:38 2026 -0400"
      },
      "message": "Parameter name typo and Javadoc.\n"
    },
    {
      "commit": "630bfd30f006276f102624d6a707bc8aada09709",
      "tree": "e3cabe89d74cc7acc5c56945ac0a33a1053ef234",
      "parents": [
        "15d479a80318cc89b084aa8525dcaa6fc08be2ea"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:12:06 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:12:06 2026 -0400"
      },
      "message": "Internal refactoring\n"
    },
    {
      "commit": "15d479a80318cc89b084aa8525dcaa6fc08be2ea",
      "tree": "4dbb9cc701b3092ff257deedeb4802ab69427d55",
      "parents": [
        "8dbba30276df173979bb10f7f326b98983a6b28c"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:08:14 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 10:08:14 2026 -0400"
      },
      "message": "Add SecureSAXParserFactoryTest.newXmlReaderWrapsParserConfigurationException()\n"
    },
    {
      "commit": "8dbba30276df173979bb10f7f326b98983a6b28c",
      "tree": "1b109c5dddbb25571256ba384a7418f88aa95203",
      "parents": [
        "24ee6580f3ca467496ae86c589da02d9676dcf85"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 09:52:45 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 09:52:45 2026 -0400"
      },
      "message": "Fix descriptions\n"
    },
    {
      "commit": "24ee6580f3ca467496ae86c589da02d9676dcf85",
      "tree": "7967c5e0173b10bbf34834ae8f658a503494abf9",
      "parents": [
        "f7798ed10d2ef98b66e0e5c34248a77a49eca417"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:48:33 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:48:33 2026 -0400"
      },
      "message": "Add inline comment\n\n- SecureTemplates.newTransformer()\n- https://issues.apache.org/jira/browse/XALANJ-2410\n"
    },
    {
      "commit": "f7798ed10d2ef98b66e0e5c34248a77a49eca417",
      "tree": "833cee67e7244426077e68403fcca627f8faa7dd",
      "parents": [
        "a6878ca47f6558167636fd811218b7aa57b644bb"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:38:31 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:38:31 2026 -0400"
      },
      "message": "Javadoc\n"
    },
    {
      "commit": "a6878ca47f6558167636fd811218b7aa57b644bb",
      "tree": "60a3961fa2ea43b42d388b788d9d60d34879abf3",
      "parents": [
        "12adf4692f961d65a8bbe77fddf1178ff3a3bd8c"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:21:31 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:21:31 2026 -0400"
      },
      "message": "Simplify."
    },
    {
      "commit": "12adf4692f961d65a8bbe77fddf1178ff3a3bd8c",
      "tree": "629a0cbc33a24f9f2915e611446af38f01823159",
      "parents": [
        "6709edd447cc8744061a03a3f29772560b248198"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 11:19:28 2026 +0000"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 11:19:28 2026 +0000"
      },
      "message": "Bump github/codeql-action/analyze from 4.37.8 to 4.37.9.\n"
    },
    {
      "commit": "6709edd447cc8744061a03a3f29772560b248198",
      "tree": "33670db9c47c9c85999911fc6fa1ede36c680913",
      "parents": [
        "52efaa2a4e20c18bccf68c57c5a9392689f46eec"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:05:45 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Mon Aug 31 07:05:45 2026 -0400"
      },
      "message": "Tests ExceptionInInitializerError in FallbackIgnoreURIResolver.\n"
    },
    {
      "commit": "52efaa2a4e20c18bccf68c57c5a9392689f46eec",
      "tree": "e68be53b3da5958bd8c82a56244490324b06e263",
      "parents": [
        "279173b4284480cdd994d204e55c4d179c530503",
        "a4000e586161bf6d13c3e942bd422cc178c85009"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Mon Aug 31 06:19:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 06:19:36 2026 -0400"
      },
      "message": "Merge pull request #65 from ppkarwasz/docs/modifiable-access-external-properties\n\nReclassify the JAXP 1.5 accessExternal properties as modifiable"
    },
    {
      "commit": "279173b4284480cdd994d204e55c4d179c530503",
      "tree": "6b7e608d34c062bb4c7043b8981cb03fd9a6056d",
      "parents": [
        "9b1362f5981b20479c9bf2cf8c695244bfadafee"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Mon Aug 31 10:29:33 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Mon Aug 31 10:29:33 2026 +0200"
      },
      "message": "Update remaining references to old project name.\n\nPoint repository URLs in README badges, SECURITY.md, and the POM SCM\nsection at commons-secure-xml, and fix the throwOnUnresolved system\nproperty name in the SecureException javadoc to match the constant.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01A9uqqZFmAHAiS1D2zqonMK\n"
    },
    {
      "commit": "a4000e586161bf6d13c3e942bd422cc178c85009",
      "tree": "f96263bb5012d5942f7765a917c88d35e05631ed",
      "parents": [
        "3b25119ae6f20fd660f6f22dbb0279888fc1aa08"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Mon Aug 31 06:14:49 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Mon Aug 31 06:14:49 2026 +0200"
      },
      "message": "Reclassify the JAXP 1.5 accessExternal properties as modifiable\n\nThe securing is independent of the JAXP 1.5 external-access\nproperties: a resource supplied by a resolver bypasses their checks,\nand the resolver floor covers every external reference, so no value a\ncaller sets loosens the securing and no value is needed to keep it.\n\nMove the three properties from the reserved list to \"Settings you may\nmodify\" in the threat model, add a Javadoc overview section explaining\nwhy the securing does not build on them, and add\nAccessExternalPropertyTest guarding that loosening them to \"all\" on a\nsecured factory does not reopen an external fetch.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_014Hm8EbPnSdQeuQfsoFwQt1\n"
    },
    {
      "commit": "9b1362f5981b20479c9bf2cf8c695244bfadafee",
      "tree": "a919ac94c8d9c657c007acd70f992620c6c99a93",
      "parents": [
        "2edce75926c22ea9c15e0ccc134deec20bf3f7da"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:50:14 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:50:14 2026 -0400"
      },
      "message": "Update Maven propeties to use \"secure\" names.\n"
    },
    {
      "commit": "2edce75926c22ea9c15e0ccc134deec20bf3f7da",
      "tree": "e20381683efdcf3c2876d3d3e07ec340eb04d992",
      "parents": [
        "d11079111f49556456edfb93f550f422aecaa7fb"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:49:27 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:49:27 2026 -0400"
      },
      "message": "Revert \"Inherit Maven property `commons.packageId`\"\n\nThis reverts commit d11079111f49556456edfb93f550f422aecaa7fb.\n"
    },
    {
      "commit": "d11079111f49556456edfb93f550f422aecaa7fb",
      "tree": "8edb29b0fea0fe33af0975afff100f4db0bae1fc",
      "parents": [
        "3b25119ae6f20fd660f6f22dbb0279888fc1aa08"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:44:10 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:44:10 2026 -0400"
      },
      "message": "Inherit Maven property `commons.packageId`\n"
    },
    {
      "commit": "3b25119ae6f20fd660f6f22dbb0279888fc1aa08",
      "tree": "e20381683efdcf3c2876d3d3e07ec340eb04d992",
      "parents": [
        "e5495c3854ca2c4149f38d080c3574a1ef714dd9"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:29:16 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:29:16 2026 -0400"
      },
      "message": "Rename Java package from `org.apache.commons.xml` to\n`org.apache.commons.xml.secure`"
    },
    {
      "commit": "e5495c3854ca2c4149f38d080c3574a1ef714dd9",
      "tree": "f0eb822459b98df0bb739700a34cad3305c0d65a",
      "parents": [
        "c365653100f6e7dba906507b6278030f0c8ad8a0"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:12:39 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 17:12:39 2026 -0400"
      },
      "message": "Rename artifactId from commons-xml to commons-secure-xml"
    },
    {
      "commit": "c365653100f6e7dba906507b6278030f0c8ad8a0",
      "tree": "389c775cd312cbd4baac362e8368c518f1969f3b",
      "parents": [
        "2b4185845aa7988fbab594878ca218d2611e017f",
        "5937df60bf152955d4c9dccb8758eaa0f3ca9991"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sun Aug 30 15:53:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 30 15:53:31 2026 -0400"
      },
      "message": "Merge pull request #63 from ppkarwasz/fix/android-test-capabilities\n\nGate platform-optional test assertions on probed capabilities"
    },
    {
      "commit": "5937df60bf152955d4c9dccb8758eaa0f3ca9991",
      "tree": "389c775cd312cbd4baac362e8368c518f1969f3b",
      "parents": [
        "2b4185845aa7988fbab594878ca218d2611e017f"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 21:37:58 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 21:37:58 2026 +0200"
      },
      "message": "Gate platform-optional test assertions on probed capabilities\n\nAdd probe-once capability constants to AttackTestSupport (secure\nprocessing, parser-attached schemas, XInclude, SAXParser.reset) and\ngate the wrapper tests\u0027 platform-optional assertions on them instead of\nfailing where the platform default implementation does not support the\nsurface, notably Android. Tests of the DOM wrapper contract skip where\nthe platform DOM is left unwrapped, the newDefault* smoke tests assert\nthe degraded lookup instead of the removed FactoryConfigurationError,\nand every SecureFactoriesSmokeTest method now carries the tag of the\nJAXP factory it exercises, running it across the implementation matrix.\n\nThat wider matrix exposed the schema smoke tests asserting the stock\nJDK\u0027s FEATURE_SECURE_PROCESSING default rather than the library\u0027s\ncontract; they now assert the wrapped SecureSchema product, the actual\nschema securing observable.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01MbfpcsKig16HfSe6jGhcvh\n"
    },
    {
      "commit": "2b4185845aa7988fbab594878ca218d2611e017f",
      "tree": "0a181616bade4e21bb1708437d08fbe5ae67cc4c",
      "parents": [
        "da4d44c2b9b401e6867fe61073d68145f1ecca02",
        "2062d949a981c0e52cf37ff396158cbea6afb54f"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sun Aug 30 14:59:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 30 14:59:04 2026 -0400"
      },
      "message": "Merge pull request #62 from ppkarwasz/fix/android-newdefaultinstance\n\nFall back to the standard lookup in newDefaultInstance on Android"
    },
    {
      "commit": "2062d949a981c0e52cf37ff396158cbea6afb54f",
      "tree": "13f18dca84442618135dc8b77e68e23eb410b0b2",
      "parents": [
        "f2752197081ac8e02e244ef01bb48863bd11f0a1"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:51:25 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:51:37 2026 +0200"
      },
      "message": "Extend the newDefaultInstance fallback to SchemaFactory\n\nAndroid ships no SchemaFactory implementation, but its lookup falls\nback to exactly the Xerces implementation this library recognizes, so\ndegrading to the standard newInstance(String) lookup gives schema the\nsame platform-default semantics as the DOM and SAX methods.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01MbfpcsKig16HfSe6jGhcvh\n"
    },
    {
      "commit": "da4d44c2b9b401e6867fe61073d68145f1ecca02",
      "tree": "15e4105d54fbb8f36579efb0ee62f4c522de89c7",
      "parents": [
        "f3e756b326f03272f8945ee1012a08e7e8887606",
        "a7cf56269afda6cd2cfb567927d997f15852b49f"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sun Aug 30 14:39:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 30 14:39:36 2026 -0400"
      },
      "message": "Merge pull request #61 from ppkarwasz/docs/shading-guide\n\nAdd a shading guide to the site"
    },
    {
      "commit": "f2752197081ac8e02e244ef01bb48863bd11f0a1",
      "tree": "34d38907a1bc1b5808403a0e1e842d492087ffee",
      "parents": [
        "7d14adceecbede716469c8c4aee7b4bdd85d1736",
        "f3e756b326f03272f8945ee1012a08e7e8887606"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:36:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 30 20:36:32 2026 +0200"
      },
      "message": "Merge branch \u0027main\u0027 into fix/android-newdefaultinstance"
    },
    {
      "commit": "f3e756b326f03272f8945ee1012a08e7e8887606",
      "tree": "1c06f92b5f37b4896387d5fe6d8eb564750a5ee9",
      "parents": [
        "58c030097c8fe4c90b29e1d2559eaebd4adeabd9"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:36:17 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:36:17 2026 +0200"
      },
      "message": "Exclude generated Gradle output from Checkstyle\n\nA repository-root checkstyle run sweeps android-tests/build and fails\non generated files; filter the directory out before execution.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01MbfpcsKig16HfSe6jGhcvh\n"
    },
    {
      "commit": "58c030097c8fe4c90b29e1d2559eaebd4adeabd9",
      "tree": "df0fab545697c6b739bbb354918a4bb57d4e5efc",
      "parents": [
        "f6cc01b35fb87cf951636435117fa14737d7af2c"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:24:30 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:29:26 2026 +0200"
      },
      "message": "Tag the Secure* wrapper tests by JAXP factory group\n\nTag each Secure* factory and product-wrapper test class with the group\nof the JAXP factory it concerns (dom, sax, stax, trax, xpath, schema),\nso the tests run across the whole implementation matrix instead of only\nthe stock-JDK execution. Adapt the four assertions the wider matrix\nexposed as stock-JDK-specific: the configuration-forwarding probes now\nuse keys every matrix implementation recognizes (the JAXP 1.2\nschemaLanguage attribute and the Xerces external-schemaLocation and\nlocale properties, supported by the JDK-internal and standalone Xerces\nalike) instead of the JAXP 1.5 external-access keys, the XSLTC-only\nindent-number attribute tolerates the delegate\u0027s rejection as the\nforwarding proof, and the XMLFilter parent-failure test asserts the\nportable contract, since XSLTC, Xalan and Saxon each surface the\nfailure in a different shape.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01MbfpcsKig16HfSe6jGhcvh\n"
    },
    {
      "commit": "7d14adceecbede716469c8c4aee7b4bdd85d1736",
      "tree": "7333105e0d3a95d618a19e690936b51af834597b",
      "parents": [
        "f6cc01b35fb87cf951636435117fa14737d7af2c"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:09:41 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 20:09:41 2026 +0200"
      },
      "message": "Fall back to the standard lookup in newDefaultInstance on Android\n\nAndroid provides neither the Java 9 newDefaultInstance methods nor the\nJDK\u0027s built-in implementation classes, so the DOM and SAX\nnewDefaultInstance methods threw FactoryConfigurationError there. Both\nnow degrade to the standard newInstance() lookup, which Android pins to\nthe platform implementation, preserving the platform-default semantics.\nThe fallback is unreachable on a JVM: Java 9+ resolves the platform\nmethod and Java 8 has the built-in class.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01MbfpcsKig16HfSe6jGhcvh\n"
    },
    {
      "commit": "f6cc01b35fb87cf951636435117fa14737d7af2c",
      "tree": "12926e5199019359e15893212a922db31e9be482",
      "parents": [
        "cfc8cef7b6c9221a77651a65107bf181ef4ae5eb"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 13:03:06 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 13:03:06 2026 -0400"
      },
      "message": "Make Android build continue-on-error: true\n"
    },
    {
      "commit": "cfc8cef7b6c9221a77651a65107bf181ef4ae5eb",
      "tree": "52ed274fb064abebea02d0af75b5556b9c12a65d",
      "parents": [
        "5071af424e163cb3a40265d787a6cc6af2373b56"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:56:05 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:56:05 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "5071af424e163cb3a40265d787a6cc6af2373b56",
      "tree": "a5369f9096d4d4d7e82d1b3c979a8c77293def15",
      "parents": [
        "569238ef6b72523aa18fe791bd51cfe69708ab84"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:54:15 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:54:15 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "569238ef6b72523aa18fe791bd51cfe69708ab84",
      "tree": "3ed621fc01cf9b482bf57de8dee465cbde467945",
      "parents": [
        "175909c888428263604eb40475db98758289af8f"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:47:58 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:47:58 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "175909c888428263604eb40475db98758289af8f",
      "tree": "3df8e2d0651a4bc475ae9ad5bdc75c5f228cd982",
      "parents": [
        "571a379c83076d883f4f931295baf0b2e98703b7"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:44:45 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:44:45 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "571a379c83076d883f4f931295baf0b2e98703b7",
      "tree": "61187dc395e5f821b3f4b798c50b32dbf330b50c",
      "parents": [
        "a1ff73ecb60a6a8d9f5edc4fb2f1e27bb9b3e2ab"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:36:44 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:36:44 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "a1ff73ecb60a6a8d9f5edc4fb2f1e27bb9b3e2ab",
      "tree": "03d55f73da4dbaf62398ce412b2ae458160eef53",
      "parents": [
        "18c8b3b0b8e8a561354103c7f0f317e380826789"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:31:44 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:31:44 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "18c8b3b0b8e8a561354103c7f0f317e380826789",
      "tree": "7282d932c2da1d91e1f8041c46130245eda73ef5",
      "parents": [
        "ba293aeb5d80479d48db58648295ef35f05368c5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:28:05 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:28:05 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "ba293aeb5d80479d48db58648295ef35f05368c5",
      "tree": "5c6c29d9949d20102866469255b0254803962cb9",
      "parents": [
        "90dbedc96e9ed0e80d01d2fb36ae759d8690f205"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:27:19 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:27:19 2026 -0400"
      },
      "message": "Set a floor for test coverage.\n"
    },
    {
      "commit": "90dbedc96e9ed0e80d01d2fb36ae759d8690f205",
      "tree": "16954cfb8dbf3b337917fb973c9327f9bc89e347",
      "parents": [
        "7872b57bf28dbbbdfdcb6182d56129712504b818"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:18:23 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:18:23 2026 -0400"
      },
      "message": "Disable a failing test on Android and Graalvm\n"
    },
    {
      "commit": "7872b57bf28dbbbdfdcb6182d56129712504b818",
      "tree": "744e4c462b8167d5a0f8e3ff20809f6d6a647fca",
      "parents": [
        "b382edd15307e2f767966e3b0a8bdd159b9983b1"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:09:54 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:09:54 2026 -0400"
      },
      "message": "Fix Icon/Unicode mess in YAML"
    },
    {
      "commit": "b382edd15307e2f767966e3b0a8bdd159b9983b1",
      "tree": "ac8b566b48ef7fd156a375919169284fe2a16e69",
      "parents": [
        "6ab169a447d0c45b201577ea499b4808cd243c98"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:05:33 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:05:33 2026 -0400"
      },
      "message": "Hack for Android builds.\n"
    },
    {
      "commit": "6ab169a447d0c45b201577ea499b4808cd243c98",
      "tree": "37f7b160f6f4bfb3b68dccc2357682b28dc45549",
      "parents": [
        "961e48fb1411c40988928d25724d2108505020b5"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:02:01 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:02:01 2026 -0400"
      },
      "message": "This component use a DIFFERENT master branch name than all other Commons\ncomponent.\n"
    },
    {
      "commit": "961e48fb1411c40988928d25724d2108505020b5",
      "tree": "6606c8ff92e8219a5ac125740f074cae135d63bd",
      "parents": [
        "0ebe9e03d66ee5a30031a997089eb2a2f100045d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:00:49 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 12:00:49 2026 -0400"
      },
      "message": "Hack for Android builds.\n"
    },
    {
      "commit": "0ebe9e03d66ee5a30031a997089eb2a2f100045d",
      "tree": "2ab325b8a83a3c616438f3e47a3c54d822832cad",
      "parents": [
        "7261217aa5fc6023de221680af8e0830f9c2ec5d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:52:27 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:52:27 2026 -0400"
      },
      "message": "Use final.\n\nUse compact array initialization.\n"
    },
    {
      "commit": "7261217aa5fc6023de221680af8e0830f9c2ec5d",
      "tree": "7fd118a13ba4eccb93cf165edd37f4b091b35e8e",
      "parents": [
        "4881e0270a8ea1a88a391982e453862f6d171c95"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:49:33 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:49:33 2026 -0400"
      },
      "message": "Use static imports for Assertions.assertX() calls.\n\nOrganize imports in tests.\n"
    },
    {
      "commit": "4881e0270a8ea1a88a391982e453862f6d171c95",
      "tree": "46ba0f68c6d052e47b6f2f482556d8e5ea5df817",
      "parents": [
        "d06988af9786751a766b3455cc34e7d0f2b8cc0d"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:40:52 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:40:52 2026 -0400"
      },
      "message": "Use imports instead of FQCNs in tests.\n"
    },
    {
      "commit": "d06988af9786751a766b3455cc34e7d0f2b8cc0d",
      "tree": "779ec5fa31b8c0ef1ab75c95f65b6f552a60f83c",
      "parents": [
        "c0c5f786462f9f75c01d0fbf8105f3f339bb61cd"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:19:10 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:19:10 2026 -0400"
      },
      "message": "Add missing test classes.\n\nCoverage went from 75% instructions, 70% branches to 97% instructions,\n91% branches.\n"
    },
    {
      "commit": "c0c5f786462f9f75c01d0fbf8105f3f339bb61cd",
      "tree": "fa3e75ed8a77a9770972ab3658381b0f75317656",
      "parents": [
        "e6c2bb6347652faaa3783a0d7e3e9828ccaceb3e"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:14:24 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 11:14:24 2026 -0400"
      },
      "message": "Prevent instantiation of MethodHandleFactory.\n"
    },
    {
      "commit": "a7cf56269afda6cd2cfb567927d997f15852b49f",
      "tree": "ef26c2ee0418b741ac8a3071091a78b513bd646b",
      "parents": [
        "b723307f6b7a0236343d41d3a99a0aed969128b5"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 15:56:17 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 15:56:17 2026 +0200"
      },
      "message": "fix: add shading documentation\n"
    },
    {
      "commit": "b723307f6b7a0236343d41d3a99a0aed969128b5",
      "tree": "bd4121cf34725cba2c96cf98fe0a33a3536e03a1",
      "parents": [
        "3ac22b8693ef730f04082eeb639451715055b2ac"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 15:47:35 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sun Aug 30 15:47:35 2026 +0200"
      },
      "message": "Add a shading guide to the site\n\nDocument that the Secure* entry points are designed as independent shade\nclosures: per-entry-point shaded size estimates, the security trade-offs\nof dependency vs. shading vs. vendored recipes, and a maven-shade-plugin\nconfiguration that relocates commons-xml alone.\n\nAlso make the ShadingFootprintTest report compute its percentages\nagainst the union of all entry-point closures, matching its\n\"% of full library\" header.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01MbfpcsKig16HfSe6jGhcvh\n"
    },
    {
      "commit": "e6c2bb6347652faaa3783a0d7e3e9828ccaceb3e",
      "tree": "58cd61d596d9e72c892e1caec4dfc2fe17794544",
      "parents": [
        "9d98a830f76fb0fb5a7e021190e05577f2414653"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 09:36:44 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 09:36:44 2026 -0400"
      },
      "message": "Normalize CodeQL to other Commons components.\n"
    },
    {
      "commit": "9d98a830f76fb0fb5a7e021190e05577f2414653",
      "tree": "c51def3e6be76e76ca5905589051fd7aabbabb43",
      "parents": [
        "208e00d78f2f7dd6d3fb633873c2571ddd09d5f2"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 08:31:34 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 08:31:34 2026 -0400"
      },
      "message": "Make test pass on Java 8.\n"
    },
    {
      "commit": "208e00d78f2f7dd6d3fb633873c2571ddd09d5f2",
      "tree": "a69a50dfb90c8723a2d380f6d0890a8950bf76d0",
      "parents": [
        "cd2a7a4087fe448372acfc92d2e6094cd9c0e417"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 08:28:22 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 08:28:22 2026 -0400"
      },
      "message": "Add a TL;DR and OpenRewrite recipe.\n"
    },
    {
      "commit": "cd2a7a4087fe448372acfc92d2e6094cd9c0e417",
      "tree": "2dd529d1231a8dac93479e51068e566c7f882058",
      "parents": [
        "d559440417151b54fccabbafec0e6e2bad95901f"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 07:53:33 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 07:53:33 2026 -0400"
      },
      "message": "Add missing unit tests.\n\n- Total coverage is now 75% (70% branches).\n- Sort members\n"
    },
    {
      "commit": "d559440417151b54fccabbafec0e6e2bad95901f",
      "tree": "bc1d14b9b19b190baafac1eba611b8eb1f33e29e",
      "parents": [
        "7fe4794216f5703c2eaffcef19d1cdae494166b6"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 07:48:52 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sun Aug 30 07:48:52 2026 -0400"
      },
      "message": "Move documentation to Javadoc to sync with the version documented.\n"
    },
    {
      "commit": "7fe4794216f5703c2eaffcef19d1cdae494166b6",
      "tree": "779d3b0ab73823f525d4ec4befe0130498792984",
      "parents": [
        "3ac22b8693ef730f04082eeb639451715055b2ac"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Aug 29 16:48:42 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Aug 29 16:48:42 2026 -0400"
      },
      "message": "Add link to Commons Security Model\n"
    },
    {
      "commit": "3ac22b8693ef730f04082eeb639451715055b2ac",
      "tree": "3cd7af487145414f4bfad388a28085ef7ee2a9ff",
      "parents": [
        "df653561c145af3f1f8d0dca598cba33217e0015"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Aug 29 16:06:39 2026 -0400"
      },
      "committer": {
        "name": "Gary Gregory",
        "email": "garydgregory@gmail.com",
        "time": "Sat Aug 29 16:06:39 2026 -0400"
      },
      "message": "Remove redundant information. Link to page instead.\n"
    },
    {
      "commit": "df653561c145af3f1f8d0dca598cba33217e0015",
      "tree": "53d5f325b8ecbbfc6ca98b01400c567cf6cc96c0",
      "parents": [
        "ffc7b82b10779a58f818a4de35c81ef07d9b39ba",
        "7caa9f0ea61cf5e93da31d885384569f567e69a0"
      ],
      "author": {
        "name": "Gary Gregory",
        "email": "garydgregory@users.noreply.github.com",
        "time": "Sat Aug 29 15:06:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 29 15:06:31 2026 -0400"
      },
      "message": "Merge pull request #60 from ppkarwasz/feat/source-exception-propagation\n\nRework exception propagation when securing sources"
    },
    {
      "commit": "7caa9f0ea61cf5e93da31d885384569f567e69a0",
      "tree": "53d5f325b8ecbbfc6ca98b01400c567cf6cc96c0",
      "parents": [
        "1e5e545cf39ecc1b487fbdf58f970e177d57c8b8"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sat Aug 29 20:34:01 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sat Aug 29 20:34:01 2026 +0200"
      },
      "message": "Test the setupParse-style wiring in SecureXMLFilter.parse\n\nA recording parent reader asserts parse wires the filter as the\nparent\u0027s EntityResolver, DTDHandler and ErrorHandler (the wiring calls\nthemselves: which of them the TrAX implementation later consults or\noverwrites varies, so delivery cannot be asserted uniformly). A second\ntest proves the EntityResolver route end-to-end: a caller-set resolver\nopts an external entity in through the parent\u0027s floor.\n\nThe cause-chain walks now follow SAXException.getException(), which\nAndroid\u0027s SAXException does not link into Throwable.getCause().\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RZSVucNBf5fsyd1uqamLuk\n"
    },
    {
      "commit": "1e5e545cf39ecc1b487fbdf58f970e177d57c8b8",
      "tree": "8de09a744fb142c5722ed53432788a156485896a",
      "parents": [
        "4a8ea614182ddbb663bdf8c8d8c338042c8e7203"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sat Aug 29 20:22:11 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sat Aug 29 20:22:11 2026 +0200"
      },
      "message": "Fix Checkstyle violations\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RZSVucNBf5fsyd1uqamLuk\n"
    },
    {
      "commit": "4a8ea614182ddbb663bdf8c8d8c338042c8e7203",
      "tree": "fb379f6696b4dddcb6df1438fc962a5cb9196439",
      "parents": [
        "94ea2072560afedd4df295dd91e7af1f8369e8e1"
      ],
      "author": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sat Aug 29 20:19:51 2026 +0200"
      },
      "committer": {
        "name": "Piotr P. Karwasz",
        "email": "pkarwasz-github@apache.org",
        "time": "Sat Aug 29 20:20:23 2026 +0200"
      },
      "message": "Wrap reader-provisioning failures in SecureException; simplify\n\nnewXMLReader (formerly newSecureXMLReader) does not normally throw:\nevery supported implementation provides a reader as a routine\ncapability, so a ParserConfigurationException or SAXException there\nsignals a broken environment, not a per-parse condition. Wrap it in the\nunchecked SecureException instead of TransformerConfigurationException\nand drop the checked-exception plumbing this branch had introduced: the\nsecure/secureTraX split, the SecureTransformerFactory.secure(Source)\nwrapper and the per-caller try/catch in SecureValidator,\nSecureSchemaFactory and FallbackIgnoreURIResolver all revert to plain\ncalls.\n\nSecureXMLFilter now performs the XMLFilterImpl.setupParse wiring for the\nresolver, DTD and error callbacks (the transformer owns the parent\u0027s\nContentHandler), implements ErrorListener to forward TrAX error reports\nto the caller-set ErrorHandler, and rethrows the SAXException or\nIOException cause of a transform failure instead of nesting the\nhierarchies, so the original SAXParseException surfaces as-is and no\nimplementation can end the parse silently.\n\nAssisted-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RZSVucNBf5fsyd1uqamLuk\n"
    }
  ],
  "next": "94ea2072560afedd4df295dd91e7af1f8369e8e1"
}
