Roadmap & Changelog¶
Roadmap¶
openframe-core¶
Documentation tasks:
- Establish
ApplicationBootstrapas the recommended wiring path in the developer guide and theruntimemodule doc. DocumentPluginRegistrydirect usage anddeps.py+lru_cacheas explicit alternatives with the conditions under which you'd choose each. Without this, three equivalent-looking patterns coexist with no hierarchy — see Design Decisions.
Lower-priority items:
test_middleware_types.py— add missing test file for ASGI type alias imports- Remove redundant
pytest.ini— configuration already present inpyproject.toml - Pin OTel SDK dev dependency to exact version —
conftest.pyaccesses_TRACER_PROVIDER_SET_ONCE._donedirectly; a patch release could rename this attribute - Switch to Trusted Publishing on PyPI — remove
PYPI_API_TOKENsecret, use OIDC viapypa/gh-action-pypi-publish
openframe-adapters¶
openframe-adapters-db-postgres— first adapter, reference implementationopenframe-adapters-db-redis— key-value, pub/sub, semantic cacheopenframe-adapters-db-mongo— document store for AI Research Vault Phase 1openframe-adapters-queue-kafka— producer + consumer, unlocks event-driven template- Remaining 11 adapters in parallel once the pattern is validated
openframe-suite¶
openframe-suite[rest],[inference],[worker]topology bundles- Six templates:
modal-template-fastapi(exists),modal-template-realtime,modal-template-event,modal-template-worker,modal-template-inference,modal-template-grpc
Changelog¶
v3.1.0 — contracts/ Merged into ports/, outbound/ Sub-module Introduced (breaking)¶
Ecosystem packages pinned
openframe-core>=3.0,<4;openframe-adaptershas migrated its imports toopenframe.core.ports.
openframe.core.contractsrenamed toopenframe.core.ports. All names previously importable fromopenframe.core.contractsare now importable fromopenframe.core.ports. No compatibility shim — update all imports.openframe.core.portsnow exports both the port primitives (BasePort,Capability,Identity,Lifecycle,PluginStatus,PluginHealth,PluginContext,PrincipalContext,TenantContext) and the outbound protocols (BaseRepository,BaseProducer,BaseConsumer) from a single unified module.BaseRepository,BaseProducer,BaseConsumermoved into a newopenframe/core/ports/outbound/sub-module, mirroringopenframe/core/inbound/on the driving side of the hexagon. The public API is unchanged —from openframe.core.ports import BaseRepositorystill works; the explicit sub-module path is nowfrom openframe.core.ports.outbound import BaseRepository. Future capability-specific outbound protocols (BaseSecretsProvider,BaseObjectStore,BaseFeatureFlagProviderfromopenframe-infra) will be added toports/outbound/.
v3.0.0 — Unified Port + Lifecycle Contract (breaking)¶
Migration guide: ADR-006. Ecosystem packages pinned
openframe-core>=3.0,<4; all packages have since migrated.
Removed:
openframe.core.health—HealthCheckProtocol (ping()/is_ready()) deleted. Health is nowLifecycle.health() -> PluginHealthinopenframe.core.ports.openframe.core.plugins.contracts/OpenFramePlugin— deleted. A plugin is now just a registeredBasePort. No separate plugin protocol exists.openframe.core.errors— thePluginErrorfamily moved intoopenframe.core.exceptionsunder the newOpenFrameErrorroot. No deprecated aliases.- Pre-v3 lifecycle-free ports —
BaseRepository,BaseProducer,BaseConsumerno longer exist as bare domain-method-only Protocols; rebuilt onBasePort.
Added:
openframe.core.contracts(merged intoopenframe.core.portsin v3.1.0 — see below) — apex module:Identity,Lifecycle,BasePort(@runtime_checkable),Capability(closedstrenum),PluginStatus,PluginHealth,PluginContext,PrincipalContext,TenantContext.openframe.core.inbound— driving side of the hexagon:UseCase[TIn, TOut],CommandHandler[TIn],QueryHandler[TIn, TOut],RequestContext.openframe.core.exceptions.OpenFrameError— single root for all ecosystem exceptions.ErrorCodeandSeverityStrEnums.AdapterErrorandPluginErrorfamilies re-parented under it.openframe.core.telemetry.record_error()— structured error→span recording seam. Called atTracingProxy,TelemetryMiddleware, andPluginRegistryboundary seams.openframe.core.plugins.PluginRegistry— now keys onCapabilityenum;get()is strict (AmbiguousCapabilityErroron >1 match).openframe.core.runtime.ApplicationBootstrap— optional async context-manager composition root.openframe.core.testing—InMemoryRepository,FakeProducer,FakeConsumer(allBasePort-satisfying);PortContractTests,LifecycleContractTests,RepositoryContractTests,ProducerContractTests,ConsumerContractTests.
Changed:
BaseRepository[T],BaseProducer[T],BaseConsumer[T]— now extendBasePort. Every port hasname/version/capability/initialize/shutdown/health.- Version bumped
2.0.0→3.0.0inpyproject.toml. - 284 tests. All run in under 1 second.
v2.0.0 — Namespace & Settings Stabilisation (breaking)¶
openframe.core.config—BaseAdapterSettingsstabilised as the base for all adapter settings.openframe.core.exceptions—AdapterError__str__format locked to[adapter.operation] message.- Namespace package (
pkgutil.extend_path) stabilised. Ecosystem packages begin using theopenframe.*namespace.
2026-06-13 — v1.0.0 Initial Release¶
openframe.core.exceptions—AdapterErrorbase class and five typed subclasses.__str__produces[adapter.operation] messagerather than a raw tuple repr.super().__init__(message)passes only the message toException.__init__.openframe.core.config—BaseAdapterSettingsPydanticBaseSettingssubclass with four common fields:adapter_name,connection_timeout(30 s),operation_timeout(10 s),max_retries(3).openframe.core.ports—BaseRepository[T],BaseProducer[T],BaseConsumer[T]asruntime_checkableProtocols.BaseConsumeruses a push-based handler model (Callable[[T], Awaitable[None]]).openframe.core.health—HealthCheckProtocol withping()andis_ready()(removed in v3.0.0).openframe.core.telemetry—setup_telemetry(),get_tracer(),get_meter(),record_lifecycle_event(). Removes_grafana_headers()— authentication handled natively viaOTEL_EXPORTER_OTLP_HEADERS. ReplacesMODAL_ENVwithOPENFRAME_ENV.openframe.core.tracing—TracingProxywith fixed method caching. Original template capturedmethodat first access (stale snapshot). This implementation resolves fresh inside_tracedon every invocation — safe for reconnecting adapters.openframe.core.middleware—TelemetryMiddlewareas pure ASGI middleware (not StarletteBaseHTTPMiddleware). Duration metric uses unit"s"per OTel HTTP semantic conventions. Five metric instruments.x-session-idinjection. Does not callsetup_telemetry().openframe.core.middleware.types—ASGIScope,ASGIMessage,Receive,Send,ASGIAppstdlib-only type aliases.- 112 tests across 8 modules.
conftest.pyresets OTelOnce._doneguards between tests — without this,set_tracer_provider()silently fails from test 2 onwards. - Published to PyPI as
openframe-core==1.0.0.