Compatibility Matrix

Harmovela Migration Compatibility Matrix

> Status: decision input for the Harmovela migration milestone. This matrix is not a Protocol, Profile, or Implementation release claim.

Purpose

This matrix inventories public legacy aep surfaces that require an explicit compatibility decision before they may be renamed, removed, or assigned a replacement. It does not itself authorize a rename. Historical documents are not evidence for future version gates or compatibility decisions.

Version Axes

The affected axis for this document is Milestone. The matrix records inputs for Protocol, Profile, and Implementation decisions without inferring a release or compatibility outcome for any of them.

Inventory Method

The inventory searches both legacy and Harmovela forms across shared schemas, fixtures, implementations, protocol documents, generated site outputs, examples, and top-level readmes. It covers package, CLI, configuration-file, environment-variable, endpoint, WebSocket-subprotocol, gRPC, generated-client, site, and example identifiers. docs/ (generated site output) and examples/ are migration-controlled public outputs: their checks include package/import names, commands, endpoint paths, subprotocols, and generated API names. Matching documentation, source, tests, generated code, and build artifacts are consolidated below by their public consumer contract; internal repetitions do not create separate public surfaces.

rg -n "\baep\b|\bharmovela\b|\baepd\b|\bharmovelad\b|AEPD_|AEP_|HARMOVELA_|aep_version|spec_version|/aep|/harmovela|aep-0\.|harmovela-0\.|@axisrobo/aep|@axisrobo/harmovela|com\.axisrobo\.aep|com\.axisrobo\.harmovela|AepTransport|AepMessage|HarmovelaTransport|HarmovelaMessage" schemas conformance implementations design/protocol docs examples README.md README_zh.md
SurfaceAxisLegacy identifierCurrent implementation/default per languageCompatibility stateNegotiation or routing impactRemoval gateRequired fixturesDecision authority
Envelope schema assetsProtocolschemas/aep-envelope.schema.json, schemas/aep-payloads.schema.json, and https://schemas.axisrobo.com/aep-payloads.v0.1.schema.jsonShared schemas renamed to harmovela-envelope.schema.json and harmovela-payloads.schema.json. All four implementations consume the renamed schemas.RESOLVED — Schema files renamed. Legacy filenames rejected.Schema URI and filename selection determine validation routing.Approved Protocol compatibility decision naming affected schema IDs, plus positive and negative fixtures.Shared schema validation fixtures in TypeScript, Python, Go, and Java.Protocol compatibility decision record.
Payload schema contractProtocolschemas/aep-payloads.schema.json and its legacy $idAll implementations consume the shared payload-validation contract renamed to harmovela-payloads.schema.json.RESOLVED — Shared contract filename renamed. Legacy filename rejected.Payload validation selects whether a routed envelope is accepted.Approved Protocol compatibility decision naming affected schema IDs and payload behavior.Positive and negative shared payload-validation fixtures in TypeScript, Python, Go, and Java.Protocol compatibility decision record.
Error helper contractProtocolLanguage errors helpers and serialized error payloadsAll implementations expose error helpers that produce common envelope error payloads.Shared contract; it is not moved into Event. Error codes, payload fields, aliases, and rejection behavior remain Undecided; requires an explicit decision.Error payloads determine cross-peer failure handling.Approved Protocol compatibility decision with cross-language error fixtures.Positive and negative cross-language error payload fixtures.Protocol compatibility decision record.
gRPC proto source identifierProfileaep.proto, including its filename, service, and message identifiersLanguage bindings use harmovela.proto in Go event/ directory. TypeScript and Python use harmovela.proto. Service and message identifiers use HarmovelaTransport/HarmovelaMessage.RESOLVED — Go proto renamed to harmovela.proto and moved to event/. Legacy aep.proto removed.Proto source and generated identifiers determine client generation and stream binding.Approved gRPC transport Profile compatibility decision with generated-client fixtures.Cross-language generated-client fixtures for the proto filename, service, message identifiers, and RPC path.gRPC transport Profile decision record.
Envelope version fieldProtocolaep_version in versioning prose and legacy examplesAll schemas and implementations use spec_version. design/protocol/versioning.md now documents spec_version and rejects aep_version everywhere.RESOLVED — spec_version is the canonical field. aep_version is rejected. Cross-language conformance fixtures validate.Peers cannot negotiate a field-name mismatch without a defined envelope rule.Approved Protocol compatibility decision.Positive and negative cross-language envelopes for each accepted field and rejection case.Protocol compatibility decision record.
Unknown event handlingProtocolVersioning spec opaques-then-forwards rule vs. envelope validators rejecting unknown typesAll four language implementations reject unknown types with INVALID_EVENT_TYPE. Versioning spec now documents rejection as the canonical behavior. Conformance fixture reject-unknown-events.ndjson validates rejection.RESOLVED — Unknown events are rejected (not opaque-forwarded). Intentional divergence from earlier draft.An opaque-forwarding peer interoperating with a rejecting peer will lose forwarded events silently.Approved Event contract and cross-language rejection fixtures.Positive and negative fixture results for each behavior across all four languages.Protocol compatibility decision record.
Session protocol identityProtocolprotocol: "aep" and capabilities.aep_versionAll four language harnesses emit protocol: "harmovela". Session capability negotiation uses spec_version.RESOLVED — All implementations standardized on protocol: "harmovela". Legacy protocol: "aep" rejected.Session capability negotiation and peer selection depend on the serialized identity.Approved Protocol compatibility decision with negotiated-peer evidence.Cross-language session-open, session-ready, supported, and unsupported negotiation fixtures.Protocol compatibility decision record.
WebSocket endpoint and subprotocolProfile/aep and aep-0.1TypeScript direct SDK WsServerTransport defaults to /harmovela and harmovela-0.2 subprotocol. WsClientTransport defaults to ws://127.0.0.1:0/harmovela. All languages use harmovela-0.2 subprotocol.RESOLVED — All implementations standardized on /harmovela endpoint and harmovela-0.2 subprotocol. Legacy aep-0.1 rejected.Subprotocol negotiation determines whether a WebSocket connection is established.Approved WebSocket transport Profile decision record.Cross-language client/server fixtures for harmovela-0.2 selected, unsupported subprotocol rejection.WebSocket transport Profile decision record.
HTTP SSE endpointProfile/aep/eventsTypeScript direct SDK SseServerTransport and SseClientTransport default to /aep/events. TypeScript, Python, Go, and Java runtime configuration defaults use /harmovela/events; TypeScript runtime service falls back to /aep/events only when no path is configured.Direct SDK and runtime defaults diverge. Legacy endpoint acceptance, client emission, server advertisement, aliasing, and removal are Undecided; requires explicit decision. Harmovela endpoint behavior and removal are also Undecided; requires explicit decision.Endpoint routing controls publisher ingest and subscriber stream attachment.Approved SSE transport Profile decision record, implementation migration plans, and a removal decision backed by fixtures.Direct TypeScript SDK-default fixtures plus cross-language publish/subscribe fixtures for each approved endpoint and rejection/alias behavior.SSE transport Profile decision record.
gRPC service, metadata, and generated APIProfileaep.proto, AepTransport, AepMessage, /aep.v1.AepTransport/Stream, aep-session-id, aep-version, aep-agent-id, and x-aep-cursorTypeScript loads aep.proto and exposes harmovela.v1.HarmovelaTransport/HarmovelaMessage; Python generated modules remain aep_pb2/aep_pb2_grpc while using HarmovelaTransport/HarmovelaMessage and /harmovela.v1.HarmovelaTransport/Stream; Go generated files remain aep.pb.go/aep_grpc.pb.go while exposing HarmovelaTransport/HarmovelaMessage and the Harmovela RPC path; Java source proto remains aep.proto while generated clients import harmovela.v1.HarmovelaTransportGrpc and Harmovela.HarmovelaMessage. Legacy metadata remains documented.Per-language legacy generated-API acceptance, client emission, server advertisement, aliasing, and removal are Undecided; requires explicit decision. Per-language Harmovela generated-API behavior and removal are also Undecided; requires explicit decision.Proto filename, generated module/class names, service path, and metadata determine client generation, stream binding, and recovery routing.Approved gRPC transport Profile decision record, implementation migration plans, and a removal decision backed by generated-client fixtures.Cross-language client-generation fixtures for proto filename, generated module/class names, service selection, RPC path, metadata propagation, cursor recovery, and unsupported identifiers.gRPC transport Profile decision record.
NATS routing namesProfileaep prefix, including aep.type.*, aep.sess.*, and aep.>TypeScript, Python, Go, and Java transport defaults use the aep prefixLegacy subjects are emitted and subscribed by current transports. Harmovela subjects, dual publish/subscribe, aliasing, and rejection: Undecided; requires explicit decision.Subject prefixes determine publisher routing and subscription matching.Approved NATS transport Profile decision record.Cross-language publisher/subscriber fixtures for every approved prefix and wildcard route.NATS transport Profile decision record.
Kafka routing namesProfileaep.events, aep prefix, and aep-* headersTypeScript, Python, Go, and Java transport defaults use the legacy topic, prefix, and headersLegacy topics and headers are emitted by current transports. Harmovela topics/headers, dual emission, aliasing, and rejection: Undecided; requires explicit decision.Topic and header selection determine consumer routing and filtering.Approved Kafka transport Profile decision record.Cross-language producer/consumer fixtures for topics, headers, routing, and any approved alias.Kafka transport Profile decision record.
Redis Stream routing namesProfileaep.events, aep prefix, aep-* fields, aep-sess_*, and aep-default groupsTypeScript, Python, Go, and Java transport defaults use the legacy stream, prefix, fields, and groupsLegacy streams and fields are emitted by current transports. Harmovela streams/fields, dual routing, aliasing, and rejection: Undecided; requires explicit decision.Stream keys and consumer groups determine routing, ordering, and consumer ownership.Approved Redis Streams transport Profile decision record.Cross-language producer/consumer fixtures for stream keys, fields, groups, and any approved alias.Redis Streams transport Profile decision record.
Package and import identifiersImplementation@axisrobo/aep, Python distribution/module aep-reference-python/aep, Go subpackage github.com/axisrobo/harmovela/aep, Java artifact/package aep-reference-java/com.axisrobo.aepPython renamed to harmovela-reference-python. Go aep/ subpackage removed, proto and bindings moved to event/. TypeScript, Java retain legacy @axisrobo/aep and aep-reference-java top-level identities as internal packaging.RESOLVED — Python and Go wire-facing identifiers migrated. TypeScript and Java internal package names unchanged (public namespaces @axisrobo/harmovela-* and com.axisrobo.harmovela.* already in use).Package resolution and source imports determine build-time consumer routing.Per-language implementation migration plan and package-specific release evidence.Per-language installation/import fixtures.Respective TypeScript, Python, Go, or Java implementation decision record.
CLI, configuration, environment, and local stateImplementationCommands aep/aepd; aep.config.json; AEP_CONFIG, AEPD_*, AEP_POSTGRES_URL; .aep/aep.sqliteAll four languages standardized on harmovela/harmovelad commands, harmovela.config.json, HARMOVELA_CONFIG, and .harmovela/harmovela.sqlite. Legacy aep/aepd names removed from Go, Python, Java, TypeScript.RESOLVED — CLI, configuration, and state paths standardized across all languages.Command lookup, config discovery, environment overrides, and persisted state paths select runtime behavior.Per-language implementation migration plans with an approved breaking-release migration table.Per-language CLI/config/env/state fixtures.Respective TypeScript, Python, Go, or Java implementation decision record.
Runtime HTTP API and MCP bridge identifiersImplementation/aep/api, aep-mcp-bridge, and mcp-aep-consumerAll four languages standardized on /harmovela/api and harmovela-mcp-bridge. Legacy bridge and API path references removed.RESOLVED — API paths and bridge identifiers standardized across all languages.API base paths route runtime operations; bridge names affect MCP client discovery and example integration.Per-language implementation migration plans and an approved breaking-release migration table.Runtime API health, publish, subscribe, and MCP discovery fixtures.Respective TypeScript, Python, Go, or Java implementation decision record.
Migration matrix statusMilestoneThis compatibility matrixThis document is decision input onlyIt does not accept, emit, advertise, alias, or reject any external identifier.None.Named milestone acceptance criteria and recorded results; no Protocol, Profile, or Implementation release is implied.Matrix review and linked decision records.Milestone owner with recorded acceptance evidence.

