LLM Signature
Provenance, not marketing. A Co-Authored-By: Claude <noreply@anthropic.com>
line says an AI touched the commit and nothing else; this signature records
what actually shaped the work — the exact model and the versioned tool stack —
as machine-readable git trailers:
Assisted-By: claude-sonnet-5
Agent-Stack: claude-code@2.1.0; engineering-discipline@2.1.0 (craft-collection); session-workflow@0.15.0 (craft-collection)
Trailers are the native mechanism: hidden from git log --oneline, filterable
with git log --format='%(trailers:key=Assisted-By)', parseable with
git interpret-trailers. Full grammar and semantics: references/spec.md.
Semantics
Assisted-Bynames the model that is writing and orchestrating — the one responsible for the change. One model: the orchestrator at commit time, not every subagent it delegated to. The model is never added as a commit co-author or committer; this trailer is its only appearance.Agent-Stackis environment-at-commit provenance: the harness and the enabled plugins, each asname@version (marketplace)— what was installed and enabled, not a claim that every item fired. The marketplace label is a lookup key (its repo orclaude plugin marketplace listresolves it) — URLs stay out of commits.
Generate — always by script, never by hand
A remembered version is wrong the moment anything updates, so the signature is rendered from live sources every time:
uv run --no-project -- python "${CLAUDE_PLUGIN_ROOT}/skills/llm-signature/scripts/render_signature.py"
The model comes from the session transcript (last main-loop assistant message —
subagent sidechains never sign; a discovered transcript signs only when fresh
and verified against this cwd); the stack comes from claude plugin list and
claude --version. --json for machine use, --plugin <name> (repeatable) to
narrow the stack, --model / --transcript as explicit overrides. If the
model cannot be resolved, the script fails rather than guessing — do not
substitute a hand-typed signature; commit unsigned or fix the resolution.
Apply
Commits — in a project that adopts the signature (one declaration in the
repo's CLAUDE.md; see references/spec.md § Adopting), run the script at
commit time and append its output verbatim as the final paragraph of the
commit message. Drop any Co-Authored-By line carrying the vendor's identity
(an anthropic.com or claude+noreply address) and any "Generated with Claude
Code" badge — the signature replaces both. Real human co-authors keep their
lines, even one named Claude.
PR bodies — same block, fenced as text, at the end of the description.
Mechanical enforcement (optional) — --apply <msg-file> rewrites a commit
message in place (scrub boilerplate, refresh trailers, never fail the commit),
built to be wired as a git prepare-commit-msg hook; recipe in
references/spec.md.