Profile: Git
Carrier: version-control history. Provenance lives in the commit MESSAGE BODY as trailers, immutable and versioned out of the box - no separate provenance database. Answers "who changed" (contributors) plus time (git timestamp), vs the File profile's "who created".
Machine layer: TAP-Human and
TAP-Model trailers (key: value, parsed by
git interpret-trailers), independent of GitHub accounts,
work on any host, even with no remote. The durable layer of truth.
Showcase layer (optional):
Co-Authored-By: <Name> <email> - GitHub renders
an avatar if the email maps to a registered account.
Packaging rules
- Type in the trailer name.
TAP-Human= person,TAP-Model= AI. A bareCo-Authored-Bydoes not reveal human vs AI; theTAP-*trailer does. - Correspondence by mirrored identity. Each
TAP-*repeats the sameName <email>as itsCo-Authored-By; the email is the join key. - Group by entity, one block at the bottom. All lines
for one party together (its
Co-Authored-Bythen itsTAP-*line(s)), then the next party. One contiguous trailer block, NO blank line inside (a blank line breaks trailer parsing and drops everything above it). - Unlimited parties; committer is not generator.
Multiple
TAP-Human/TAP-Modelallowed - this credits the actual generator even when someone else pressed commit. When several models share one account, use oneCo-Authored-By(one avatar) plus severalTAP-Modellines with roles. - Email for linking. A verified personal email on the
account, or GitHub noreply
(
<id>+<login>@users.noreply.github.com) which links the avatar and keeps the personal address private. - Lean by default. Minimum for honesty (party type +
model if disclosed);
platform/provideroptional, gated by Disclosure Level. - Demo flavor. A human may playfully carry
model=homo-sapiens-0.1, symmetric with the AI'smodel=.
Canonical multi-party example
Fix parser edge case
Co-Authored-By: Alex <sh@shelly.im>
TAP-Human: Alex <sh@shelly.im>; handle=@shelly-im; model=homo-sapiens-0.1; role=ideation,review
Co-Authored-By: Claude <noreply@anthropic.com>
TAP-Model: Claude Sonnet 5 <noreply@anthropic.com>; model=claude-sonnet-5; provider=anthropic; platform=claude-code; role=drafting
TAP-Model: Claude Opus 4.8 <noreply@anthropic.com>; model=claude-opus-4-8; provider=anthropic; platform=claude-code; role=review,synthesis,commit
How it looks now vs with TAP
Now (default Claude Code):
Fix parser edge case
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Lost: bare "Claude", no version/provider/role; every version collapses into one account; nothing machine-aggregable; human and AI indistinguishable.
With TAP: the canonical example above - same GitHub rendering, but every party is typed, every model versioned, the whole block greppable.
Retrieval
git log --grep='TAP-Model: claude-opus-4-8' # all commits of a model
git shortlog --group=trailer:tap-model # contribution by model
git shortlog --group=trailer:tap-human # contribution by human
Basis of the TAP model-contribution report: reads trailers across a repo's history and reports how much came from which model/provider/version - a breakdown GitHub has no concept of.
Confidence
New commits are recorded. Pre-protocol history recovered
only through memory is reconstructed: testimony, not
recorded - the record stays honest about what it
witnessed.
Validation
The mechanisms in this profile were verified on a live GitHub
repository: co-authors render from Co-Authored-By;
TAP-* trailers are greppable via git log and
git shortlog --group=trailer:...; and TAP-*
work with no Co-Authored-By present at all, so the machine
layer stands on its own.