Release notes
These notes cover versions 1.0.8 through 1.0.12 and link to the updated usage guides. Run Reactor examples from the application root using its Python environment.
1.0.12: Debug facade
Section titled “1.0.12: Debug facade”The new Debug facade provides access to the debugging service:
from orionis.support.facades import Debug
data = {"ready": True, "items": [1, 2, 3]}Debug.dump(data)Debug.dd(data)Debug.dump() prints values to the console and allows execution to continue. Debug.dd() displays values and stops execution: in HTTP with debugging enabled, it interrupts the request with an HTML diagnostic response; in the console, it terminates the process. Both calls are synchronous and require an initialized application. See Debug for options, return values, and behavior outside debug mode.
1.0.11: HTTP and response performance
Section titled “1.0.11: HTTP and response performance”The HTTP path uses fewer locks and redundant calls. ASGI/RSGI request admission uses a per-kernel counter on the worker event loop; public routes without middleware skip unnecessary steps, and endpoint policy lookups are skipped when no policies are registered.
HTML, JSON, redirect, streaming, SSE, and file responses prepare standard headers with fewer calls. Each response keeps independent mutable headers; precedence rules, subclass hooks, serialization behavior, and stream behavior are preserved. See request limits and response headers.
Local time estimates
Section titled “Local time estimates”The local validation reported for this release recorded 320 passing tests. The overall estimate is approximately 10–15% less time per request along the measured Python path, without networking. Each measurement has its own scope:
| Area or response | Estimated time reduction | What was measured |
|---|---|---|
| HTTP ASGI | ≈15% | Per-request path, without networking. |
| HTTP RSGI | ≈13% | Per-request path, without networking. |
| HTML | ≈10% | Small response construction. |
| Compact JSON | ≈23% | Small payload construction and serialization. |
| Redirects | ≈11% | Construction and headers. |
| Streaming | ≈19% | Construction, not transfer. |
| SSE | ≈24% | Construction, not stream duration. |
| Formatted JSON | No stable improvement | Variable results. |
| Files and downloads | No stable improvement | Results vary with I/O. |
These figures describe the reported local validation of 1.0.11; they are not a new benchmark of each later release. Behavioral tests cover, among other cases, execution resources, request limits, and response construction.
1.0.10: table schemas and queue migration
Section titled “1.0.10: table schemas and queue migration”The table schema creation stub used by make:database-schema has been updated: generated modules declare TABLE: Final[TableDefinition | None] = None instead of a wrapper class. Replace None with the table definition and import that constant in migrations and models. Review the generated schema example and the generator reference.
A new command explicitly prepares tables for database-backed queues:
python reactor queue:migrateIf you use uv to select the project environment, the equivalent invocation used in these guides is:
uv run python -B reactor queue:migrateSee queue drivers and preparation to select the connection and review which tables are prepared. This command handles queue infrastructure; application migrations run through reactor migrate.
1.0.9: tests and benchmarking application
Section titled “1.0.9: tests and benchmarking application”This release corrects details in the uvloop integration tests and the Orionis application used in HTTP comparisons. That application’s periodic readiness check changes from 0.01 to 0.1 seconds. This adjusts benchmark startup; it does not establish per-request latency or an RPS improvement.
The HTTP comparison application belongs to the framework development repository. For your own application tests, continue using the testing guide.
1.0.8: Loop and Python 3.14
Section titled “1.0.8: Loop and Python 3.14”Loop has been refactored to make event loop registration, ownership, and cleanup predictable on Python 3.14. Synchronous entry points reject calls from an active loop, synchronous work delegated to threads preserves context, and owned loops are closed through asyncio.Runner without closing borrowed loops.
When updating code that uses these utilities, review Loop.runSync(), Loop.createTask(), and Loop.eventLoopContext() in particular. createTask() is synchronous and returns the task that you can subsequently await. The asynchronous execution guide contains current signatures and examples.