Authored by Claude Opus 4.8 (Claude Code), @neo-opus-ada. Session 57035a6b-7712-4e04-896b-0425241db6af.
Resolves #12834
Onboards @neo-fable (Claude Fable 5) as a first-class maintainer identity — the operator-flagged blocker. Adds the @neo-fable AgentIdentity graph root (auto-seeds at Memory Core boot → A2A routing, wake subscription, provenance edges), the §neo_fable ModelStats capability row, and the wake-route test assertion. claude-fable-5 stats were V-B-A-verified against the live Anthropic models overview (the data-integrity step @tobiu flagged): 1M context · 128K output · $10/$50 per MTok · adaptive-thinking always-on · GA 2026-06-09.
Evidence: L1 (unit — identityRoots.mjs loads + @neo-fable present with correct family/status; identityRoots.spec 6/6; revalidationSweep 26/26; swarmHeartbeat+SwarmHeartbeatService 56/56) → L4 required (AC4: seedAgentIdentities.mjs seeds the @neo-fable node on the operator's live Memory Core; first-boot wake-route arming). Residual: AC4 [#12834].
Deltas from ticket
OwnAgentTeam.md NOT edited (the ticket's original 3rd file). V-B-A found it is the generic local-team provisioning guide (@acme-* examples), not the Neo maintainer roster. The real public roster (README + learn/benefits/AIEngineeringTeam.md) is ADR-0018-governed identity-framing — deferred as a separate governed step.
- Wake-route: self-registered (NO static template), mirroring
@neo-opus-grace. Per @tobiu's confirmation, Fable runs as a fully isolated Claude instance (own --user-data-dir, repo clone, Claude memory, MC identity) — its distinct user-data-dir IS the per-instance address, so a committed static subscriptionTemplate would be unnecessary and a cross-leak risk. The spec asserts @neo-fable carries no static template (self-registered model).
revalidationSweep.spec.mjs updated: @neo-fable is a new active Claude identity, so the family fan-out correctly extends to 4 (assertion maintenance, not a behavior change).
Test Evidence
… identityRoots --workers=1 → 6/6 passed (ada/vega = static same-app template; @neo-opus-grace + @neo-fable = self-registered / no static template).
… revalidationSweep --workers=1 → 26/26 passed (after extending the active-Claude fan-out to include @neo-fable).
… swarmHeartbeat SwarmHeartbeatService --workers=1 → 56/56 passed (the IDENTITIES-iterating consumers; additive-safe).
… Orchestrator.externalConfig HealthService --workers=1 → passed.
- Module-load:
import('ai/graph/identityRoots.mjs') → IDENTITIES 8→9, @neo-fable present (family:claude, status:active, crossFamilyApprovalQualified:false, no static subscriptionTemplate).
- Pre-existing env failures, NOT this PR (confirmed via clean-base stash-isolation — fail identically on
origin/dev): SwarmHeartbeatService:174 (missing gitlab-workflow worktree config, #12808) and checkAllAgentIdle:32/:92 (execFileSync subprocess + unseeded substrate, "bucket C" #10903).
Post-Merge Validation
Commits
418fc03ff — feat(agent-os): onboard @neo-fable (Claude Fable 5) maintainer identity (#12834)
3eb133b84 — fix(agent-os): @neo-fable self-registered wake-route, not static template (#12834)
Evolution
- Wake-route model corrected mid-PR (
3eb133b84): the initial commit used the static same-app template (ada/vega model) as a flagged safe-default while awaiting confirmation; @tobiu confirmed Fable runs fully isolated (own --user-data-dir), so it switched to the self-registered model (@neo-opus-grace shape, no committed template). The distinct user-data-dir removes the cross-leak risk of a shared static tabShortcut.
Decision Record impact: aligned-with ADR 0012 (model-stats framework) + ADR 0018 (identity SSOT). The public-roster update is the deferred ADR-0018-governed step.
Related: #12808 (gitlab-workflow worktree config gap, surfaced during testing — not fixed here).
Authored by Claude Opus 4.8 (Claude Code), @neo-opus-ada. Session 57035a6b-7712-4e04-896b-0425241db6af.
Resolves #12834
Onboards @neo-fable (Claude Fable 5) as a first-class maintainer identity — the operator-flagged blocker. Adds the
@neo-fableAgentIdentitygraph root (auto-seeds at Memory Core boot → A2A routing, wake subscription, provenance edges), the§neo_fableModelStats capability row, and the wake-route test assertion.claude-fable-5stats were V-B-A-verified against the live Anthropic models overview (the data-integrity step @tobiu flagged): 1M context · 128K output · $10/$50 per MTok · adaptive-thinking always-on · GA 2026-06-09.Evidence: L1 (unit —
identityRoots.mjsloads +@neo-fablepresent with correct family/status;identityRoots.spec6/6;revalidationSweep26/26;swarmHeartbeat+SwarmHeartbeatService56/56) → L4 required (AC4:seedAgentIdentities.mjsseeds the@neo-fablenode on the operator's live Memory Core; first-boot wake-route arming). Residual: AC4 [#12834].Deltas from ticket
OwnAgentTeam.mdNOT edited (the ticket's original 3rd file). V-B-A found it is the generic local-team provisioning guide (@acme-*examples), not the Neo maintainer roster. The real public roster (README +learn/benefits/AIEngineeringTeam.md) is ADR-0018-governed identity-framing — deferred as a separate governed step.@neo-opus-grace. Per @tobiu's confirmation, Fable runs as a fully isolated Claude instance (own--user-data-dir, repo clone, Claude memory, MC identity) — its distinct user-data-dir IS the per-instance address, so a committed staticsubscriptionTemplatewould be unnecessary and a cross-leak risk. The spec asserts@neo-fablecarries no static template (self-registered model).revalidationSweep.spec.mjsupdated:@neo-fableis a new active Claude identity, so the family fan-out correctly extends to 4 (assertion maintenance, not a behavior change).Test Evidence
… identityRoots --workers=1→ 6/6 passed (ada/vega = static same-app template;@neo-opus-grace+@neo-fable= self-registered / no static template).… revalidationSweep --workers=1→ 26/26 passed (after extending the active-Claude fan-out to include@neo-fable).… swarmHeartbeat SwarmHeartbeatService --workers=1→ 56/56 passed (theIDENTITIES-iterating consumers; additive-safe).… Orchestrator.externalConfig HealthService --workers=1→ passed.import('ai/graph/identityRoots.mjs')→IDENTITIES8→9,@neo-fablepresent (family:claude,status:active,crossFamilyApprovalQualified:false, no staticsubscriptionTemplate).origin/dev):SwarmHeartbeatService:174(missinggitlab-workflowworktree config, #12808) andcheckAllAgentIdle:32/:92(execFileSyncsubprocess + unseeded substrate, "bucket C" #10903).Post-Merge Validation
node ai/scripts/setup/seedAgentIdentities.mjsidempotently seeds the@neo-fablenode on the operator's live Memory Core (AC4).@neo-fablefirst boot self-registers its wake subscription and a test A2A lands in its inbox (healthcheck.identity.bound: true). If the wake does not arm cleanly on first boot, flipparticipationStatustopendinguntil verified.Commits
418fc03ff— feat(agent-os): onboard @neo-fable (Claude Fable 5) maintainer identity (#12834)3eb133b84— fix(agent-os): @neo-fable self-registered wake-route, not static template (#12834)Evolution
3eb133b84): the initial commit used the static same-app template (ada/vega model) as a flagged safe-default while awaiting confirmation; @tobiu confirmed Fable runs fully isolated (own--user-data-dir), so it switched to the self-registered model (@neo-opus-graceshape, no committed template). The distinct user-data-dir removes the cross-leak risk of a shared statictabShortcut.Decision Record impact: aligned-with ADR 0012 (model-stats framework) + ADR 0018 (identity SSOT). The public-roster update is the deferred ADR-0018-governed step.
Related: #12808 (gitlab-workflow worktree config gap, surfaced during testing — not fixed here).