From 1d8a30c173b1637580ed5e3f2712bd27bbe394da Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sat, 8 Aug 2026 08:59:06 +0200 Subject: [PATCH] docs: hand over a paste-ready body in creating-release-vote-mail Gmail's linkifier rewrites URLs server-side as the draft is stored, so the four link lines in the 6.11.0 vote draft arrived wrapped in https://www.google.com/url?q=...&source=gmail&ust=... and the 72-column wrap was reflowed. All three ways of passing the body through the Gmail tool were tested and all are rewritten; body-only is the least-bad, and supplying htmlBody is worse (HTML-only mail, or a plain part whose visible text is the wrapped URL). Record the constraint and make the workaround structural: the skill now produces the draft *and* a file with the exact body, so the release manager fixes it with one select-all-paste instead of hand-editing four URLs. Also flag re-running the draft-update tool on an already-corrected draft, which re-mangles it. Co-Authored-By: Claude Opus 5 --- .../creating-release-vote-mail/SKILL.md | 24 ++++++++++++++++++- .../vote-mail-template.md | 6 ++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.claude/skills/creating-release-vote-mail/SKILL.md b/.claude/skills/creating-release-vote-mail/SKILL.md index d8cb99fe19..4604faaf9e 100644 --- a/.claude/skills/creating-release-vote-mail/SKILL.md +++ b/.claude/skills/creating-release-vote-mail/SKILL.md @@ -79,7 +79,8 @@ Subject is exactly `[VOTE] Apache Struts X.Y.Z`. ## Draft it, do not send it -Create a Gmail draft with To, Bcc, Subject and body set. **Never send.** +Create a Gmail draft with To, Bcc, Subject and body set, and write the same body to a file whose +path you hand over. **Never send.** | Rationalization | Reality | |---|---| @@ -91,6 +92,26 @@ Create a Gmail draft with To, Bcc, Subject and body set. **Never send.** Sending opens a binding vote on a permanently archived public list and commits the PMC to the artifacts as staged. +### Gmail mangles the links — hand over a paste-ready body + +Gmail's linkifier rewrites URLs server-side as the draft is stored, so the four link lines +arrive as `https://www.google.com/url?q=...&source=gmail&ust=...` and the 72-column wrap is +reflowed. There is no way to pass the body through the Gmail tool that avoids it: + +| Body passed as | Result | +|---|---| +| `body` only | Wrapped hrefs; plain rendering shows `bare-url ` | +| `htmlBody` only | No plain-text part at all — HTML-only mail, wrong for an ASF list | +| both | Worst: the plain part's *visible* text becomes the wrapped URL | + +`body` only is the least-bad, and is what to use. **Also write the exact body to a file and +give the release manager its path.** Pasting plain text over the compose window restores both +the bare URLs and the wrap, making the fix one select-all-paste instead of four hand-edited +URLs. + +**Never re-run the draft-update tool on a draft whose links have already been fixed by hand** — +it re-mangles them. A draft the release manager has corrected is finished; leave it alone. + ## The boilerplate is frozen Everything from `Once you have had a chance to review the test build` to the sign-off is @@ -123,6 +144,7 @@ A vote opened on a 404 burns the window before anyone can test. - A new paragraph inserted into the vote boilerplate - A quality checkbox arriving pre-ticked - An opening sentence carried over from the previous release +- Re-running the draft-update tool on a draft whose links were already fixed by hand ## Common Mistakes diff --git a/.claude/skills/creating-release-vote-mail/vote-mail-template.md b/.claude/skills/creating-release-vote-mail/vote-mail-template.md index c25cc9083f..339e72649b 100644 --- a/.claude/skills/creating-release-vote-mail/vote-mail-template.md +++ b/.claude/skills/creating-release-vote-mail/vote-mail-template.md @@ -114,7 +114,9 @@ On behalf of the Apache Struts project ``` Hard-wrap the body at 72 columns, continuation lines unindented, so the list stays legible in -the ASF archives and in quoted replies. +the ASF archives and in quoted replies. Gmail reflows the wrap and rewrites the link lines when +it stores the draft — see *Gmail mangles the links* in [`SKILL.md`](SKILL.md) for why the body +also has to be handed over as a file. ## Frozen text @@ -143,3 +145,5 @@ repository does not. - [ ] All four checkboxes empty - [ ] No severity, CVE, S2-XXX, bulletin link or reporter detail anywhere - [ ] Exactly one mail +- [ ] Body also saved to a file and its path handed over, so the mangled links and wrap can be + fixed with one paste