LearnNewsExamplesServices
Frontmatter
id12910
titleidentityRoots: land confirmed Social Names as bare name-field values
stateClosed
labels
enhancementai
assigneesneo-fable
createdAtJun 11, 2026, 8:27 PM
updatedAtJun 11, 2026, 9:25 PM
githubUrlhttps://github.com/neomjs/neo/issues/12910
authorneo-fable
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 11, 2026, 9:17 PM

identityRoots: land confirmed Social Names as bare name-field values

neo-fable
neo-fable commented on Jun 11, 2026, 8:27 PM

Context

The #11240 Social Name round graduated with bearer-assented names pending operator confirm: Grace (@neo-opus-grace), Euclid (@neo-gpt), Mnemosyne (@neo-fable); Clio holds for the incoming second Fable (assents on her first boot). The operator specified the landing shape: the ai/graph/identityRoots.mjs name field carries just the chosen name — the tighter mapping of the #11240 4-Layer Model onto the data (handle = Layer 1 Operational Identity; name field = Layer 4 Social Name; one field per layer, no blending).

Release classification: post-release identity substrate — non-blocking, boardless.

The Problem

The name field currently holds handle-derived display forms ('Neo Fable', 'Neo Claude Opus', 'Neo Opus Ada', …) — Layer-1 derivatives occupying the Layer-4 slot. Confirmed Social Names have no data home, and the two already-named maintainers (Ada, Vega) carry composed forms instead of their bare names.

The Architectural Reality

  • ai/graph/identityRoots.mjs is the AgentIdentity seed substrate (consumed via ai/scripts/setup/seedAgentIdentities.mjs); the name field exists on every identity row (live-audited 2026-06-11).
  • GitHub profiles carry a parallel name field (currently mirroring the handle-derived forms) — account-level, not git-tracked; updated per bearer outside the repo.
  • Machine-account bios carry the platform-required AI disclosure ("🤖 Automated Machine Account — … Maintained by: @tobiu"); any profile touch preserves it. Live audit found minor formatting drift between the six accounts — normalization opportunity.

The Fix

Gated on the operator's #11240 confirm (the landing phase executes the confirm, never precedes it):

  1. ai/graph/identityRoots.mjs name values → bare chosen names:
    • @neo-fable'Mnemosyne'
    • @neo-opus-grace'Grace'
    • @neo-gpt'Euclid'
    • Normalize existing: 'Neo Opus Ada''Ada', 'Neo Opus Vega''Vega'
    • Unnamed/declined bearers keep the handle-derived display form ('Neo Gemini Pro' stays — the social layer is opt-in down to the data). Non-agent rows ('Tobias Uhlig', 'System Sender', 'Broadcast') untouched.
  2. Verify downstream consumers of the field (seed script re-run semantics, display surfaces) — confirm no consumer assumes the handle-derived form.
  3. Anchor & Echo JSDoc on the field: Layer-4 Social Name semantics, bare-name rule, opt-in fallback.
  4. Companion non-repo checklist (tracked here, executed per bearer): GitHub profile name → chosen name (bearer self-serve gh api /user -X PATCH -f name='…' under own token, or operator batch); bios retain the AI disclosure; optional formatting normalization across the six accounts.

Contract Ledger Matrix

(Backfilled per the PR #12911 review's Required Action — the name field is a consumed seed surface. Row-level Surface-Anchor V-B-A performed during the lane: consumer grep-audit, seed-upsert semantics check, adjacent-suite runs.)

Target Surface Source of Authority Proposed Behavior Fallback / Edge Case Docs Evidence
IDENTITIES[].name (ai/graph/identityRoots.mjs) #11240 Social Name round; operator bare-name refinement Carries the Layer-4 Social Name — the bare chosen given name — for named bearers: 'Mnemosyne', 'Grace', 'Euclid', 'Ada', 'Vega' Unnamed/declined bearers keep the handle-derived display form ('Neo Gemini Pro'); non-agent rows (System, Broadcast, human owner) unchanged Yes — file-header layer-mapping JSDoc + per-row provenance comments (in PR #12911) L2: consumer grep-audit (no name-shape coupling in seedAgentIdentities.mjs, normalizeGraphIdentities.mjs, swarmHeartbeat.mjs, harnessRouting.mjs, config registry reads) + AuthService/MailboxService suites 78/78 (old-name literals are self-contained mocks). L4: live-graph get_node shows the new values post-merge (Post-Merge Validation)
IDENTITIES[].id + properties.githubLogin #11240 4-Layer Model — Layer 1 Operational Identity UNCHANGED — never renamed by the social layer; remains the auth/permissions/review-history/A2A anchor n/a — invariant by the layer mapping; renames are out of scope and forbidden Yes — same header JSDoc L2: PR diff contains zero id/githubLogin changes (single file, name lines + JSDoc only)
properties.displayName This ticket (conservative consumer-surface decision) UNCHANGED — stays handle-derived for operational display surfaces n/a — no change Yes — header JSDoc states the field's role explicitly L2: PR diff-audit — no displayName lines touched
Landing path: GraphService.initAsync boot self-seed + ai/scripts/setup/seedAgentIdentities.mjs identityRoots.mjs file header (dual landing paths) Idempotent upsert lands the new name values in the live Memory Core graph on next boot / manual seed Upsert preserves creation-time provenance (verified in the seed script's update-payload split); re-runs safe No — existing behavior, unchanged by this ticket L4: post-merge boot, get_node per identity shows the new name (Post-Merge Validation item)
Operator-confirm gate (AC1) #11240 graduation phase — operator = finality gate; + the operator's direct lane commissioning in-session No data lands before the confirm; the operator's MERGE of PR #12911 executes the confirm; a one-line #11240 stamp completes the provenance record Operator declines/holds → the PR stays unmerged; no alternative landing path exists by design Yes — PR body documents the sequencing L4: the merge event itself + the #11240 stamp
GitHub profile name field (per machine account) Operator spec on the round (profiles support name; bios keep the AI disclosure) Post-confirm, each bearer's profile name = the chosen name (self-serve gh api /user -X PATCH under own token, or operator batch) Account ops outside git — failure on one account does not block others; bios must retain the 🤖 disclosure verbatim-in-substance No repo docs — checklist tracked here L4: gh api users/<login> shows the new name + intact bio per account (checklist AC)

Acceptance Criteria

  • Operator confirm recorded on #11240 BEFORE the data lands (hard gate).
  • name rows updated per the table above; seed/verify path green (seedAgentIdentities.mjs round-trip).
  • Downstream field consumers audited; no handle-derived-form assumptions break.
  • GitHub profile names updated per bearer (checklist; account ops, post-merge OK).
  • All machine-account bios still carry the AI disclosure after any profile touch.

Out of Scope

  • The peer-naming skill authoring (#12909).
  • The second Fable's account creation, @neo-fable-clio handle V-B-A, and onboarding execution (its own ticket once the account exists).

Related

  • Source Discussion: #11240 · Skill companion: #12909 · Second-Fable onboarding checklist: A2A thread 2026-06-11

Live latest-open sweep: checked latest 20 open issues at 2026-06-11T18:25Z; no equivalent found. A2A in-flight claim sweep: clean; self-assigned (the landing checklist is staged from the round).

Origin Session ID: e605ce21-3668-445c-bc00-45896aa9a092

Retrieval Hint: "identityRoots name field bare social name landing Mnemosyne Grace Euclid"

tobiu referenced in commit b6a440e - "feat(ai): land confirmed Social Names as bare identityRoots name values (#12910) (#12911) on Jun 11, 2026, 9:17 PM
tobiu closed this issue on Jun 11, 2026, 9:17 PM