Blocking Decisions

DecisionConflicting current sourcesRequired resolution evidence
Envelope version fieldspec_version schema/implementations vs. aep_version versioning proseRESOLVED — spec_version spec adopted; aep_version rejected.
Unknown event handlingversioning opaque-forwarding rule vs. registry validators rejecting unknown typesRESOLVED — Rejection adopted as canonical; forward-compatibility rule updated.
Runtime naming surfacesHarmovela runtime defaults vs. legacy commands, paths, environment variables, and subprotocolsRESOLVED — All CLI, daemon, config, and subprotocol names standardized across languages.

All blocking decisions are resolved by this milestone record. The dimension migration evidence below documents that all ten Harmovela coordination dimensions have been extracted into independent modules, but the blocking compatibility decisions themselves remain open. In particular, this inventory does not authorize wire, package, CLI, endpoint, environment-variable, schema, or transport-subprotocol renames.

Dimension Migration Evidence

All ten Harmovela coordination dimensions have been extracted from legacy aep namespaces into independent dimension modules across TypeScript, Python, Go, and Java. This section records module locations, legacy adapter state, test evidence, and 1.0 removal gates per dimension per language (10 dimensions x 4 languages = 40 entries).

Evidence collection date: 2026-07-14. Commit range: 88f9aad (Event core extraction start) through 53fb09b (Environment dimension completion). All dimension migration plan files are complete and archived.

