AgentIdentity roots (ai/graph/identityRoots.mjs) + seeding (ai/scripts/setup/seedAgentIdentities.mjs) |
ADR 0012 rename rule + ADR 0018 identity handle model |
Rename identity ids and githubLogin values for the two target identities while preserving capability properties, lineage, and existing createdAt on seeded graph nodes |
@neo-opus-grace, @neo-opus-vega, @neo-gpt, and @tobiu remain unchanged |
IdentitySchema.md, ModelStats.md references as applicable |
New ids exist, old ids absent, createdAt retained in graph after migration |
Graph migration runner (new ai/scripts/migrations/*.mjs) |
Sibling precedent: normalizeGraphIdentities.mjs |
Reusable dry-run-default migration with --apply, --db, idempotent behavior, atomic SQLite transaction, duplicate-edge handling, and post-run verify |
Missing old id is a no-op; missing new/canonical id fails loudly unless explicitly handled by the migration plan |
Script JSDoc / usage output |
Dry-run plan + post-apply verify are runnable; node syntax check passes |
Native Edge Graph storage (Nodes, Edges, identity-keyed properties) |
Memory Core graph schema + A2A routing |
Rewrite old identity in node ids, edge source / target, and identity-keyed properties without orphaning edges |
Duplicate edge collision drops or merges deterministically per sibling precedent |
Migration script comments |
Zero old-id references in graph storage after apply/verify |
| A2A mailbox data |
MailboxService behavior + graph edge types (SENT_BY, SENT_TO, DELIVERED_TO) |
Rewrite sender/recipient identity references and delivery edges so renamed identities can still read historical messages |
Message body text stays historical and is not rewritten unless it is identity-keyed metadata |
Mailbox service references if touched |
Delivered/read routing works for renamed identities; no orphaned mailbox edges |
Raw memories (Chroma neo-agent-memory + graph AGENT_MEMORY references) |
MemoryService tenant/author filters |
Update metadata such as userId / agentIdentity and graph authored-by references from old→new |
Preserve embeddings and memory text; metadata-only update, no re-embedding |
Migration script usage |
Renamed agent can query prior memories; old metadata keys absent from verify |
Session summaries (Chroma neo-agent-sessions + graph SESSION_SUMMARY references) |
SummaryService / session author-scope filters |
Update participatingAgents, sourceAgentIdentities, userId, and authored-by references where they carry renamed identities |
Preserve summary text and timestamps |
Migration script usage |
Summaries remain visible under tenant-aware reads and author-scope filters |
Runtime roster mirror: RequestContextService.mjs |
CORE_SWARM_USER_IDS / CORE_SWARM_AGENT_IDS |
Replace versioned handles with stable handles; derived node-id list follows automatically |
Keep neo-opus-grace, neo-opus-vega, and neo-gpt entries unchanged |
Inline JSDoc |
Unit/lint verifies exported roster contains new handles and no old target handles |
Standalone migration mirror: backfillChromaSharedUserId.mjs |
No-Neo-bootstrap mirror of CORE_SWARM_USER_IDS |
Replace the hardcoded versioned handles while preserving the standalone dependency-light constraint |
Do not import RequestContextService; keep sync enforced by text/regex unit test |
Existing script JSDoc |
Existing sync test passes |
| Harness recovery routing |
#12524 + harnessRouting.mjs |
Verify identityRoots ids and harnessRouting model-family derivation remain correct after rename |
There is no remaining resumeHarness identityMap to rewrite after #12524; old handles should not remain as active targets unless explicitly documented as aliases |
harnessRouting.mjs JSDoc |
Resolver returns expected targets for new identities; old target handles absent or intentionally treated as aliases |
| CI / PR review lint rosters + email convention |
Agent PR body/review lint workflows + pull-request-workflow §3.2 |
Update author/reviewer allowlists and <handle>@neomjs.com convention examples for renamed machine accounts |
Existing historical commit authorship is immutable and out of scope |
Workflow docs / pull-request skill references |
PR body/review lint recognizes new accounts; tracked grep old-handle check excludes immutable archives only |
| Public docs / skill refs |
README.md, AGENTS.md, learn/agentos/ModelStats.md, IdentitySchema.md, MemoryCoreMcpAuth.md, affected skills/ADRs, .agents/skills/neo-identity-update/affected-areas-map.md |
Rewrite current/public identity references and skill substrate references; use the affected-areas map rather than re-deriving the blast radius |
Historical resources/content/** archives and immutable GitHub artifacts remain unchanged |
Updated docs/skills as touched |
Tracked rg old-handle check is zero outside an explicit historical/immutable allowlist |
| Operator-owned / unreachable surfaces |
Operator decision + issue comments |
Explicitly out of scope: GitHub account rename execution, existing PR bodies, existing commit authorship, and harness-private agent memory files |
Migration should notify rename-subject agents to self-update harness-private memory after apply |
Issue/PR handoff |
Notification sent; verify pass does not chase unreachable substrates |
Context
De-versioning the maintainer roster to stable handles requires renaming existing identities:
@neo-opus-ada→@neo-opus@neo-gemini-pro→@neo-gemini-proADR 0018's handle-indirection makes the tracked code-reference rename routed, but that is not the full cost. The identity is also bound into persisted data:
AgentIdentitynode, message/delivery edges, author edges, and identity-keyed properties.identityRoots.mjs, and CI/review lint rosters.A bare handle swap would orphan or hide historical data. The rename needs a reusable migration script plus tracked-reference updates and a verification pass, not a config edit.
Target-Handle Decision
Operator-decided by @tobiu, recorded in the issue thread:
@neo-opus-ada@neo-opus@neo-gemini-pro@neo-gemini-pro@neo-opus-grace@neo-gptCurrent-Source Calibration
31a7ae6413250ab96a714d56f4b60322b775d83d, merged 2026-06-05), soresumeHarnessno longer owns a hardcoded identity map. Harness recovery now derives fromai/scripts/lifecycle/harnessRouting.mjs, which readsai/graph/identityRoots.mjs.ai/mcp/server/shared/services/RequestContextService.mjsexportsCORE_SWARM_USER_IDS, andCORE_SWARM_AGENT_IDSderives from it.ai/scripts/migrations/backfillChromaSharedUserId.mjsintentionally duplicatesCORE_SWARM_USER_IDSfor standalone/no-Neo-bootstrap execution; existing unit coverage enforces sync withRequestContextService.ai/scripts/migrations/normalizeGraphIdentities.mjsis the sibling precedent for a graph migration runner: dry-run default,--apply,--db, idempotent, atomic SQLite transaction, duplicate-edge handling.ai/graph/identityRoots.mjsandai/scripts/setup/seedAgentIdentities.mjsown AgentIdentity root seeding and existingcreatedAtpreservation.Contract Ledger
Classification: T3 (Explicit Matrix). This ticket mutates persisted identity/data surfaces consumed by agents, the Memory Core, A2A mailbox routing, CI/review lint, and public identity docs.
ai/graph/identityRoots.mjs) + seeding (ai/scripts/setup/seedAgentIdentities.mjs)githubLoginvalues for the two target identities while preserving capability properties, lineage, and existingcreatedAton seeded graph nodes@neo-opus-grace,@neo-opus-vega,@neo-gpt, and@tobiuremain unchangedIdentitySchema.md,ModelStats.mdreferences as applicablecreatedAtretained in graph after migrationai/scripts/migrations/*.mjs)normalizeGraphIdentities.mjs--apply,--db, idempotent behavior, atomic SQLite transaction, duplicate-edge handling, and post-run verifyNodes,Edges, identity-keyed properties)source/target, and identity-keyed properties without orphaning edgesMailboxServicebehavior + graph edge types (SENT_BY,SENT_TO,DELIVERED_TO)neo-agent-memory+ graph AGENT_MEMORY references)MemoryServicetenant/author filtersuserId/agentIdentityand graph authored-by references from old→newneo-agent-sessions+ graph SESSION_SUMMARY references)SummaryService/ session author-scope filtersparticipatingAgents,sourceAgentIdentities,userId, and authored-by references where they carry renamed identitiesRequestContextService.mjsCORE_SWARM_USER_IDS/CORE_SWARM_AGENT_IDSneo-opus-grace,neo-opus-vega, andneo-gptentries unchangedbackfillChromaSharedUserId.mjsCORE_SWARM_USER_IDSRequestContextService; keep sync enforced by text/regex unit testharnessRouting.mjsidentityRootsids andharnessRoutingmodel-family derivation remain correct after renameresumeHarnessidentityMap to rewrite after #12524; old handles should not remain as active targets unless explicitly documented as aliasesharnessRouting.mjsJSDocpull-request-workflow §3.2<handle>@neomjs.comconvention examples for renamed machine accountsREADME.md,AGENTS.md,learn/agentos/ModelStats.md,IdentitySchema.md,MemoryCoreMcpAuth.md, affected skills/ADRs,.agents/skills/neo-identity-update/affected-areas-map.mdresources/content/**archives and immutable GitHub artifacts remain unchangedrgold-handle check is zero outside an explicit historical/immutable allowlistAcceptance Criteria
--apply, supports a graph DB override, and has a post-run verification pass.@neo-opus-ada → @neo-opusand@neo-gemini-pro → @neo-gemini-pro.createdAt/ lineage history preserved across the rename.RequestContextService,backfillChromaSharedUserId,identityRoots, andharnessRoutingverification.Out of Scope
@neo-opus-grace,@neo-opus-vega,@neo-gpt, or@tobiu.Related
ADR 0018 (handle indirection), ADR 0012 (rename rule), #11318 (identity system), #12517 (new
neo-opus-vegaidentity), #12524 (harness routing derived from identity roots),IdentitySchema.md,ai/graph/identityRoots.mjs,ai/scripts/setup/seedAgentIdentities.mjs,.agents/skills/neo-identity-update/affected-areas-map.md.Authored by Claude Opus 4.8 (Claude Code), /lead-role. Body synced by @neo-gpt after intake recheck. MC session
f5432f03-d2b6-4bc0-a7b5-9fbdafe4b7b9.