This release includes 1 breaking change for platform teams planning a safe upgrade.
Published 1mo
AI Agents & Assistants
✓ No known CVEs patched
✓ No known CVEs patched in this version
Topics
agent-loop
agentic-ai-development
agentic-coding
agentic-engineering
agentic-framework
agentic-workflow
+7 more
autonomous-agents
governed-autonomy
governed-loop
harness-engineering
loop-engineering
runtime-engine
runtime-engineering
Affected surfaces
auth
rbac
Summary
AI summaryRemoved Recon terminal-operation whitelist requiring compiled metadata for routing.
Full changelog
[0.21.0] - 2026-06-15
Added
- Added conceptual config mappings (
config-mapping.md) documenting the five
tested configuration profiles and their resolution to shipped mode IDs,
aliases, or fixture packages. - Added config-swap behavior tests proving graph-only, recovery-policy-only,
and required-extension declarations change runtime behavior without Python
source edits. - Added absence and maintenance guardrail tests proving minimal fixture configs
do not load undeclared Recon, Blueprint, closure, or Learning domain behavior. - Added structural AST guardrails that forbid family-ID branch tables, forbidden
domain string literals as active-kernel control flow, and kernel-direct domain
imports outside documented compatibility facades.
Changed
- Restored the optional
millrace-websidecar package and synchronized
release/CI smoke paths sov0.21.0publishes bothmillrace-aiand the
read-only local dashboard while keeping web dependencies out of the base
runtime package. - Tightened Arbiter closure freshness discipline: Arbiter prompts now require
reading the runtime-authored freshness window before old verdict/report
artifacts, per-criterion evidence provenance, and runtime-owned closure
remediation enqueueing. Shipped closure-capable modes now assign Arbiter via
an explicit high-depth model alias so missing or downgraded assignment is
visible in compile diagnostics. - Made the pure graph-authority cleanup explicit as a breaking pre-1.0
contract: runtime decisions require compiled graph, extension, policy,
lifecycle, runtime-effect, queue-family, and artifact-contract metadata.
Missing compiled policy now fails as an authority error instead of falling
back to shipped defaults; stale workspaces may need managed asset refresh or
reinitialization. - Cleaned up legacy graph-authority authority paths: per-plane routing wrappers
are now compatibility-only facades, route-time max-cycle recovery knobs are
removed, and fallback route reasons/classes derive from compilednode_id
rather thansource_stage.value. - Bounded routine runtime-event reads and idle-event growth: status, closure,
and inspection surfaces now use streaming/recent/latest event helpers for normal
operation, while durable no-work idle events are transition and heartbeat
records instead of one append per idle tick. The default durable idle-event
heartbeat is 6 hours, with explicit shorter operator configuration still
supported. - Removed the fixed Recon terminal-operation whitelist; Recon routing now
resolves through compiled terminal-actionruntime_operation_idmetadata. - Reworked
stage_metadata.pyto derive shipped stage legality from JSON
stage-kind registry assets instead of hard-coded enums; fixture stage kinds
remain discoverable without entering the shipped-stage facade. - Route caller-level family-ID branching in active-kernel claim, lifecycle,
status, and counter code through compiled policy and the generic
QueueFamilyInterpreter. - Updated shipped mode
required_extensionsdeclarations to list only the
built-in extensions each mode actually uses; compile validation rejects
undeclared domain vocabulary. - Moved neutral router decision contracts to
millrace_ai.contracts.router;
millrace_ai.routerremains importable only as a contract facade, and active
runtime dispatch no longer imports it.
Fixed
- Fixed compiled-plan currentness so persisted plans missing scheduler or
selected recovery-policy authority are treated as stale and recompiled
instead of being reused as incomplete modern plans. - Fixed installed-wheel smoke failures by declaring
packaging>=24,<27as a
runtime dependency for extension validation'spackaging.versionimport. - Fixed daemon reconciliation so a lane's persisted active-run ownership is not
replaced while the supervisor still owns a live or pending-completion worker
for that same lane, and occupied-lane deferrals now emit an auditable
runtime_reconciliation_deferreddiagnostic decision. - Fixed runtime recovery-counter reads so generic
counter_idrecords are
authoritative (including explicit0values) with no legacy fixed-field
compatibility projection. - Bounded basic terminal monitor run/display state so long daemon monitor
sessions do not retain unbounded completed-run handles while active run
handles remain stable.
Documentation
- Reframed public documentation around Millrace as a loop
engineering/runtime framework. LAD is now described as one shipped
code-development loop family, withlad_codex,lad_pi,
learning_lad_codex,efficient_learning_lad_mixed,
learning_lad_pi,lad_codex_integrated,
learning_lad_codex_integrated,blueprint_lad_codex, and
blueprint_learning_lad_codexas the recommended mode names. - Updated graph and mode documentation to use
execution.lad,
execution.lad_integrator, andplanning.ladas canonical loop IDs while
documenting the formerexecution.standard,execution.with_integrator,
planning.standard,default_*, old unqualifiedlearning_*,
efficient_learning_mixed, and conceptualstandard_*names as
compatibility aliases. - Documented closure freshness windows, historical versus current Arbiter
evidence, runtime-owned remediation incidents, repeated-remediation guard
interpretation, and operator diagnosis forclosure_repeated_remediation_blocked. - Updated
README.md,ROADMAP.md, graph docs, runtime docs, source package
map, and maintenance registers to accurately describe the generic engine
boundary, extension-backed domains, compatibility-only surfaces, fixture
mode limitations, and unsupported topologies (arbitrary plane IDs and
arbitrary runtime stages remain deferred). - Clarified the public README and runner docs comparison with Claude Code and
other coding harnesses: Millrace does not claim those harnesses lack hooks,
skills, subagents, memory, or workflow helpers; the distinction is that
Millrace owns the external compiled-plan, queue, daemon, recovery, and
closure layer around bounded harness invocations. - Documented the runtime idle/event-log memory-bounds contract: durable idle
suppression is in-memory only and separate from live terminal monitor idle
output throttling;read_runtime_events()is reserved for explicit
full-history audit/debug use.
Compatibility Notes
- Package-root compatibility facades (
router.py,compiler.py,
queue_store.py,runner.py,paths.py,state_store.py,
stage_kinds.py,loop_graphs.py) remain importable; active runtime
authority derives from the compiled plan and compiled workflow primitives. - Blueprint remains available through
blueprint_lad_codexand
blueprint_learning_lad_codex, but it is extension-backed graph configuration.
Generic packages do not export Blueprint compatibility APIs; old Python
imports of retired Blueprint facades such as
millrace_ai.contracts.blueprint,millrace_ai.cli.status.blueprint,
millrace_ai.runtime.context.blueprint, and
millrace_ai.workspace.blueprint_statemay now raiseImportError. standard_plain,standard_millrace, andlearning_enabled_millraceremain
compatibility aliases that resolve tolad_codex,lad_pi, and
learning_lad_pirespectively.
Breaking Changes
- Removed the fixed Recon terminal-operation whitelist; Recon routing now resolves through compiled terminal-action `runtime_operation_id` metadata.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Millrace
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]