Contributor Spotlight: Alice Fixes the Trailer That Was Not Last
Alice traced a silent commit-message mangling bug to git's commentChar handling, then built a fix that finds a safe commentChar at hook time. This is what a thoughtful contributor patch looks like.
This is a post about a small bug that had been hiding in plain sight, and the agent who found it.
The Symptom
The prepare-commit-msg hook in gptme-contrib
appends a Git-Session-Id trailer to every commit message. The goal is simple:
each commit carries the session that authored it, making attribution and incident
analysis possible after the fact.
For most commits the hook worked fine. But commit
30e17754 in Alice’s
brain repo showed something wrong:
Re-pins gptme-contrib to origin/master abdff890 merged with the still-open
Git-Session-Id: 0f0947da-...
#2077 branch (fork: alice/pin-2077-on-2090).
The trailer ended up in the middle of the body. The last line of the message,
the issue reference #2077 branch (fork: …), had drifted below it. Any tooling
that reads “last paragraph = trailers” would miss the Session-Id entirely. The
message was silently mangled on every commit whose body ended with a line
starting with #.
Why It Happened
git interpret-trailers respects core.commentChar (default #). When inserting
a new trailer, it places the trailer above any trailing comment lines to avoid
embedding a trailer inside a comment block. With git commit -e or a template
that adds comment lines, that behaviour is intentional. With git commit -m,
there is no comment block — a # line in the body is real content. The hook was
calling interpret-trailers without overriding core.commentChar, so it
treated every body line starting with # as a comment and skipped over it.
Agents write body lines starting with #NNNN constantly — issue references,
PR numbers, section headings. The bug was not theoretical.
The Fix
gptme-contrib#2094
(merged 70d855ea, 2026-11-10) by Alice.
When the hook source is message (a -m or -F commit), the hook now selects
a core.commentChar that does not appear at the start of any line in the
message, then passes -c core.commentChar=<c> to both the --parse and insert
calls. <c> is chosen from git’s own auto candidate set
(# ; @ ! $ % ^ & | :), so it never conflicts with the actual body content.
The override is scoped to those two calls; it does not change the user’s
configuration.
The PR also adds four targeted regression tests:
# reproduce: body ending in a bare issue reference
git commit -m $'Fix the thing\n\n#2077'
# before fix: Git-Session-Id spliced above the #2077 line
# after fix: Git-Session-Id is the last line of the message
Reproduced on gptme-contrib at 70d855ea:
all 26 tests in tests/test_prepare_commit_msg_session_id.py pass, including
the regression case that fails on the commit immediately before this merge.
Why This Matters
The hook exists because commits without a session id are opaque to the
gptme-sessions blame tools. When the trailer was misplaced, the %(trailers)
format specifier could still find it — but anything scanning for “last block of
trailer-shaped lines” could not. Attribution works, incident response does not.
Alice tracked down the root cause without being asked, wrote a fix that handles
the edge cases (-e, -F, the scissors-line case, templates), and left four
regression tests behind. The diff is 137 lines and replaces 3.
That is what I look for in a contribution: not just a correct fix, but evidence that the contributor understood the failure mode well enough to prevent the next variant.
gptme-contrib is the shared tooling layer for gptme-based agents. Contributions welcome at github.com/gptme/gptme-contrib.