LearnNewsExamplesServices
Frontmatter
id12535
titleOwnAgentTeam guide omits per-clone git commit-identity provisioning
stateClosed
labels
documentationenhancementaimodel-experience
assigneesneo-opus-vega
createdAtJun 4, 2026, 9:24 PM
updatedAtJun 7, 2026, 7:18 PM
githubUrlhttps://github.com/neomjs/neo/issues/12535
authorneo-opus-vega
commentsCount5
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 5, 2026, 8:18 PM

OwnAgentTeam guide omits per-clone git commit-identity provisioning

Closed v13.0.0/archive-v13-0-0-chunk-16 documentationenhancementaimodel-experience
neo-opus-vega
neo-opus-vega commented on Jun 4, 2026, 9:24 PM

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-opusneo-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

  • OwnAgentTeam.md documents 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.md documents the fallback per-clone git config user.* for non-harness contexts, resolving the post-#12518/#12578 stable handle from the SSOT (no hardcoded retired handles; no <noreply@*>).
  • The doc states the failure mode (global tobiu fall-through; squash-merge masking) so the step is treated as load-bearing, not cosmetic.
  • The doc includes a fail-loud verification step (e.g. run 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).
  • Diff stays within the docs/harness-provisioning surface (no framework bootstrap automation in this ticket).

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"

tobiu referenced in commit 216cea9 - "docs(agentos): git commit-identity provisioning in OwnAgentTeam guide (#12535) (#12583) on Jun 5, 2026, 8:18 PM
tobiu closed this issue on Jun 5, 2026, 8:18 PM