> Status: decision input for the Harmovela migration milestone. This matrix is not a Protocol, Profile, or Implementation release claim.
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.
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.
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
| Surface | Axis | Legacy identifier | Current implementation/default per language | Compatibility state | Negotiation or routing impact | Removal gate | Required fixtures | Decision authority |
|---|---|---|---|---|---|---|---|---|
| Envelope schema assets | Protocol | schemas/aep-envelope.schema.json, schemas/aep-payloads.schema.json, and https://schemas.axisrobo.com/aep-payloads.v0.1.schema.json | Shared 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 contract | Protocol | schemas/aep-payloads.schema.json and its legacy $id | All 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 contract | Protocol | Language errors helpers and serialized error payloads | All 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 identifier | Profile | aep.proto, including its filename, service, and message identifiers | Language 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 field | Protocol | aep_version in versioning prose and legacy examples | All 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 handling | Protocol | Versioning spec opaques-then-forwards rule vs. envelope validators rejecting unknown types | All 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 identity | Protocol | protocol: "aep" and capabilities.aep_version | All 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 subprotocol | Profile | /aep and aep-0.1 | TypeScript 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 endpoint | Profile | /aep/events | TypeScript 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 API | Profile | aep.proto, AepTransport, AepMessage, /aep.v1.AepTransport/Stream, aep-session-id, aep-version, aep-agent-id, and x-aep-cursor | TypeScript 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 names | Profile | aep prefix, including aep.type.*, aep.sess.*, and aep.> | TypeScript, Python, Go, and Java transport defaults use the aep prefix | Legacy 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 names | Profile | aep.events, aep prefix, and aep-* headers | TypeScript, Python, Go, and Java transport defaults use the legacy topic, prefix, and headers | Legacy 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 names | Profile | aep.events, aep prefix, aep-* fields, aep-sess_*, and aep-default groups | TypeScript, Python, Go, and Java transport defaults use the legacy stream, prefix, fields, and groups | Legacy 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 identifiers | Implementation | @axisrobo/aep, Python distribution/module aep-reference-python/aep, Go subpackage github.com/axisrobo/harmovela/aep, Java artifact/package aep-reference-java/com.axisrobo.aep | Python 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 state | Implementation | Commands aep/aepd; aep.config.json; AEP_CONFIG, AEPD_*, AEP_POSTGRES_URL; .aep/aep.sqlite | All 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 identifiers | Implementation | /aep/api, aep-mcp-bridge, and mcp-aep-consumer | All 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 status | Milestone | This compatibility matrix | This document is decision input only | It 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. |
| Decision | Conflicting current sources | Required resolution evidence |
|---|---|---|
| Envelope version field | spec_version schema/implementations vs. aep_version versioning prose | RESOLVED — spec_version spec adopted; aep_version rejected. |
| Unknown event handling | versioning opaque-forwarding rule vs. registry validators rejecting unknown types | RESOLVED — Rejection adopted as canonical; forward-compatibility rule updated. |
| Runtime naming surfaces | Harmovela runtime defaults vs. legacy commands, paths, environment variables, and subprotocols | RESOLVED — 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.
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.
Scope: Envelope validation, Event-only registry entries, sessions, subscriptions, routing, and transport contracts.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/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-event | packages/event/test/event-core.test.js — Event core fixture; transport tests under test/transport-*.test.js redirected to event package | Remove legacy aep barrel re-export; remove src/transport/ directory (moved); remove packages/event/src/transport/aep.proto after gRPC Profile compatibility decision |
| Python | implementations/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 module | tests/test_transport_*.py redirected to event transport module; cross-language Event core fixture passes | Remove legacy aep re-exports; remove aep/transport/ directory (moved); remove axisrobo_harmovela_event/transport/aep.proto derivates after gRPC Profile decision |
| Go | implementations/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 module | event/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 |
| Java | implementations/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 transport | src/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.
Scope: DeliveryTracker, DeliveryJournal, InMemory/Sqlite/Postgres DeliveryStores, retryDelay.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/recovery/src/ (package @axisrobo/harmovela-recovery) — delivery, delivery-journal, delivery-store-memory, delivery-store-sqlite, delivery-store-postgres | src/index.js re-exports from @axisrobo/harmovela-recovery; src/harness.js imports DeliveryTracker; src/runtime/config.js imports InMemoryDeliveryStore, SqliteDeliveryStore, PostgresDeliveryStore | packages/recovery/test/delivery.test.js, delivery-journal.test.js, delivery-store.test.js, delivery-store-sqlite.test.js, delivery-store-postgres.test.js | Remove legacy src/delivery*.js files (moved); remove adapter re-exports |
| Python | implementations/python/src/axisrobo_harmovela_recovery/ — __init__.py, delivery.py, delivery_journal.py, delivery_store.py, sqlite_delivery_store.py, postgres_delivery_store.py | aep/__init__.py and aep/harness.py import from axisrobo_harmovela_recovery | axisrobo_harmovela_recovery/tests/test_delivery.py, test_delivery_journal.py, test_delivery_store.py, test_sqlite_delivery_store.py, test_postgres_delivery_store.py | Remove legacy aep/delivery*.py files (moved); remove adapter re-exports |
| Go | implementations/go/recovery/ — delivery.go, delivery_journal.go, delivery_store.go, delivery_sqlite.go, delivery_postgres.go | aep/harness.go imports "github.com/axisrobo/harmovela/recovery"; aep/runtime/runtime.go imports recovery | recovery/delivery_test.go, delivery_journal_test.go, delivery_store_test.go, delivery_sqlite_test.go, delivery_postgres_test.go | Remove aep/store/ directory (moved); remove aep.go re-exports |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/recovery/ — DeliveryStore.java, InMemoryDeliveryStore.java, SqliteDeliveryStore.java, PostgresDeliveryStore.java, DeliveryTracker.java, DeliveryJournal.java | aep/Harness.java imports com.axisrobo.harmovela.recovery.DeliveryTracker | src/test/java/com/axisrobo/harmovela/recovery/DeliveryTrackerTest.java, DeliveryJournalTest.java, InMemoryDeliveryStoreTest.java, SqliteDeliveryStoreTest.java, PostgresDeliveryStoreTest.java | Remove legacy com.axisrobo.aep recovery classes (moved); remove adapter imports |
Scope: RBAC authorization policy (authorize function), role-action mapping.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/governance/src/index.js (package @axisrobo/harmovela-governance) | src/harness.js imports authorize from @axisrobo/harmovela-governance | packages/governance/test/governance.test.js | Remove legacy src/governance.js (was already abstracted); remove adapter re-export |
| Python | implementations/python/src/axisrobo_harmovela_governance/ — __init__.py, policy.py | aep/harness.py imports authorize from axisrobo_harmovela_governance | tests/test_governance_module.py | Remove legacy aep/governance.py (was already abstracted); remove adapter re-export |
| Go | implementations/go/governance/ — policy.go | aep/harness.go imports "github.com/axisrobo/harmovela/governance" | governance/policy_test.go | Remove legacy aep/governance.go (was already abstracted); remove adapter re-export |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/governance/GovernancePolicy.java | aep/Harness.java imports com.axisrobo.harmovela.governance.GovernancePolicy | src/test/java/com/axisrobo/harmovela/governance/GovernancePolicyTest.java | Remove legacy com.axisrobo.aep.GovernancePolicy (was already abstracted); remove adapter import |
Scope: TaskTracker state machine, lifecycle transitions, task event types.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/task/src/index.js (package @axisrobo/harmovela-task) — exports TaskTracker | src/index.js re-exports TaskTracker; src/harness.js imports TaskTracker from @axisrobo/harmovela-task | packages/task/test/task.test.js | Remove legacy src/task-tracker.js (moved); remove adapter re-export |
| Python | implementations/python/src/axisrobo_harmovela_task/__init__.py — exports TaskState, TaskTracker | aep/__init__.py imports TaskTracker from axisrobo_harmovela_task; aep/harness.py imports from task module | tests/test_task_module.py | Remove legacy aep/task_tracker.py (moved); remove adapter re-export |
| Go | implementations/go/task/task.go — package task, exports TaskTracker, TaskState | aep/harness.go imports "github.com/axisrobo/harmovela/task"; aep/runtime/runtime.go imports task | task/task_test.go | Remove legacy aep/task.go (moved); remove adapter re-export |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/task/TaskTracker.java | aep/Harness.java imports com.axisrobo.harmovela.task.TaskTracker | src/test/java/com/axisrobo/harmovela/task/TaskTrackerTest.java | Remove legacy com.axisrobo.aep.TaskTracker (moved); remove adapter import |
Scope: State event type registry (6 types), isStateEventType predicate.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/state/src/index.js (package @axisrobo/harmovela-state) — exports STATE_EVENT_TYPES, isStateEventType | src/legacy-dimension-types.js imports STATE_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES; src/index.js re-exports from @axisrobo/harmovela-state | packages/state/test/state.test.js | Remove legacy adapter import; state types served directly from module |
| Python | implementations/python/src/axisrobo_harmovela_state/__init__.py — exports STATE_EVENT_TYPES, is_state_event_type | aep/legacy_dimension_types.py imports STATE_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPES | tests/test_state_module.py | Remove legacy adapter import; state types served directly from module |
| Go | implementations/go/state/state.go — package state, exports EventTypes, IsEventType | aep/event_types.go imports "github.com/axisrobo/harmovela/state" and merges state.EventTypes into legacyStandardEventTypes via for loop | state/state_test.go | Remove legacy adapter merge loop; state types served directly from module |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/state/StateTypes.java | aep/EventTypes.java imports StateTypes and calls types.addAll(StateTypes.EVENT_TYPES) | src/test/java/com/axisrobo/harmovela/state/StateTypesTest.java | Remove legacy adapter addAll call; state types served directly from module |
Scope: 15 context.* and memory.* event types, isContextMemoryEventType predicate.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/context/src/index.js (package @axisrobo/harmovela-context) — exports CONTEXT_MEMORY_EVENT_TYPES, isContextMemoryEventType | src/legacy-dimension-types.js imports CONTEXT_MEMORY_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES; src/index.js exports from @axisrobo/harmovela-context | packages/context/test/context.test.js — 3 tests: includes all 15 types, positive predicate, negative predicate | Remove legacy adapter import; context types served directly from module |
| Python | implementations/python/src/axisrobo_harmovela_context/__init__.py — exports CONTEXT_MEMORY_EVENT_TYPES, is_context_memory_event_type | aep/legacy_dimension_types.py imports CONTEXT_MEMORY_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPES | tests/test_context_module.py — 3 tests: size check, positives, negatives | Remove legacy adapter import; context types served directly from module |
| Go | implementations/go/context/context.go — package context, exports EventTypes map, IsEventType | aep/event_types.go imports "github.com/axisrobo/harmovela/context" and merges context.EventTypes into legacyStandardEventTypes via for loop | context/context_test.go — 3 tests: all 15 types included, positive predicate, negative predicate | Remove legacy adapter merge loop; context types served directly from module |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/context/ContextMemoryTypes.java — exports EVENT_TYPES set, isContextMemoryEventType | aep/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 null | Remove legacy adapter addAll call; context types served directly from module |
Scope: 5 delegation event types (delegation.requested, delegation.accepted, delegation.rejected, delegation.handoff.completed, delegation.escalated), isDelegationEventType predicate.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/delegation/src/index.js (package @axisrobo/harmovela-delegation) — exports DELEGATION_EVENT_TYPES, isDelegationEventType | src/legacy-dimension-types.js imports DELEGATION_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES | packages/delegation/test/delegation.test.js — 3 tests: all 5 types, positives, negatives | Remove legacy adapter import; delegation types served directly from module |
| Python | implementations/python/src/axisrobo_harmovela_delegation/__init__.py — exports DELEGATION_EVENT_TYPES, is_delegation_event_type | aep/legacy_dimension_types.py imports DELEGATION_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPES | tests/test_delegation_module.py — 3 tests: all 5 types, positives, negatives | Remove legacy adapter import; delegation types served directly from module |
| Go | implementations/go/delegation/delegation.go — package delegation, exports EventTypes map, IsEventType | aep/event_types.go imports "github.com/axisrobo/harmovela/delegation" and merges delegation.EventTypes into legacyStandardEventTypes via for loop | delegation/delegation_test.go — 3 tests: all 5 types, positives, negatives | Remove legacy adapter merge loop; delegation types served directly from module |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/delegation/DelegationTypes.java — exports EVENT_TYPES set, isDelegationEventType | aep/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 null | Remove legacy adapter addAll call; delegation types served directly from module |
Scope: 8 tool.call.* event types, isToolEventType predicate.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/tool/src/index.js (package @axisrobo/harmovela-tool) — exports TOOL_EVENT_TYPES, isToolEventType | src/legacy-dimension-types.js imports TOOL_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES | packages/tool/test/tool.test.js — 3 tests: all 8 types, positives, negatives | Remove legacy adapter import; tool types served directly from module |
| Python | implementations/python/src/axisrobo_harmovela_tool/__init__.py — exports TOOL_EVENT_TYPES, is_tool_event_type | aep/legacy_dimension_types.py imports TOOL_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPES | tests/test_tool_module.py — 3 tests: all 8 types, positives, negatives | Remove legacy adapter import; tool types served directly from module |
| Go | implementations/go/tool/tool.go — package tool, exports EventTypes map, IsEventType | aep/event_types.go imports "github.com/axisrobo/harmovela/tool" and merges tool.EventTypes into legacyStandardEventTypes via for loop | tool/tool_test.go — 3 tests: all 8 types, positives, negatives | Remove legacy adapter merge loop; tool types served directly from module |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/tool/ToolTypes.java — exports EVENT_TYPES set, isToolEventType | aep/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 null | Remove legacy adapter addAll call; tool types served directly from module |
Scope: 5 agent.* event types, isAgentEventType predicate.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/agent/src/index.js (package @axisrobo/harmovela-agent) — exports AGENT_EVENT_TYPES, isAgentEventType | src/legacy-dimension-types.js imports AGENT_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES | packages/agent/test/agent.test.js — 3 tests: all 5 types, positives, negatives | Remove legacy adapter import; agent types served directly from module |
| Python | implementations/python/src/axisrobo_harmovela_agent/__init__.py — exports AGENT_EVENT_TYPES, is_agent_event_type | aep/legacy_dimension_types.py imports AGENT_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPES | tests/test_agent_module.py — 3 tests: all 5 types, positives, negatives | Remove legacy adapter import; agent types served directly from module |
| Go | implementations/go/agent/agent.go — package agent, exports EventTypes map, IsEventType | aep/event_types.go imports "github.com/axisrobo/harmovela/agent" and merges agent.EventTypes into legacyStandardEventTypes via for loop | agent/agent_test.go — 3 tests: all 5 types, positives, negatives | Remove legacy adapter merge loop; agent types served directly from module |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/agent/AgentTypes.java — exports EVENT_TYPES set, isAgentEventType | aep/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 null | Remove legacy adapter addAll call; agent types served directly from module |
Scope: 4 environment.* event types, isEnvironmentEventType predicate.
| Language | New module location | Legacy adapter state | Test evidence | 1.0 removal gate |
|---|---|---|---|---|
| TypeScript | implementations/typescript/packages/environment/src/index.js (package @axisrobo/harmovela-environment) — exports ENVIRONMENT_EVENT_TYPES, isEnvironmentEventType | src/legacy-dimension-types.js imports ENVIRONMENT_EVENT_TYPES and spreads into LEGACY_DIMENSION_EVENT_TYPES | packages/environment/test/environment.test.js — 3 tests: all 4 types, positives, negatives | Remove legacy adapter import; environment types served directly from module |
| Python | implementations/python/src/axisrobo_harmovela_environment/__init__.py — exports ENVIRONMENT_EVENT_TYPES, is_environment_event_type | aep/legacy_dimension_types.py imports ENVIRONMENT_EVENT_TYPES and unions into LEGACY_DIMENSION_EVENT_TYPES | tests/test_environment_module.py — 3 tests: all 4 types, positives, negatives | Remove legacy adapter import; environment types served directly from module |
| Go | implementations/go/environment/environment.go — package environment, exports EventTypes map, IsEventType | aep/event_types.go imports "github.com/axisrobo/harmovela/environment" and merges environment.EventTypes into legacyStandardEventTypes via for loop | environment/environment_test.go — 3 tests: all 4 types, positives, negatives | Remove legacy adapter merge loop; environment types served directly from module |
| Java | implementations/java/src/main/java/com/axisrobo/harmovela/environment/EnvironmentTypes.java — exports EVENT_TYPES set, isEnvironmentEventType | aep/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 null | Remove legacy adapter addAll call; environment types served directly from module |
| Rule | Status |
|---|---|
No dimension module imports legacy aep package code | PASS — 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 APIs | PASS — src/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 tests | PASS — 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 documented | PASS — Compatibility matrix rows for WebSocket, SSE, gRPC, NATS, Kafka, Redis, package identifiers cover all remaining aep wire surfaces |
All event type families have been classified and extracted into dimension modules. The following classification is recorded in design/protocol/event-dimension-classification.md:
state.*, freshness.*): Fully migrated with adapter wiring.context.*, memory.*, belief.*, provenance.*): Fully migrated with adapter wiring.interruption.*, compensation.*): Fully migrated as Recovery types alongside DeliveryTracker infrastructure.tool.call.*): Fully migrated with adapter wiring.agent.*): Fully migrated with adapter wiring.environment.*): Fully migrated with adapter wiring.delegation.*): Fully migrated with adapter wiring.task.*): Fully migrated with adapter wiring.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.
| Blocker | Status |
|---|---|
| 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 decisions | Remaining — four language packages retain @axisrobo/aep top-level identity |
| Shared schema and error contract decisions | Remaining — 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.