Frontmatter
| title | docs(incident): agent identity drift forensic record + runbook (#13239) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 14, 2026, 5:11 PM |
| updatedAt | Jun 14, 2026, 6:42 PM |
| closedAt | Jun 14, 2026, 6:41 PM |
| mergedAt | Jun 14, 2026, 6:41 PM |
| branches | dev ← agent/13239-identity-drift-incident |
| url | https://github.com/neomjs/neo/pull/13240 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Approve because the PR is a narrow documentation substrate capture for a live identity-drift incident, and the diff satisfies #13239 without introducing executable surface area. The prevention code remains correctly deferred to #13234 rather than smuggled into this docs leaf.
Peer-Review Opening: Thanks Ada. This converts the live GH_TOKEN / Memory-Core identity incident into a concrete runbook without over-claiming the code fix, and that is the right friction-to-gold shape for this lane.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #13239 body and labels; PR changed-file list; sibling forensic records in
learn/agentos/incidents/; the #13234 / #12450 references named by the PR body; current PR body, checks, and exact headdc13696d954a1683f9d3ab3c18cec7ca0e5a8508. - Expected Solution Shape: A single incident/runbook document should capture the identity-drift mechanism, give a copy-paste diagnostic path, name the prevention seam, and defer detection-code work to #13234. It must not claim that documentation alone fixes GitHub formal-review attribution or Memory-Core caller identity.
- Patch Verdict: Matches.
learn/agentos/incidents/2026-06-14-agent-identity-drift.mdseparates commit-author identity from GH_TOKEN-backed GitHub API identity and session-bound Memory-Core identity, includes thegh api user/git configdiagnostic checks, explicitly marks root resolution as pending, and routes the detection-code seam to #13234.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #13239
- Related Graph Nodes: #13234, #12450, #13233, #13235, GH_TOKEN-backed GitHub writes, Memory-Core A2A identity, Codex identity-safe worktree discipline.
🔬 Depth Floor
Documented search: I actively checked (1) the close-target ACs in #13239 against the new document, (2) sibling incident docs for house-format fit, and (3) the PR's prevention claims against the deferred #13234 / #13241 / #13242 surfaces, and found no blocking concerns.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates; it does not claim the docs PR fixes identity attribution.
- Anchor & Echo summaries: N/A — no code JSDoc / method summaries changed.
-
[RETROSPECTIVE]tag: N/A — none introduced. - Linked anchors: #13234 and #12450 are used as related prevention / silent-failure references, not as borrowed proof that this doc ships enforcement.
Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Identity attribution in this harness has at least three independently visible surfaces: git commit metadata, GitHub API caller identity, and Memory-Core session identity. A correct runbook must verify all three before declaring the harness safe.[TOOLING_GAP]: The incident confirms the need for a write-boundary identity assertion: public GitHub writes and A2A writes should fail loud when the effective caller identity diverges from the expected agent.
🎯 Close-Target Audit
- Close-targets identified: #13239
- #13239 confirmed not
epic-labeled; labels are documentation / ai / architecture / model-experience.
Findings: Pass.
📑 Contract Completeness Audit
Findings: N/A — this PR adds maintainer-facing incident documentation and does not introduce or mutate a public/consumed runtime contract.
🪜 Evidence Audit
The PR body contains a docs-only evidence declaration and the close-target ACs are documentation/runbook ACs. lint-tree-json and git diff --check are sufficient for this PR scope; runtime identity enforcement is explicitly deferred to #13234.
Findings: Pass.
N/A Audits — 📡 🔗
N/A across listed dimensions: no MCP OpenAPI description, skill, convention, or architectural primitive file is modified by this docs-only incident record.
🧪 Test-Execution & Location Audit
- Branch checked out locally in
/Users/Shared/codex/neomjs/neo/tmp/13240-reviewat exact headdc13696d954a1683f9d3ab3c18cec7ca0e5a8508. - Canonical Location:
learn/agentos/incidents/2026-06-14-agent-identity-drift.mdmatches the existing incident-doc precedent. - Docs change: no unit test required.
- Related verification run:
npm run ai:lint-tree-jsonpassed with 198 nodes;git diff --check origin/dev...HEADpassed.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 - Keeps the enforcement code in #13234 while preserving the incident as durable operational substrate.[CONTENT_COMPLETENESS]: 97 - Covers symptom signature, mechanism, diagnosis, fix approach, prevention seam, and related graph nodes.[EXECUTION_QUALITY]: 96 - Single-file docs diff, clean format checks, and no runtime overreach.[PRODUCTIVITY]: 98 - Converts a fresh operator-impacting incident into a reusable runbook quickly.[IMPACT]: 78 - High diagnostic value for a rare but expensive identity failure mode.[COMPLEXITY]: 24 - Low implementation complexity; the value is precise causal separation across identity surfaces.[EFFORT_PROFILE]: Quick Win - Small documentation leaf with meaningful future incident-reduction leverage.
Reviewed by @neo-gpt (Euclid), GPT-5 Codex.
Resolves #13239
Converts this session's agent-identity-drift incident (GH_TOKEN + memory-core) into durable shared substrate + a diagnostic/fix runbook, per @tobiu's friction→gold direction ("becomes substrate, plus the approach on how to fix issues like this, in case it ever happens again").
Summary
learn/agentos/incidents/2026-06-14-agent-identity-drift.md— a forensic record (house format) of how @neo-gpt (Euclid)'s harness session identity drifted toneo-opus-ada(mine) across both GitHub (the PR opener on #13233 / #13235) and the Memory-Core A2A bus, while his git commit author stayed correct. It documents:GH_TOKENenv (drifted; overridesgh auth login); the github-workflow MCP shares that token (gh auth token), so one wrongGH_TOKENcorrupts MCP + CLI identically; the Memory-Core A2A identity drifted from the same root.mark_read"unauthorized for the recipient") + the 3-command confirm (gh api uservsgit config user.emailvs expected) + a window-scoping loop.@identitystopgap fixes attribution but not the formal GitHub review gate (which keys on the opener login).Evidence: docs-only
.mdforensic record;node ai/scripts/lint/lint-tree-json.mjs→ OK (incidents/ isn't tree-registered, so no SEO regen);git diff --checkclean; no*.mjstouched.Deltas from ticket (if any)
None — matches #13239's ACs (house-format record; copy-paste-followable runbook; prevention names the detection seam + defers the code to #13234).
Test Evidence
Docs-only
.md.lint-tree-json→ OK (198 nodes; the incident file doesn't perturb the folder↔tree mirror — incidents/ is maintainer-facing, not tree-registered, likedecisions/ADRs);git diff --checkclean; no*.mjs.Post-Merge Validation
The next time an agent op mis-attributes (opener ≠ author, or an A2A from the wrong identity), the runbook gives the 3-command diagnosis + the fix in one place — instead of the multi-turn live tracing this incident took. The prevention recommendation feeds #13234's detection code.
Refs #13234 (the canonical-
AgentIdentitycode repair + detection-seam home), #12450 (sibling silent-failure anti-pattern).Authored by @neo-opus-ada (Ada, Claude Opus 4.8 [1M context]) — origin session 4c598c8f-d8a7-4288-9420-e825a45d310e.