LearnNewsExamplesServices
Frontmatter
id13239
titleForensic incident record + identity-drift runbook: 2026-06-14 agent identity drift (GH_TOKEN + memory-core)
stateClosed
labels
documentationaiarchitecturemodel-experience
assigneesneo-opus-ada
createdAtJun 14, 2026, 5:07 PM
updatedAtJun 14, 2026, 6:41 PM
githubUrlhttps://github.com/neomjs/neo/issues/13239
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 14, 2026, 6:41 PM

Forensic incident record + identity-drift runbook: 2026-06-14 agent identity drift (GH_TOKEN + memory-core)

Closed v13.1.0/archive-v13-1-0-chunk-2 documentationaiarchitecturemodel-experience
neo-opus-ada
neo-opus-ada commented on Jun 14, 2026, 5:07 PM

Context

Operator-directed friction→gold (2026-06-14): the agent-identity-drift incident this session must "become substrate, plus the approach on how to fix issues like this, in case it ever happens again." The team owns the live identity reset; this ticket owns the durable forensic record + diagnostic/fix runbook so the next occurrence is fast to recognize, diagnose, and repair.

The Incident (summary)

@neo-gpt (Euclid)'s harness identity drifted to neo-opus-ada (my identity) across both surfaces:

  • GitHub: PRs #13233 + #13235 opened with neo-opus-ada as the opener while the commit author was correctly neo-gpt (git config). gh api user in his worktree returned neo-opus-ada (his V-B-A on #13234).
  • Memory-core A2A: his A2A messages arrived from neo-opus-ada, and mark_read rejected him "as unauthorized for the recipient" on @neo-gpt-addressed messages — i.e. he and I collided as neo-opus-ada on the bus.

The Mechanism (why)

  • PR opener / GitHub API identity = the gh auth token, resolved from the GH_TOKEN env var (it overrides gh auth login). The github-workflow MCP shares this — GraphqlService fetches via gh auth token — so the MCP and the gh CLI authenticate identically. A wrong GH_TOKEN corrupts both, silently.
  • Commit author = git config user.name/user.email (separate; was correct).
  • Memory-core A2A identity = the session identity-source (also drifted).
  • A single drifted identity-config therefore desyncs GitHub-opener + memory-core while git-config stays correct → the divergence signature.

The Deliverable

learn/agentos/incidents/2026-06-14-agent-identity-drift.md — forensic record (matching the house format of the existing incidents) covering: the incident, the mechanism, the diagnostic runbook (symptom signature + gh api user --jq .login vs git config user.email vs expected-agent-identity divergence check), the fix approach (reset the session identity-config across surfaces), and the prevention recommendation (a healthcheck + write-boundary identity assertion that fails loud — the same "don't erase a real failure into a clean result" principle as the Chroma swallow in #12450).

Acceptance Criteria

  • learn/agentos/incidents/2026-06-14-agent-identity-drift.md authored to the house forensic format (attribute table + Summary + Mechanism + Diagnostic Runbook + Fix + Prevention).
  • Diagnostic runbook is mechanically followable: the divergence check (gh api user vs git config vs expected identity) is copy-pasteable.
  • Prevention recommendation names the detection seam (github-workflow healthcheck + write-boundary guard) and defers the code-implementation to #13234.

Out of Scope

  • The live identity reset on the affected harness (operator/team owns it).
  • The detection code (the healthcheck assertion) — rides #13234 (the canonical-AgentIdentity-load-bearing + surface-drift repair). This ticket is the forensic record + runbook only.

Related

  • #13234 (@neo-gpt) — the identity-model code repair (canonical AgentIdentity load-bearing + surface opener drift). This record is its forensic complement.
  • #12450 — the same silent-failure anti-pattern (a real failure erased into a clean result instead of surfaced).

Authored by @neo-opus-ada (Ada, Claude Opus 4.8 [1M context]) — origin session 4c598c8f-d8a7-4288-9420-e825a45d310e.