Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 74 additions & 35 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,49 +1,59 @@
## [0.18.4] - 2026-09-25
## [0.18.5] - 2026-09-26

Consolidated release that bundles three rounds of work landed on
`cleanup/deprecation-removal` (#111) and never shipped as separate
versions: the 0.18.3 `init`/`init_or_die` unification, the 0.18.4
`handle` → `guard` rename plus top-level `status()` removal, and
the follow-on deprecation sweep (drop redundant `@guarded`, drop
framework-extras / `auto_instrument` public surface, strip legacy
"pre-fix / post-fix" docstring framing, drop stale `init_or_die`
references in source docstrings). Also adds a mechanical lint/type
cleanup pass that brings `ruff check src tests` and `mypy
src/nullrun` back to green after the 1882-insertion / 15621-deletion
sweep across the branch (71 unused imports, 9 unused locals,
`BusinessImpact.impact` narrowed from `Any` to `NoImpactPayload`,
`_LAZY_EXPORTS` annotation tightened).

### Surface (breaking)

- `nullrun.handle` renamed to `nullrun.guard`. Same `@contextmanager`
body (catches `NullRunError`, re-raises `WorkflowKilledInterrupt`,
renders the four-line developer report, `sys.exit(1)` on failure).
The name `guard` was freed in 0.18.2 when `@guarded` was removed.
Migrate by replacing `from nullrun import handle` /
`with nullrun.handle:` with `from nullrun import guard` /
`with nullrun.guard():`.
- `nullrun.handle` renamed to `nullrun.guard`. Same
`@contextmanager` body (catches `NullRunError`, re-raises
`WorkflowKilledInterrupt`, renders the four-line developer report,
`sys.exit(1)` on failure). The name `guard` was freed when
`@guarded` was dropped earlier in this release. Migrate by
replacing `from nullrun import handle` / `with nullrun.handle:`
with `from nullrun import guard` / `with nullrun.guard():`.
- Top-level `nullrun.status()` removed. Reach the snapshot via
`nullrun.get_runtime().status()` (returns the same frozen
`NullRunStatus` dataclass). The wrapper's only role was raising
`NullRunConfigError(NR-C004)` when no runtime was bound — that
path is now `get_runtime()`'s job. `NullRunStatus` itself
remains importable as a type.

### Curated surface after 0.18.4

```text
__version__, init, protect, shutdown, on_error, guard,
NullRunError, NullRunAuthError, NullRunConfigError,
NullRunBackendError, NullRunBudgetError, NullRunToolBlockedError,
WorkflowKilledInterrupt, NullRunWorkflowKilledError,
NullRunMcpDestructiveBlockedError,
NullRunMcpReadonlyBypassBlockedError,
NullRunMcpApprovalRequiredError,
NullRunApprovalDbUnavailableError,
format_user_message, set_user_message
```

(`status` and `handle` dropped; `guard` added. Net -1 symbol vs 0.18.3.)

## [0.18.3] - 2026-09-25

### Surface (breaking)

- `nullrun.init_or_die()` removed. CLI fail-fast behavior is now a
parameter on `init()`: `nullrun.init(fail_on_exit=True)` prints the
same four-line developer report and `sys.exit(1)` on configuration
failure.
parameter on `init()`: `nullrun.init(fail_on_exit=True)` prints
the same four-line developer report and `sys.exit(1)` on
configuration failure.
- `nullrun.shutdown()` is now auto-registered via `atexit` inside
`init()` — long-running scripts get a clean WS close on process
exit without an explicit call. Calling `shutdown()` manually
remains safe and idempotent.
- `@nullrun.guarded` decorator removed. It was a 3-line syntactic
shortcut for `with nullrun.guard():`; with `guard` as the
canonical error-translation path the decorator form was pure
duplication.
- Framework-extras install groups dropped from `pyproject.toml`
(`[agents]`, `[langchain]`, `[langgraph]`, `[llama-index]`,
`[crewai]`, `[autogen]`). The silent auto-detect instrumentation
patches remain in code, but `nullrun` no longer advertises
per-framework install paths or example wiring. Public install
is one line: `pip install nullrun`.
- `nullrun.auto_instrument` / `nullrun.is_auto_instrumented`
removed from the top-level namespace (they were internal
triggers, not user-facing API). Module-level `track_event`
alias removed (duplicate of `track`; the `runtime.track_event`
method is still used internally). `NullRunCallback` removed
from `_LAZY_EXPORTS` (advanced / manual path; reachable via
`nullrun.toolbox.langgraph` if ever needed).

### Lifecycle

Expand All @@ -54,8 +64,37 @@ format_user_message, set_user_message
- The `_shutdown_atexit_registered` module-level flag prevents
double registration when `init()` is called more than once.

Top-level `dir(nullrun)` no longer exposes `init_or_die`. All other
symbols unchanged from 0.18.2.
### Tooling

- Strips "pre-fix / post-fix", "previously / now we", "was X / is
now Y", and "legacy" framing from public docstrings across
`runtime.py`, `transport.py`, `decorators.py`, and 14 other
modules. External ticket identifiers (DEF-*, ADR-*, AUDIT P*,
IDEM-01, CLOSE-ORPHAN) are preserved as anchors.
- Mechanical lint cleanup: 71 unused imports (F401) auto-removed,
9 unused locals (F841) hand-removed across `tests/`. `ruff check
src tests` and `mypy src/nullrun` are clean on the merged
branch.

### Curated surface after 0.18.5

```text
__version__, init, protect, shutdown, on_error, guard,
NullRunError, NullRunAuthError, NullRunConfigError,
NullRunBackendError, NullRunBudgetError, NullRunToolBlockedError,
WorkflowKilledInterrupt, NullRunWorkflowKilledError,
NullRunMcpDestructiveBlockedError,
NullRunMcpReadonlyBypassBlockedError,
NullRunMcpApprovalRequiredError,
NullRunApprovalDbUnavailableError,
format_user_message, set_user_message
```

(Net vs 0.18.2: `status`, `handle`, `guarded`, `init_or_die`,
`auto_instrument`, `is_auto_instrumented`, `track_event` removed;
`guard` added. Net -6 symbols vs 0.18.2.)

Wire contract: unchanged from 0.18.0.

## [0.18.2] - 2026-09-22

Expand All @@ -77,4 +116,4 @@ Top-level `dir(nullrun)` exposes only:
`NullRunMcpReadonlyBypassBlockedError`, `NullRunToolBlockedError`,
`NullRunWorkflowKilledError`, `WorkflowKilledInterrupt`)

Wire contract: unchanged from 0.18.0.
Wire contract: unchanged from 0.18.0.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "hatchling.build"
name = "nullrun"
# Full release history lives in CHANGELOG.md; only the current version
# is pinned here.
version = "0.18.4"
version = "0.18.5"
# Kept under the 200-char preview threshold so the full line is visible
# without an "expand" click. The headline is the canonical §1 statement
# from positioning.md — "runtime decision layer for tool-using AI agents"
Expand Down
2 changes: 1 addition & 1 deletion src/nullrun/__version__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
string and the SDK_MIN_VERSION constant.
"""

__version__ = "0.18.4"
__version__ = "0.18.5"
__platform_version__ = "1.0.0"
Loading
Loading