콘텐츠로 이동

Rename Maps

Search here for a name that no longer resolves.

Two refactors renamed a large number of Java symbols. This page is the old-name -> new-name lookup for both, plus the two smaller renames that came with them.

Nothing here is a data migration. Every rename stops at the Java symbol boundary -- the wire format, DDL, channel names, key prefixes and persisted fields were deliberately left alone, and frozen-names.md is the list of what that covers. A node running the new jars interoperates with the stored state and the live traffic of a node running the old ones.

Why this is a document and not a changelog section. It used to live under [Unreleased] in CHANGELOG.md, which is the wrong shelf for it: a changelog entry is written once and never revisited, while this table is consulted long after the release that produced it and grows whenever another rename lands. Left where it was, the first release to ship would have buried it under a version heading, and every citation of it would have become "go read the 0.2.0 section" -- getting worse with each release. Adding to it is required rather than optional; see MAINTAINERS.md.


Conversation / AgentSessionSessionRecord / LiveSession

The persistent aggregate was called Conversation and the node-local handle that ran turns against it was called AgentSession. Both names were wrong in a way that cost data: "session" is what a user resumes across a restart, so state that had to survive eviction kept getting parked on the thing named Session* — the handle that dies with the process.

Neither lifetime is called Session. Session and AgentSession are both banned as type names, enforced by SessionNamingArchitectureTest (production classes only). The rule bans the names, not the token — SessionRecord, SessionTotals and LiveSessionStatus are all correct. The payoff is in prose: with no type called Session, the phrase "the session" in a comment has no referent to be quietly wrong about.

"Conversation" is not a retired word. It was demoted from a lifetime word to the LLM message-exchange word and stays in that role — SessionSnapshot.getConversationHistory(), /compact's "Conversation compacted", the summarization prompt. A new type about message history should be Transcript*; a new type about lifetime should be Session*.

The durable record and its stores

Old New
Conversation SessionRecord
ConversationView SessionRecordView
ConversationRepository SessionRecordStore
InMemoryConversationRepository InMemorySessionRecordStore
ConversationId SessionId
ConversationTotals SessionTotals
ConversationStore SessionStore
DefaultConversationStore DefaultSessionStore
ConversationLeaseStore SessionLeaseStore
InMemoryConversationLeaseStore InMemorySessionLeaseStore
ConversationLease SessionLease
ConversationCheckpointMailbox SessionCheckpointMailbox
ConversationLeaseException SessionLeaseException
ConversationNotHeldException SessionNotHeldException

The transcript — types about message history took transcript vocabulary rather than Session*.

Old New
ConversationTranscript SessionTranscript
ConversationSnapshot SessionSnapshot
ConversationMemory TranscriptBuffer
ConversationManager TranscriptManager
DefaultConversationManager DefaultTranscriptManager

The node-local handle and multi-node routing

Old New
AgentSession LiveSession
DefaultAgentSession DefaultLiveSession
AgentSessionFactory LiveSessionFactory
AgentSessionOptions LiveSessionOptions
AgentSessionStatus LiveSessionStatus
AgentSessionOpener LiveSessionOpener
LocalSessionCache LiveSessionCache
AgentSessionManager SessionRouter
DefaultAgentSessionManager DefaultSessionRouter
AgentSessionManagerBuilder SessionRouterBuilder
AgentSessionManagerConfig SessionRouterConfig

AgentSessionManager became SessionRouter rather than LiveSessionManager because what it manages is not the handles — it routes a request for a session to whichever node holds it, and the local handle cache is one collaborator among several.

Inbox, signals and leases per backend

Old New
ConversationInbox SessionInbox
InMemoryConversationInbox / MongoConversationInbox / PostgresConversationInbox / RedisConversationInbox InMemorySessionInbox / MongoSessionInbox / PostgresSessionInbox / RedisSessionInbox
ConversationInboxException SessionInboxException
ConversationSignal / ConversationSignalBus SessionSignal / SessionSignalBus
MongoConversationSignalBus / PostgresConversationSignalBus MongoSessionSignalBus / PostgresSessionSignalBus
ConversationSignalBusException SessionSignalBusException
ConversationSignalCodec / ConversationSignalRowCodec SessionSignalCodec / SessionSignalRowCodec
MongoConversationLock / PostgresConversationLock / RedisConversationLock MongoSessionLeaseStore / PostgresSessionLeaseStore / RedisSessionLeaseStore

