---
audience: engineers
summary: User-visible changes per ScaiCore release.
title: Changelog
path: changelog
status: published
---

User-visible changes per release. Older versions stay readable at their published wheel. Breaking changes are flagged explicitly.

## v1.2.0 — Auto-telemetry

**New.** The runtime now fires six lifecycle events through the host's `EventSink` while a flow executes: `invocation.started`, `invocation.completed`, `invocation.failed`, `block.entered`, `block.exited`, `block.failed`. Each carries `core_id` and `execution_id`; block events carry `block_kind` and (when set) `node_id`. The `block.exited` event includes the duration in milliseconds and, when a block has a `result_binding`, either the bound value (if its JSON encoding is ≤4096 bytes) or `result_binding_truncated: true`.

**Configurable.** `CoreEngine.load(module, env, auto_telemetry=False)` disables auto-telemetry for high-throughput or batch deployments. The default is `True` when an event sink is wired.

**Resilience.** A failing event sink is logged and swallowed — telemetry never aborts a flow.

**Backwards-compatible.** No IR or schema changes. Existing `@emit` statements behave identically.

## v1.1.0 — `node_id` propagation on emitted events

**New.** `SourceLocation` carries an optional `node_id` field that upstream codegens (canvas editors, source-AST tools) can populate to correlate runtime events back to whatever produced them. When set, the runtime injects it as a top-level `node_id` field on every event emitted by a `@emit` statement.

**Override.** An explicit `node_id` field on the `@emit` payload takes precedence over the source-location fallback (`setdefault` semantics).

**Backwards-compatible.** No schema bump. Bundles compiled by older versions deserialize cleanly with `node_id` defaulting to `None`.

## v1.0.0 — Native HITL routing on `@checkpoint`

**New.** `@checkpoint` blocks accept a `hitl_target` field that evaluates to a routing dict of shape `{scope, queue, hitl_spec}`. When set with `checkpoint_type = "hitl_review"`, host handlers are expected to publish a `hitl_request` to the addressed queue and subscribe to its completion event. The runtime delivers the resolved dict to `CheckpointHandler.create()` as a new `hitl_target` kwarg and persists it on `CheckpointState`.

**Breaking.** IR `FORMAT_VERSION` bumped 1 → 2. Bundles produced by this version are rejected by older runtimes; older bundles load cleanly here. The `CheckpointHandler` Protocol gained an optional `hitl_target` kwarg — custom host implementations must accept it (defaulting to `None`).

## v0.1.0 — Initial release

First public wheel. Compiler pipeline (lex → parse → resolve → type-check → IR → verify → serialize), runtime executor for the 14 block kinds, host abstraction via `MemoryBackend` / `ModelProvider` / `PluginDispatcher` protocols, CLI with `compile`/`check`/`run`/`inspect`, instance routing (`stateless` / `entity` / `singleton`), and checkpoint suspend/resume.
