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

  1. Type in the trailer name. TAP-Human = person, TAP-Model = AI. A bare Co-Authored-By does not reveal human vs AI; the TAP-* trailer does.
  2. Correspondence by mirrored identity. Each TAP-* repeats the same Name <email> as its Co-Authored-By; the email is the join key.
  3. Group by entity, one block at the bottom. All lines for one party together (its Co-Authored-By then its TAP-* 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).
  4. Unlimited parties; committer is not generator. Multiple TAP-Human/TAP-Model allowed - this credits the actual generator even when someone else pressed commit. When several models share one account, use one Co-Authored-By (one avatar) plus several TAP-Model lines with roles.
  5. 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.
  6. Lean by default. Minimum for honesty (party type + model if disclosed); platform/provider optional, gated by Disclosure Level.
  7. Demo flavor. A human may playfully carry model=homo-sapiens-0.1, symmetric with the AI's model=.

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.