Subagent transcript snapshots

Old New
ConversationSnapshotStore SessionSnapshotStore
InMemoryConversationSnapshotStore InMemorySessionSnapshotStore
VfsConversationSnapshotStore VfsSessionSnapshotStore
ScopedConversationSnapshotStore ScopedSessionSnapshotStore
ConversationSnapshotCodec SessionSnapshotCodec
JsonConversationSnapshotCodec JsonSessionSnapshotCodec
ConversationCodecException SessionSnapshotCodecException
ResumableConversation ResumableSession

Packages (import-breaking)

Old New
at.aimon.core.agent.conversation split into at.aimon.core.agent.session.store (record, lease, totals, mailbox) and at.aimon.core.agent.session.transcript (transcript, snapshot, buffer, manager)
at.aimon.core.agent.conversation.store at.aimon.core.agent.session.store
at.aimon.core.agent.conversation.exception at.aimon.core.agent.session.exception
at.aimon.core.skill.policy.conversation at.aimon.core.skill.policy.session

The agent.conversation package no longer exists. SessionId moved up to at.aimon.core.agent.session — it is the join key both lifetimes share.

Accessors and methods

Old New
getConversationId() getSessionId() — on every event, envelope, request, context and query that carried it
getConversationIdValue() getSessionIdValue()
getConversationTotals() / setConversationTotals(...) getSessionTotals() / setSessionTotals(...)
ConversationRepository.listConversationIds() SessionRecordStore.listSessionIds()
SessionRouter.deleteConversation(...) / releaseConversation(...) / yieldConversation(...) deleteSession(...) / releaseSession(...) / yieldSession(...)
interrupt(conversationId, [turnId,] reason) interrupt(sessionId, [turnId,] reason)
getConversationMemory() getTranscriptBuffer()
getConversationManager() getTranscriptManager()
CommandExecutionContext.Builder.sessionContext(...) transcriptBuffer(...) — the setter lied about both the type and the scope
OrcaAgentExecutionRequest.Builder.previousConversation(...) / getPreviousConversation() previousSnapshot(...) / getPreviousSnapshot()
OrcaAgentExecutionResult.getConversation() getSnapshot()
getInvokingConversationId() / builder invokingConversationId(...) getInvokingSessionId() / invokingSessionId(...)
purgeConversationApprovals(...) purgeSessionApprovals(...)
getConversationApprovalStore() / withConversationApprovalStore(...) getSessionApprovalStore() / withSessionApprovalStore(...)
getConversationSnapshotStore() / withConversationSnapshotStoreFactory(...) getSessionSnapshotStore() / withSessionSnapshotStoreFactory(...)
maxTrackedConversations(...) maxTrackedSessions(...)
ToolContextKeys.CONVERSATION_ID / INVOKING_CONVERSATION_ID SESSION_ID / INVOKING_SESSION_ID (key strings frozen)

AgentExecutionContextAgentRuntime

AgentExecutionContext read like a per-execution value. It is the opposite: exactly one instance lives per (Agent, discriminator), owns the agent's long-lived machinery (ToolRegistry, HookRegistry, McpClientManager, MCP connections), and survives every session running against that agent.

Old New
AgentExecutionContext AgentRuntime
AgentExecutionContextId AgentRuntimeId
AgentExecutionContextRegistry AgentRuntimeRegistry
DefaultAgentExecutionContextRegistry DefaultAgentRuntimeRegistry
OrcaAgentExecutionContext OrcaAgentRuntime
OrcaAgentExecutionContextFactory OrcaAgentRuntimeFactory
OrcaAgentExecutionContextManager OrcaAgentRuntimeManager
AgentExecutionHookRegistrar AgentRuntimeHookRegistrar
RewakeCapableContext RewakeCapableRuntime
ContextScoped AgentScoped

AgentRuntimeId keeps its format and factories: agent:<name> / agent:<name>:<discriminator>, issued via from(Agent) / from(Agent, String). There is still no generate().

Old New
getContextId() / getExecutionContextId() / getAgentExecutionContextId() getAgentRuntimeId() — on AgentExecutionEvent, BackgroundTask, OnSessionStartContext, OnSessionEndContext, PendingTurn, QueuedInput, ResumableSession, RewakeEnvelope, RunQuery, SkillInvocationRequest, SubagentExecutionContext, SubagentExecutionEnvironment, TaskQuery, ToolContextEnrichmentInfo, WorkflowRun
ScheduledTask.getBoundContextId() / Builder.boundContextId(...) getBoundRuntimeId() / Builder.boundRuntimeId(...)
Builder setters contextId(...) / executionContextId(...) / agentExecutionContextId(...) agentRuntimeId(...)
OrcaAgentRuntimeManager.getOrCreateContext(...) / getContext(...) / destroyContext(...) getOrCreateRuntime(...) / getRuntime(...) / destroyRuntime(...)
SchedulingEngineBuilder.contextRegistry(...) agentRuntimeRegistry(...)
OrcaAgentRuntimeManager.Builder.contextRegistry(...) / contextFactory(...) agentRuntimeRegistry(...) / agentRuntimeFactory(...)
AgentSetupFactory.Builder.contextRegistry(...) agentRuntimeRegistry(...)
TaskQuery.byContext(...) / RunQuery.byContext(...) byAgentRuntime(...)
PendingTurnRegistry.listByContext(...) listByAgentRuntime(...)

Also renamed for the same reason: SessionContextAgentEnvironmentSnapshot, SessionContextProviderAgentEnvironmentSnapshotProvider, DefaultSessionContextProviderDefaultAgentEnvironmentSnapshotProvider, all moved from at.aimon.core.agent.session to at.aimon.core.agent. The type was never session-scoped — it is memoized by AgentRuntimeId. Likewise RenderContext.getSessionId()getAgentRuntimeId() and the skill-body variable ${AIMON_SESSION_ID}${AIMON_AGENT_RUNTIME_ID}; the old accessor and setter remain as @Deprecated delegates onto the same field. This value is agent-scoped — do not use it as a per-run discriminator; use ${AIMON_EXECUTION_ID}.

AIMON_AGENT_RUNTIME_ID is the env var exported to declarative shell hooks. The old AIMON_AGENT_EXECUTION_CONTEXT_ID is still exported alongside it with the same value; the constant is @Deprecated and the alias will be dropped in a future release.

Deliberately not renamed: the generic String scope keys on TodoRepository, KnowledgeScope, WikiScope and ScopeFilter are not AgentRuntimeIds and keep getContextId(); ToolContext, ToolExecutionContext and SubagentExecutionContext are different concepts.

Skill approval stores — the name SessionApprovalStore is reused

Read this table before trusting a memory of that name. It first belonged to the agent-scoped store, was freed by renaming that store to AgentApprovalStore, and then taken by the new session-scoped one.

Old New Keyed by
SessionApprovalStore (…skill.policy.session, the agent-wide one) AgentApprovalStore (…skill.policy.agent) AgentRuntimeId
InMemorySessionApprovalStore (likewise) InMemoryAgentApprovalStore AgentRuntimeId
SessionAwareSkillInvocationPolicy ApprovalCachingSkillInvocationPolicy
ConversationApprovalStore SessionApprovalStore (…skill.policy.session) SessionId
InMemoryConversationApprovalStore InMemorySessionApprovalStore SessionId
ConversationAwareSkillInvocationPolicy SessionScopedSkillInvocationPolicy
ApprovalScope.CONVERSATION ApprovalScope.SESSION
InvokingConversationAccess InvokingSessionAccess
OrcaAgentRuntimeFactory.withSessionApprovalStore(...) (agent-wide) withAgentApprovalStore(...)
OrcaProviderDependencies.getSessionApprovalStore() / sessionApprovalStore(...) (agent-wide) getAgentApprovalStore() / agentApprovalStore(...)

Approval semantics did not change: y is scoped to the session, a (or --agent) to the whole agent with no TTL and no clearing on /clear, /revoke clears the narrow scope and /revoke --agent clears both.

The session SPIs moved into aimon-core, and the module is now aimon-session-routing

aimon-session-base held two unrelated things: multi-node routing, and five storage SPIs a distributed session needs. Every SPI in the second group is keyed by SessionId and names nothing routing owns, yet aimon-session-{redis,postgres,mongodb} each depended on the routing module purely to see them. After the move all three have zero references to routing in main sources and demote it to testImplementation; routing itself loses its last Jackson usage.

Was Is
at.aimon.session.base.spi.SessionRecordCodec at.aimon.core.agent.session.store.SessionRecordCodec
at.aimon.session.base.spi.StoredSessionRecord at.aimon.core.agent.session.store.StoredSessionRecord
at.aimon.session.base.spi.StoredAgentExecutionResult at.aimon.core.agent.session.store.StoredAgentExecutionResult
at.aimon.session.base.spi.SessionInbox at.aimon.core.agent.session.inbox.SessionInbox
at.aimon.session.base.inbox.InboundMessage at.aimon.core.agent.session.inbox.InboundMessage
at.aimon.session.base.inbox.InboundMessageId at.aimon.core.agent.session.inbox.InboundMessageId
at.aimon.session.base.spi.inmemory.InMemorySessionInbox at.aimon.core.agent.session.inbox.InMemorySessionInbox
at.aimon.session.base.spi.SessionSignal at.aimon.core.agent.session.signal.SessionSignal
at.aimon.session.base.spi.SessionSignalBus at.aimon.core.agent.session.signal.SessionSignalBus
at.aimon.session.base.spi.inmemory.InMemorySignalBus at.aimon.core.agent.session.signal.InMemorySignalBus
at.aimon.session.base.spi.IdempotencyStore at.aimon.core.agent.session.idempotency.IdempotencyStore
at.aimon.session.base.spi.IdempotencyEntry at.aimon.core.agent.session.idempotency.IdempotencyEntry
at.aimon.session.base.spi.PutResult at.aimon.core.agent.session.idempotency.PutResult
at.aimon.session.base.spi.inmemory.InMemoryIdempotencyStore at.aimon.core.agent.session.idempotency.InMemoryIdempotencyStore
at.aimon.session.base.exception.IdempotencyConflictException at.aimon.core.agent.session.exception.IdempotencyConflictException
at.aimon.session.base.exception.IdempotencyStoreException at.aimon.core.agent.session.exception.IdempotencyStoreException
at.aimon.session.base.exception.SessionInboxException at.aimon.core.agent.session.exception.SessionInboxException
at.aimon.session.base.exception.SessionSignalBusException at.aimon.core.agent.session.exception.SessionSignalBusException

What remains — SessionRouter, LiveSessionCache, LiveSessionOpener, SessionRouterBuilder, SubmitRequest, SubmitDisposition, ClusterSessionStatus, DeploymentMode, SessionMetrics — keeps its simple names and moves package at.aimon.session.baseat.aimon.session.routing. This is the module's second rename and not a wobble: aimon-session-webaimon-session-base said only what the module was not; routing is the first name that describes its contents.


Memory moves to a service-tier backend seam

The mistake being corrected is a name that described the one backend that happened to exist rather than the thing being named. The seam is now PeerMemory and its five capability tiers; the storage interfaces keep every signature and become the default backend's materials. Design: pluggable-memory-backend.md.

Old New Value
RepresentationMemoryContextProvider (aimon-core) SnapshotMemoryContextProvider
MemoryAssembly.CAPABILITY_WRITE_PATH (aimon-bootstrap) MemoryAssembly.CAPABILITY_INGEST "memory-write-path""memory-ingest"

Representation is a type only the store-backed backend has — a backend that computes its snapshot on read never materializes one — so a class named after it was named after an implementation detail of one backend. The constructor now takes a MemorySnapshotReader; SnapshotMemoryContextProvider.readerOver(representationStore) builds one for callers assembling the default backend by hand.

