Skip to content

this repository's own history publishes agent session identifiers, and nothing checks for it #652

Description

@MongLong0214

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions