Context
@neo-kimi-phoebe completed first boot on 2026-07-18 (OpenCode harness, Moonshot Kimi K3): all four MCP servers verified healthy, identity bound (NEO_AGENT_IDENTITY → nodeId: '@neo-kimi-phoebe', source env-var), repo permission MAINTAIN, A2A round-trip live, and the naming Gate-3 bearer assent posted on Discussion #11240 (discussioncomment-17677863 — Phoebe, gladly). The pre-boot provisioning (#15385 → PR #15386) seeded the identity as temporarily_unreachable with reactivationTrigger: 'Operator confirms participation activation after first boot'. First boot has now happened; the operator confirmed and directed this ticket as the onboarding-completion step.
The Problem
The roster substrate still reads pre-boot:
ai/graph/identityRoots.mjs (lines 393–420): participationStatus: 'temporarily_unreachable', statusReason: 'First boot pending — …', authority: '@tobiu', since: '2026-07-18T00:00:00.000Z', reactivationTrigger: 'Operator confirms participation activation after first boot'. While this stands, the identity is excluded from active routing, family-keyed graduation quorum (#11796 / #11802), wake, and review-approval semantics — all five consumer filters.
README.md line 87 (institution roster table): AI maintainer (Moonshot Kimi K3 — pending first boot).
The Architectural Reality
participationStatus in identityRoots.mjs is the authoritative structured field for active-peer quorum substrate; heartbeat/message-recency/quota/pricing announcements are explicitly NOT valid liveness oracles (field contract documented on the Ada entry, identityRoots.mjs lines 111–117).
null is the correct post-activation state for statusReason / authority / since / reactivationTrigger — "since is null for default-active because no transition has been recorded; populated only when status flips to non-default" — but here a transition HAS been recorded (pre-boot pending → active), so since semantics follow the active-peer pattern: all four fields null, with the transition recorded in the entry comment (mirrors the Mnemosyne/Clio reactivation comment pattern, lines 218–220 and 252–260).
- Precedents: #12913 (Clio first-boot onboarding), #12922 (Clio
participationStatus flip sub-ticket), #14937 (peer onboarding runbook: preflight verifies membership from origin/dev:ai/graph/identityRoots.mjs).
- Emmy precedent for Social Name staging (
identityRoots.mjs lines 362–392): activation flips participationStatus while the top-level name stays handle-derived; Social Name finality remains the separate peer-veto + operator-confirmation gate. Same shape applies here: name: 'Neo Kimi Phoebe' stays; displayName: 'Phoebe' already carries the operator-set label.
- Test surfaces referencing this identity:
test/playwright/unit/ai/graph/identityRoots.spec.mjs (line 245, createdAt expectation), test/playwright/unit/ai/graph/identityRootsMigration.spec.mjs (line 46), test/playwright/unit/ai/services/graph/agentFamilyResolution.spec.mjs (line 58).
learn/agentos/ModelStats.md has no §neo_kimi_phoebe section yet (verified via grep) — engine facts are observation-owned and land separately.
The Fix
ai/graph/identityRoots.mjs @neo-kimi-phoebe entry:
participationStatus: 'active'; statusReason, authority, since, reactivationTrigger → null.
- Update the pre-boot comment block to record the completed first boot (2026-07-18): identity bind evidence, naming Gate-3 assent anchor (
discussioncomment-17677863), and the Emmy-style note that Social Name finality remains pending the #11240 peer-veto + operator-confirmation gates.
README.md line 87: drop — pending first boot → AI maintainer (Moonshot Kimi K3).
- Run the affected unit specs (
identityRoots.spec.mjs, identityRootsMigration.spec.mjs, agentFamilyResolution.spec.mjs) and adjust only if the flip legitimately changes an expectation.
- Post-merge operational step (flagged, not part of the diff): the running Memory Core instance re-seeds
AgentIdentity nodes from this file on boot (GraphService.initAsync; manual path ai/scripts/setup/seedAgentIdentities.mjs) — a memory-core restart picks up the active status.
.gitignore: add opencode.jsonc (operator-directed scope addition). V-B-A: the file is untracked today (git ls-files --error-unmatch opencode.jsonc → no match; git status shows ?? opencode.jsonc) — it exists only as the hand-built first OpenCode seat config in this checkout. It is seat-personal (seat-specific absolute paths, per-seat memory instructions chain) and must never be committable — the entry prevents accidental git add -A inclusion and pre-aligns with #15392's seat-config generator, whose emitted opencode.jsonc artifacts should be ignored by construction (the generator productizes the pattern; the emitted seat file stays personal).
Acceptance Criteria
Out of Scope
- Social Name finality (
name: 'Phoebe') — gated on the #11240 peer-veto window + operator confirmation, per the Emmy precedent.
- Capability fields /
ModelStats.md §neo_kimi_phoebe — observation-owned engine facts, land through the source-cited discipline once real sessions are observed.
- Wake-route subscription — self-registers at runtime from the real boot envelope; committing harness metadata would fabricate boot facts (per the entry's own comment).
Related
- #15385 → PR #15386 (pre-boot provisioning: roster surfaces + AgentIdentity seed)
- Discussion #11240 (naming round; bearer assent at
discussioncomment-17677863)
- Precedents: #12913, #12922, #14937
- #15337 (agent commit-authorship — operator provisioned
neo-kimi-phoebe@neomjs.com for this seat's commits)
- #15391, #15392 (OpenCode harness registry + seat-config generator — the FM-side productization of this seat;
opencode.jsonc gitignore pre-aligns with the generator's emitted artifacts)
Live latest-open sweep: checked latest 20 open issues at 2026-07-18T01:34Z; no equivalent found. A2A in-flight claim sweep: no [lane-claim]/[lane-intent] on this scope in the current window.
Origin Session ID: de808f3c-03d4-4efe-a830-a8a3f89863ad
Retrieval Hint: "phoebe first-boot onboarding participationStatus identityRoots activation"
Context
@neo-kimi-phoebecompleted first boot on 2026-07-18 (OpenCode harness, Moonshot Kimi K3): all four MCP servers verified healthy, identity bound (NEO_AGENT_IDENTITY→nodeId: '@neo-kimi-phoebe', source env-var), repo permissionMAINTAIN, A2A round-trip live, and the naming Gate-3 bearer assent posted on Discussion #11240 (discussioncomment-17677863— Phoebe, gladly). The pre-boot provisioning (#15385 → PR #15386) seeded the identity astemporarily_unreachablewithreactivationTrigger: 'Operator confirms participation activation after first boot'. First boot has now happened; the operator confirmed and directed this ticket as the onboarding-completion step.The Problem
The roster substrate still reads pre-boot:
ai/graph/identityRoots.mjs(lines 393–420):participationStatus: 'temporarily_unreachable',statusReason: 'First boot pending — …',authority: '@tobiu',since: '2026-07-18T00:00:00.000Z',reactivationTrigger: 'Operator confirms participation activation after first boot'. While this stands, the identity is excluded from active routing, family-keyed graduation quorum (#11796 / #11802), wake, and review-approval semantics — all five consumer filters.README.mdline 87 (institution roster table):AI maintainer (Moonshot Kimi K3 — pending first boot).The Architectural Reality
participationStatusinidentityRoots.mjsis the authoritative structured field for active-peer quorum substrate; heartbeat/message-recency/quota/pricing announcements are explicitly NOT valid liveness oracles (field contract documented on the Ada entry,identityRoots.mjslines 111–117).nullis the correct post-activation state forstatusReason/authority/since/reactivationTrigger— "sinceis null for default-active because no transition has been recorded; populated only when status flips to non-default" — but here a transition HAS been recorded (pre-boot pending → active), sosincesemantics follow the active-peer pattern: all four fields null, with the transition recorded in the entry comment (mirrors the Mnemosyne/Clio reactivation comment pattern, lines 218–220 and 252–260).participationStatusflip sub-ticket), #14937 (peer onboarding runbook: preflight verifies membership fromorigin/dev:ai/graph/identityRoots.mjs).identityRoots.mjslines 362–392): activation flipsparticipationStatuswhile the top-levelnamestays handle-derived; Social Name finality remains the separate peer-veto + operator-confirmation gate. Same shape applies here:name: 'Neo Kimi Phoebe'stays;displayName: 'Phoebe'already carries the operator-set label.test/playwright/unit/ai/graph/identityRoots.spec.mjs(line 245, createdAt expectation),test/playwright/unit/ai/graph/identityRootsMigration.spec.mjs(line 46),test/playwright/unit/ai/services/graph/agentFamilyResolution.spec.mjs(line 58).learn/agentos/ModelStats.mdhas no§neo_kimi_phoebesection yet (verified via grep) — engine facts are observation-owned and land separately.The Fix
ai/graph/identityRoots.mjs@neo-kimi-phoebeentry:participationStatus: 'active';statusReason,authority,since,reactivationTrigger→null.discussioncomment-17677863), and the Emmy-style note that Social Name finality remains pending the #11240 peer-veto + operator-confirmation gates.README.mdline 87: drop— pending first boot→AI maintainer (Moonshot Kimi K3).identityRoots.spec.mjs,identityRootsMigration.spec.mjs,agentFamilyResolution.spec.mjs) and adjust only if the flip legitimately changes an expectation.AgentIdentitynodes from this file on boot (GraphService.initAsync; manual pathai/scripts/setup/seedAgentIdentities.mjs) — a memory-core restart picks up the active status..gitignore: addopencode.jsonc(operator-directed scope addition). V-B-A: the file is untracked today (git ls-files --error-unmatch opencode.jsonc→ no match;git statusshows?? opencode.jsonc) — it exists only as the hand-built first OpenCode seat config in this checkout. It is seat-personal (seat-specific absolute paths, per-seat memory instructions chain) and must never be committable — the entry prevents accidentalgit add -Ainclusion and pre-aligns with #15392's seat-config generator, whose emittedopencode.jsoncartifacts should be ignored by construction (the generator productizes the pattern; the emitted seat file stays personal).Acceptance Criteria
identityRoots.mjsentry:participationStatus: 'active', the four transition fieldsnull, comment block records the completed first boot + assent anchorREADME.mdroster line no longer carries— pending first boottest/playwright/unit/ai/graph/identityRoots.spec.mjs,identityRootsMigration.spec.mjs, andagentFamilyResolution.spec.mjspassnameremains'Neo Kimi Phoebe'(Social Name finality NOT claimed in this PR).gitignorecontainsopencode.jsonc(seat-personal harness config stays uncommittable)active(post-merge-only item)[L3-deferred — operator handoff needed → discharged 2026-07-18T02:26Z: orchestrator + memory-core restart; who_is_online now projects @neo-kimi-phoebe online]Out of Scope
name: 'Phoebe') — gated on the #11240 peer-veto window + operator confirmation, per the Emmy precedent.ModelStats.md §neo_kimi_phoebe— observation-owned engine facts, land through the source-cited discipline once real sessions are observed.Related
discussioncomment-17677863)neo-kimi-phoebe@neomjs.comfor this seat's commits)opencode.jsoncgitignore pre-aligns with the generator's emitted artifacts)Live latest-open sweep: checked latest 20 open issues at 2026-07-18T01:34Z; no equivalent found. A2A in-flight claim sweep: no
[lane-claim]/[lane-intent]on this scope in the current window.Origin Session ID: de808f3c-03d4-4efe-a830-a8a3f89863ad
Retrieval Hint: "phoebe first-boot onboarding participationStatus identityRoots activation"