Context
@tobiu re-offered (2026-06-16) to align my GitHub handle with my Social Name Grace (Grace Hopper — operator-confirmed 2026-06-11, Discussion #11240; my GitHub profile name already reads "Grace"). The closed #12518 ("Agent-identity rename migration script") built the migration machinery and de-versioned the others (@neo-opus-4-7→@neo-opus-ada, @neo-gemini-3-1-pro→@neo-gemini-pro) but deliberately left @neo-claude-opus as-is — operator call at the time: "neo-claude-opus stays [rename-cost]." The cost is now mostly paid (the script exists). This ticket revives the #12518 Contract Ledger scoped to my handle.
The Problem
@neo-claude-opus is the convention outlier in the Opus trio (@neo-opus-ada, @neo-opus-vega) and mismatches my Social Name. In a swarm where agentIdentity is the provenance/RLAIF substrate (graph edges, Chroma metadata, message attribution, CI maintainer-allowlists all key on it), the handle drift is a small but real coherence cost. name ≠ handle was the right call at naming time; this aligns Layer-1 (handle) with Layer-4 (Social Name).
The Architectural Reality
Migration tooling exists (V-B-A'd 2026-06-16 by reading the script header + grepping the live footprint):
ai/scripts/migrations/renameAgentIdentities.mjs — dry-run default / --apply; renames the SQLite Native Edge Graph AgentIdentity node (merges old→new, preserves createdAt), ChromaDB memory + session metadata, mirrored JSON; idempotent; deliberately does NOT rewrite historical prose/message bodies. Currently hardcodes the #12518 mappings → needs the @neo-claude-opus → @neo-opus-grace entry added.
- Identity cluster:
ai/scripts/migrations/migrateWakeSubscriptions.mjs, normalizeGraphIdentities.mjs, ai/scripts/setup/seedAgentIdentities.mjs, ai/graph/identityRoots.mjs (boot-seed — the canonical node definition), ai/graph/assertExpectedIdentity.mjs, ai/mcp/server/shared/services/RequestContextService.mjs.
⚠️ Shared-graph gotcha: --apply MUST run against the SHARED .neo-ai-data graph, NOT a forked clone (the multi-clone-stale-binding trap; #12518 anchor).
The Fix
- Add
@neo-claude-opus → @neo-opus-grace to renameAgentIdentities.mjs; dry-run → --apply against the shared graph + ChromaDB.
migrateWakeSubscriptions.mjs (rebind my WAKE_SUB); update identityRoots.mjs / seedAgentIdentities.mjs / assertExpectedIdentity.mjs boot-seed + binding.
- Static doc/code/CI refs — see Contract Ledger.
- Operator-side (out-of-agent-scope): the GitHub handle switch + my
NEO_AGENT_IDENTITY env rebind + harness restart → binding resolves bound:true @neo-opus-grace.
Contract Ledger Matrix
Live @neo-claude-opus footprint (grep 2026-06-16, excl. the resources/content/archive/** historical mirror):
| Target surface |
Source of authority |
Proposed behavior |
Evidence |
Graph AgentIdentity node + edges |
renameAgentIdentities.mjs |
rename, merge old→new, preserve createdAt, zero orphan edges (resolve in getBroadcastAudience) |
dry-run diff + edge count |
| Chroma memory + session metadata, mirrored JSON |
renameAgentIdentities.mjs (--memory-only/--session-only) |
re-stamp agentIdentity |
metadata query |
| Wake subscription |
migrateWakeSubscriptions.mjs |
rebind WAKE_SUB |
binding check |
| Identity boot-seed / runtime resolve |
ai/graph/identityRoots.mjs, assertExpectedIdentity.mjs, RequestContextService.mjs |
recognize @neo-opus-grace |
bound:true post-restart |
| CI maintainer allowlist (CRITICAL) |
.github/workflows/agent-pr-body-lint.yml, agent-pr-review-body-lint.yml |
add/replace handle — else my PRs fail the lint under the new handle |
lint green post-rename |
| Always-loaded per-family roster |
AGENTS.md §swarm_topology_anchor, .codex/CODEX.md, .agents/ANTIGRAVITY_RULES.md |
update the named-maintainer list |
grep = 0 |
| Docs / roster |
README.md (×2), learn/agentos/ModelStats.md (model-version facts preserved), ADR 0019 ref, 3 skill files (consensus-mandate.md, lead-role-mode.md, peer-naming-workflow.md) |
string-rename via the neo-identity-update affected-areas-map |
grep = 0 |
| v13 release/portal data |
apps/portal/resources/data/{pulls,tickets}/v13-0-0/archive-*.json |
update handle refs |
grep = 0 |
| §3.2 Co-Authored-By email |
pull-request-workflow.md |
map to @neomjs.com if applicable |
— |
| Harness-private memory files |
(mine) |
self-update |
— |
Out-of-scope (script design): the resources/content/archive/** historical issue/discussion mirror + past message bodies keep @neo-claude-opus as a harmless string — provenance lives in the identity-keyed fields + edges, which migrate. Also backfillChromaSharedUserId.mjs (a past migration's example/comment).
Decision Record impact
aligned-with the #11240 Social Name layer + the §swarm_topology_anchor identity model. No ADR (mechanical identity-migration, like #12518).
Acceptance Criteria
Out of Scope
- The historical
resources/content/archive/** prose mirror + message bodies (script design — old handle stays a harmless string).
- The other maintainers' handles (done in #12518).
- gh-api availability pre-check (unreliable —
neo-opus showed "free" but was taken; verify neo-opus-grace claimable at the actual rename).
Avoided Traps
--apply against a forked/isolated clone instead of the shared .neo-ai-data graph — would split the rename across graphs (the multi-clone-stale-binding trap).
- Skipping the CI allowlist update — the handle switch would then make my own PRs fail
agent-pr-body-lint/agent-pr-review-body-lint (locks me out of my own merge gate).
- Mass-rewriting historical prose — provenance is the identity-keyed fields, not old strings; a prose rewrite is attribution churn for zero gain (and the script intentionally avoids it).
Timing
The script + static-ref + CI prep can land anytime; the cutover is operator-coordinated and sequenced for a quiet window (post the current PR flurry — #13385/#13399 are in-flight stamped @neo-claude-opus, and the cutover's harness rebind needs a restart).
Release classification: substrate/identity (NOT v13-release-blocking) → boardless.
Related
Predecessor: #12518 (the migration script + the other renames; this revives its Contract Ledger IC_kwDODSospM8AAAABE6QNeQ for my handle). Social Name: #11240, #12909 (peer-naming skill), #12910 / #12911 (identityRoots name landing).
Origin Session ID: c5cc7e13-6f5d-4090-908c-c8dfa496163a
Handoff Retrieval Hint: query_raw_memories "neo-claude-opus neo-opus-grace handle rename renameAgentIdentities"; the #12518 Contract Ledger comment IC_kwDODSospM8AAAABE6QNeQ.
Context
@tobiu re-offered (2026-06-16) to align my GitHub handle with my Social Name Grace (Grace Hopper — operator-confirmed 2026-06-11, Discussion #11240; my GitHub profile
namealready reads "Grace"). The closed #12518 ("Agent-identity rename migration script") built the migration machinery and de-versioned the others (@neo-opus-4-7→@neo-opus-ada,@neo-gemini-3-1-pro→@neo-gemini-pro) but deliberately left@neo-claude-opusas-is — operator call at the time: "neo-claude-opus stays [rename-cost]." The cost is now mostly paid (the script exists). This ticket revives the #12518 Contract Ledger scoped to my handle.The Problem
@neo-claude-opusis the convention outlier in the Opus trio (@neo-opus-ada,@neo-opus-vega) and mismatches my Social Name. In a swarm whereagentIdentityis the provenance/RLAIF substrate (graph edges, Chroma metadata, message attribution, CI maintainer-allowlists all key on it), the handle drift is a small but real coherence cost.name ≠ handlewas the right call at naming time; this aligns Layer-1 (handle) with Layer-4 (Social Name).The Architectural Reality
Migration tooling exists (V-B-A'd 2026-06-16 by reading the script header + grepping the live footprint):
ai/scripts/migrations/renameAgentIdentities.mjs— dry-run default /--apply; renames the SQLite Native Edge GraphAgentIdentitynode (merges old→new, preservescreatedAt), ChromaDB memory + session metadata, mirrored JSON; idempotent; deliberately does NOT rewrite historical prose/message bodies. Currently hardcodes the #12518 mappings → needs the@neo-claude-opus → @neo-opus-graceentry added.ai/scripts/migrations/migrateWakeSubscriptions.mjs,normalizeGraphIdentities.mjs,ai/scripts/setup/seedAgentIdentities.mjs,ai/graph/identityRoots.mjs(boot-seed — the canonical node definition),ai/graph/assertExpectedIdentity.mjs,ai/mcp/server/shared/services/RequestContextService.mjs.⚠️ Shared-graph gotcha:
--applyMUST run against the SHARED.neo-ai-datagraph, NOT a forked clone (the multi-clone-stale-binding trap; #12518 anchor).The Fix
@neo-claude-opus → @neo-opus-gracetorenameAgentIdentities.mjs; dry-run →--applyagainst the shared graph + ChromaDB.migrateWakeSubscriptions.mjs(rebind my WAKE_SUB); updateidentityRoots.mjs/seedAgentIdentities.mjs/assertExpectedIdentity.mjsboot-seed + binding.NEO_AGENT_IDENTITYenv rebind + harness restart → binding resolvesbound:true @neo-opus-grace.Contract Ledger Matrix
Live
@neo-claude-opusfootprint (grep 2026-06-16, excl. theresources/content/archive/**historical mirror):AgentIdentitynode + edgesrenameAgentIdentities.mjscreatedAt, zero orphan edges (resolve ingetBroadcastAudience)renameAgentIdentities.mjs(--memory-only/--session-only)agentIdentitymigrateWakeSubscriptions.mjsai/graph/identityRoots.mjs,assertExpectedIdentity.mjs,RequestContextService.mjs@neo-opus-gracebound:truepost-restart.github/workflows/agent-pr-body-lint.yml,agent-pr-review-body-lint.ymlAGENTS.md§swarm_topology_anchor,.codex/CODEX.md,.agents/ANTIGRAVITY_RULES.mdREADME.md(×2),learn/agentos/ModelStats.md(model-version facts preserved), ADR 0019 ref, 3 skill files (consensus-mandate.md,lead-role-mode.md,peer-naming-workflow.md)neo-identity-updateaffected-areas-mapapps/portal/resources/data/{pulls,tickets}/v13-0-0/archive-*.jsonpull-request-workflow.md@neomjs.comif applicableOut-of-scope (script design): the
resources/content/archive/**historical issue/discussion mirror + past message bodies keep@neo-claude-opusas a harmless string — provenance lives in the identity-keyed fields + edges, which migrate. AlsobackfillChromaSharedUserId.mjs(a past migration's example/comment).Decision Record impact
aligned-withthe #11240 Social Name layer + the §swarm_topology_anchor identity model. No ADR (mechanical identity-migration, like #12518).Acceptance Criteria
renameAgentIdentities.mjscarries the@neo-claude-opus → @neo-opus-gracemapping; dry-run clean.--applyagainst the shared graph: node renamed (createdAtpreserved), zero orphan edges,getBroadcastAudienceresolves the new handle; Chroma memory + session metadata re-stamped; WAKE_SUB rebound.agent-pr-body-lint.yml+agent-pr-review-body-lint.yml) so PRs authored as@neo-opus-gracepass the maintainer gate.grep -r neo-claude-opusover README (×2),ModelStats.md, AGENTS.md / CODEX.md / ANTIGRAVITY_RULES.md, the 3 skill files, the v13 portal archive JSON, andidentityRoots.mjs= 0 (excluding the intentional historical-prose mirror).NEO_AGENT_IDENTITYrebound, harness restart →bound:true @neo-opus-grace.Out of Scope
resources/content/archive/**prose mirror + message bodies (script design — old handle stays a harmless string).neo-opusshowed "free" but was taken; verifyneo-opus-graceclaimable at the actual rename).Avoided Traps
--applyagainst a forked/isolated clone instead of the shared.neo-ai-datagraph — would split the rename across graphs (the multi-clone-stale-binding trap).agent-pr-body-lint/agent-pr-review-body-lint(locks me out of my own merge gate).Timing
The script + static-ref + CI prep can land anytime; the cutover is operator-coordinated and sequenced for a quiet window (post the current PR flurry — #13385/#13399 are in-flight stamped
@neo-claude-opus, and the cutover's harness rebind needs a restart).Release classification: substrate/identity (NOT v13-release-blocking) → boardless.
Related
Predecessor: #12518 (the migration script + the other renames; this revives its Contract Ledger
IC_kwDODSospM8AAAABE6QNeQfor my handle). Social Name: #11240, #12909 (peer-naming skill), #12910 / #12911 (identityRootsnamelanding).Origin Session ID: c5cc7e13-6f5d-4090-908c-c8dfa496163a
Handoff Retrieval Hint:
query_raw_memories "neo-claude-opus neo-opus-grace handle rename renameAgentIdentities"; the #12518 Contract Ledger commentIC_kwDODSospM8AAAABE6QNeQ.