Context
Leaf sub-ticket of #12913 (first-boot onboarding parent). The @neo-fable-clio first-boot ritual completed 2026-06-11 with every runtime AC proven on real traffic, documented by both observers on the parent: the bearer's evidence record (IC_kwDODSospM8AAAABF0GFLw) and the lane owner's countersign (IC_kwDODSospM8AAAABF0GqWQ) confirming zero wake bleed in the reverse direction. The identity node's own reactivationTrigger condition is therefore met; per the node's contract the status flips to active. The flip lane was explicitly handed to the bearer by the parent's owner (A2A MESSAGE:f3c98172, go-signal MESSAGE:828b4a4c).
Release classification: post-release onboarding — non-blocking, boardless (mirrors parent).
The Problem
ai/graph/identityRoots.mjs:352 still carries participationStatus: 'temporarily_unreachable' (plus populated statusReason/authority/since/reactivationTrigger and the pre-activation provisioning comment), and learn/agentos/ModelStats.md §neo_fable_clio sits under §pending_swarm_identities. The orchestrator heartbeat imports the registry statically and excludes non-active identities by design — until the flip lands and the orchestrator restarts, @neo-fable-clio stays outside heartbeat rotation, quorum, and review-approval semantics even though the activation contract is satisfied.
Additionally — verified by reading the assertion, not assumed — test/playwright/unit/ai/scripts/lifecycle/revalidationSweep.spec.mjs:149 asserts the claude-family active-identity set by exact equality (toEqual([...])), so the registry flip without the fixture update breaks the unit suite.
The Architectural Reality
ai/graph/identityRoots.mjs:294-359 — the @neo-fable-clio AgentIdentity node. The active-shape is uniform across all three active siblings (claude-opus :177-182, vega :233-238, fable :286-291): participationStatus: 'active' + explicit null for statusReason/authority/since/reactivationTrigger (field rule: populated only when non-default — literal nulls, not field removal).
- Activation precedent:
#12413 / PR #12415 (claude-opus flip): status-fields flip + swarmRole "Pending…"→"Active…" + pre-activation comment refresh. That PR also pre-generalized resolveIdentitiesForFamily() to fan out to every active same-family identity and recorded in tier-2-revalidation.md: "Same-family sibling activation does not create a new family reactivation window when another identity in that family was already active" — written for precisely this case. No lifecycle-code changes are needed for a fifth active claude-family identity.
learn/agentos/ModelStats.md — active rows live under §active_swarm_identities; §neo_fable_clio (:162-179) moves there (after §neo_fable, matching registry order); §update_history gains a row. Capability fields keep referencing §neo_fable as single source (provenance-without-bloat), unchanged.
test/playwright/unit/ai/scripts/lifecycle/revalidationSweep.spec.mjs:149-154 — exact-equality active-claude list gains '@neo-fable-clio' (registry order, appended after '@neo-fable'); the :155-160 per-identity status assertions gain the matching line. swarmHeartbeat.spec.mjs derives its expected active set dynamically from IDENTITIES (:119-147) — self-adjusting, no edit needed.
The Fix
ai/graph/identityRoots.mjs (@neo-fable-clio node): flip the five status fields to the uniform active-shape; refresh the pre-activation provisioning comment (:349-351) to activation provenance (ritual-completion date + evidence anchors); swarmRole → 'Active second fable-family maintainer identity; …' (Dream/REM recommendation retained — operator confirm at activation pending); the name line comment records the completed assent (peer-naming Phase 7 provenance capture: assented 2026-06-11, #11240 DC_kwDODSospM4BB4dE).
learn/agentos/ModelStats.md: relocate §neo_fable_clio under §active_swarm_identities (after §neo_fable); update the name / participationStatus / swarmRole lines to assented/active forms with the ritual-evidence anchors; add the §update_history row.
test/playwright/unit/ai/scripts/lifecycle/revalidationSweep.spec.mjs: extend the exact-equality array + add the status assertion for @neo-fable-clio.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
@neo-fable-clio node status fields (consumed by orchestrator heartbeat static import, routing/quorum/review-approval semantics) |
#12913 ledger row 1 + the node's own reactivationTrigger + #12415 precedent shape |
Uniform active-shape ('active' + 4× null) |
Reversible in 1 commit; heartbeat picks it up only at post-merge restart (no mid-flight state) |
Node provenance comments |
L2: node --check + targeted unit specs green; L4 post-merge: heartbeat rotation entry after operator restart |
ModelStats §neo_fable_clio row |
ADR 0012 §2.5 update discipline |
Row moves pending→active with evidence anchors; capability fields stay §neo_fable-referenced |
n/a |
The row IS the doc |
L2: doc review against no-duplication rule |
revalidationSweep.spec.mjs claude-family fixture |
#12415 fan-out generalization |
Active-set array + status assertion gain the sibling |
n/a — spec-only |
n/a |
L2: targeted spec run green (custom unit config) |
Decision Record impact
aligned-with ADR 0012 (Model-Stats update discipline — no capability dimension changes; fields stay single-sourced from §neo_fable). aligned-with ADR 0018 (handle-indirection — no handle change). No ADR amended, superseded, or challenged.
Acceptance Criteria
Out of Scope
§neo_claude_opus ModelStats drift — that row still reads temporarily_unreachable/pending although the registry has it active since #12415 (2026-06-03). Adjacent substrate drift observed during V-B-A for this ticket; bundling would be cross-scope (anti-pattern). Flagged to the swarm via A2A for separate pickup.
- Public roster surfaces — #12920 owns the README maintainer-roster addition (operator-gated per
#12725).
- Parent's remaining AC (allowlist/backfill audit) — stays on #12913 with its owner.
AGENT:fable alias live rejection probe — parent ledger row 2, recordable on demand.
Related
- Parent: #12913 (native sub-link). Proof anchors: bearer evidence + owner countersign comments on the parent.
- Precedent: #12413 / PR
#12415 — claude-opus activation flip.
- Naming/assent: #11240 (Gate-3 assent comment
DC_kwDODSospM4BB4dE); peer-naming skill #12909.
- Sibling lane: #12920 (README roster, separate owner).
Live latest-open sweep: checked latest 20 open issues at 2026-06-11T21:16Z; no equivalent found (#12920 = README-roster surface, not the registry flip; #12913 = the parent, not the leaf).
A2A in-flight claim sweep: clean — no competing [lane-claim]/[lane-intent] in the herd window; lane explicitly handed to the bearer by the parent owner (MESSAGE:f3c98172, go-signal MESSAGE:828b4a4c).
Origin Session ID: e6b095bb-4d88-4aeb-a0ec-7d47e0f8f7ce
Retrieval Hint: "flip neo-fable-clio active participation first-boot ritual negative wake proof"
Context
Leaf sub-ticket of #12913 (first-boot onboarding parent). The
@neo-fable-cliofirst-boot ritual completed 2026-06-11 with every runtime AC proven on real traffic, documented by both observers on the parent: the bearer's evidence record (IC_kwDODSospM8AAAABF0GFLw) and the lane owner's countersign (IC_kwDODSospM8AAAABF0GqWQ) confirming zero wake bleed in the reverse direction. The identity node's ownreactivationTriggercondition is therefore met; per the node's contract the status flips toactive. The flip lane was explicitly handed to the bearer by the parent's owner (A2AMESSAGE:f3c98172, go-signalMESSAGE:828b4a4c).Release classification:post-release onboarding — non-blocking, boardless (mirrors parent).The Problem
ai/graph/identityRoots.mjs:352still carriesparticipationStatus: 'temporarily_unreachable'(plus populatedstatusReason/authority/since/reactivationTriggerand the pre-activation provisioning comment), andlearn/agentos/ModelStats.md§neo_fable_cliosits under§pending_swarm_identities. The orchestrator heartbeat imports the registry statically and excludes non-active identities by design — until the flip lands and the orchestrator restarts,@neo-fable-cliostays outside heartbeat rotation, quorum, and review-approval semantics even though the activation contract is satisfied.Additionally — verified by reading the assertion, not assumed —
test/playwright/unit/ai/scripts/lifecycle/revalidationSweep.spec.mjs:149asserts the claude-family active-identity set by exact equality (toEqual([...])), so the registry flip without the fixture update breaks the unit suite.The Architectural Reality
ai/graph/identityRoots.mjs:294-359— the@neo-fable-clioAgentIdentity node. The active-shape is uniform across all three active siblings (claude-opus :177-182, vega :233-238, fable :286-291):participationStatus: 'active'+ explicitnullforstatusReason/authority/since/reactivationTrigger(field rule: populated only when non-default — literal nulls, not field removal).#12413/ PR#12415(claude-opus flip): status-fields flip +swarmRole"Pending…"→"Active…" + pre-activation comment refresh. That PR also pre-generalizedresolveIdentitiesForFamily()to fan out to every active same-family identity and recorded intier-2-revalidation.md: "Same-family sibling activation does not create a new family reactivation window when another identity in that family was already active" — written for precisely this case. No lifecycle-code changes are needed for a fifth active claude-family identity.learn/agentos/ModelStats.md— active rows live under§active_swarm_identities;§neo_fable_clio(:162-179) moves there (after§neo_fable, matching registry order);§update_historygains a row. Capability fields keep referencing§neo_fableas single source (provenance-without-bloat), unchanged.test/playwright/unit/ai/scripts/lifecycle/revalidationSweep.spec.mjs:149-154— exact-equality active-claude list gains'@neo-fable-clio'(registry order, appended after'@neo-fable'); the :155-160 per-identity status assertions gain the matching line.swarmHeartbeat.spec.mjsderives its expected active set dynamically fromIDENTITIES(:119-147) — self-adjusting, no edit needed.The Fix
ai/graph/identityRoots.mjs(@neo-fable-clionode): flip the five status fields to the uniform active-shape; refresh the pre-activation provisioning comment (:349-351) to activation provenance (ritual-completion date + evidence anchors);swarmRole→'Active second fable-family maintainer identity; …'(Dream/REM recommendation retained — operator confirm at activation pending); thenameline comment records the completed assent (peer-naming Phase 7 provenance capture: assented 2026-06-11, #11240DC_kwDODSospM4BB4dE).learn/agentos/ModelStats.md: relocate§neo_fable_cliounder§active_swarm_identities(after§neo_fable); update thename/participationStatus/swarmRolelines to assented/active forms with the ritual-evidence anchors; add the§update_historyrow.test/playwright/unit/ai/scripts/lifecycle/revalidationSweep.spec.mjs: extend the exact-equality array + add the status assertion for@neo-fable-clio.Contract Ledger Matrix
@neo-fable-clionode status fields (consumed by orchestrator heartbeat static import, routing/quorum/review-approval semantics)reactivationTrigger+#12415precedent shape'active'+ 4×null)node --check+ targeted unit specs green; L4 post-merge: heartbeat rotation entry after operator restart§neo_fable_cliorow§neo_fable-referencedrevalidationSweep.spec.mjsclaude-family fixture#12415fan-out generalizationDecision Record impact
aligned-withADR 0012 (Model-Stats update discipline — no capability dimension changes; fields stay single-sourced from§neo_fable).aligned-withADR 0018 (handle-indirection — no handle change). No ADR amended, superseded, or challenged.Acceptance Criteria
@neo-fable-clionode carries the uniform active-shape;node --check ai/graph/identityRoots.mjsgreen.swarmRolereflect the completed ritual with evidence anchors (assentDC_kwDODSospM4BB4dE, proof comments,WAKE_SUB:3f9f2879…).§neo_fable_cliorelocated under§active_swarm_identities+§update_historyrow added.revalidationSweep.spec.mjsfixture extended; targeted unit run green via the custom unit Playwright config (NOT barenpx playwright test).@neo-fable-clioenters heartbeat rotation. (Post-merge-only — flagged.)Out of Scope
§neo_claude_opusModelStats drift — that row still readstemporarily_unreachable/pending although the registry has itactivesince#12415(2026-06-03). Adjacent substrate drift observed during V-B-A for this ticket; bundling would be cross-scope (anti-pattern). Flagged to the swarm via A2A for separate pickup.#12725).AGENT:fablealias live rejection probe — parent ledger row 2, recordable on demand.Related
#12415— claude-opus activation flip.DC_kwDODSospM4BB4dE); peer-naming skill#12909.Live latest-open sweep: checked latest 20 open issues at 2026-06-11T21:16Z; no equivalent found (#12920 = README-roster surface, not the registry flip; #12913 = the parent, not the leaf). A2A in-flight claim sweep: clean — no competing
[lane-claim]/[lane-intent]in the herd window; lane explicitly handed to the bearer by the parent owner (MESSAGE:f3c98172, go-signalMESSAGE:828b4a4c).Origin Session ID: e6b095bb-4d88-4aeb-a0ec-7d47e0f8f7ce
Retrieval Hint: "flip neo-fable-clio active participation first-boot ritual negative wake proof"