"Co-authored-by: Copilot" Is Not an Audit Trail — Here's What One Actually Looks Like Microsoft faced backlash after VS Code 1.117 silently added 'Co-authored-by: Copilot' to all commit messages by default, even when AI had not generated code. The company reverted the change and apologized, but the incident exposed the inadequacy of git trailers for AI governance. A developer introduced LineageLens, a provenance schema that captures detailed AI code insertion metadata including timestamps, model parameters, prompts, and diff content. In late April 2026, Microsoft shipped VS Code 1.117. Buried in the release was a change: the github.copilot.chat.generateCommitMessage.addCoAuthoring setting was flipped from off to all by default. That meant "Co-authored-by: Copilot copilot@github.com mailto:copilot@github.com " was now being appended to every commit message in the background — silently, without showing up in the commit message editor, and critically, without verifying that Copilot had generated any of the code. Developers noticed within days. The backlash was significant. VS Code 1.119 shipped May 3 with the default reverted and a consent requirement added. Microsoft apologized. The technical fix was straightforward. The governance question it exposed is not. The developer anger wasn't really about attribution credit. It was about consent and accuracy. The co-author trailer was added to commits where AI features were disabled. It was added when developers had manually written every line. It attributed work that wasn't done. But underneath that anger is a more important problem: even when Copilot does write code, a "Co-authored-by" git trailer tells you almost nothing useful from a governance or security standpoint. It tells you that a tool called Copilot existed somewhere in the developer's editor during some portion of the work that eventually became this commit. That's it. It doesn't tell you which model generated which lines. It doesn't tell you what the developer prompted for. It doesn't contain the raw model response. It doesn't tell you whether any of the AI-generated lines touched authentication paths, hardcoded credentials, or SQL construction. It says nothing about when generation happened relative to the commit. It carries no risk score. If you had to defend a specific commit in a security audit six months from now — "which parts of this function were AI-generated, under what prompt, using what model?" — a git trailer gets you nowhere. LineageLens captures provenance at insertion time, not commit time. Each AI code insertion generates a ProviderAgnosticProvenanceEvent structured around schema version lineagelens.provenance-event.v1 . Here is what that record contains: type ProviderAgnosticProvenanceEvent = { schemaVersion: 'lineagelens.provenance-event.v1'; eventId: string; timestamps: { observedAtIso: string; // when the extension saw the insertion insertedAtIso: string; // when the text hit the buffer requestAtIso: string | null; // when the proxy saw the outbound request responseAtIso: string | null; // when the model responded }; source: { ide: string | null; // 'vscode' shim: string; // which capture path fired toolName: string | null; // 'Edit', 'Write', 'apply patch', etc. provider: string | null; // 'anthropic', 'openai', 'google' adapterName: string | null; // 'claude-code', 'copilot', 'cursor', etc. }; capture: { level: CaptureStatus; // 'full' | 'metadata only' | 'tunnel only' | 'file diff' promptStatus: 'captured' | 'not-captured'; capabilities: ProvenanceEventCapability ; // 10 named slots }; model: { name: unknown; parameters: Record