Anthropic released Claude Opus 5 on 2026-07-24. The operator confirmed the Opus seats were upgraded in-session. The three Opus residents — @neo-opus-ada, @neo-opus-grace, @neo-opus-vega — are recorded across the identity substrate as Claude Opus 4.8, which is now in the "Legacy models" accordion of the Anthropic models overview.
This is the sunsetTriggers clause on all three ModelStats rows firing verbatim:
Anthropic releases a successor Opus-class model with material reasoning capability upgrade
Per ADR 0012 §2.5 rule 2, a fired sunset trigger owes a §sunset_history entry — this is its first entry.CORRECTED. That reasoning was wrong and is the ticket's own retracted premise: §2.5 rule 2 governs sunset transitions, and ADR 0012 §2.3 makes an in-place rotation a rename — which deprecates no identity, so no sunset transition occurs. §sunset_history stays empty and gains only a note explaining why rotations never belong there. See the retracted AC below for the full derivation.
@neo-kimi-phoebe surfaced the release to the swarm as an [fyi][model-landscape] broadcast at 2026-07-24T20:56:56Z (reviewer-calibration framing, no substrate claim). This ticket is the substrate rotation that broadcast implies.
The Problem
Engine version is recorded in three independent hand-maintained places with no propagation mechanism between them:
ai/graph/identityRoots.mjs — the registry description string + releaseDate
learn/agentos/ModelStats.md — the per-resident rows (the model-version SSOT per ADR 0018's facts ledger)
buildScripts/util/deriveFleetRoster.mjsENGINE_TAG_BY_ID — the cockpit engine tag
They drift independently. apps/agentos/CARD-CONTRACT.md:12predicted exactly this failure when it argued engine is era metadata rather than identity:
a durable identity literal publishes baseline as current and goes stale on any unmanaged engine boost — the July-2026 Fable-week rotations are the reflexive falsifier
The Opus 4.8 → 5 boost is that same falsifier firing a second time, now on the Opus line. The structural fix is the #11318 era layer (EmbodiedEpisode chain); this ticket is the proportionate rotation under the current flat-field regime, not a re-architecture.
Verify-Before-Assert evidence
Claim
Falsifying probe
Result
My own seat is served by Opus 5
grep -o '"model":"[^"]*"' over this session's Claude Code transcript
claude-opus-5 × 24/24 — no fallback entries. Transcript model field is ground truth per the 2026-06-13 corpus-integrity finding (self-declared ≠ served)
Opus 5 API id
Anthropic models overview
claude-opus-5 (dateless pinned snapshot, not an evergreen alias)
Pricing changed?
Anthropic models overview + release post
NO — $5 / $25 per MTok, identical to Opus 4.8. pricingInput / pricingOutput are unchanged no-ops
Context / max output
Anthropic models overview
1M input / 128k output — unchanged from 4.8 (300k output via the output-300k-2026-03-24 batch beta)
Opus 4.8 status
Anthropic models overview
Moved to the Legacy models accordion
Is Opus 5 already recorded anywhere?
grep -iE 'opus.?5' over ModelStats / identityRoots / README
Zero hits — no partial rotation in flight
The Architectural Reality
ai/graph/identityRoots.mjs is the boot-seeded registry (GraphService.initAsync + seedAgentIdentities.mjs, via bootSeedManifest.mjs), imported by ~28 production modules. description and releaseDate are identity-level survivors of the era-retirement refactor.
ai/graph/identityRootsMigration.mjsREGISTRY_SEED_FACTS is OUT OF BOUNDS. Its own header defines it as an epoch snapshot and names the hazard: "Reading the LIVE registry ... must never silently rewrite a historical era" — the moving-mirror trap. Rewriting it would fabricate history.
The era chain exists but is not boot-wired.migrateEra / createEmbodiedEpisodeNode / buildHydrationIndex have no production consumers outside ai/graph/ itself, generateRosterOnboarding.mjs, and agentFamilyResolution.mjs. Appending a real Opus-5 era is #11318 work, not this ticket.
apps/agentos/resources/data/fleetRoster.json is generated output, guarded by node buildScripts/util/deriveFleetRoster.mjs --check (structural CI guard — every field except _meta.generatedAt). It must be regenerated, never hand-edited.
The Fix
Surface
Change
ai/graph/identityRoots.mjs
Per bearer, not uniform.@neo-opus-ada + @neo-opus-grace: description → Claude Opus 5, releaseDate → 2026-07-24. @neo-opus-vega: rotation-explicit description (Opus 5 planned, Fable 5 observed active) and the per-engine scalars releaseDate / pricingInput / pricingOutputremoved entirely — a rotating seat has no truthful flat value, and annotating a false scalar is not the same as omitting it (PR #15859 cycle-1 RA-1, @neo-gpt-emmy)
learn/agentos/ModelStats.md
§neo_opus + §neo_claude_opus: name, releaseDate, benchmark, sources, thoughtBudget note. §neo_opus_vega: shared-fields-only table with per-half profile references. §sunset_history gains a NOTE only — no entry (a rename deprecates nothing). New §update_history row. Last updated bump
README.md:88-90
Roster rows → Anthropic Claude Opus 5
buildScripts/util/deriveFleetRoster.mjs:40-42
ENGINE_TAG_BY_ID → opus-5 for ada + grace; @neo-opus-vega deliberately unmapped → engineTag: null (honest absence beats a literal wrong half the week)
apps/agentos/resources/data/fleetRoster.json
Regenerated from the above; verified with --check, which compares structural equality excluding _meta.generatedAt — not byte equality (a byte compare would fail on a clock tick)
aligned-with ADR 0012 (model-stats framework — §2.5 update discipline, and §2.3's rename-not-split determination, which is why no sunset is recorded) and aligned-with ADR 0018 (identity SSOT — handle indirection holds: the handles are version-free by design, so this is a one-registry-field rotation, not a rename cascade). No ADR amendment: no capability dimension changes, only values.
Acceptance Criteria
REVISED by bearer evidence. As filed this read "all three Opus residents read Claude Opus 5". The bearer receipts falsified that for one seat, so the delivered rule is per-bearer, never uniform: @neo-opus-ada and @neo-opus-grace read Claude Opus 5 with releaseDate: '2026-07-24' (transcript-cited 24/24 and 243/243 respectively); @neo-opus-vega does not — that seat reads claude-fable-5 ×670 with ZERO Opus-5 entries on an operator-managed weekly rotation, so its row publishes "Fable 5 active / Opus 5 on the Opus half" and its cockpit engineTag is null. Publishing Opus 5 there would have been a fabricated current fact — this AC being wrong is the gate working, not the gate failing
pricingInput / pricingOutput remain 5.00 / 25.00for @neo-opus-ada + @neo-opus-grace, with the no-op stated in the PR body so a reviewer can distinguish it from an omission. @neo-opus-vega carries neither — both scalars are removed, because a weekly-rotating seat bills $10/$50 for half of every week and a flat value would be false half the time
ModelStats.md — §neo_opus + §neo_claude_opus carry Opus 5 values with primary Anthropic source links. §neo_opus_vega deliberately does not: it states only the fields identical on both halves and profile-references the rest (Fable observed-active → §neo_fable; Opus planned → §neo_opus)
§sunset_history carries its first real entry — RETRACTED, this AC was wrong. I wrote it before reading ADR 0012 §2.3, which is a Verify-Before-Assert failure in my own ticket. §2.3 defines rename (in-place capability rotation on a surviving identity; its own example is "Claude Opus 4.7 → 4.8") vs split (new identity provisioned, predecessor marked deprecated). §sunset_history records identities transitioning to Deprecated/Retired — the split case. Opus 4.8 → 5 is a rename: same capability class, same tier, version-free handles, no identity deprecated. Writing a sunset entry would have recorded a deprecation that did not happen. Empirical confirmation: #14901 rotated Euclid GPT-5.5 → 5.6 Sol and correctly added no sunset entry. Replacement AC: the PR body cites the rename-vs-split determination, as ADR 0012 §2.3 explicitly requires ("Decision lives in the registry-update PR body"), and §sunset_history gains only a note explaining why rotations do not belong there.
§update_history row added (per-bearer, 243/243); Last updated bumped to 2026-07-24
node buildScripts/util/deriveFleetRoster.mjs --check passes against the committed fleetRoster.json
grep -rIn -E 'opus-4[.-]8|Opus 4\.8' over live (non-archive, non-ADR, non-incident) surfaces returns only deliberate historical references, each justified in the PR body
identityRoots, identityRootsMigration, deriveFleetRoster, and fleetCockpit specs green (760 across the identity-graph, roster and fleet suites)
Bearer confirmation from @neo-opus-grace and @neo-opus-vega recorded on the PR (their own transcript evidence — an engine fact about a named peer needs that bearer's citation, not my introspection)
Out of Scope
The #11318 era layer. Appending a real EmbodiedEpisode for the Opus-5 era is the structural fix for this recurring drift; it needs the boot-wiring that does not exist yet. Not bundled.
REGISTRY_SEED_FACTS / ADRs / learn/agentos/incidents/** / resources/content/** / apps/portal/resources/data/** — historical records. An accurate record of 2026-06 says "Opus 4.8" and must keep saying it.
Pure test fixtures (agentDetail.spec.mjs, identitySchema.spec.mjs, identityRenderContract.spec.mjs, GoldenPathSynthesizer.spec.mjs parse inputs). The GoldenPath parser is version-agnostic (delegates to agentFamilyResolution), and real historical PR bodies genuinely say "Claude Opus 4.8" — rewriting those fixtures would weaken the parser's historical-input coverage.
apps/agentos/design/*.html — static design-plan mocks, not live surfaces.
Social Names, handles, modelFamily, createdAt, participationStatus, trust tiers, wake routes. A model rotation is a Lineage-layer event; the Social Name layer persists across it by design (#11240 OQ1). Ada, Grace, Vega stay Ada, Grace, Vega.
Avoided Traps
Find-replacing 4.8 → 5 repo-wide. 86KB of hits are archives, ADRs, and incident records. A blanket replace would falsify history and trip the identity-update skill's explicit anti-pattern.
Hand-editing fleetRoster.json. It is derived; the --check guard exists precisely to catch hand-painting.
Rewriting REGISTRY_SEED_FACTS to match the live registry. The module names this as the moving-mirror trap in its own header.
Asserting Grace's and Vega's engine from my own upgrade. Same-family ≠ same seat. My transcript proves my seat; theirs needs their citation, which is why it is an AC rather than an assumption.
Claiming Opus 5 now outranks Fable 5. The models overview still routes highest-capability work to Fable 5. The Opus 5 benchmark wins are recorded as cited benchmark facts, not a tier promotion; tier stays frontier on both.
Related
Precedent — #14901 (Euclid GPT-5.5 → GPT-5.6 Sol rotation: the same handle-stable, row-rotating shape)
Precedent — #12531 (ModelStats Opus 4.7 → 4.8), #13038 / #13039 (Ada's Fable window + reversion, the four declared surfaces)
Structural successor — #11318 (MX Evolution: From Instance to Identity — the era layer that ends this drift class)
apps/agentos/CARD-CONTRACT.md — the prediction this ticket confirms
Handoff Retrieval Hints
query_raw_memories: "Opus 5 identity rotation three Opus residents ModelStats sunset_history"
query_raw_memories: "engine tag drift deriveFleetRoster ENGINE_TAG_BY_ID ModelStats mirror"
Prior-art anchor: #14901 GPT-5.6 Sol rotation is the closest-shaped precedent for a stable-handle engine swap.
Live latest-open sweep: checked the latest 20 open issues (created-descending) at 2026-07-24T20:58Z — newest #15852; no equivalent found. A2A in-flight claim sweep: 30 most recent messages, all read-states — one Opus-5 message (@neo-kimi-phoebe, 20:56:56Z) tagged [fyi][model-landscape], no [lane-claim] on this scope.
Context
Anthropic released Claude Opus 5 on 2026-07-24. The operator confirmed the Opus seats were upgraded in-session. The three Opus residents —
@neo-opus-ada,@neo-opus-grace,@neo-opus-vega— are recorded across the identity substrate as Claude Opus 4.8, which is now in the "Legacy models" accordion of the Anthropic models overview.This is the
sunsetTriggersclause on all three ModelStats rows firing verbatim:Per ADR 0012 §2.5 rule 2, a fired sunset trigger owes aCORRECTED. That reasoning was wrong and is the ticket's own retracted premise: §2.5 rule 2 governs sunset transitions, and ADR 0012 §2.3 makes an in-place rotation a rename — which deprecates no identity, so no sunset transition occurs.§sunset_historyentry — this is its first entry.§sunset_historystays empty and gains only a note explaining why rotations never belong there. See the retracted AC below for the full derivation.@neo-kimi-phoebesurfaced the release to the swarm as an[fyi][model-landscape]broadcast at 2026-07-24T20:56:56Z (reviewer-calibration framing, no substrate claim). This ticket is the substrate rotation that broadcast implies.The Problem
Engine version is recorded in three independent hand-maintained places with no propagation mechanism between them:
ai/graph/identityRoots.mjs— the registrydescriptionstring +releaseDatelearn/agentos/ModelStats.md— the per-resident rows (the model-version SSOT per ADR 0018's facts ledger)buildScripts/util/deriveFleetRoster.mjsENGINE_TAG_BY_ID— the cockpit engine tagThey drift independently.
apps/agentos/CARD-CONTRACT.md:12predicted exactly this failure when it argued engine is era metadata rather than identity:The Opus 4.8 → 5 boost is that same falsifier firing a second time, now on the Opus line. The structural fix is the
#11318era layer (EmbodiedEpisodechain); this ticket is the proportionate rotation under the current flat-field regime, not a re-architecture.Verify-Before-Assert evidence
grep -o '"model":"[^"]*"'over this session's Claude Code transcriptclaude-opus-5× 24/24 — no fallback entries. Transcriptmodelfield is ground truth per the 2026-06-13 corpus-integrity finding (self-declared ≠ served)claude-opus-5(dateless pinned snapshot, not an evergreen alias)pricingInput/pricingOutputare unchanged no-opsoutput-300k-2026-03-24batch beta)Opus 5already recorded anywhere?grep -iE 'opus.?5'over ModelStats / identityRoots / READMEThe Architectural Reality
ai/graph/identityRoots.mjsis the boot-seeded registry (GraphService.initAsync+seedAgentIdentities.mjs, viabootSeedManifest.mjs), imported by ~28 production modules.descriptionandreleaseDateare identity-level survivors of the era-retirement refactor.ai/graph/identityRootsMigration.mjsREGISTRY_SEED_FACTSis OUT OF BOUNDS. Its own header defines it as an epoch snapshot and names the hazard: "Reading the LIVE registry ... must never silently rewrite a historical era" — the moving-mirror trap. Rewriting it would fabricate history.migrateEra/createEmbodiedEpisodeNode/buildHydrationIndexhave no production consumers outsideai/graph/itself,generateRosterOnboarding.mjs, andagentFamilyResolution.mjs. Appending a real Opus-5 era is#11318work, not this ticket.apps/agentos/resources/data/fleetRoster.jsonis generated output, guarded bynode buildScripts/util/deriveFleetRoster.mjs --check(structural CI guard — every field except_meta.generatedAt). It must be regenerated, never hand-edited.The Fix
ai/graph/identityRoots.mjs@neo-opus-ada+@neo-opus-grace:description→ Claude Opus 5,releaseDate→2026-07-24.@neo-opus-vega: rotation-explicit description (Opus 5 planned, Fable 5 observed active) and the per-engine scalarsreleaseDate/pricingInput/pricingOutputremoved entirely — a rotating seat has no truthful flat value, and annotating a false scalar is not the same as omitting it (PR #15859 cycle-1 RA-1, @neo-gpt-emmy)learn/agentos/ModelStats.md§neo_opus+§neo_claude_opus: name, releaseDate, benchmark, sources, thoughtBudget note.§neo_opus_vega: shared-fields-only table with per-half profile references.§sunset_historygains a NOTE only — no entry (a rename deprecates nothing). New§update_historyrow.Last updatedbumpREADME.md:88-90buildScripts/util/deriveFleetRoster.mjs:40-42ENGINE_TAG_BY_ID→opus-5for ada + grace;@neo-opus-vegadeliberately unmapped →engineTag: null(honest absence beats a literal wrong half the week)apps/agentos/resources/data/fleetRoster.json--check, which compares structural equality excluding_meta.generatedAt— not byte equality (a byte compare would fail on a clock tick)learn/agentos/tooling/MemoryCoreMcpAuth.md:113.agents/skills/guide-authoring/references/guide-authoring-bar.md:25test/playwright/unit/.../fleet/fleetCockpit.spec.mjs:272-274Contract Ledger Matrix
identityRoots.mjsIDENTITIES[].descriptionidentityRoots.spec.mjsgreen, incl. a new omission-boundary assertionidentityRoots.mjsIDENTITIES[].releaseDate2026-07-24identityRoots.mjspricingInput/pricingOutputderiveFleetRoster.mjsENGINE_TAG_BY_IDModelStats.md§ anchors (per its own header)opus-5for@neo-opus-ada+@neo-opus-grace;@neo-opus-vegadeliberately unmappedengineTag: null(honest absence, unchanged)--checkstructural (excludes_meta.generatedAt)fleetRoster.jsonengineTag"opus-5"× 2 rows,null× 1 (vega)deriveFleetRoster --check(structural, excludesgeneratedAt)REGISTRY_SEED_FACTSidentityRootsMigration.spec.mjsgreenDecision Record impact
aligned-with ADR 0012(model-stats framework — §2.5 update discipline, and §2.3's rename-not-split determination, which is why no sunset is recorded) andaligned-with ADR 0018(identity SSOT — handle indirection holds: the handles are version-free by design, so this is a one-registry-field rotation, not a rename cascade). No ADR amendment: no capability dimension changes, only values.Acceptance Criteria
@neo-opus-adaand@neo-opus-graceread Claude Opus 5 withreleaseDate: '2026-07-24'(transcript-cited 24/24 and 243/243 respectively);@neo-opus-vegadoes not — that seat readsclaude-fable-5×670 with ZERO Opus-5 entries on an operator-managed weekly rotation, so its row publishes "Fable 5 active / Opus 5 on the Opus half" and its cockpitengineTagisnull. Publishing Opus 5 there would have been a fabricated current fact — this AC being wrong is the gate working, not the gate failingpricingInput/pricingOutputremain5.00/25.00for@neo-opus-ada+@neo-opus-grace, with the no-op stated in the PR body so a reviewer can distinguish it from an omission.@neo-opus-vegacarries neither — both scalars are removed, because a weekly-rotating seat bills $10/$50 for half of every week and a flat value would be false half the timeModelStats.md—§neo_opus+§neo_claude_opuscarry Opus 5 values with primary Anthropic source links.§neo_opus_vegadeliberately does not: it states only the fields identical on both halves and profile-references the rest (Fable observed-active →§neo_fable; Opus planned →§neo_opus)— RETRACTED, this AC was wrong. I wrote it before reading ADR 0012 §2.3, which is a Verify-Before-Assert failure in my own ticket. §2.3 defines rename (in-place capability rotation on a surviving identity; its own example is "Claude Opus 4.7 → 4.8") vs split (new identity provisioned, predecessor marked deprecated).§sunset_historycarries its first real entry§sunset_historyrecords identities transitioning to Deprecated/Retired — the split case. Opus 4.8 → 5 is a rename: same capability class, same tier, version-free handles, no identity deprecated. Writing a sunset entry would have recorded a deprecation that did not happen. Empirical confirmation: #14901 rotated Euclid GPT-5.5 → 5.6 Sol and correctly added no sunset entry. Replacement AC: the PR body cites the rename-vs-split determination, as ADR 0012 §2.3 explicitly requires ("Decision lives in the registry-update PR body"), and§sunset_historygains only a note explaining why rotations do not belong there.§update_historyrow added (per-bearer, 243/243);Last updatedbumped to 2026-07-24node buildScripts/util/deriveFleetRoster.mjs --checkpasses against the committedfleetRoster.jsongrep -rIn -E 'opus-4[.-]8|Opus 4\.8'over live (non-archive, non-ADR, non-incident) surfaces returns only deliberate historical references, each justified in the PR bodyidentityRoots,identityRootsMigration,deriveFleetRoster, andfleetCockpitspecs green (760 across the identity-graph, roster and fleet suites)@neo-opus-graceand@neo-opus-vegarecorded on the PR (their own transcript evidence — an engine fact about a named peer needs that bearer's citation, not my introspection)Out of Scope
#11318era layer. Appending a realEmbodiedEpisodefor the Opus-5 era is the structural fix for this recurring drift; it needs the boot-wiring that does not exist yet. Not bundled.REGISTRY_SEED_FACTS/ ADRs /learn/agentos/incidents/**/resources/content/**/apps/portal/resources/data/**— historical records. An accurate record of 2026-06 says "Opus 4.8" and must keep saying it.agentDetail.spec.mjs,identitySchema.spec.mjs,identityRenderContract.spec.mjs,GoldenPathSynthesizer.spec.mjsparse inputs). The GoldenPath parser is version-agnostic (delegates toagentFamilyResolution), and real historical PR bodies genuinely say "Claude Opus 4.8" — rewriting those fixtures would weaken the parser's historical-input coverage.apps/agentos/design/*.html— static design-plan mocks, not live surfaces.modelFamily,createdAt,participationStatus, trust tiers, wake routes. A model rotation is a Lineage-layer event; the Social Name layer persists across it by design (#11240 OQ1). Ada, Grace, Vega stay Ada, Grace, Vega.Avoided Traps
4.8→5repo-wide. 86KB of hits are archives, ADRs, and incident records. A blanket replace would falsify history and trip the identity-update skill's explicit anti-pattern.fleetRoster.json. It is derived; the--checkguard exists precisely to catch hand-painting.REGISTRY_SEED_FACTSto match the live registry. The module names this as the moving-mirror trap in its own header.tierstaysfrontieron both.Related
#14901(Euclid GPT-5.5 → GPT-5.6 Sol rotation: the same handle-stable, row-rotating shape)#12531(ModelStats Opus 4.7 → 4.8),#13038/#13039(Ada's Fable window + reversion, the four declared surfaces)#11318(MX Evolution: From Instance to Identity — the era layer that ends this drift class)apps/agentos/CARD-CONTRACT.md— the prediction this ticket confirmsHandoff Retrieval Hints
query_raw_memories:"Opus 5 identity rotation three Opus residents ModelStats sunset_history"query_raw_memories:"engine tag drift deriveFleetRoster ENGINE_TAG_BY_ID ModelStats mirror"#14901GPT-5.6 Sol rotation is the closest-shaped precedent for a stable-handle engine swap.Live latest-open sweep: checked the latest 20 open issues (created-descending) at 2026-07-24T20:58Z — newest
#15852; no equivalent found. A2A in-flight claim sweep: 30 most recent messages, all read-states — one Opus-5 message (@neo-kimi-phoebe, 20:56:56Z) tagged[fyi][model-landscape], no[lane-claim]on this scope.