)]}'
{
  "log": [
    {
      "commit": "807f7bd8867831dca5b277cf8c7d487508a81a49",
      "tree": "6f066d3a1ccaaa41bfdbbc8b1a9c62f458ea007b",
      "parents": [
        "14856465c3e8cdf63c5e086df2b289ae6937634f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 29 09:42:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 09:42:38 2026 +0200"
      },
      "message": "docs: document ModelDriven parameter binding and authorization (#319)\n\n* docs: document ModelDriven parameter binding and authorization\n\nAn action implementing ModelDriven makes its model the target of\n@StrutsParameter authorization, so the model\u0027s members are bindable\nwithout the annotation. This holds on every input channel — request\nparameters, JSON bodies and REST bodies — since they all resolve the\nauthorization target through the same authorizer.\n\nDocument it on the @StrutsParameter page (canonical), with short notes\nand cross-links from the Model Driven Interceptor and REST plugin pages,\nplus guidance to shape a model as a request DTO rather than a domain or\npersistence entity.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Adds ToC\n\n* docs: correct version attribution for ModelDriven exemption\n\n@StrutsParameter was introduced in 6.4.0; the ModelDriven exemption\narrived separately in 7.0.0. The previous wording conflated the two and\nread as though the annotation itself were a 7.0.0 feature.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* docs: drop 6.x reference from ModelDriven authorization note\n\n@StrutsParameter enforcement is supported from Struts 7.0.0; 6.x is not\na version the annotation\u0027s behavior should be characterised against.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* docs: add ModelDriven binding note to the Model Driven page\n\nThe conceptual Model Driven page is the likelier landing spot for\nsomeone learning the feature, but said only that Struts populates the\nmodel\u0027s fields — with no mention that this lifts the @StrutsParameter\nrequirement, and no DTO guidance. Adds the same short note and\ncross-link the other pages carry.\n\nAlso corrects the interface\u0027s package: it is org.apache.struts2\n.ModelDriven in 7.x, not com.opensymphony.xwork2.ModelDriven.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "14856465c3e8cdf63c5e086df2b289ae6937634f",
      "tree": "11650054d4f68877ea324b3f55de1d741c6a9c6d",
      "parents": [
        "329586567f016413eea2301f366b2fea5dbbeb96"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 29 09:04:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 09:04:41 2026 +0200"
      },
      "message": "docs: add secure-usage guidance on trust state to Chaining Interceptor (#318)\n\nAction chaining populates the target action implicitly from the value\nstack. Document the design-level guidance that follows from that: keep\nauthorization, trust, identity and approval state out of the chain and\nre-derive it in the target action, prefer avoiding chaining, and narrow\nwhat is copied via Unchainable or the includes/excludes parameters.\n\nCross-links the \"Where authorization applies\" overview on the\n@StrutsParameter page.\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "329586567f016413eea2301f366b2fea5dbbeb96",
      "tree": "307d2d3525685e809ca2016aef3ecf128c4b953e",
      "parents": [
        "f5761f8ee49c3dc22e7b16022278e5bd0b8ae54f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Jul 25 09:28:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 09:28:12 2026 +0200"
      },
      "message": "fix: point /announce.html at the newest announce-YYYY page (#317)\n\nThe redirect was hardcoded to /announce-2024.html, so it kept sending\nvisitors to the 2024 announcements even though 2025 and 2026 pages exist.\n\nAdd empty front matter to source/.htaccess so Jekyll renders Liquid in it,\nand resolve the target from the newest announce-* page at build time. No\nmanual update is needed when a new year file is added; CLAUDE.md and the\nannouncing-struts-release skill are updated to drop that step.\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "f5761f8ee49c3dc22e7b16022278e5bd0b8ae54f",
      "tree": "ec7278345a6e76b22c3322d6ad315ccc0057d7d4",
      "parents": [
        "1abc30338b7f06f728a204ec043cbdf6c6bc1fe7"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Jul 25 09:25:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 09:25:28 2026 +0200"
      },
      "message": "docs: JSON input parameter filtering \u0026 scalar-collection authorization (Struts 7.3.0) (#316)\n\n* docs: document JSON input parameter filtering (Struts 7.3.0)\n\nJSON population now applies the same name/value acceptability controls\nas the Parameters Interceptor (WW-4858, apache/struts#1773):\n\n- Always-on: framework-wide accepted/excluded name patterns, param-name\n  max length (paramNameMaxLength, default 100), ParameterNameAware /\n  ParameterValueAware callbacks, @StrutsParameter authorization.\n- Opt-in: acceptedValuePatterns / excludedValuePatterns and\n  applyPropertyFiltersToInput (reuse excludeProperties/includeProperties\n  on input).\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: clarify @StrutsParameter depth\u003d1 on getters for primitive collections (JSON/REST)\n\n@StrutsParameter authorization on the JSON path exists since 7.2.0; PRs\n#1773/#1784 align its logic with ParametersInterceptor. Extend the\ncollections example to make clear that populating a collection of simple\ntypes element by element (mySelection[0]) — as JSON/REST payloads do —\nrequires @StrutsParameter(depth \u003d 1) on the getter, not on the setter.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1abc30338b7f06f728a204ec043cbdf6c6bc1fe7",
      "tree": "266f797a16d475ce84da67aa77430578b396609c",
      "parents": [
        "0c49b6de60947a7ed3b5a1a0c716623134cb9cb3"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Mon Jul 06 15:34:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 15:34:13 2026 +0200"
      },
      "message": "WW-5640 docs: document WebJars support (Struts 7.3.0) (#315)\n\n* WW-5640 docs: add webjar tag reference page\n\nDocument the new \u003cs:webjar\u003e tag (and \u003c@s.webjar\u003e macro) that resolves\nversion-less WebJar resource paths to servable URLs, introduced in\nStruts 7.3.0. Pulls description/attributes from the released source and\nlinks the Static Content serving pipeline. Lists the tag under Other\nTags in the tag reference index.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* WW-5640 docs: document WebJars support in static content\n\nAdd a WebJars support section to the Static Content guide covering the\nnew /static/webjars/** serving pipeline, version-less resolution, the\nstruts.webjars.enabled and struts.webjars.allowlist constants, the\nfail-closed security constraints, and the WebJarUrlProvider extension\nseam. Introduced in Struts 7.3.0.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0c49b6de60947a7ed3b5a1a0c716623134cb9cb3",
      "tree": "a6a313b2905eda3787ab2c98a30a556323c6b773",
      "parents": [
        "e87b4d3ec920fc4e18302833d2f2cfdf3147c8cc"
      ],
      "author": {
        "name": "jenkins",
        "email": "builds@apache.org",
        "time": "Wed Jul 01 12:45:50 2026 +0000"
      },
      "committer": {
        "name": "jenkins",
        "email": "builds@apache.org",
        "time": "Wed Jul 01 12:45:50 2026 +0000"
      },
      "message": "Updates Maven site by Jenkins\n"
    },
    {
      "commit": "e87b4d3ec920fc4e18302833d2f2cfdf3147c8cc",
      "tree": "702be92ec5e8bbcb0a9d84b861ae8b11213d8639",
      "parents": [
        "cfd71366713910173e5e3c1af52ff5436e43cb94"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 14:37:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 14:37:47 2026 +0200"
      },
      "message": "ci: publish only the menu-linked Maven site modules, flattened (#314)\n\nThe struts reactor stages module sites nested by POM inheritance\n(struts2-bom/struts2-parent/struts2-core/...), which does not match the\n/maven/... links in the website menu, so those links 404. Instead of moving\nthe whole staged tree, publish only what the menu references: the top-level\naggregate site at the root, plus struts2-core and struts2-plugins flattened\nto /maven/\u003cmodule\u003e/. Each module site is self-contained and struts2-plugins\ncarries its submodule sites, so moving whole directories preserves their\nlinks. This also drops the unreferenced modules (jakarta, apps, assembly)\nand the bom/parent scaffolding.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "cfd71366713910173e5e3c1af52ff5436e43cb94",
      "tree": "0420a733c2cdaceb78294c45155541492ebd9f84",
      "parents": [
        "aae2fb3a5b289b4bae389150bc1aa17640409938"
      ],
      "author": {
        "name": "jenkins",
        "email": "builds@apache.org",
        "time": "Wed Jul 01 12:12:19 2026 +0000"
      },
      "committer": {
        "name": "jenkins",
        "email": "builds@apache.org",
        "time": "Wed Jul 01 12:12:19 2026 +0000"
      },
      "message": "Updates Maven site by Jenkins\n"
    },
    {
      "commit": "aae2fb3a5b289b4bae389150bc1aa17640409938",
      "tree": "4309b2815950b8311d611ba9b4aad78380e9c959",
      "parents": [
        "a9c78aed7a8546bd697840d3a69b8cf98d02ae4d"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 13:53:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 13:53:11 2026 +0200"
      },
      "message": "ci: check out asf/main explicitly in javadocs publish stage (#313)\n\nThe publish stage failed with \u0027main matched multiple (2) remote tracking\nbranches\u0027: the Pipeline-from-SCM checkout leaves an origin/main, and we add\nan asf remote that also has main, so a bare \u0027git checkout main\u0027 is ambiguous\nand git refuses. Use \u0027git checkout -B main asf/main\u0027 to pin the intended\nremote; this also makes the follow-up \u0027git pull asf main\u0027 redundant, so it\nis dropped.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a9c78aed7a8546bd697840d3a69b8cf98d02ae4d",
      "tree": "82b62277811c34e56829ccd367cc736c5309ea1e",
      "parents": [
        "2ad559b1a73990a2f1d19321f5543d1ea19a8b02"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 12:12:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 12:12:30 2026 +0200"
      },
      "message": "ci: skip OWASP dependency-check report in javadocs site build (#312)\n\nThe site:site aggregate report ran dependency-check-maven, which downloads\nthe full NVD CVE database (~360k records) with no API key and blew the\n90-minute timeout (build ABORTED at ~17%). The OWASP report is not needed\nfor the published Maven site, so skip it with -Ddependency-check.skip\u003dtrue.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2ad559b1a73990a2f1d19321f5543d1ea19a8b02",
      "tree": "78a675617af394d9d7d53bd0a8943345270a62dc",
      "parents": [
        "b57b82a4928a5010888ec4493fec22bf60344eb6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 09:55:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 09:55:40 2026 +0200"
      },
      "message": "ci: skip staging site build when a PR changes no site files (#311)\n\nThe Struts-site multibranch job rebuilt Jekyll and pushed to asf-staging\non every PR, even PRs that touch only CI/docs and leave source/ untouched,\nproducing an identical staged site. Add a \u0027Check for site changes\u0027 stage\nthat diffs a PR against its target branch and sets SITE_CHANGED; gate the\nbuild, deploy, and PR-comment stages on it. Branch builds (main) always\nrebuild. Skipped stages still report success, so any required check stays\ngreen.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b57b82a4928a5010888ec4493fec22bf60344eb6",
      "tree": "4fc2a71b38adcc64b7df0eb9a9c6b111c89afdc7",
      "parents": [
        "9bf4cca7858f8d4a760ae5ad4defc255faa7c3c5"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 09:55:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 09:55:26 2026 +0200"
      },
      "message": "ci: provision maven and jdk 17 via tools block in javadocs pipeline (#310)\n\nThe first run failed with \u0027mvn: not found\u0027 (exit 127): MAVEN_3_LATEST_HOME\nis not set on the git-websites/websites2 agent, so prepending it to PATH\nadded nothing. Replace the PATH hack with a declarative tools block\n(maven \u0027maven_3_latest\u0027, jdk \u0027jdk_17_latest\u0027), matching the apache/struts\nbuild. Struts 7 also requires JDK 17, which the block now supplies.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9bf4cca7858f8d4a760ae5ad4defc255faa7c3c5",
      "tree": "324cec2c358ea0df4b028c44da52fbfdc88e88fe",
      "parents": [
        "bfed245a4beb6532aadb78f16b4e3e4a981d17fa"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 08:57:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 08:57:33 2026 +0200"
      },
      "message": "ci: convert Struts-site-javadocs job to a declarative pipeline (#309)\n\n* docs: add design spec for javadocs Jenkins pipeline conversion\n\nConverts the shell-based Struts-site-javadocs freestyle job into a\ndeclarative Jenkins pipeline (Jenkinsfile.javadocs), mirroring the\nexisting root Jenkinsfile conventions. Two intended deviations: use\nplain `mvn` instead of `./mvnw`, and push via the explicit `asf`\nremote.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: add implementation plan for javadocs Jenkins pipeline\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* ci: add declarative pipeline for the javadocs job\n\nConverts the shell-based Struts-site-javadocs freestyle job into\nJenkinsfile.javadocs. Builds Struts with plain `mvn` and publishes the\nstaged Maven site into source/maven on main via the asf remote.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "bfed245a4beb6532aadb78f16b4e3e4a981d17fa",
      "tree": "2c4cdbc69d520dd9813d1077ca63e101c885bb89",
      "parents": [
        "cff3eb1551f8e82bfb4b514f5a659337e18bb895"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Jul 01 07:49:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 07:49:07 2026 +0200"
      },
      "message": "WW-5626 docs: clarify @StrutsParameter depth for collections (#308)\n\nExplain how the `depth` parameter is counted (each property access or\ncollection/map index is one level) and correct the collection example to\nuse `depth \u003d 2` instead of `depth \u003d 1` — indexing into the collection is\nitself a level, so reaching an element\u0027s property needs depth 2 even for\nflat POJOs. Also note that JSON/REST payloads populating collection\nelements require the getter to be annotated, not just the setter.\n\nReported on the user list against 7.2.1 by Markus (flyingfischer.ch).\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "cff3eb1551f8e82bfb4b514f5a659337e18bb895",
      "tree": "0099aa04e686f2e0d0125636166222a6375b0343",
      "parents": [
        "0c406707cc1f6b3d4f151ecf1c70fa3d2663e0d3"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jun 30 07:56:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 07:56:28 2026 +0200"
      },
      "message": "docs: put the [ANN] email in the PR description in announcing-struts-release skill (#307)\n\nInstead of outputting the [ANN] email to the chat console, the skill now\nplaces it in the draft PR\u0027s description (fenced block under an \"## [ANN] email\"\nheading) so the release manager can copy it verbatim after merge. The email is\nstill never committed to the repo. Reorders the workflow to draft the email\nbefore opening the PR, and updates the overview, template heading, and the\ncommon-mistakes note to match.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0c406707cc1f6b3d4f151ecf1c70fa3d2663e0d3",
      "tree": "8c2bc438efea1b721e82c4227f739bab35e68880",
      "parents": [
        "9fe357d0f25302ce437e8a508c9a021282e8dd19"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jun 30 07:56:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 07:56:07 2026 +0200"
      },
      "message": "docs: announce Apache Struts 7.2.1 GA release (#306)\n\nAdd the 7.2.1 General Availability announcement, bump the 7.x release\nvariables in _config.yml, point the homepage GA box to announce-2026,\nand move the superseded 7.1.1 release into Prior Releases.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9fe357d0f25302ce437e8a508c9a021282e8dd19",
      "tree": "1cf5771b38bc9d92e5db8696b6a4777cfcec760a",
      "parents": [
        "1c4bcacb3699a4952c4406f129976af4906a6583"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Jun 14 20:32:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 20:32:22 2026 +0200"
      },
      "message": "docs: add breaking-change detection to documenting-struts-release skill (#305)\n\nBreaking changes were the skill\u0027s biggest gap: a baseline subagent test showed\nagents missed backward-incompatible items because they (a) only scanned New\nFeature/Improvement, and (b) dropped dependency bumps as \u0027internal\u0027 — exactly\nwhere breakage hides (OGNL, commons-fileupload method renames, UIBean field\nvisibility).\n\nAdds a dedicated breaking-changes pass: a keyword shortlist over ALL issue types,\na 6-point checklist (changed default, new enforcement, removed/narrowed API,\nraised minimum requirement, breaking dependency bump, output/encoding change),\nnet-delta dependency verification against the tag POM, and migration-note output.\nRe-verified with a with-skill subagent test (correctly found the 7.2.0 breaking\nchanges and ruled out non-breaking items).\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1c4bcacb3699a4952c4406f129976af4906a6583",
      "tree": "994f2549fdb9f48ae543e4403866146c62360286",
      "parents": [
        "29a1090fdee3c8b3fb448ca6f2627fe7f6755e50"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Jun 14 20:16:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 20:16:42 2026 +0200"
      },
      "message": "docs: add documenting-struts-release skill (#304)\n\nCapture the repeatable content-audit procedure for a new Struts release:\npull the itemized JIRA release notes, check existing coverage first (don\u0027t\nre-document), map each item to its page under core-developers/tag-developers/\nplugins, verify constant names/defaults against the STRUTS_X_Y_Z tag source\n(not JIRA proposals), document only real gaps, and keep announcement mechanics\nin announcing-struts-release.\n\nDerived from the 7.2.0 content audit (PR #303) and validated with a\nbaseline/with-skill subagent test.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "29a1090fdee3c8b3fb448ca6f2627fe7f6755e50",
      "tree": "7bcaf3c08186083f89bc15b3178fa9a7266c889d",
      "parents": [
        "471963ff40207e9e908dc06b1506090f71716ee7"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Jun 14 19:56:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 19:56:41 2026 +0200"
      },
      "message": "docs: document Struts 7.2.0 changes (@StrutsParameter authorization, JSON limits) (#303)\n\n* docs: add 7.2.0 content audit design spec\n\nCaptures the documentation gap analysis for the Struts 7.2.0 release notes:\nthe @StrutsParameter authorization expansion (ChainingInterceptor,\nCookieInterceptor, JSON/REST) and the new JSON deserialization limits.\nAnnouncement mechanics are out of scope.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: add 7.2.0 content audit implementation plan\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: document chaining interceptor @StrutsParameter enforcement (WW-5631)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: document cookie interceptor @StrutsParameter authorization (WW-5627)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: make @StrutsParameter page the authorization hub (WW-5626/5631/5627)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: document JSON deserialization limits and per-property authorization (WW-5618/5626)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs: note AuthorizationAwareContentTypeHandler in REST plugin (WW-5626)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "471963ff40207e9e908dc06b1506090f71716ee7",
      "tree": "f015ec5405b0c7829115b58cf2d9f2df75be1df5",
      "parents": [
        "7ac165beff451e3c9b467ff2fd21bb934d39fb32"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri May 29 14:40:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 14:40:28 2026 +0200"
      },
      "message": "docs: add announcing-struts-release skill (#302)\n\nCapture the repeatable release-announcement procedure as a Claude Code\nskill: add the announce-YYYY entry, bump the correct 6.x/7.x version\nvariables in _config.yml, the conditional index.html year-link edit,\nmove the superseded version into the Prior Releases table, open the\ndraft PR, and draft the [ANN] user-list email (not committed).\n\nDerived from the 6.10.0 release and modeled on PR #292.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "7ac165beff451e3c9b467ff2fd21bb934d39fb32",
      "tree": "c46b97897356c84722bfdb60ac40b2dd435f544e",
      "parents": [
        "c885fb5d9f8dadca258d86e3785a2902fe7311c0"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri May 29 14:28:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 14:28:18 2026 +0200"
      },
      "message": "docs: announce Apache Struts 6.10.0 GA release (#301)\n\nAdd 6.10.0 General Availability announcement to announce-2026, bump the\n6.x release variables in _config.yml (which also updates the homepage GA\nbox), and move the superseded 6.9.0 into the Prior Releases table.\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c885fb5d9f8dadca258d86e3785a2902fe7311c0",
      "tree": "e5d56cef1e8630feb2ce513db17cdc79ba1525e4",
      "parents": [
        "79a4cb8c1b9db664201189ae12c0507cd954ec9b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed May 27 07:37:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 07:37:25 2026 +0200"
      },
      "message": "docs(security): links security reporting with security guideline (#300)"
    },
    {
      "commit": "79a4cb8c1b9db664201189ae12c0507cd954ec9b",
      "tree": "c0cd3e4769a9669dcf144893fe62e05505c8614b",
      "parents": [
        "13ebe2d28cbe9c8ce89aaecf55468f582fde6c9a"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri May 22 06:48:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 06:48:03 2026 +0200"
      },
      "message": "security: updates the page and links to SECURITY.md (#299)"
    },
    {
      "commit": "13ebe2d28cbe9c8ce89aaecf55468f582fde6c9a",
      "tree": "93aae6c6760aa18d282306d528ef722cbbcb6c62",
      "parents": [
        "d7885fc9db1155fc98e00c628f7e0591881d8e66"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu May 14 14:03:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 14:03:52 2026 +0200"
      },
      "message": "docs: add EOL versions page and cross-link from related pages (#291)\n\n* docs: add EOL versions page and cross-link from related pages\n\n- Add source/eol-versions.md — dedicated page explaining what EOL means,\n  listing EOL branches, and linking to commercial support options (neutral wording)\n- Update index.html — generalize the Struts 2.5.x EOL card to cover all EOL\n  versions and link to the new page\n- Update download.md — add note in Prior Releases section pointing to eol-versions\n- Update releases.md — add note before the Prior Releases table and in the\n  Older Releases bullet\n- Update commercial-support.md — clarify HeroDevs entry description and update date\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* docs: add End-of-Life Versions to Support navigation menu\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* chore: trigger staging build\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "d7885fc9db1155fc98e00c628f7e0591881d8e66",
      "tree": "8d61191dfba85170a1fa1f55212bbc43b3e2e052",
      "parents": [
        "f5b47b3f594f9641c252539e2d22c5633f557601"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 29 08:43:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 08:43:38 2026 +0200"
      },
      "message": "docs: add 6.8.0 to Prior Releases and document the dependency (#298)\n\n* docs: simplify IDEA plugin install to a single Marketplace button\n\nDrop the surrounding card mock-up and keep only the \u0027Get from\nMarketplace\u0027 button — the card without the live download/rating data\ndidn\u0027t add value.\n\n* docs: add 6.8.0 to Prior Releases and document the dependency\n\nMove 6.8.0 into the Prior Releases table on releases.md now that\n6.9.0 supersedes it. Document in README.md and CLAUDE.md that\nreleases.md must be updated alongside _config.yml and the yearly\nannouncement file when preparing a new release."
    },
    {
      "commit": "f5b47b3f594f9641c252539e2d22c5633f557601",
      "tree": "a375dcbfaef21c596928c209995b4e2d431bcc9c",
      "parents": [
        "bc0d98dd896343f871c2c6e1984b130d846af6dd"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 29 08:26:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 08:26:26 2026 +0200"
      },
      "message": "docs: simplify IDEA plugin install to a single Marketplace button (#297)\n\nDrop the surrounding card mock-up and keep only the \u0027Get from\nMarketplace\u0027 button — the card without the live download/rating data\ndidn\u0027t add value."
    },
    {
      "commit": "bc0d98dd896343f871c2c6e1984b130d846af6dd",
      "tree": "bd7c2fa92b35647e71a7ff0edab10f4ef658552d",
      "parents": [
        "11fdba415d3ccc42802a4bb86f9cff44d4611946"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 29 08:21:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 08:21:32 2026 +0200"
      },
      "message": "docs: fix broken rendering of IDEA plugin Marketplace card (#296)\n\nThe Kramdown parser breaks when block-level elements (div, p) are\nnested inside an inline anchor — the closing \u003c/a\u003e ends up rendered\nas literal text. Restructure the card so the outer wrapper is a div\nand only the \u0027Get from Marketplace\u0027 button is an anchor."
    },
    {
      "commit": "11fdba415d3ccc42802a4bb86f9cff44d4611946",
      "tree": "288e1c6bf87eb42863b0b5467bc4b05aefe462b0",
      "parents": [
        "4aee9d9d5393ff0e5d790b00549cfd139afc25f5"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 29 08:13:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 08:13:16 2026 +0200"
      },
      "message": "docs: replace blocked Marketplace iframes with static card (#295)\n\nThe JetBrains Marketplace embeddable widgets (iframe and script\nvariants) both load from plugins.jetbrains.com, which is not allowed\nby the ASF site CSP (frame-src/script-src). Replace them with a\nself-contained static card linking to the Marketplace listing."
    },
    {
      "commit": "4aee9d9d5393ff0e5d790b00549cfd139afc25f5",
      "tree": "8cb0f652537ea3b2e038393130ac25a724e4c68c",
      "parents": [
        "860646af6d4898c3ebdd822e67bb6e5af8e10c20"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 29 08:03:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 08:03:59 2026 +0200"
      },
      "message": "docs: link IDEA plugin page to Marketplace and GitHub releases (#294)\n\nReplace the outdated Version notes section with embedded JetBrains\nMarketplace card/install widget and a pointer to the GitHub releases\npage as the single source of truth for release notes."
    },
    {
      "commit": "860646af6d4898c3ebdd822e67bb6e5af8e10c20",
      "tree": "82d70cf54d71d8aff0760073760f3e80675a5cb4",
      "parents": [
        "61574deef06fd2ad05b3eaa712b56fe9cffcb62b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Apr 28 13:37:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 13:37:00 2026 +0200"
      },
      "message": "Remove stale Maven site snapshot from source/ (#293)\n\nThe source/maven/ tree was a one-off snapshot from April 2020 (commit\n1e7942f2a) pinned at Struts 2.6-SNAPSHOT. Each Jekyll publish from main\ncopied it into output/maven/ on asf-site, overwriting the fresh content\nthat the Jenkins JavaDocs job stages there and reverting the displayed\nversion back to 2.6-SNAPSHOT.\n\nThe Jenkins job is the sole source of truth for output/maven/ on\nasf-site, so this directory should not exist in main."
    },
    {
      "commit": "61574deef06fd2ad05b3eaa712b56fe9cffcb62b",
      "tree": "9563043a7a267ef1d45d5c5ce1bdd26a78acb729",
      "parents": [
        "aec47b65c6405dddfa80f14b3f6697d15a9289fa"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Apr 28 13:12:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 13:12:35 2026 +0200"
      },
      "message": "Adds announcement about Apache Struts 6.9.0 GA release (#292)"
    },
    {
      "commit": "aec47b65c6405dddfa80f14b3f6697d15a9289fa",
      "tree": "cb6d212b7f3dc2391f64c7a130612941ee1aa448",
      "parents": [
        "2142d1aac5372b5b227cabfe4d6519b076b042dd"
      ],
      "author": {
        "name": "Indigo-Jones",
        "email": "tomblackburn011@gmail.com",
        "time": "Tue Mar 17 08:22:32 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 17 09:22:32 2026 +0100"
      },
      "message": "Add Announcement of Security Bulletin S2-069 (#290)\n\n* Create announcements for 2026 with security updates\n\nAdded announcements for 2026, including a security advisory for CVE-2025-68493.\r\n\r\nI\u0027ve mirrored the style and content of the previous security announcements as closely as possible.\r\n\r\nCould do with review by an experienced contributor and potentially add more detail about which users may be vulnerable.\n\n* Rename announce-2026 to announce-2026.md\n\n* Add announcement about S2-069 security bulletin\n\nAdded information about CVE-2025-68493 and mitigation steps.\n\n* Update header to point to new 2026 announcements page"
    },
    {
      "commit": "2142d1aac5372b5b227cabfe4d6519b076b042dd",
      "tree": "7812bb49779977905c39196523ed799be4e61427",
      "parents": [
        "db8438c041fc9ea16936e45cb49189a6a1616e9d"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Feb 17 08:49:53 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 17 08:49:53 2026 +0100"
      },
      "message": "docs: add documentation for Struts 7.2.0 new features and changes (#289)\n\n- Checkbox hidden field prefix constant (WW-3429)\n- Spring autowire alwaysRespect default change to true (WW-3647)\n- Spring bean names support in type converters (WW-4291)\n- Preparable.prepare() default method (WW-5588)\n- Dynamic file upload validation parameters (WW-5585)\n- @Validations annotation fix for doubleRange/shortRange (WW-5579)\n- JSP direct access security warning (WW-5294)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "db8438c041fc9ea16936e45cb49189a6a1616e9d",
      "tree": "ee31f21ba5f225380fd7cbd812aab23e8e8d756d",
      "parents": [
        "15772a7443f28efcd8d33b184bba8ee0c75386c4"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Dec 19 09:03:17 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 19 09:03:17 2025 +0100"
      },
      "message": "docs: update Prior Releases with S2-068 vulnerability (#288)\n\n* docs: update Prior Releases with S2-068 vulnerability\n\n- Add S2-068 to all affected versions (7.0.0-7.0.3, 6.0.0-6.7.0, 2.5.x)\n- Fix S2-067 links that incorrectly pointed to S2-066\n- Add Struts 7.0.3 entry to the releases table\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* refactor: convert releases.html to Markdown format\n\n- Convert HTML structure to Markdown syntax\n- Simplify table formatting using Markdown tables\n- Improve readability and maintainability\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "15772a7443f28efcd8d33b184bba8ee0c75386c4",
      "tree": "9384fa05d0570f5992436d54ceb91e47ba7d82b5",
      "parents": [
        "87a89f113355d8d811adcede86f7252d8e8f842c"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Dec 14 19:49:32 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 14 19:49:32 2025 +0100"
      },
      "message": "WW-5444 Add documentation for HTML5 theme (#287)\n\n- Create new html5-theme.md documentation page\n- Add HTML5 theme to themes-and-templates.md list\n- Update getting-started/themes.md to include HTML5 theme\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "87a89f113355d8d811adcede86f7252d8e8f842c",
      "tree": "5ea3533f3eb70a47f528b6a49acf3c15555aadda",
      "parents": [
        "e84d5c450cb398ecc85b417b14c9123c3cff4e4b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Dec 06 15:30:16 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 06 15:30:16 2025 +0100"
      },
      "message": "WW-5256 Add documentation for compress tag and FreeMarker whitespace stripping (#286)\n\n* docs: WW-5256 add documentation for compress tag and freemarker whitespace stripping\n\nAdded comprehensive documentation for new features in Struts 7.2.0:\n- New compress tag documentation (compress-tag.md)\n- Updated tag reference with compress tag\n- Added FreeMarker whitespace stripping section to freemarker-support.md\n- Added performance tuning sections for both features\n- Updated constant configuration examples\n\nRelated to apache/struts#1418\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n\n* docs: WW-5256 update constants to struts.tag.compress namespace\n\nUpdated all compress tag configuration constants to follow the struts.tag.*\nnamespace pattern as per apache/struts#1446:\n- struts.compress.enabled → struts.tag.compress.enabled\n- struts.compress.maxSize → struts.tag.compress.maxSize\n- struts.compress.log.maxLength → struts.tag.compress.log.maxLength\n\nThis aligns with established Struts patterns for tag-specific configuration.\n\nRelated to apache/struts#1446\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "e84d5c450cb398ecc85b417b14c9123c3cff4e4b",
      "tree": "e251b130cac1df9530e62242e7eca9bb024db6b6",
      "parents": [
        "4464fde02e3427c1306b27528feac1e40be8fcf5"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Dec 05 08:16:07 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 05 08:16:07 2025 +0100"
      },
      "message": "Adds a link to the action file upload page (#285)\n\n"
    },
    {
      "commit": "4464fde02e3427c1306b27528feac1e40be8fcf5",
      "tree": "f7c41c42d70383dc6358c64e0bf77ea54ad5c666",
      "parents": [
        "06cb18801964087e39a09a70684177bb297ad6e7"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Mon Dec 01 16:10:08 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 16:10:08 2025 +0100"
      },
      "message": "Adds an announcement about S2-068 security bulletin (#284)\n\n* Adds an announcement about S2-068 security bulletin\n\n* Ignores Ruby specific folder"
    },
    {
      "commit": "06cb18801964087e39a09a70684177bb297ad6e7",
      "tree": "948e5409d7ca865f42ae72f10ba2f88c10ec343a",
      "parents": [
        "59e8f447eaf4a99b0dce012a9afa7bcdac353000"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 21 11:08:37 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 11:08:37 2025 +0100"
      },
      "message": "docs: add missing validators to @Validations annotation docs (#283)\n\n* docs: add missing validators to @Validations annotation docs\n\nAdd longRangeFields, shortRangeFields, and doubleRangeFields to the\nParameters table and add doubleRangeFields example in the Examples section.\n\nRelates to WW-5579\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* style: convert HTML table to Markdown in validations-annotation.md\n\nAlso sort parameters alphabetically and fix pluralization consistency.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "59e8f447eaf4a99b0dce012a9afa7bcdac353000",
      "tree": "2ef993e7cb0e41799359d218c2966664b2d425bd",
      "parents": [
        "28090a7233d91874c93027aedd0007240514cf62"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Oct 18 14:29:17 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 18 14:29:17 2025 +0200"
      },
      "message": "DOCS: Refine @StrutsParameter annotation documentation (#282)\n\nThe documentation for the `@StrutsParameter` annotation has been updated to provide clearer and more accurate guidance on its usage, especially in combination with checkboxes and collections.\n\n- Clarified the placement of the annotation based on the field type (simple, checkbox, complex object/collection) and the intended population behavior.\n- Corrected the examples to reflect the proper usage.\n- Added a section to the `checkbox-interceptor.md` documentation to explain how to use `@StrutsParameter` with checkbox lists."
    },
    {
      "commit": "28090a7233d91874c93027aedd0007240514cf62",
      "tree": "d195c7b913c13ca95d1c1635757bd6cf233487f7",
      "parents": [
        "946196e8e46a11990439a6f01c236c3ed93356b3",
        "d1bf7a4d7b7c62fef4084e7d2dda9c2201c1dde4"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Oct 18 13:25:33 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 18 13:25:33 2025 +0200"
      },
      "message": "Merge pull request #281 from apache/release/7.1.1\n\nAdds an announcement about Struts 7.1.1"
    },
    {
      "commit": "d1bf7a4d7b7c62fef4084e7d2dda9c2201c1dde4",
      "tree": "d195c7b913c13ca95d1c1635757bd6cf233487f7",
      "parents": [
        "946196e8e46a11990439a6f01c236c3ed93356b3"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Oct 18 13:07:23 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Oct 18 13:07:23 2025 +0200"
      },
      "message": "Adds an announcement about Struts 7.1.1\n"
    },
    {
      "commit": "946196e8e46a11990439a6f01c236c3ed93356b3",
      "tree": "acc2a4ba7cdf1a42fb6f979cd04d6ab00cbfe2bc",
      "parents": [
        "10fe0aa0a0776e1cd68ca838f0bcf59615f2e2ca",
        "6fea613e0467582ae187d6e5d14b01775f6bf631"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:30:41 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 17 12:30:41 2025 +0200"
      },
      "message": "Merge pull request #280 from apache/docs/update-xwork-package-paths\n\ndocs: Update XWork package paths from com/opensymphony/xwork2 to org/apache/struts2"
    },
    {
      "commit": "10fe0aa0a0776e1cd68ca838f0bcf59615f2e2ca",
      "tree": "5d3ff8abd02f5471dca062c06cda98b6e2152f15",
      "parents": [
        "9d1bbf0b0e9d994173ef9b454ae829a01d672cfa",
        "e3c890523a997e5af719474552b31e02ac300383"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:22:53 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 17 12:22:53 2025 +0200"
      },
      "message": "Merge pull request #279 from apache/docs/add-claude-guidelines\n\ndocs: Add CLAUDE.md guidelines and update .gitignore"
    },
    {
      "commit": "6fea613e0467582ae187d6e5d14b01775f6bf631",
      "tree": "3f8d47dd12514d8c07d4cac5b511df293621a388",
      "parents": [
        "1745fcd9e0ef04ab19564e737c1ef8285003a0d6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:22:24 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:22:24 2025 +0200"
      },
      "message": "docs: Update XWork package paths from com/opensymphony/xwork2 to org/apache/struts2\n\n- Update all references in markdown documentation files to reflect Apache Struts 7.x package restructuring\n- Fix remote_file_content URL for default.xml validator configuration\n- Update API documentation links for security, localization, OGNL, logging, and chaining components\n- Correct package paths in text references and documentation links\n- Aligns documentation with current Apache Struts package hierarchy\n\nAddresses package migration from XWork to Apache Struts namespace.\n"
    },
    {
      "commit": "9d1bbf0b0e9d994173ef9b454ae829a01d672cfa",
      "tree": "081dfc05db80b95820992d17bdff5a726d994edd",
      "parents": [
        "1745fcd9e0ef04ab19564e737c1ef8285003a0d6",
        "4003d352d1ec828a6c3a0d7d2db87df83919b32f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:16:04 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 17 12:16:04 2025 +0200"
      },
      "message": "Merge pull request #278 from apache/docs/validation-slash-naming\n\ndocs: Add validation file naming documentation for actions with slashes"
    },
    {
      "commit": "e3c890523a997e5af719474552b31e02ac300383",
      "tree": "cb6c20329e1ff95da2ae799f49d4076bfd4cb9be",
      "parents": [
        "1745fcd9e0ef04ab19564e737c1ef8285003a0d6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:09:04 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:09:04 2025 +0200"
      },
      "message": "docs: Add CLAUDE.md guidelines and update .gitignore\n\n- Add comprehensive CLAUDE.md with project overview and development guidelines\n- Include Jekyll/Docker setup instructions and site configuration details\n- Document content guidelines, deployment process, and build infrastructure\n- Update .gitignore to exclude .claude/settings.local.json\n- Provides clear guidance for AI assistants working on this repository\n"
    },
    {
      "commit": "4003d352d1ec828a6c3a0d7d2db87df83919b32f",
      "tree": "081dfc05db80b95820992d17bdff5a726d994edd",
      "parents": [
        "23fdeea3bfaa8aa2cccbe52acfdc36e7eafc5007"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:06:50 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:06:50 2025 +0200"
      },
      "message": "docs: Add cross-references to Default Workflow Interceptor in validation docs\n\n- Link to workflow interceptor details at top of validation page\n- Add reference to method-specific validation methods (validate{MethodName}, validateDo{MethodName})\n- Improves discoverability of related validation features\n"
    },
    {
      "commit": "23fdeea3bfaa8aa2cccbe52acfdc36e7eafc5007",
      "tree": "050f774f60930f0176688e7deb13ed40bd6fee71",
      "parents": [
        "bdca71c39a2856bc0c13f8de8746e2e2bc73cd1e"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:02:20 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 12:02:20 2025 +0200"
      },
      "message": "docs: Add explanation of \u0027action alias\u0027 term in validation documentation\n\n- Add clear definition of \u0027action alias\u0027 in the Defining Validation Rules section\n- Provide concrete example from struts.xml configuration\n- Explain the purpose (different validation rules for different action mappings)\n- Position explanation before examples that use the term\n"
    },
    {
      "commit": "bdca71c39a2856bc0c13f8de8746e2e2bc73cd1e",
      "tree": "43ffbf51308820a49c564aab6d2bee2423bbe2df",
      "parents": [
        "1745fcd9e0ef04ab19564e737c1ef8285003a0d6"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 11:58:13 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 11:58:13 2025 +0200"
      },
      "message": "docs: Add validation file naming documentation for actions with slashes\n\n- Add detailed explanation of slash-to-hyphen replacement rule in core validation docs\n- Include concrete example: a/b/myaction.validate -\u003e MyAction-a-b-myaction.validate-validation.xml\n- Reference AnnotationActionValidatorManager implementation\n- Add cross-references in getting started tutorial and action configuration docs\n- Addresses gap in documentation for struts.enable.SlashesInActionNames usage\n\nFixes validation file naming confusion when using slashes in action names.\n"
    },
    {
      "commit": "1745fcd9e0ef04ab19564e737c1ef8285003a0d6",
      "tree": "bb1a65b3cfda1283e56d71886e5bd75df47312e1",
      "parents": [
        "376bc28a8c2c477a96c5f87c16b939bb845ed5d2",
        "c28ee7f0e431d7e99afd7503b617bf0c77dec989"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 07:30:36 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 17 07:30:36 2025 +0200"
      },
      "message": "Merge pull request #277 from apache/fix/max-files-action-file-upload\n\nDocuments bug with maxFiles setting for ActionFileUploadInterceptor as well"
    },
    {
      "commit": "c28ee7f0e431d7e99afd7503b617bf0c77dec989",
      "tree": "bb1a65b3cfda1283e56d71886e5bd75df47312e1",
      "parents": [
        "376bc28a8c2c477a96c5f87c16b939bb845ed5d2"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 07:19:41 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 17 07:19:41 2025 +0200"
      },
      "message": "Documents bug with maxFiles setting for ActionFileUploadInterceptor as well\n"
    },
    {
      "commit": "376bc28a8c2c477a96c5f87c16b939bb845ed5d2",
      "tree": "1e73eb36341570dbead144b8c9502f1d6eb37dbf",
      "parents": [
        "39642da88372a30fae67b33ff6e0cbdba8217b38",
        "0fcea8fad7d56d4f03d54baf909bc72fa8b5190b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Oct 09 18:16:45 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 09 18:16:45 2025 +0200"
      },
      "message": "Merge pull request #276 from apache/fix/max-files\n\nDocuments bug with maxFiles setting"
    },
    {
      "commit": "0fcea8fad7d56d4f03d54baf909bc72fa8b5190b",
      "tree": "1e73eb36341570dbead144b8c9502f1d6eb37dbf",
      "parents": [
        "39642da88372a30fae67b33ff6e0cbdba8217b38"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Oct 09 16:37:02 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Oct 09 16:37:02 2025 +0200"
      },
      "message": "Documents bug with maxFiles setting\n"
    },
    {
      "commit": "39642da88372a30fae67b33ff6e0cbdba8217b38",
      "tree": "70b5533b44f089b2031be6f2bb5e4194aabf4e5d",
      "parents": [
        "69511fa6bf28a0f241433ceba7b898f8fb26a16c",
        "c806396c2a7c466ae1b465769a6a4c794f4648cf"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Oct 09 06:35:28 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 09 06:35:28 2025 +0200"
      },
      "message": "Merge pull request #275 from apache/release/6.8.0\n\nAnnounces Struts 6.8.0"
    },
    {
      "commit": "c806396c2a7c466ae1b465769a6a4c794f4648cf",
      "tree": "70b5533b44f089b2031be6f2bb5e4194aabf4e5d",
      "parents": [
        "69511fa6bf28a0f241433ceba7b898f8fb26a16c"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Oct 08 17:09:31 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Oct 08 17:17:07 2025 +0200"
      },
      "message": "Announces Struts 6.8.0\n"
    },
    {
      "commit": "69511fa6bf28a0f241433ceba7b898f8fb26a16c",
      "tree": "22e45fd2fd6184d8a980636d0626c0de9c0e7d23",
      "parents": [
        "4e12ccf6904d56912be8b36260d5e188b0266270"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Oct 08 17:09:31 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Oct 08 17:09:31 2025 +0200"
      },
      "message": "Announces Struts 6.8.0\n"
    },
    {
      "commit": "4e12ccf6904d56912be8b36260d5e188b0266270",
      "tree": "bf340f77e33cc3e81372c247a86b3346deb09d4d",
      "parents": [
        "9528005c89b60763ee36e2fea4bb3c29f755b036",
        "2fa3bca750a77172d335833a85e916c666ca7193"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Oct 05 10:35:08 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 05 10:35:08 2025 +0200"
      },
      "message": "Merge pull request #274 from apache/feature/struts-parameter\n\nDocuments how to use @StrutsParameter annotation"
    },
    {
      "commit": "2fa3bca750a77172d335833a85e916c666ca7193",
      "tree": "bf340f77e33cc3e81372c247a86b3346deb09d4d",
      "parents": [
        "9528005c89b60763ee36e2fea4bb3c29f755b036"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Oct 05 10:31:22 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Oct 05 10:31:22 2025 +0200"
      },
      "message": "Documents how to use @StrutsParameter annotation\n"
    },
    {
      "commit": "9528005c89b60763ee36e2fea4bb3c29f755b036",
      "tree": "30d4425ba909beae3b172d304a89dff22d632895",
      "parents": [
        "a8456e30d8a69f9d0d826025977c9cdc2fce22ca"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Jul 19 09:42:36 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 19 09:42:36 2025 +0200"
      },
      "message": "Adds an announcement about Annotations 2.0 (#273)\n\n"
    },
    {
      "commit": "a8456e30d8a69f9d0d826025977c9cdc2fce22ca",
      "tree": "51e04b050ddf58b05f18dd083e088df8383c5e37",
      "parents": [
        "ace2d29d1986369965a6ffd6f3d29f81de44428e"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Jul 12 17:46:40 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 12 17:46:40 2025 +0200"
      },
      "message": "Updates Getting Started guide to use Struts 7 (#272)\n\n"
    },
    {
      "commit": "ace2d29d1986369965a6ffd6f3d29f81de44428e",
      "tree": "7e83ed549d4caad3ac79ddf999b96b18224da50a",
      "parents": [
        "695a69479bae851bfc541458fb50ab7f84112d86"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Jun 08 20:19:44 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 08 20:19:44 2025 +0200"
      },
      "message": "Updates docs around exception handling (#271)\n\n"
    },
    {
      "commit": "695a69479bae851bfc541458fb50ab7f84112d86",
      "tree": "3e07e5f5b4bb0461e074ae46f137614dc934665b",
      "parents": [
        "06de36aa2789e171546bfb99512019663df9d64b"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu May 29 07:59:17 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 29 07:59:17 2025 +0200"
      },
      "message": "Replaces parameters with attributes (#270)\n\n"
    },
    {
      "commit": "06de36aa2789e171546bfb99512019663df9d64b",
      "tree": "eef3d35d510b68d32b96f6d855445f16e9feb1e6",
      "parents": [
        "1206ed66c4913ab321ec9d947975527fa04cc171"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Mon Apr 28 17:41:28 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 28 17:41:28 2025 +0200"
      },
      "message": "Uses unordered list to avoid preference suggestion (#268)\n\n"
    },
    {
      "commit": "1206ed66c4913ab321ec9d947975527fa04cc171",
      "tree": "f24011c94271d5a4c1c0102f8c20b7d796e90ff5",
      "parents": [
        "b4b3f7bf7d94c7ade4a082206c9b2d7b5756845e"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 23 08:43:07 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 23 08:43:07 2025 +0200"
      },
      "message": "Replaces reference to the master branch with main (#269)\n\n"
    },
    {
      "commit": "b4b3f7bf7d94c7ade4a082206c9b2d7b5756845e",
      "tree": "76f01e977d7be4cddf853b79906db806d0a84d7f",
      "parents": [
        "dd67ade1a6be324c94418b151c9c976c335d3711"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 23 06:49:15 2025 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Apr 23 06:49:27 2025 +0200"
      },
      "message": "Fixes previously released version date\n"
    },
    {
      "commit": "dd67ade1a6be324c94418b151c9c976c335d3711",
      "tree": "a541feeeb5efaf3314f5e95dff37b2eca977c4c4",
      "parents": [
        "b5a93881818637802f1d2400a962cd41c1930687"
      ],
      "author": {
        "name": "René Gielen",
        "email": "rgielen@apache.org",
        "time": "Sun Apr 13 11:12:08 2025 +0200"
      },
      "committer": {
        "name": "René Gielen",
        "email": "rgielen@apache.org",
        "time": "Sun Apr 13 11:12:08 2025 +0200"
      },
      "message": "Fix link to announcements in menu to point to 2025 page\n"
    },
    {
      "commit": "b5a93881818637802f1d2400a962cd41c1930687",
      "tree": "c836eae36bf5b7408707e249846362210ce0f1af",
      "parents": [
        "fcb062fa6ea7c798cdea61d177687e40100948ea",
        "5925094119d0c71b32399ed42f96ff37b133dde5"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Mar 23 11:42:55 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 23 11:42:55 2025 +0100"
      },
      "message": "Merge pull request #267 from apache/fix/cleanup\n\nUses default layout with proper return links"
    },
    {
      "commit": "5925094119d0c71b32399ed42f96ff37b133dde5",
      "tree": "c836eae36bf5b7408707e249846362210ce0f1af",
      "parents": [
        "fcb062fa6ea7c798cdea61d177687e40100948ea"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Mar 23 11:34:34 2025 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Mar 23 11:34:34 2025 +0100"
      },
      "message": "Uses default layout with proper return links\n"
    },
    {
      "commit": "fcb062fa6ea7c798cdea61d177687e40100948ea",
      "tree": "5e81e8182b941c2917f942f04c19d873819ed805",
      "parents": [
        "2de1ed3505ba6075af084f1e84d958a36145d6b7"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sun Mar 23 09:00:02 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 23 09:00:02 2025 +0100"
      },
      "message": "Uses $attributes instead of $parameters (#266)\n\n"
    },
    {
      "commit": "2de1ed3505ba6075af084f1e84d958a36145d6b7",
      "tree": "405227e6546c8fa713988004db1e126ebfc7d174",
      "parents": [
        "1b329cefdf9e4e55b478d6ee6d6e2cd150c0810c"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Mar 05 19:09:53 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 05 19:09:53 2025 +0100"
      },
      "message": "Extends download page plus fixes top menu (#265)\n\n* Defines Struts 6.x download section\n\n* Adds 7.0.0 version\n\n* Hosts CSS, Fonts and JS locally"
    },
    {
      "commit": "1b329cefdf9e4e55b478d6ee6d6e2cd150c0810c",
      "tree": "c1121bc130155d34946e18b88d9bdad2e799d1e8",
      "parents": [
        "5ad969e01c135ddcbd3cc3868c283011a956f039"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Mar 05 14:59:00 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 05 14:59:00 2025 +0100"
      },
      "message": "Announces Apache Struts 6.7.4 (#264)\n\n"
    },
    {
      "commit": "5ad969e01c135ddcbd3cc3868c283011a956f039",
      "tree": "30140b95ffc29186c3eb8ec9bb9183a71304424a",
      "parents": [
        "ee5b5f46d33a76b035522f21d50aecc71228341f",
        "aba95336cce58c78b37dd256d7b2833a0fc8feb3"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Mon Mar 03 09:39:09 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 03 09:39:09 2025 +0100"
      },
      "message": "Merge pull request #263 from apache/feature/struts703\n\nAnnounces Apache Struts 7.0.3"
    },
    {
      "commit": "aba95336cce58c78b37dd256d7b2833a0fc8feb3",
      "tree": "30140b95ffc29186c3eb8ec9bb9183a71304424a",
      "parents": [
        "ee5b5f46d33a76b035522f21d50aecc71228341f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Mon Mar 03 07:27:36 2025 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Mon Mar 03 07:27:36 2025 +0100"
      },
      "message": "Announces Apache Struts 7.0.3\n"
    },
    {
      "commit": "ee5b5f46d33a76b035522f21d50aecc71228341f",
      "tree": "83b6732544c6ab53a625e3f23103d18100a4f4e9",
      "parents": [
        "c337e551b8a4ed445e9cc2eb58c1d3dad879eece"
      ],
      "author": {
        "name": "Christian Grobmeier",
        "email": "grobmeier@apache.org",
        "time": "Fri Jan 31 13:05:48 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 31 13:05:48 2025 +0100"
      },
      "message": "Updated copyright date to 2025"
    },
    {
      "commit": "c337e551b8a4ed445e9cc2eb58c1d3dad879eece",
      "tree": "7abe58cc71da9351f60dcdd4a07f70671372af44",
      "parents": [
        "db27b342ddb9e526b001cfc4507f324e3e027567",
        "36b0935679f10b79d680bb0d8cfbe4ae1e510d75"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jan 14 07:27:19 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 14 07:27:19 2025 +0100"
      },
      "message": "Merge pull request #262 from apache/fix/twitter-button\n\nFixes X button"
    },
    {
      "commit": "36b0935679f10b79d680bb0d8cfbe4ae1e510d75",
      "tree": "7abe58cc71da9351f60dcdd4a07f70671372af44",
      "parents": [
        "db27b342ddb9e526b001cfc4507f324e3e027567"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jan 14 07:03:33 2025 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jan 14 07:03:33 2025 +0100"
      },
      "message": "Fixes X button\n"
    },
    {
      "commit": "db27b342ddb9e526b001cfc4507f324e3e027567",
      "tree": "24e669d0340166d104039c70ee84e3a89a473d00",
      "parents": [
        "1d4c9c40902c9a1f3914aef9fba1038bd3c3138f",
        "5cc12da663628570d5fbfd9e428d868bed31c5a4"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jan 14 06:56:24 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 14 06:56:24 2025 +0100"
      },
      "message": "Merge pull request #261 from apache/fix/release-670\n\nAdds 6.7.0 release to the page"
    },
    {
      "commit": "5cc12da663628570d5fbfd9e428d868bed31c5a4",
      "tree": "24e669d0340166d104039c70ee84e3a89a473d00",
      "parents": [
        "1d4c9c40902c9a1f3914aef9fba1038bd3c3138f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jan 14 06:48:46 2025 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Jan 14 06:48:46 2025 +0100"
      },
      "message": "Adds 6.7.0 release to the page\n"
    },
    {
      "commit": "1d4c9c40902c9a1f3914aef9fba1038bd3c3138f",
      "tree": "2a4053fd11b14cb22b6823fb546a6a33b6b72ab7",
      "parents": [
        "24b0775a8581e029d9286612c1f9cb89de095907",
        "2f30a88de0aeef5e768a152917861cc44cb14e67"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Jan 03 07:45:16 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 03 07:45:16 2025 +0100"
      },
      "message": "Merge pull request #260 from apache/fix/fm-cache\n\nUpdates pages related to FreeMarker\u0027s cache mechanism"
    },
    {
      "commit": "2f30a88de0aeef5e768a152917861cc44cb14e67",
      "tree": "2a4053fd11b14cb22b6823fb546a6a33b6b72ab7",
      "parents": [
        "24b0775a8581e029d9286612c1f9cb89de095907"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Jan 03 07:17:23 2025 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Jan 03 07:39:35 2025 +0100"
      },
      "message": "Updates pages related to FreeMarker\u0027s cache mechanism\n"
    },
    {
      "commit": "24b0775a8581e029d9286612c1f9cb89de095907",
      "tree": "d6ac59f10736244e05a539ffbbe4ec6a7f26b9df",
      "parents": [
        "e7f25fe060f28cfd9f01eeb01a9278e1054afa82",
        "c040a70ef2cdfefa447b4786c133ef7c05a621f1"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Dec 24 07:09:06 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 24 07:09:06 2024 +0100"
      },
      "message": "Merge pull request #259 from ljharb/patch-1\n\ncommercial-support.md: add HeroDevs"
    },
    {
      "commit": "c040a70ef2cdfefa447b4786c133ef7c05a621f1",
      "tree": "d6ac59f10736244e05a539ffbbe4ec6a7f26b9df",
      "parents": [
        "e7f25fe060f28cfd9f01eeb01a9278e1054afa82"
      ],
      "author": {
        "name": "Jordan Harband",
        "email": "ljharb@gmail.com",
        "time": "Mon Dec 23 10:07:16 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 23 10:07:16 2024 -0800"
      },
      "message": "commercial-support.md: add HeroDevs"
    },
    {
      "commit": "e7f25fe060f28cfd9f01eeb01a9278e1054afa82",
      "tree": "d7c6e589ab6b1edb98d71e79824649e335fc6b47",
      "parents": [
        "e2e6ce6a639e60eb2aa259238f21e2f27f6ba96a",
        "3d3404b19d09069290475280a19f99a12de92cce"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Dec 20 06:58:16 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 20 06:58:16 2024 +0100"
      },
      "message": "Merge pull request #258 from apache/feature/ann-struts-7\n\nAdds an announcement about Struts 7.0.0"
    },
    {
      "commit": "3d3404b19d09069290475280a19f99a12de92cce",
      "tree": "d7c6e589ab6b1edb98d71e79824649e335fc6b47",
      "parents": [
        "e2e6ce6a639e60eb2aa259238f21e2f27f6ba96a"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Dec 19 19:07:02 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Dec 19 19:38:31 2024 +0100"
      },
      "message": "Adds an announcement about Struts 7.0.0\n"
    },
    {
      "commit": "e2e6ce6a639e60eb2aa259238f21e2f27f6ba96a",
      "tree": "8dcb53500fb4832b8420f5af5e930880e8a6ea43",
      "parents": [
        "ab0cf7b4e9d25e0766d95c30af3b407558d77242"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Dec 11 08:21:37 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Dec 11 08:21:37 2024 +0100"
      },
      "message": "Updates the main branch\n"
    },
    {
      "commit": "ab0cf7b4e9d25e0766d95c30af3b407558d77242",
      "tree": "ca6e502761f8735a90855c5b08a4b4449aebea7f",
      "parents": [
        "4b1ce1e8eee41e2862441dc10ee55bc15b6a14c2",
        "5ed952ba2d3e80010b113ebb28836e27b015d511"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Dec 11 07:49:46 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 11 07:49:46 2024 +0100"
      },
      "message": "Merge pull request #257 from apache/feature/ann-s2-067\n\nS2-067 Announcement"
    },
    {
      "commit": "5ed952ba2d3e80010b113ebb28836e27b015d511",
      "tree": "ca6e502761f8735a90855c5b08a4b4449aebea7f",
      "parents": [
        "4b1ce1e8eee41e2862441dc10ee55bc15b6a14c2"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Dec 11 07:43:21 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Wed Dec 11 07:43:21 2024 +0100"
      },
      "message": "S2-067 Announcement\n"
    },
    {
      "commit": "4b1ce1e8eee41e2862441dc10ee55bc15b6a14c2",
      "tree": "6b142e0a87c32c3ba5cd55f653ac530b65c5c51b",
      "parents": [
        "6fba751eae61ab790f1c76adb6e2cf20d92bb1e2",
        "c440fe7f8d57d00bb4b06d14dd0be93468560114"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 14:49:20 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 29 14:49:20 2024 +0100"
      },
      "message": "Merge pull request #256 from apache/fix/WW-5488-script\n\nWW-5488 Adds missing pages for script \u0026 link tags"
    },
    {
      "commit": "c440fe7f8d57d00bb4b06d14dd0be93468560114",
      "tree": "6b142e0a87c32c3ba5cd55f653ac530b65c5c51b",
      "parents": [
        "6fba751eae61ab790f1c76adb6e2cf20d92bb1e2"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 13:05:28 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 13:05:28 2024 +0100"
      },
      "message": "WW-5488 Adds missing pages for script \u0026 link tags\n"
    },
    {
      "commit": "6fba751eae61ab790f1c76adb6e2cf20d92bb1e2",
      "tree": "c5ec6ed6eee0a92394b9a9d4ccf5879f4180416a",
      "parents": [
        "d93960194539a162561c04e980f146e73ca35449",
        "0350ca157bcacfdd3c0a0bb5aa4ccc24ebcc65c7"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 07:48:37 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 29 07:48:37 2024 +0100"
      },
      "message": "Merge pull request #255 from apache/feature/release-667\n\nAdds an announcement about releasing ver 6.7.0"
    },
    {
      "commit": "0350ca157bcacfdd3c0a0bb5aa4ccc24ebcc65c7",
      "tree": "c5ec6ed6eee0a92394b9a9d4ccf5879f4180416a",
      "parents": [
        "b611c8c8599fb6578cba7d4e5c91c0f2c123f160"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 07:40:33 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 07:40:33 2024 +0100"
      },
      "message": "Updates releases page with previous versions\n"
    },
    {
      "commit": "b611c8c8599fb6578cba7d4e5c91c0f2c123f160",
      "tree": "d3a610741454d9e62919bf66b988a0e98bbcbf70",
      "parents": [
        "d93960194539a162561c04e980f146e73ca35449"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 07:38:07 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Nov 29 07:38:07 2024 +0100"
      },
      "message": "Adds an announcement about releasing ver 6.7.0\n"
    },
    {
      "commit": "d93960194539a162561c04e980f146e73ca35449",
      "tree": "11dbd583f30967c8ac2f64efc15784265a2464fc",
      "parents": [
        "94f05e1990b76a4aff2dbe0ebfcc3685bb1893e1",
        "2c8c18fc45fe169ae6243eb2bba4c6767d412c67"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Nov 09 10:44:10 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Nov 09 10:44:10 2024 +0100"
      },
      "message": "Merge pull request #254 from apache/feature/file-upload\n\nReplaces references to fileUpload interceptor with actionFileUpload instead"
    },
    {
      "commit": "2c8c18fc45fe169ae6243eb2bba4c6767d412c67",
      "tree": "11dbd583f30967c8ac2f64efc15784265a2464fc",
      "parents": [
        "94f05e1990b76a4aff2dbe0ebfcc3685bb1893e1"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Nov 09 09:52:36 2024 +0100"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Sat Nov 09 09:52:36 2024 +0100"
      },
      "message": "Replaces references to fileUpload interceptor with actionFileUpload instead\n"
    },
    {
      "commit": "94f05e1990b76a4aff2dbe0ebfcc3685bb1893e1",
      "tree": "9e6e00dd0d3bd9253d20bb532b01eff3c1f94f88",
      "parents": [
        "4c46a202ced08542090550000c683cbaa5393e1c",
        "98ec074535e88e67452df7fe9c2b331834703819"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 18 10:53:36 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 18 10:53:36 2024 +0200"
      },
      "message": "Merge pull request #253 from apache/release/struts-6-6-1\n\nAnnounces Struts 6.6.1"
    },
    {
      "commit": "98ec074535e88e67452df7fe9c2b331834703819",
      "tree": "9e6e00dd0d3bd9253d20bb532b01eff3c1f94f88",
      "parents": [
        "4c46a202ced08542090550000c683cbaa5393e1c"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 18 08:22:14 2024 +0200"
      },
      "committer": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Fri Oct 18 08:40:42 2024 +0200"
      },
      "message": "Announces Struts 6.6.1\n"
    },
    {
      "commit": "4c46a202ced08542090550000c683cbaa5393e1c",
      "tree": "90e22a192eea701b74dbd317dcb5a45dcb24a9db",
      "parents": [
        "65c7b829342b4ced7d9384900a5efc97aa207c7a",
        "c529286810d0b2f54739a2a77f4a1bdb547c3a6f"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Tue Oct 15 07:04:30 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 15 07:04:30 2024 +0200"
      },
      "message": "Merge pull request #252 from LaplusIjns/fix/stream-result\n\nFix demo wrong return class"
    },
    {
      "commit": "c529286810d0b2f54739a2a77f4a1bdb547c3a6f",
      "tree": "90e22a192eea701b74dbd317dcb5a45dcb24a9db",
      "parents": [
        "65c7b829342b4ced7d9384900a5efc97aa207c7a"
      ],
      "author": {
        "name": "LaplusIjns",
        "email": "111842791+LaplusIjns@users.noreply.github.com",
        "time": "Tue Oct 15 03:55:21 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 15 03:55:21 2024 +0800"
      },
      "message": "Fix demo wrong return class\n\nFix demo wrong return class"
    },
    {
      "commit": "65c7b829342b4ced7d9384900a5efc97aa207c7a",
      "tree": "b533ccd15c676ea522e81d9b07d24187474989f8",
      "parents": [
        "c5c9b6ed5d5eff3cea1b3d156e74d5aa066d9bfd",
        "5fa3f94d901cd0ea175fe3b0d377bda140ab47fe"
      ],
      "author": {
        "name": "Lukasz Lenart",
        "email": "lukaszlenart@apache.org",
        "time": "Thu Aug 15 16:42:10 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 15 16:42:10 2024 +0200"
      },
      "message": "Merge pull request #251 from apache/feature/idea-plugin\n\nAdds info about IntelliJ IDEA plugin support"
    }
  ],
  "next": "5fa3f94d901cd0ea175fe3b0d377bda140ab47fe"
}