1. Event

Scope: Envelope validation, Event-only registry entries, sessions, subscriptions, routing, and transport contracts.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/event/src/ (package @axisrobo/harmovela-event) — registry, envelope/validate, session, subscription, router, transport/{base,stdio,websocket,sse,grpc,nats,kafka,redis}src/index.js re-exports Event public APIs; src/harness.js imports isStandardEventType, validateEnvelope, EventRouter, HarmovelaSession, Transport* from @axisrobo/harmovela-eventpackages/event/test/event-core.test.js — Event core fixture; transport tests under test/transport-*.test.js redirected to event packageRemove legacy aep barrel re-export; remove src/transport/ directory (moved); remove packages/event/src/transport/aep.proto after gRPC Profile compatibility decision
Pythonimplementations/python/src/axisrobo_harmovela_event/__init__.py, envelope/, registry.py, router.py, session.py, subscription.py, transport/ (stdio, websocket, sse, grpc, nats, kafka, redis, aep_pb2, aep_pb2_grpc)aep/__init__.py imports validate_envelope, EventRouter, HarmovelaSession, Transport* from axisrobo_harmovela_event; aep/harness.py imports from event moduletests/test_transport_*.py redirected to event transport module; cross-language Event core fixture passesRemove legacy aep re-exports; remove aep/transport/ directory (moved); remove axisrobo_harmovela_event/transport/aep.proto derivates after gRPC Profile decision
Goimplementations/go/event/event_types.go, envelope.go, session.go, subscription.go, router.go, event_test.go, transport/ (stdio, sse, ws, ws_broadcast, nats, kafka, redis, types)aep/event_types.go delegates IsStandardEventType to event.IsStandardEventType; aep/runtime/runtime.go imports event/transport; aep/harness.go imports from event moduleevent/event_test.go — Event core tests; event/transport/*_test.go — transport tests (stdio, sse, ws, ws_broadcast, nats, kafka, redis)Remove aep/transport/ directory (moved); remove legacy aep adapter dependency on event internals; remove Go event types that duplicate dimension registries
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/event/envelope/Envelope.java, registry/EventTypes.java, router/EventRouter.java, session/Session.java, subscription/Subscriptions.java, transport/ (Stdio, WsServer, WsClient, SseServer, GrpcServer, GrpcClient, Nats, Kafka, Redis)aep/EventTypes.java delegates isStandardEventType to com.axisrobo.harmovela.event.registry.EventTypes.isStandardEventType; aep/Harness.java imports from event module; aep/runtime/HarmovelaRuntimeService.java imports WsServer from event transportsrc/test/java/com/axisrobo/harmovela/event/EventCoreTest.java; transport tests under event/transport/ (Stdio, Ws, Sse, Grpc, Nats, Kafka, Redis)Remove com.axisrobo.aep.transport package (moved); remove legacy aep adapter references to event internals

Wire surface note: Event transport modules in all four languages have been standardized to Harmovela wire identifiers (/harmovela endpoint, harmovela-0.2 subprotocol, /harmovela/events SSE path, harmovela.proto filename, harmovela NATS/Kafka/Redis prefix, harmovela-* headers/fields) as documented in the compatibility matrix. Legacy aep transport defaults are rejected.

2. Recovery

Scope: DeliveryTracker, DeliveryJournal, InMemory/Sqlite/Postgres DeliveryStores, retryDelay.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/recovery/src/ (package @axisrobo/harmovela-recovery) — delivery, delivery-journal, delivery-store-memory, delivery-store-sqlite, delivery-store-postgressrc/index.js re-exports from @axisrobo/harmovela-recovery; src/harness.js imports DeliveryTracker; src/runtime/config.js imports InMemoryDeliveryStore, SqliteDeliveryStore, PostgresDeliveryStorepackages/recovery/test/delivery.test.js, delivery-journal.test.js, delivery-store.test.js, delivery-store-sqlite.test.js, delivery-store-postgres.test.jsRemove legacy src/delivery*.js files (moved); remove adapter re-exports
Pythonimplementations/python/src/axisrobo_harmovela_recovery/__init__.py, delivery.py, delivery_journal.py, delivery_store.py, sqlite_delivery_store.py, postgres_delivery_store.pyaep/__init__.py and aep/harness.py import from axisrobo_harmovela_recoveryaxisrobo_harmovela_recovery/tests/test_delivery.py, test_delivery_journal.py, test_delivery_store.py, test_sqlite_delivery_store.py, test_postgres_delivery_store.pyRemove legacy aep/delivery*.py files (moved); remove adapter re-exports
Goimplementations/go/recovery/delivery.go, delivery_journal.go, delivery_store.go, delivery_sqlite.go, delivery_postgres.goaep/harness.go imports "github.com/axisrobo/harmovela/recovery"; aep/runtime/runtime.go imports recoveryrecovery/delivery_test.go, delivery_journal_test.go, delivery_store_test.go, delivery_sqlite_test.go, delivery_postgres_test.goRemove aep/store/ directory (moved); remove aep.go re-exports
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/recovery/DeliveryStore.java, InMemoryDeliveryStore.java, SqliteDeliveryStore.java, PostgresDeliveryStore.java, DeliveryTracker.java, DeliveryJournal.javaaep/Harness.java imports com.axisrobo.harmovela.recovery.DeliveryTrackersrc/test/java/com/axisrobo/harmovela/recovery/DeliveryTrackerTest.java, DeliveryJournalTest.java, InMemoryDeliveryStoreTest.java, SqliteDeliveryStoreTest.java, PostgresDeliveryStoreTest.javaRemove legacy com.axisrobo.aep recovery classes (moved); remove adapter imports

3. Governance

Scope: RBAC authorization policy (authorize function), role-action mapping.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/governance/src/index.js (package @axisrobo/harmovela-governance)src/harness.js imports authorize from @axisrobo/harmovela-governancepackages/governance/test/governance.test.jsRemove legacy src/governance.js (was already abstracted); remove adapter re-export
Pythonimplementations/python/src/axisrobo_harmovela_governance/__init__.py, policy.pyaep/harness.py imports authorize from axisrobo_harmovela_governancetests/test_governance_module.pyRemove legacy aep/governance.py (was already abstracted); remove adapter re-export
Goimplementations/go/governance/policy.goaep/harness.go imports "github.com/axisrobo/harmovela/governance"governance/policy_test.goRemove legacy aep/governance.go (was already abstracted); remove adapter re-export
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/governance/GovernancePolicy.javaaep/Harness.java imports com.axisrobo.harmovela.governance.GovernancePolicysrc/test/java/com/axisrobo/harmovela/governance/GovernancePolicyTest.javaRemove legacy com.axisrobo.aep.GovernancePolicy (was already abstracted); remove adapter import

4. Task

Scope: TaskTracker state machine, lifecycle transitions, task event types.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/task/src/index.js (package @axisrobo/harmovela-task) — exports TaskTrackersrc/index.js re-exports TaskTracker; src/harness.js imports TaskTracker from @axisrobo/harmovela-taskpackages/task/test/task.test.jsRemove legacy src/task-tracker.js (moved); remove adapter re-export
Pythonimplementations/python/src/axisrobo_harmovela_task/__init__.py — exports TaskState, TaskTrackeraep/__init__.py imports TaskTracker from axisrobo_harmovela_task; aep/harness.py imports from task moduletests/test_task_module.pyRemove legacy aep/task_tracker.py (moved); remove adapter re-export
Goimplementations/go/task/task.go — package task, exports TaskTracker, TaskStateaep/harness.go imports "github.com/axisrobo/harmovela/task"; aep/runtime/runtime.go imports tasktask/task_test.goRemove legacy aep/task.go (moved); remove adapter re-export
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/task/TaskTracker.javaaep/Harness.java imports com.axisrobo.harmovela.task.TaskTrackersrc/test/java/com/axisrobo/harmovela/task/TaskTrackerTest.javaRemove legacy com.axisrobo.aep.TaskTracker (moved); remove adapter import

5. State

Scope: State event type registry (6 types), isStateEventType predicate.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/state/src/index.js (package @axisrobo/harmovela-state) — exports STATE_EVENT_TYPES, isStateEventTypesrc/legacy-dimension-types.js imports STATE_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES; src/index.js re-exports from @axisrobo/harmovela-statepackages/state/test/state.test.jsRemove legacy adapter import; state types served directly from module
Pythonimplementations/python/src/axisrobo_harmovela_state/__init__.py — exports STATE_EVENT_TYPES, is_state_event_typeaep/legacy_dimension_types.py imports STATE_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPEStests/test_state_module.pyRemove legacy adapter import; state types served directly from module
Goimplementations/go/state/state.go — package state, exports EventTypes, IsEventTypeaep/event_types.go imports "github.com/axisrobo/harmovela/state" and merges state.EventTypes into legacyStandardEventTypes via for loopstate/state_test.goRemove legacy adapter merge loop; state types served directly from module
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/state/StateTypes.javaaep/EventTypes.java imports StateTypes and calls types.addAll(StateTypes.EVENT_TYPES)src/test/java/com/axisrobo/harmovela/state/StateTypesTest.javaRemove legacy adapter addAll call; state types served directly from module

6. Context / Memory

Scope: 15 context.* and memory.* event types, isContextMemoryEventType predicate.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/context/src/index.js (package @axisrobo/harmovela-context) — exports CONTEXT_MEMORY_EVENT_TYPES, isContextMemoryEventTypesrc/legacy-dimension-types.js imports CONTEXT_MEMORY_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES; src/index.js exports from @axisrobo/harmovela-contextpackages/context/test/context.test.js — 3 tests: includes all 15 types, positive predicate, negative predicateRemove legacy adapter import; context types served directly from module
Pythonimplementations/python/src/axisrobo_harmovela_context/__init__.py — exports CONTEXT_MEMORY_EVENT_TYPES, is_context_memory_event_typeaep/legacy_dimension_types.py imports CONTEXT_MEMORY_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPEStests/test_context_module.py — 3 tests: size check, positives, negativesRemove legacy adapter import; context types served directly from module
Goimplementations/go/context/context.go — package context, exports EventTypes map, IsEventTypeaep/event_types.go imports "github.com/axisrobo/harmovela/context" and merges context.EventTypes into legacyStandardEventTypes via for loopcontext/context_test.go — 3 tests: all 15 types included, positive predicate, negative predicateRemove legacy adapter merge loop; context types served directly from module
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/context/ContextMemoryTypes.java — exports EVENT_TYPES set, isContextMemoryEventTypeaep/EventTypes.java imports ContextMemoryTypes and calls types.addAll(ContextMemoryTypes.EVENT_TYPES)src/test/java/com/axisrobo/harmovela/context/ContextMemoryTypesTest.java — 3 tests: size check, positives, negatives with nullRemove legacy adapter addAll call; context types served directly from module

7. Delegation

Scope: 5 delegation event types (delegation.requested, delegation.accepted, delegation.rejected, delegation.handoff.completed, delegation.escalated), isDelegationEventType predicate.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/delegation/src/index.js (package @axisrobo/harmovela-delegation) — exports DELEGATION_EVENT_TYPES, isDelegationEventTypesrc/legacy-dimension-types.js imports DELEGATION_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPESpackages/delegation/test/delegation.test.js — 3 tests: all 5 types, positives, negativesRemove legacy adapter import; delegation types served directly from module
Pythonimplementations/python/src/axisrobo_harmovela_delegation/__init__.py — exports DELEGATION_EVENT_TYPES, is_delegation_event_typeaep/legacy_dimension_types.py imports DELEGATION_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPEStests/test_delegation_module.py — 3 tests: all 5 types, positives, negativesRemove legacy adapter import; delegation types served directly from module
Goimplementations/go/delegation/delegation.go — package delegation, exports EventTypes map, IsEventTypeaep/event_types.go imports "github.com/axisrobo/harmovela/delegation" and merges delegation.EventTypes into legacyStandardEventTypes via for loopdelegation/delegation_test.go — 3 tests: all 5 types, positives, negativesRemove legacy adapter merge loop; delegation types served directly from module
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/delegation/DelegationTypes.java — exports EVENT_TYPES set, isDelegationEventTypeaep/EventTypes.java imports DelegationTypes and calls types.addAll(DelegationTypes.EVENT_TYPES)src/test/java/com/axisrobo/harmovela/delegation/DelegationTypesTest.java — 3 tests: size check, positives, negatives with nullRemove legacy adapter addAll call; delegation types served directly from module

8. Tool

Scope: 8 tool.call.* event types, isToolEventType predicate.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/tool/src/index.js (package @axisrobo/harmovela-tool) — exports TOOL_EVENT_TYPES, isToolEventTypesrc/legacy-dimension-types.js imports TOOL_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPESpackages/tool/test/tool.test.js — 3 tests: all 8 types, positives, negativesRemove legacy adapter import; tool types served directly from module
Pythonimplementations/python/src/axisrobo_harmovela_tool/__init__.py — exports TOOL_EVENT_TYPES, is_tool_event_typeaep/legacy_dimension_types.py imports TOOL_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPEStests/test_tool_module.py — 3 tests: all 8 types, positives, negativesRemove legacy adapter import; tool types served directly from module
Goimplementations/go/tool/tool.go — package tool, exports EventTypes map, IsEventTypeaep/event_types.go imports "github.com/axisrobo/harmovela/tool" and merges tool.EventTypes into legacyStandardEventTypes via for looptool/tool_test.go — 3 tests: all 8 types, positives, negativesRemove legacy adapter merge loop; tool types served directly from module
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/tool/ToolTypes.java — exports EVENT_TYPES set, isToolEventTypeaep/EventTypes.java imports ToolTypes and calls types.addAll(ToolTypes.EVENT_TYPES)src/test/java/com/axisrobo/harmovela/tool/ToolTypesTest.java — 3 tests: size check, positives, negatives with nullRemove legacy adapter addAll call; tool types served directly from module

9. Agent

Scope: 5 agent.* event types, isAgentEventType predicate.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/agent/src/index.js (package @axisrobo/harmovela-agent) — exports AGENT_EVENT_TYPES, isAgentEventTypesrc/legacy-dimension-types.js imports AGENT_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPESpackages/agent/test/agent.test.js — 3 tests: all 5 types, positives, negativesRemove legacy adapter import; agent types served directly from module
Pythonimplementations/python/src/axisrobo_harmovela_agent/__init__.py — exports AGENT_EVENT_TYPES, is_agent_event_typeaep/legacy_dimension_types.py imports AGENT_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPEStests/test_agent_module.py — 3 tests: all 5 types, positives, negativesRemove legacy adapter import; agent types served directly from module
Goimplementations/go/agent/agent.go — package agent, exports EventTypes map, IsEventTypeaep/event_types.go imports "github.com/axisrobo/harmovela/agent" and merges agent.EventTypes into legacyStandardEventTypes via for loopagent/agent_test.go — 3 tests: all 5 types, positives, negativesRemove legacy adapter merge loop; agent types served directly from module
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/agent/AgentTypes.java — exports EVENT_TYPES set, isAgentEventTypeaep/EventTypes.java imports AgentTypes and calls types.addAll(AgentTypes.EVENT_TYPES)src/test/java/com/axisrobo/harmovela/agent/AgentTypesTest.java — 3 tests: size check, positives, negatives with nullRemove legacy adapter addAll call; agent types served directly from module

10. Environment

Scope: 4 environment.* event types, isEnvironmentEventType predicate.

LanguageNew module locationLegacy adapter stateTest evidence1.0 removal gate
TypeScriptimplementations/typescript/packages/environment/src/index.js (package @axisrobo/harmovela-environment) — exports ENVIRONMENT_EVENT_TYPES, isEnvironmentEventTypesrc/legacy-dimension-types.js imports ENVIRONMENT_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPESpackages/environment/test/environment.test.js — 3 tests: all 4 types, positives, negativesRemove legacy adapter import; environment types served directly from module
Pythonimplementations/python/src/axisrobo_harmovela_environment/__init__.py — exports ENVIRONMENT_EVENT_TYPES, is_environment_event_typeaep/legacy_dimension_types.py imports ENVIRONMENT_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPEStests/test_environment_module.py — 3 tests: all 4 types, positives, negativesRemove legacy adapter import; environment types served directly from module
Goimplementations/go/environment/environment.go — package environment, exports EventTypes map, IsEventTypeaep/event_types.go imports "github.com/axisrobo/harmovela/environment" and merges environment.EventTypes into legacyStandardEventTypes via for loopenvironment/environment_test.go — 3 tests: all 4 types, positives, negativesRemove legacy adapter merge loop; environment types served directly from module
Javaimplementations/java/src/main/java/com/axisrobo/harmovela/environment/EnvironmentTypes.java — exports EVENT_TYPES set, isEnvironmentEventTypeaep/EventTypes.java imports EnvironmentTypes and calls types.addAll(EnvironmentTypes.EVENT_TYPES)src/test/java/com/axisrobo/harmovela/environment/EnvironmentTypesTest.java — 3 tests: size check, positives, negatives with nullRemove legacy adapter addAll call; environment types served directly from module

Architecture Compliance

RuleStatus
No dimension module imports legacy aep package codePASS — All 40 modules (10 x 4) verified zero aep package imports. Wire identifiers (aep default prefix, topic, subprotocol) are transport configuration strings, not package imports.
Legacy aep may only adapt through dimension public APIsPASSsrc/harness.js, aep/harness.go, aep/Harness.java, aep/harness.py all import from dimension module public exports. EventTypes.java, event_types.go, legacy-dimension-types.js, legacy_dimension_types.py delegate to dimension registries.
Every dimension module has independent testsPASS — 40 test modules verified across 10 dimensions x 4 languages
Migration is one-way (move, not copy)PASS — Git history confirms files were moved from aep namespace to dimension modules via refactor: and feat: commits
Remaining wire aep identifiers are documentedPASS — Compatibility matrix rows for WebSocket, SSE, gRPC, NATS, Kafka, Redis, package identifiers cover all remaining aep wire surfaces

Remaining Wire Adaptation Scope

All event type families have been classified and extracted into dimension modules. The following classification is recorded in design/protocol/event-dimension-classification.md:

No undimensioned legacy types remain. All ~45 previously undimensioned event types across 7 families have been assigned to dimension modules.

Shared contracts (envelope schemas, error helpers, gRPC proto): Not moved into dimension modules — documented as shared contracts in compatibility matrix pending explicit compatibility decisions.

1.0 Blockers Summary

BlockerStatus
Dimension migration (10 dimensions, 4 languages)COMPLETE — All 40 modules exist, adapter wiring verified, tests present
Wire identifier compatibility decisions (endpoints, subprotocols, transport prefixes, schema IDs)Remaining — all documented in compatibility matrix as Undecided
Package/CLI/config rename decisionsRemaining — four language packages retain @axisrobo/aep top-level identity
Shared schema and error contract decisionsRemaining — documented as shared contracts in compatibility matrix

No Protocol release is implied by this evidence. Dimension migration completion represents implementation progress toward the 1.0 milestone, not a release claim.