[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACJGZAS1WB8RHDQMC76XFB":3,"skill-same:01M6ACJGZAS1WB8RHDQMC76XFB":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6ACJGZAS1WB8RHDQMC76XFB","creating-security-bulletins",null,"Use when drafting, updating, or reviewing an S2-XXX security bulletin on the Struts cwiki, when preparing bulletin text ahead of a CVE request, when filling a CVE record in the ASF CVE tool (cveprocess.apache.org \u002F Vulnogram), when deciding when to publish, when publishing a bulletin and announcing it to the ASF lists, when wrapping up after the advisory mails, or when deciding how much detail about a fixed vulnerability is safe to publish.","apache\u002Fstruts","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6ACJC9PH86ZGJ487XPD32BP",1373,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcreating-security-bulletins\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,9],"security","creating security bulletins","drafting","safe","when","request","org","detail","publishing","up","use","text","tool","how","vulnerability","publish","cve","asf","struts","2026-11-10 10:12:30",false,"---\nname: fix-reviewed-vcpkg-pr\ndescription: >-\n  Address findings in an existing report produced by review-vcpkg-pr or\n  review-vcpkg-prs-today, then push fixes for the user to submit to the\n  contributor. Use only for follow-up fixes to those reviews, including\n  batches. Do not use for generic bug fixes, issue resolution, or PRs\n  without an existing review report. Never open a PR.\n---\n\n## Goal\n\nMake the requested fixes on the contributor's PR head, validate and push them to the user's fork, and return a URL for the user to open a PR against the contributor's branch. Confirm whether the resulting contributor PR merits `approve`; report remaining issues or uncertainty honestly.\n\n## Prerequisite\n\nBefore modifying anything for a PR, locate and read its existing report from `review-vcpkg-pr` or `review-vcpkg-prs-today`. If it cannot be found, ask for its location and do not proceed for that PR. Do not substitute a fresh review for this prerequisite.\n\n## Inputs\n\n| Input | Required | Meaning |\n|---|---|---|\n| `pr` | Yes | One or more microsoft\u002Fvcpkg PR numbers. |\n| `fixes` | No | Requested changes per PR. If omitted, use agreed findings from the conversation or existing review; ask if the intended scope is unclear. |\n| `reviews-root` | No | Directory containing `pr-\u003CNUMBER>\u002Freport.md`; defaults to `reviews\u002F` in the caller's original directory. |\n| `push-remote` | No | Git remote for the user's fork. Use an applicable personal default or ask; do not assume `origin` is the destination. |\n\nResolve explicit arguments before personal defaults. Personal instructions may supply defaults scoped to microsoft\u002Fvcpkg; no particular username, remote name, or machine path is required by this skill.\n\nBefore changing directories, resolve `reviews-root` and `.github\u002Fskills\u002Fshared\u002Freview-vcpkg-pr-guide.md` against the caller's original directory to absolute paths. Resolve the push remote's URL from the caller's repository; do not assume its name has the same meaning in another workspace.\n\n### Example invocations\n\n- `\u002Ffix-reviewed-vcpkg-pr 12345`\n- `\u002Ffix-reviewed-vcpkg-pr 12345, 12346 push-remote my-fork`\n- `\u002Ffix-reviewed-vcpkg-pr 12345 reviews-root D:\\review-results\\reviews fixes F1,F3`\n- `\u002Ffix-reviewed-vcpkg-pr 12345 fixes \"Correct the installed include paths\" push-remote my-fork`\n\n## Workspace and artifact safety\n\nDerive each PR's worktree and investigation paths from its fix handoff. Reuse the worktree when suitable; inspect its status and history first. Discard the review's uncommitted experimental changes in that worktree, but preserve previous fix commits and fix branches. If the origin of uncommitted changes is unclear, ask before discarding them. Limit cleanup to those source changes; retain review artifacts and build evidence. If a new worktree is needed, create it under the recorded investigation directory when suitable; otherwise ask for a short replacement location and resolve it to an absolute path. Never use the Copilot session directory or an arbitrary long temp path. Never switch branches or run mutable fix\u002Fbuild steps in the caller's working tree.\n\nCopy the caller's `vcpkg.exe` (Windows) or `vcpkg` (non-Windows) into the workspace root if needed. Keep builds, installs, logs, and examples worker-local and retain them for follow-up; do not use `--clean-after-build`.\n\nIf `VCPKG_DOWNLOADS` is already nonempty, preserve it for every command and worker. Use that shared directory only through vcpkg; never clean or delete it, even under storage pressure. Otherwise, do not set it. Do not pass `--downloads-root`.\n\nTreat all existing review artifacts, including reports, patches, and the index, as read-only. Give concurrent workers separate writable workspaces and intermediate directories. Pass each worker its PR number, fix scope or finding IDs, absolute report, workspace, investigation, and guide paths, and push destination explicitly.\n\n## Procedure\n\n1. Read `pr-\u003CNUMBER>\u002Freport.md` under `reviews-root`, including any `## Fix handoff`. Use its finding IDs, scope, workspace inventory, and reproduction recipes rather than relying on prior chat. Fetch current PR metadata and conversation; compare the current contributor repository, branch, and head SHA with the report. Revalidate findings affected by intervening changes. If the existing report is incomplete, reconstruct needed evidence from the PR and sources; ask about ambiguous fix scope rather than guessing. If local artifacts are missing, recreate them from the recorded recipes. If the PR is closed or its head is unavailable, report that instead of preparing a stale fix.\n2. Read the shared review guide and apply its review criteria and relevant validation guidance. This is a fix workflow: do not invoke its report-writing, Contributor Feedback, or `git format-patch` deliverables. Read `.github\u002Fpull_request_template.md` and verify applicable checklist items; do not invent checklist completion.\n3. Base the fix branch on the contributor's current head, not the vcpkg target branch or a synthetic merge commit. Name the destination branch `pr-\u003CNUMBER>-\u003CPORT>`; use a short descriptive suffix for multi-port or non-port changes. Check for existing local and remote fix branches and preserve prior fixes. Apart from the review's uncommitted experimental changes described above, ask before discarding work or rewriting published history.\n4. Make only the requested fixes and tightly coupled corrections. Distinguish introduced problems from pre-existing ones; do not expand into unrelated repairs just to obtain an approval verdict. Generate or refresh source patch files with `git diff --output=\u003Cpatch-file>`, preserving line endings. Do not open upstream PRs either; report any upstream-submission requirement that remains unmet.\n5. Validate the changed behavior with relevant builds and consumer examples, reusing review evidence only where still applicable. For integration fixes, cover Release and Debug and affected integration methods using the guide's rules. Surface failed or unavailable validation explicitly.\n6. Keep versioning consistent with the contributor's PR. Do not add another `port-version` bump when the PR already introduces the version entry being fixed. After committing port changes, refresh each affected entry with `vcpkg x-add-version \u003Cport> --overwrite-version` when replacing that PR's entry, then commit the generated metadata. Do not overwrite historical entries already in the target branch. Verify the final version records match the final port contents.\n7. Assess the resulting contributor PR against the review criteria, including remaining findings. State whether it would receive `approve`; if not, give its actual verdict and reasons. Do not alter the original review artifacts.\n8. Before pushing, recheck the contributor's head and verify that the commits being added contain only the intended fixes. If the head moved, update safely, repeat affected validation, and repeat step 7's verdict assessment before proceeding. Verify the push URL belongs to the intended user-controlled fork, not the contributor's repository or microsoft\u002Fvcpkg. Push the fix branch without force and verify its remote tip matches the local commit. Report push failures as failures.\n9. Generate a PR creation URL using the contributor repository and branch as the base and the pushed fork branch as the head. Do not target microsoft\u002Fvcpkg's default branch. Never open a PR or post review comments; submission belongs to the user.\n\n## Required result\n\nFor every requested PR, return its fix summary, worktree path, pushed branch and commit, validation results or limitations, resulting review verdict, and contributor-targeted PR creation URL. For batches, account for every PR, including blocked or failed fixes.\n\nFinish only after the intended commits are pushed and verified, or explicitly report what prevented completion. Leave all review artifacts unchanged and open no PRs.\n","## Goal\n\nMake the requested fixes on the contributor's PR head, validate and push them to the user's fork, and return a URL for the user to open a PR against the contributor's branch. Confirm whether the resulting contributor PR merits `approve`; report remaining issues or uncertainty honestly.\n\n## Prerequisite\n\nBefore modifying anything for a PR, locate and read its existing report from `review-vcpkg-pr` or `review-vcpkg-prs-today`. If it cannot be found, ask for its location and do not proceed for that PR. Do not substitute a fresh review for this prerequisite.\n\n## Inputs\n\n| Input | Required | Meaning |\n|---|---|---|\n| `pr` | Yes | One or more microsoft\u002Fvcpkg PR numbers. |\n| `fixes` | No | Requested changes per PR. If omitted, use agreed findings from the conversation or existing review; ask if the intended scope is unclear. |\n| `reviews-root` | No | Directory containing `pr-\u003CNUMBER>\u002Freport.md`; defaults to `reviews\u002F` in the caller's original directory. |\n| `push-remote` | No | Git remote for the user's fork. Use an applicable personal default or ask; do not assume `origin` is the destination. |\n\nResolve explicit arguments before personal defaults. Personal instructions may supply defaults scoped to microsoft\u002Fvcpkg; no particular username, remote name, or machine path is required by this skill.\n\nBefore changing directories, resolve `reviews-root` and `.github\u002Fskills\u002Fshared\u002Freview-vcpkg-pr-guide.md` against the caller's original directory to absolute paths. Resolve the push remote's URL from the caller's repository; do not assume its name has the same meaning in another workspace.\n\n### Example invocations\n\n- `\u002Ffix-reviewed-vcpkg-pr 12345`\n- `\u002Ffix-reviewed-vcpkg-pr 12345, 12346 push-remote my-fork`\n- `\u002Ffix-reviewed-vcpkg-pr 12345 reviews-root D:\\review-results\\reviews fixes F1,F3`\n- `\u002Ffix-reviewed-vcpkg-pr 12345 fixes \"Correct the installed include paths\" push-remote my-fork`\n\n## Workspace and artifact safety\n\nDerive each PR's worktree and investigation paths from its fix handoff. Reuse the worktree when suitable; inspect its status and history first. Discard the review's uncommitted experimental changes in that worktree, but preserve previous fix commits and fix branches. If the origin of uncommitted changes is unclear, ask before discarding them. Limit cleanup to those source changes; retain review artifacts and build evidence. If a new worktree is needed, create it under the recorded investigation directory when suitable; otherwise ask for a short replacement location and resolve it to an absolute path. Never use the Copilot session directory or an arbitrary long temp path. Never switch branches or run mutable fix\u002Fbuild steps in the caller's working tree.\n\nCopy the caller's `vcpkg.exe` (Windows) or `vcpkg` (non-Windows) into the workspace root if needed. Keep builds, installs, logs, and examples worker-local and retain them for follow-up; do not use `--clean-after-build`.\n\nIf `VCPKG_DOWNLOADS` is already nonempty, preserve it for every command and worker. Use that shared directory only through vcpkg; never clean or delete it, even under storage pressure. Otherwise, do not set it. Do not pass `--downloads-root`.\n\nTreat all existing review artifacts, including reports, patches, and the index, as read-only. Give concurrent workers separate writable workspaces and intermediate directories. Pass each worker its PR number, fix scope or finding IDs, absolute report, workspace, investigation, and guide paths, and push destination explicitly.\n\n## Procedure\n\n1. Read `pr-\u003CNUMBER>\u002Freport.md` under `reviews-root`, including any `## Fix handoff`. Use its finding IDs, scope, workspace inventory, and reproduction recipes rather than relying on prior chat. Fetch current PR metadata and conversation; compare the current contributor repository, branch, and head SHA with the report. Revalidate findings affected by intervening changes. If the existing report is incomplete, reconstruct needed evidence from the PR and sources; ask about ambiguous fix scope rather than guessing. If local artifacts are missing, recreate them from the recorded recipes. If the PR is closed or its head is unavailable, report that instead of preparing a stale fix.\n2. Read the shared review guide and apply its review criteria and relevant validation guidance. This is a fix workflow: do not invoke its report-writing, Contributor Feedback, or `git format-patch` deliverables. Read `.github\u002Fpull_request_template.md` and verify applicable checklist items; do not invent checklist completion.\n3. Base the fix branch on the contributor's current head, not the vcpkg target branch or a synthetic merge commit. Name the destination branch `pr-\u003CNUMBER>-\u003CPORT>`; use a short descriptive suffix for multi-port or non-port changes. Check for existing local and remote fix branches and preserve prior fixes. Apart from the review's uncommitted experimental changes described above, ask before discarding work or rewriting published history.\n4. Make only the requested fixes and tightly coupled corrections. Distinguish introduced problems from pre-existing ones; do not expand into unrelated repairs just to obtain an approval verdict. Generate or refresh source patch files with `git diff --output=\u003Cpatch-file>`, preserving line endings. Do not open upstream PRs either; report any upstream-submission requirement that remains unmet.\n5. Validate the changed behavior with relevant builds and consumer examples, reusing review evidence only where still applicable. For integration fixes, cover Release and Debug and affected integration methods using the guide's rules. Surface failed or unavailable validation explicitly.\n6. Keep versioning consistent with the contributor's PR. Do not add another `port-version` bump when the PR already introduces the version entry being fixed. After committing port changes, refresh each affected entry with `vcpkg x-add-version \u003Cport> --overwrite-version` when replacing that PR's entry, then commit the generated metadata. Do not overwrite historical entries already in the target branch. Verify the final version records match the final port contents.\n7. Assess the resulting contributor PR against the review criteria, including remaining findings. State whether it would receive `approve`; if not, give its actual verdict and reasons. Do not alter the original review artifacts.\n8. Before pushing, recheck the contributor's head and verify that the commits being added contain only the intended fixes. If the head moved, update safely, repeat affected validation, and repeat step 7's verdict assessment before proceeding. Verify the push URL belongs to the intended user-controlled fork, not the contributor's repository or microsoft\u002Fvcpkg. Push the fix branch without force and verify its remote tip matches the local commit. Report push failures as failures.\n9. Generate a PR creation URL using the contributor repository and branch as the base and the pushed fork branch as the head. Do not target microsoft\u002Fvcpkg's default branch. Never open a PR or post review comments; submission belongs to the user.\n\n## Required result\n\nFor every requested PR, return its fix summary, worktree path, pushed branch and commit, validation results or limitations, resulting review verdict, and contributor-targeted PR creation URL. For batches, account for every PR, including blocked or failed fixes.\n\nFinish only after the intended commits are pushed and verified, or explicitly report what prevented completion. Leave all review artifacts unchanged and open no PRs.\n",{"name":43,"description":44},"fix-reviewed-vcpkg-pr","Address findings in an existing report produced by review-vcpkg-pr or review-vcpkg-prs-today, then push fixes for the user to submit to the contributor. Use only for follow-up fixes to those reviews, including batches. Do not use for generic bug fixes, issue resolution, or PRs without an existing review report. Never open a PR.","master","9a5dfef5d1a0438a7d24856a85bd60f309d355e9",".claude\u002Fskills\u002Fcreating-security-bulletins",876,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts","https:\u002F\u002Fstruts.apache.org\u002F","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-14 17:00:41",{"source":8,"skillName":43,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add apache\u002Fstruts --skill fix-reviewed-vcpkg-pr",{"tool":60,"command":61},"bunx","bunx skills add apache\u002Fstruts --skill fix-reviewed-vcpkg-pr",{"tool":63,"command":64},"pnpm","pnpm dlx skills add apache\u002Fstruts --skill fix-reviewed-vcpkg-pr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcreating-security-bulletins\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"bulletin-template.md","REFERENCE","参考文档",8575,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcreating-security-bulletins\u002Fbulletin-template.md",[75,111,134,152,172,191],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":94,"publishedAt":38},"01M6ACJVHR7YZNC8AZFK987QP0","code-review","Apache Struts pull request review guide. Use when reviewing pull requests in this repository to check test conventions, security-sensitive framework code, PR and commit hygiene, and Struts-specific implementation patterns.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fcode-review\u002FSKILL.md",[81,86,89],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":87,"categoryName":88,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[95,96,97,98,99,100,9,101,102,37,19,103,104,105,106,29,107,23,108,109,24,110],"code review","code","review","pull","pull requests","test","pr","pull request","commit","framework","Test Conventions","review guide","pull request review","check","requests","repository",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":120,"publishedAt":38},"01M6ACJSK2MWX4MPVHH4S3FK0V","triaging-security-reports","Use when a vulnerability or security report arrives for triage, when assessing a CVE\u002FRCE\u002FOGNL\u002Finjection claim against the code, when deciding whether a finding is the framework's fault or the application's, when drafting a reply to a security researcher, or when a claim that is already public (a Full Disclosure post, a blog, a scanner advisory) needs the project's position stated for users and scanner vendors — to research the claim from source without trusting the reporter and without fabricating your own facts.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftriaging-security-reports\u002FSKILL.md",[117],{"categoryNo":118,"categoryName":119,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000021","资料检索与研究",[121,19,122,96,35,123,124,125,29,33,126,127,128,129,23,130,131,104,132,133,21],"triaging security reports","reports","for","security report","claim","facts","injection","source","project","scanner","full","advisory","users",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":38},"01M6ACJQJRMWRPQJ7P796RJZDZ","releasing-struts","Use when running or planning an Apache Struts release on any maintenance line (6.x, 7.x) - cutting the tag, staging artifacts, opening the vote, promoting, updating the site and announcing - or when asked what the next step in a release is.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Freleasing-struts\u002FSKILL.md",[],[37,141,9,142,143,144,145,29,23,146,147,148,149,150,151],"releasing struts","planning","artifacts","release","running","maintenance","next","what the","line","site","next step",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":38},"01M6ACJNFT2MMYBT8WFBJR8HXM","merging-dependabot-prs","Use when triaging, classifying or landing Dependabot pull requests in this repo — clearing the open Dependabot queue, deciding whether a bump needs a WW Jira ticket, or checking whether a bump's build actually passed.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fmerging-dependabot-prs\u002FSKILL.md",[],[159,160,161,98,99,162,163,164,165,166,167,29,23,109,168,169,170,171],"merging dependabot prs","prs","dependabot","jira","bump","repo","landing","ticket","open","build","ww","queue","jira ticket",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":38},"01M6ACJK00H307C0B4HTMM34EB","creating-version-notes","Use when preparing, updating, or reviewing the release documentation for a Struts release or release candidate on any maintenance line (6.x, 7.x) - the Version Notes page on the cwiki, its Migration Guide entry, the GitHub release notes, and the test-build announcement mail.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcreating-version-notes\u002FSKILL.md",[],[179,180,181,182,100,183,184,144,185,37,23,186,187,149,188,189,123,190,29,146],"notes","creating version notes","version","documentation","announcement","github","release notes","candidate","mail","guide","github release","page",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":197,"publishedAt":38},"01M6ACJERGEM6AYZGCC6A2ZC27","creating-release-vote-mail","Use when opening the formal release vote for a Struts release candidate on any maintenance line (6.x, 7.x) - composing and drafting the [VOTE] Apache Struts X.Y.Z mail to dev@ once the Version Notes page, GitHub release and staged artifacts are published.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fstruts\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcreating-release-vote-mail\u002FSKILL.md",[],[198,144,187,179,199,9,184,143,123,190,29,37,23,181,21,186,146,149,200,189],"creating release vote mail","dev","staged"]