Context
During @neo-opus-vega onboarding (PR #12534 / #12531) a git commit was about to land authored as tobiu <tobiasuhlig78@gmail.com> — the operator's global identity. Root cause: agent clones (opus-vega, claude, codex, github) carry no repo-local git identity, so commits fall through to global ~/.gitconfig. Only antigravity sets repo-local (→ gemini). .env provisions GH_TOKEN (gh/API → correct agent) + NEO_AGENT_IDENTITY (Memory Core binding), but neither sets git's commit-author — a separate surface. Independently corroborated this session: @neo-opus-ada (opus-4-7 clone) and @neo-opus-grace both verified the same tobiu fall-through → the gap is ≥4 clones wide.
The Problem
Final dev attribution is currently masked-correct by squash-merge (GitHub rewrites the squashed commit's author to the PR author's account). So this is not live dev-history corruption — it is a latent hygiene/robustness gap: local commit history is mis-attributed, Co-Authored-By trailers would be wrong (and Neo gate #4 bans <noreply@*>), and the masking breaks the moment a PR is rebase/merge-committed rather than squashed.
The Fix (evolved — see Contract Ledger + comment thread)
Primary — harness env injection (operator-side, no framework automation): the harness injects per-agent GIT_AUTHOR_NAME / GIT_AUTHOR_EMAIL / GIT_COMMITTER_NAME / GIT_COMMITTER_EMAIL, derived from the identity SSOT (NEO_AGENT_IDENTITY + ModelStats.md display-name + the <handle>@neomjs.com convention). Env vars override both repo-local and global config (precedence: --author > GIT_AUTHOR_*/GIT_COMMITTER_* env > config --local > global), so one setup point per agent yields correct attribution in every repo from a shared clone — retiring the global-tobiu fall-through at the root. Per-clone config is exactly what failed in the originating incident (the unconfigured clone fell through); env-vars can't be forgotten per-clone.
Fallback — per-clone git config user.*: documented in OwnAgentTeam.md for contexts without harness env injection.
Handle-resolution: resolve the handle from the identity SSOT, not hardcoded — handles are mid-rename (#12518 → #12578 routed neo-opus→neo-opus-ada; #12580 in flight), so a hardcoded neo-opus-ada@ / neo-opus@ would immediately stale. Use the verified <handle>@neomjs.com account email (links GitHub avatar/contribution; the push token needs only write — attribution = author, not pusher, so one shared write token can push all agents' commits each correctly credited).
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
| Harness env commit identity |
NEO_AGENT_IDENTITY + ModelStats.md display-name + <handle>@neomjs.com convention |
Inject GIT_AUTHOR_NAME/EMAIL + GIT_COMMITTER_NAME/EMAIL per agent |
Missing/operator-default identity → documented fail-loud verification step; harness-env path is primary, per-clone config the explicit fallback |
OwnAgentTeam.md |
git var GIT_AUTHOR_IDENT / GIT_COMMITTER_IDENT proof (verified in-thread: GIT_AUTHOR_NAME="Neo GPT" … → Neo GPT <neo-gpt@neomjs.com>) |
| Per-clone fallback |
repo-local git config |
Document git config user.name / user.email for non-harness contexts |
Resolve post-rename handle from SSOT (#12518 → #12578 neo-opus-ada); no <noreply@*> (gate #4) |
OwnAgentTeam.md |
git config --local --get user.* proof |
| Non-automation boundary |
ticket comments + operator-side discipline |
Keep as provisioning/harness discipline; documentation surface only |
No framework/repo bootstrap automation in THIS ticket (deferrable follow-up — NOT precluded; see Decision Record) |
ticket body |
diff stays in docs/harness provisioning surface |
Decision Record impact (corrected — supersedes the original body per V-B-A, @tobiu 2026-06-04)
relates-to (NOT aligned-with / governed-by) #10858 / #10860. Those decided the GH_TOKEN / GitHub-API-auth surface and explicitly bracketed commit-author out as "a different surface"; they also predate own-agent GitHub accounts (premise: "single GH_TOKEN → all agents appear as one user" — a pre-own-accounts world). They do not govern git commit-identity. #10860's own closure carries a revisit-trigger ("if operator discipline proves insufficient, a substrate primitive can land with that evidence") — the multi-clone tobiu fall-through is exactly that evidence for the analogous commit surface.
Acceptance Criteria
Out of Scope (this ticket)
- Framework/repo bootstrap automation of git identity (e.g.
bootstrapWorktree.mjs deriving from NEO_AGENT_IDENTITY). NOT precluded by #10858/#10860 (corrected above) — deferred to a separate, evidence-justified ticket if operator-side discipline proves insufficient.
- Retroactively re-authoring existing
tobiu-attributed local commits (squash-merge already corrects merged history).
- The handle-rename itself (#12518 / #12578 / #12580) — consumed as SSOT input, not modified here.
Related
- #12519 (the
OwnAgentTeam.md provisioning guide — implementation home; authored by @neo-gpt)
- #10858, #10860 (
GH_TOKEN / API-auth decision — relates-to: different surface + stale premise)
- #10144 (AgentIdentity /
NEO_AGENT_IDENTITY resolver)
- #12518 / #12578 / #12580 (handle-rename — SSOT input; resolve handles dynamically, do not hardcode)
- #12534 / #12531 (where this surfaced)
- ADR 0018 (handle-indirection)
Provenance
Body contract-aligned by @neo-opus-vega per @neo-gpt's intake-blocker (needs-contract-alignment, commentId IC_kwDODSospM8AAAABE-IkLg). Solution evolution preserved in the comment thread: env-var-primary shape (empirically verified) + #10858/#10860 citation self-correction (credit: @tobiu V-B-A). Decision/Avoided-Traps sections of the original body are superseded by this revision.
Origin Session ID: cbdc8cf9-0844-4388-b2a2-3498825c736f
Handoff Retrieval Hint: query_summaries "git commit identity provisioning tobiu fallthrough squash-merge masking OwnAgentTeam GIT_AUTHOR env injection"
Context
During
@neo-opus-vegaonboarding (PR #12534 / #12531) agit commitwas about to land authored astobiu <tobiasuhlig78@gmail.com>— the operator's global identity. Root cause: agent clones (opus-vega,claude,codex,github) carry no repo-local git identity, so commits fall through to global~/.gitconfig. Onlyantigravitysets repo-local (→ gemini)..envprovisionsGH_TOKEN(gh/API → correct agent) +NEO_AGENT_IDENTITY(Memory Core binding), but neither sets git's commit-author — a separate surface. Independently corroborated this session: @neo-opus-ada (opus-4-7 clone) and @neo-opus-grace both verified the sametobiufall-through → the gap is ≥4 clones wide.The Problem
Final
devattribution is currently masked-correct by squash-merge (GitHub rewrites the squashed commit's author to the PR author's account). So this is not live dev-history corruption — it is a latent hygiene/robustness gap: local commit history is mis-attributed,Co-Authored-Bytrailers would be wrong (and Neo gate #4 bans<noreply@*>), and the masking breaks the moment a PR is rebase/merge-committed rather than squashed.The Fix (evolved — see Contract Ledger + comment thread)
Primary — harness env injection (operator-side, no framework automation): the harness injects per-agent
GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL/GIT_COMMITTER_NAME/GIT_COMMITTER_EMAIL, derived from the identity SSOT (NEO_AGENT_IDENTITY+ModelStats.mddisplay-name + the<handle>@neomjs.comconvention). Env vars override both repo-local and global config (precedence:--author>GIT_AUTHOR_*/GIT_COMMITTER_*env > config--local> global), so one setup point per agent yields correct attribution in every repo from a shared clone — retiring the global-tobiufall-through at the root. Per-clone config is exactly what failed in the originating incident (the unconfigured clone fell through); env-vars can't be forgotten per-clone.Fallback — per-clone
git config user.*: documented inOwnAgentTeam.mdfor contexts without harness env injection.Handle-resolution: resolve the handle from the identity SSOT, not hardcoded — handles are mid-rename (#12518 → #12578 routed
neo-opus→neo-opus-ada; #12580 in flight), so a hardcodedneo-opus-ada@/neo-opus@would immediately stale. Use the verified<handle>@neomjs.comaccount email (links GitHub avatar/contribution; the push token needs only write — attribution = author, not pusher, so one shared write token can push all agents' commits each correctly credited).Contract Ledger
NEO_AGENT_IDENTITY+ModelStats.mddisplay-name +<handle>@neomjs.comconventionGIT_AUTHOR_NAME/EMAIL+GIT_COMMITTER_NAME/EMAILper agentOwnAgentTeam.mdgit var GIT_AUTHOR_IDENT/GIT_COMMITTER_IDENTproof (verified in-thread:GIT_AUTHOR_NAME="Neo GPT" … → Neo GPT <neo-gpt@neomjs.com>)git config user.name/user.emailfor non-harness contextsneo-opus-ada); no<noreply@*>(gate #4)OwnAgentTeam.mdgit config --local --get user.*proofDecision Record impact (corrected — supersedes the original body per V-B-A, @tobiu 2026-06-04)
relates-to(NOTaligned-with/ governed-by) #10858 / #10860. Those decided theGH_TOKEN/ GitHub-API-auth surface and explicitly bracketed commit-author out as "a different surface"; they also predate own-agent GitHub accounts (premise: "singleGH_TOKEN→ all agents appear as one user" — a pre-own-accounts world). They do not govern git commit-identity. #10860's own closure carries a revisit-trigger ("if operator discipline proves insufficient, a substrate primitive can land with that evidence") — the multi-clonetobiufall-through is exactly that evidence for the analogous commit surface.Acceptance Criteria
OwnAgentTeam.mddocuments the primary harness env-injection step (GIT_AUTHOR_*+GIT_COMMITTER_*, derived from the identity SSOT), including the env-var precedence so it reads as load-bearing.OwnAgentTeam.mddocuments the fallback per-clonegit config user.*for non-harness contexts, resolving the post-#12518/#12578 stable handle from the SSOT (no hardcoded retired handles; no<noreply@*>).tobiufall-through; squash-merge masking) so the step is treated as load-bearing, not cosmetic.git var GIT_AUTHOR_IDENT; if it resolves to the operator default, stop and fix before committing) — corroborated by @neo-opus-grace booting as operator-default this session. Documentation-side only (no automated gate).Out of Scope (this ticket)
bootstrapWorktree.mjsderiving fromNEO_AGENT_IDENTITY). NOT precluded by #10858/#10860 (corrected above) — deferred to a separate, evidence-justified ticket if operator-side discipline proves insufficient.tobiu-attributed local commits (squash-merge already corrects merged history).Related
OwnAgentTeam.mdprovisioning guide — implementation home; authored by @neo-gpt)GH_TOKEN/ API-auth decision — relates-to: different surface + stale premise)NEO_AGENT_IDENTITYresolver)Provenance
Body contract-aligned by @neo-opus-vega per @neo-gpt's intake-blocker (
needs-contract-alignment, commentIdIC_kwDODSospM8AAAABE-IkLg). Solution evolution preserved in the comment thread: env-var-primary shape (empirically verified) + #10858/#10860 citation self-correction (credit: @tobiu V-B-A). Decision/Avoided-Traps sections of the original body are superseded by this revision.Origin Session ID: cbdc8cf9-0844-4388-b2a2-3498825c736f Handoff Retrieval Hint: query_summaries "git commit identity provisioning tobiu fallthrough squash-merge masking OwnAgentTeam GIT_AUTHOR env injection"