The degradation key changed value as well as name, because "write path" named a direction while the thing that is missing is a capability — INGEST — that now has four siblings with keys of their own (memory-snapshot, memory-search, memory-chat, memory-observe). It counts as public API because a deployment reads it back with stack.degradations().has(...); in-tree every reference went through the constant, so nothing here broke, and what breaks is external code that hard-codes the literal. Degradation keys are not in frozen-names.md: they live only as long as the process and are never stored.


ModelCapabilities.lowestReasoningEffort() becomes acceptedReasoningEfforts()

The mistake being corrected is a name that described a boundary while the thing being described is a set. It cost an HTTP 400: gpt-5.6-terra rejects minimal and accepts none, so its ladder has a gap in the middle and no single floor states it. Design: request-parameters.md §4.2.

Old New Value
ModelCapabilities.lowestReasoningEffort() (aimon-core) ModelCapabilities.acceptedReasoningEfforts() ReasoningEffortSet<ReasoningEffort>

The setter of the same name survives, and is not a rename. ModelCapabilities.Builder.lowestReasoningEffort(X) keeps its signature and becomes shorthand for "the ladder starts at X and runs to the top", which is what every row that uses it always meant. So do both configuration keys — llm.modelCapabilities.<m>.lowestReasoningEffort and aimon.llm.model-capabilities.<m>.lowest-reasoning-effort — and that is a decision rather than inertia: the starter ignores an unknown property in silence, so renaming the key would have made every deployment that declared it lose the declaration without a word. Each gains a sibling, acceptedReasoningEfforts, for a ladder that cannot be written as a floor.

There is no adapter. A caller reading the removed getter fails to compile, which is the outcome to want: the expression a floor invites is the one that produced the 400, and a getter returning min(set) would keep it reachable under a new spelling. docs/project/api-stability.md §5 permits the break and records that going in one step is this repository's habit for 0.x.


The file memory backend moves into aimon-core

aimon-memory-file stopped being a module. Its classes are unchanged -- same names, same signatures, same JSONL on disk -- and they now live in aimon-core under at.aimon.core.memory.file, beside the InMemory*Stores they are the durable counterpart to.

This is a package move, not a redesign, and it happened for a subtractive reason: the two distributed memory backends (aimon-memory-mongodb, aimon-memory-postgres) were removed rather than moved, leaving one node-local store implementation alone in a module of its own. Distributed memory is now a separate service consumed through PeerMemory (aimon-memory); see ../design/memory/pluggable-memory-backend.md §4.3.

Old New
at.aimon.memory.file.FileObservationStore at.aimon.core.memory.file.FileObservationStore
at.aimon.memory.file.FileRepresentationStore at.aimon.core.memory.file.FileRepresentationStore
at.aimon.memory.file.FileWorkspaceStore at.aimon.core.memory.file.FileWorkspaceStore
at.aimon.memory.file.FileMemoryMaintenanceScheduler at.aimon.core.memory.file.FileMemoryMaintenanceScheduler
at.aimon.memory.file.Compactable at.aimon.core.memory.file.Compactable
at.aimon.memory.file.internal.* at.aimon.core.memory.file.internal.*
dependency at.aimon.core:aimon-memory-file none -- it is in at.aimon.core:aimon-core

Not at.aimon.core.memory.impl.file, and that is a decision rather than an oversight -- the memory domain has no .impl split at all today (InMemory*Store and StoreBackedPeerMemory sit in at.aimon.core.memory), aimon-cli still assembles these classes by name, and an .impl package with no ArchUnit rule behind it is a label rather than a boundary. The reasoning, and the fact that this package joins the eventual .impl move rather than pre-empting it, is in that design document's §4.2.

Nothing on disk changed. A log written by aimon-memory-file is read by this package without conversion: the JSON Lines format, the field names inside each record, the sidecar <log>.lock, and the compaction temp-file swap are all identical. That is the usual rule here -- see frozen-names.md -- applied to a file format instead of a DDL.


aimon-browser-playwright moved to its own repository

