Three commits reachable from main carry a trailer naming an agent session:
X-Claude-Session: https://claude.ai/code/session_…
| commit |
|
fc1009b |
docs: correct four factual defects in the README, and fix the hero SVG (#643) |
97c6b45 |
spec: 서명 모드에 signer allowlist 요구를 정본에 반영 (#645) |
8a49ddc |
COMMITLORE_BIN carried none of the checks its sibling config key already had |
No open branch carries one, and the merge that landed after this was found does not.
This is not a CommitLore defect
SPEC §3 is explicit about the slot:
| X-<Name>: | free text | yes | Organization extension — preserved, never interpreted by the core |
and §150 requires that every key be in §3 or match X-<Name>. So Claude-Session: is refused as unknown-key, and X-Claude-Session: is accepted — exactly as specified. The product did what it says it does; the extension slot did its job.
What is missing is a rule of this repository's own, about what belongs in a public commit history. Session identifiers are execution metadata: they say which agent run produced a change, which is an internal detail of how the work was done rather than a decision about the code. A public git history is a permanent, mirrored surface, and a decision record is the wrong place to file operational bookkeeping.
Why it cannot be cleaned up
main has allow_force_pushes=false, and rewriting shared history is not on the table regardless. These three are permanent. The only thing left to decide is whether there is a fourth.
Suggested acceptance
test/dogfood.test.ts already asserts that this repository obeys its own protocol against its real history. The same place can hold this:
- no commit reachable from
main introduces a trailer whose key or value names an agent session, beyond an explicit baseline
- the baseline holds exactly the three commits above, listed by SHA, so the rule is enforceable today rather than after an impossible cleanup
- the failure message says which commit and which trailer, because the fix has to happen before the merge — afterwards there is no fix
A baseline is the honest shape here for the same reason dogfood-baseline.json exists: the repository cannot pass a rule retroactively, and pretending otherwise would mean either weakening the rule or never adopting it.
Where it came from
I merged two of the three today without reading the squash body. The third predates that. Recording it because the same omission produced a second defect in the same session — a commit subject that is the only non-English one in the last forty — and both were preventable by reading what was about to become public.
Three commits reachable from
maincarry a trailer naming an agent session:fc1009b97c6b458a49ddcNo open branch carries one, and the merge that landed after this was found does not.
This is not a CommitLore defect
SPEC §3 is explicit about the slot:
|
X-<Name>:| free text | yes | Organization extension — preserved, never interpreted by the core |and §150 requires that every key be in §3 or match
X-<Name>. SoClaude-Session:is refused asunknown-key, andX-Claude-Session:is accepted — exactly as specified. The product did what it says it does; the extension slot did its job.What is missing is a rule of this repository's own, about what belongs in a public commit history. Session identifiers are execution metadata: they say which agent run produced a change, which is an internal detail of how the work was done rather than a decision about the code. A public git history is a permanent, mirrored surface, and a decision record is the wrong place to file operational bookkeeping.
Why it cannot be cleaned up
mainhasallow_force_pushes=false, and rewriting shared history is not on the table regardless. These three are permanent. The only thing left to decide is whether there is a fourth.Suggested acceptance
test/dogfood.test.tsalready asserts that this repository obeys its own protocol against its real history. The same place can hold this:mainintroduces a trailer whose key or value names an agent session, beyond an explicit baselineA baseline is the honest shape here for the same reason
dogfood-baseline.jsonexists: the repository cannot pass a rule retroactively, and pretending otherwise would mean either weakening the rule or never adopting it.Where it came from
I merged two of the three today without reading the squash body. The third predates that. Recording it because the same omission produced a second defect in the same session — a commit subject that is the only non-English one in the last forty — and both were preventable by reading what was about to become public.