--- name: roller-security description: Triage Apache Roller security reports, maintain private case tracking, prepare CVE records, coordinate fixes and reporter review, and prepare disclosure with a release. --- # Apache Roller security response Use this workflow for vulnerability response, not ordinary bug fixes. The PMC owns acceptance, severity, release scope, and disclosure decisions. This skill supports those decisions; loading it does not authorize messages or publication. Parts are designed to work with Obsidian (the triage- directory is a vault), but Obsidian is optional. ## Confidentiality and project practice Keep reports, reproductions, CVE reservations, reporter identities, investigation notes, and disclosure schedules in a private workspace. If using `triage-/` in a checkout, verify its local Git exclusion before adding case material. Exclusion prevents accidental additions; it is not access control and does not remove material from Git history. Never force-add private records. Roller uses public code review for fixes. Follow the PMC's agreed workflow and keep vulnerability characterization out of branch names, commits, PR text, tests, and comments until disclosure. Neutral wording alone does not prove that a diff is safe: review what the entire change reveals, including related cases. Resolve uncertainty with the PMC and ASF Security. Do not assume that derivability from public source makes an unannounced finding appropriate for publication. When public text such as a release announcement, blog post or website page is prepared before disclosure, by a person or another agent, give the author the permitted facts and the constraints on scope and tone. Do not tell them what is being withheld or why: the instruction itself must be safe to leak. Keep such text neutral until the advisories are out. Keep only generic procedures and synthetic templates in this skill. Do not add live portal screenshots, case-derived examples, or release execution notes. ## Read the case before acting 1. Locate the private workspace and read its summary and the item's `TRACKING.md`. 2. Read the original report, reproduction evidence and `IMPLEMENTATION.md`. 3. Check the implementation branch, review state and release target against the actual repository. Do not infer that a message was sent from a draft file, or that none was received because the record lacks one; search the correspondence before stating what a reporter said or did not say. 4. Reconcile `CVE_FORM.md` before using the portal or drafting an advisory. For new cases, copy `assets/item-template/` into a private item directory. `TRACKING.md` frontmatter stores facts; checkboxes store workflow state. The terminal board reads those files directly: ```sh python3 skills/roller-security/scripts/triage-status.py "$TRIAGE_DIR" ``` Set `TRIAGE_DIR` to the actual private workspace. Commands above run from the Roller checkout root; when installed elsewhere, resolve scripts relative to this skill. Plain Markdown editing works; Obsidian Tasks is optional. Read [tracking conventions](references/obsidian-tasks-tracking.md) when creating or migrating records. Keep completion dates and mark irrelevant tasks explicitly. ## Workflow Read [ASF process and routing](references/asf-process.md) for policy sources and project-specific decisions. Verify current policy when performing the workflow. 1. Acknowledge receipt without inventing a verdict or fix commitment. 2. Investigate reachability, actor privileges, configuration, affected versions, impact and duplicates. Record evidence separately from inference. Use the [codebase orientation](references/roller-codebase-map.md) to find entry points. 3. Record the PMC's acceptance, rejection or duplicate decision. Explain a rejection with verified reasons; re-evaluate each report independently. 4. Tell the reporter the accepted remedy and any agreed schedule. Distinguish planned work from completed work. Check existing credit preferences first; ask when unclear. Use [communication templates](references/comms-templates.md). 5. Assess [severity and CVSS](references/severity-and-cvss.md), reconcile the CVE worksheet, and request an ID from ASF Security through the [portal workflow](references/cve-portal.md). 6. Implement and review the fix under the agreed project workflow. Demonstrate that regression tests detect the reported behavior and pass with the fix; keep sensitive reproduction evidence private. Use the target branch's supported JDK and documented test commands, not a machine-specific SDK path. Record as `fix_commit` the commit that landed on the release branch (the merge or squash commit), not the pull request's branch head, and confirm it is an ancestor of the release tag before citing it in a CVE record. 7. Give the reporter the fix and draft advisory for comment with a reasonable deadline. Coordinate merge timing with the PMC; the ASF default places reporter review before commit. Record any agreed project variation. 8. Release the approved fix. The companion `roller-release` skill covers the mechanics when available; otherwise use the project's release documentation. 9. Coordinate disclosure with release availability, verify announcement recipients, update public security information, and add announcement references to the CVE. Confirm each advisory in every list archive rather than assuming delivery, and notify reporters separately with their advisory links, since the list emails do not reach them. Log each reporter reply in the case record when it arrives. Do not rewrite pushed Git commits to add CVE IDs. ## Multiple reports Give each case an owner and next task. Record shared code and duplicate relationships in frontmatter. Coordinate merge order when fixes overlap, and consider whether publishing one change reveals another case. Set release targets explicitly; the board's release gates are reminders, not release authorization. ## Helpers and limits - `scripts/triage-status.py [--mine ]` derives stages, next tasks, blockers and consistency warnings without writing case data. - `scripts/migrate-status.py [--write]` previews migration from legacy `status.yml`; writes only when requested and retains legacy originals. - `scripts/check-private.sh [--range ] [--pr ]` checks common private paths and wording. Use explicit commit endpoints such as `master..HEAD` (or `master...HEAD`); a lone revision such as `HEAD` is rejected. Without `--range`, it checks the last 20 commit messages. It is a heuristic, not publication approval: manually inspect the full diff, filenames, screenshots, archives and PR text. Public security documentation can legitimately trigger its vocabulary checks.