Same shape as the sandbox section below, one module instead of three. aimon-browser-playwright is alive in aimon-browser with every .java file byte for byte, the package still at.aimon.browser.playwright.*, and the Browser tool keeping its name, input schema, ToolContext keys and permission rule. Only the Maven coordinate changed.

Through 0.2.4 From now
at.aimon.core:aimon-browser-playwright at.aimon.browser:aimon-browser-playwright

at.aimon.core:aimon-browser-playwright:0.2.4 stays on Central and keeps resolving; it receives no further releases. Nothing migrates — the module stores nothing.

What did not move is the part worth knowing about. SsrfGuard (at.aimon.core.tools.web.security) and ContentExtractor (at.aimon.core.tools.web.fetch) stay here, shared between WebFetchTool and the browser tool. Both are public API by the package rule in ../project/api-stability.md §2, so the browser repository depends on them legitimately. But SsrfGuard is a security control, and the split turned an in-repository shared class into a cross-repository contract: a hole fixed here reaches the browser tool only after a release of this repository, and until that repository raises its aimon-core line the two run different SSRF defences. Do not fork the guard — a second copy of an SSRF allowlist is a second copy that goes stale silently.

The browser tier moved with the module, and that was the point: playwrightTest was a CI step and a release gate task here, carrying a browser cache, a version-resolution guard and a 94-second cold Chromium install for a module nothing in this build depended on. scripts/release.sh now asks for a Docker daemon and nothing else.


The sandbox modules moved to their own repository

Searching for aimon-sandbox in this build finds nothing, and unlike the two rows below that is not because anything was deleted. All three modules — aimon-sandbox, aimon-sandbox-docker, aimon-sandbox-kubernetes — are alive in aimon-sandbox, with every .java file byte for byte as it was. The Java package did not move: it is still at.aimon.sandbox.*, the SandboxBackend SPI keeps every signature, and the four tools keep their names, their input schemas and their ToolContext keys. Only the Maven coordinate changed.

Through 0.2.4 From now
at.aimon.core:aimon-sandbox at.aimon.sandbox:aimon-sandbox
at.aimon.core:aimon-sandbox-docker at.aimon.sandbox:aimon-sandbox-docker
at.aimon.core:aimon-sandbox-kubernetes at.aimon.sandbox:aimon-sandbox-kubernetes

IMPORTANT: this is neither a rename nor a removal, and the difference matters in both directions. The old coordinates are not withdrawn — at.aimon.core:aimon-sandbox:0.2.4 and its two backends stay on Central and keep resolving — so a build that never updates keeps working; they simply receive no further releases. And nothing needs migrating, because there is nothing stored: unlike the memory modules below, these three own no tables, no collections and no file format. Moving is one line per dependency, and the version restarts at 0.1.0 because the new group id has no release history of its own.

The aimon-core BOM no longer manages these three, which follows from how it is built rather than from a decision about them: it derives its constraints from the subprojects of this build that publish. A consumer that took their version from the BOM now writes it out, or takes it from the new repository — which publishes no BOM, on the grounds that three coordinates, two of which carry the third on api, do not earn one.

What stayed behind is one line of enforcement. at.aimon.sandbox.. is still in the forbidden-package list of ArchitectureRulesTest.coreHasNoSiblingModuleDependencies, beside at.aimon.memory.., so the dependency cannot start running the other way now that satisfying it would only take a coordinate from Central. The design document went with the code, from docs/design/integration/sandbox.md to docs/design/sandbox.md there.

Two memory backend modules were removed, not renamed

Searching for these will find nothing, and that is the answer rather than a missing row:

Gone What took its place
aimon-memory-postgres (at.aimon.memory.postgres.*) aimon-memory: aimon-memory-store for the tables, aimon-memory-worker for PostgresDerivationQueueManager's queue, pgvector for KnowledgeStoreOutboxRelay's index
aimon-memory-mongodb (at.aimon.memory.mongodb.*) the same service

IMPORTANT: this is removal, not migration. Every other table on this page is a rename that left the stored data alone; this one leaves no stored data to read. The service's schema is a different design keyed on (workspace, observer, observed), and nothing migrates mem_* into it. A deployment on either module keeps running on the last release that contained it, or starts empty on the service.