Release Notes¶
What changed in the surface you use, and what to do about it.
Binaries, checksums and the per-tag changelog are published as GitHub Releases
in
engineering-runtime-releases.
This page is the technical companion to those tags: which parts of the runtime
you interact with moved, and which of your files need attention.
Just looking for the download?
Releases on the Engineering Runtime site, or straight to the GitHub Releases page. Then follow Installation.
v0.9.8¶
Enterprise-managed commands now bind their audit evidence to the verified policy digest and governance generation revision installed by registration or Portal sync. This fixes v0.9.7, where enrollment and signed synchronization succeeded but the first governed command refused while constructing its audit policy projection.
On upgrade, no configuration, policy or capability document changes are required. Enterprise users should upgrade Runtime agents from v0.9.7 to v0.9.8 before exercising managed operations. Community/local execution is unchanged.
v0.9.7¶
The optional Portal client is being narrowed to three authenticated Enterprise
operations: explicit registration, at-most-once-per-process heartbeat, and
manual signed policy/config sync. Community/local mode remains the default and
disabled portal sync performs no network or audit work.
First registration binds one show-once RUNTIME_PORTAL_API_KEY to one stable
Runtime installation, pins the Control Plane organization and Ed25519 public
signing key, verifies the first atomic governance generation, and only then
commits sticky Enterprise-managed state. Later local config/policy sources
cannot override it; outage uses last-known-good and invalid state fails closed.
Replacement keys recover the same Runtime identity without replacing signing
trust.
Portal audit upload and the Runtime repository's reverse app-api contract
vendoring are removed. Local audit remains unchanged; external audit delivery
will be a separately released OpenTelemetry integration. /api/v1 is now the
only Portal prefix.
v0.9.6¶
Capability and command audit evidence is now attributable, correlated and safe under parallel execution.
Direct operations carry a unique invocation ID. Capability runs add durable start/completion frames and repeat the exact capability source, SHA-256 byte digest, run ID, execute/preview mode and ordered step position. A successful step followed by a denied step remains visible as two distinct outcomes and closes the overall capability run as failed.
Audit identity separates the caller class (human, ci or ai), optional
self-asserted actor label, observed OS executor and optional session ID. CI,
agents and pods can set RUNTIME_CONSUMER, RUNTIME_ACTOR_NAME and
RUNTIME_SESSION_ID; these labels support correlation and are never accepted
as authorization identity.
RUNTIME_HOME is now the canonical Runtime Home variable. The pre-v1
ENGINEERING_RUNTIME_HOME and ENGINEERING_RUNTIME_CONSUMER aliases remain
temporarily accepted for migration. Equal dual values work; conflicting values
refuse. Update active automation to the canonical names.
Cross-process locking serializes durable evidence appends. Broken or torn chains refuse new governed work, JSON audit output includes integrity state, and recovery is explicit after confirming no Runtime process still uses the Home. The compiled environment-variable reference is machine-checked and installed version-exact for operators and agents.
On upgrade, no provider operation, transport, configuration/policy schema
or capability grammar changes. Capabilities remain version: v1; no document
migration is required. Existing enterprise audit ingestion remains compatible
with engineeringruntime.audit/v1:runtime-execution.
v0.9.5¶
Repository-list output is now useful to humans and stable for automation.
runtime github repo list now renders repository, visibility, update time and
description columns followed by a repository count. Default text no longer
serializes the complete REST response.
runtime --output json github repo list retains the complete typed GitHub API
objects exactly once under .data, so it can be piped directly to tools such as
jq. The accidental duplicate .output field has been removed. If an
automation read .output, change that selector to .data.
Identity output now reports only the provider, authentication mode and whether a subject resolved. Text and JSON no longer expose the account name or a masked token fingerprint.
On upgrade, no provider operation, transport, configuration/policy schema or
capability grammar changes. Capabilities remain version: v1; no configuration
migration is required.
v0.9.4¶
Native CLI parity and governed bulk file editing are now released together.
The Command Engine admits the exact semantic mode gh repo list. When no
Runtime token is configured, it delegates to the GitHub CLI's existing native
authentication, host and account context; when RUNTIME_GITHUB_TOKEN is
configured, the Auth Engine validates and brokers that credential. Runtime
never runs gh auth login. Text and raw modes preserve familiar CLI output,
while JSON mode separates typed data, stdout/stderr, exit code and media type.
Other raw gh shapes remain context-unsupported until their semantic mode is
registered.
The File Engine now performs bounded selective edits across text, YAML, JSON,
Terraform, CODEOWNERS, Dockerfiles and Markdown. It supports one file or a
recursive filtered directory set, expected-count preconditions, whole-batch
preflight, --dry-run, human tables/diffs, typed JSON, pre-image race checks,
atomic per-file replacement, rollback states and content-free per-file audit
digests. runtime capability execute <path> --dry-run validates every step's
preview contract before step one. No plan file or plan digest is required, and
File Engine never performs Git or external validation implicitly.
On upgrade, existing policy schema remains v3. The new
file_policy.max_edit_* values are optional and may only narrow compiled
limits. Existing direct file commands behave as before. A policy must grant
read roots for preview and both read and write roots for applying structured
edits.
v0.9.3¶
The agent contract no longer contradicts itself. RUNTIME-AGENT.md — the
file Runtime writes into your Home, and the one it tells an assistant outranks
anything it already knows — carried two authoring loops about a hundred lines
apart. They disagreed on three things: whether to write a capability through
runtime files write or with ordinary file tools, whether
file_policy.write_roots must grant the write, and whether
RUNTIME_CAPABILITIES_DIR is authoritative.
The first of each pair was the pre-0.9.2 model, left behind when the
one-directory change shipped. The last was the damaging one: the contract said
never to treat that directory as authoritative, while the binary beside it
reports Authoring source: capabilities-dir and authors there by default. An
assistant reading top to bottom met the stale instruction first.
There is now one authoring loop, and it says more than either did:
- check
runtime versionand stop if Runtime is not installed, rather than guessing - treat
runtime --output json capability authoring-contextas the source of truth for every path — so a Home moved withRUNTIME_HOMEresolves correctly instead of being reconstructed from~ - never invent an organisation, repository, namespace or credential
- treat a policy denial as a design signal, not something to work around
- execute read-only work; wait for approval before changing an external system
- report a shared Runtime or provider gap separately instead of hiding it behind a workaround in the capability
It also states the trap that costs the most time: validation passing is not evidence a capability works, and neither is execution passing if nobody reads the output — an empty result can be a successful call against a target that has nothing to report.
Nothing else changed. No new command, no schema change, no difference at execution time. Config is still schema v2 and policy still schema v3.
On upgrade, Runtime rewrites RUNTIME-AGENT.md in your Home. Your own
capabilities, config.yaml and policy document are untouched. If you had copied
the old contract somewhere, replace it — the two disagreed.
v0.9.2¶
Writing your first capability no longer starts with a configuration file.
On v0.9.1 a fresh install could not author at all: the target had to be named by
capabilities.authoring_source, which had to match an entry in
capabilities.sources — and that list ships empty. capability
authoring-context reported authoring_ready: false even with
RUNTIME_CAPABILITIES_DIR pointing at a directory full of capabilities.
One directory is now the whole setup:
git clone https://github.com/engineeringruntime/engineering-runtime-capabilities
export RUNTIME_CAPABILITIES_DIR=$PWD/engineering-runtime-capabilities/capabilities
runtime capability authoring-context
That directory is read from and written to, and capability list reports it
as capabilities-dir — an authoritative source, not the "non-authoritative
cache" a directory you deliberately chose was previously called. Only the unset
fallback inside Runtime Home is still a cache.
Authoring no longer depends on file_policy.write_roots. Those roots govern
what the File Engine may touch on your behalf; writing a capability is you, or
your assistant, editing a file with your own tools. A fleet that narrows its
write roots to one tree keeps the ability to author, and the File Engine still
refuses a files write outside them.
Nothing to change on upgrade. capabilities.authoring_source still parses
and still wins when set, so an existing configuration behaves exactly as it did.
It is simply no longer required: with several directories configured, Runtime
asks which is yours instead of guessing. Config and policy schema versions are
unchanged.
The 47 capability samples that were compiled into the binary are gone. Nothing read them, they were never installed into your Home, and every one lives in the public store the clone above fetches.
v0.9.1¶
Two dead execution paths, repaired. No new features; both fixes restore behaviour that was already documented.
Every GitHub operation whose transport is the gh CLI — pr list, pr view,
pr create, issue create, workflow list, workflow run, run list,
run view — was refused with "gh reached the Command Engine with no pinned
artifact". The provider path built its request without the pinned executable
the Command Engine requires. Sixteen published capabilities depended on that
transport and failed at execution while still validating cleanly.
Tools that delegate authentication to a helper binary could not authenticate:
docker push to a registry using a credential helper failed inside Runtime
while the identical push succeeded outside it. New
command_policy.admitted_helpers
admits named helper executables — absolute paths, scoped to one parent binary,
exposing only the named files rather than their directory, and empty by default.
Policy schema is now v3. The 2→3 migration is behaviour-preserving and rewrites nothing, so an existing v2 document is read unchanged and needs no action.
What to do: upgrade normally. If you use docker push, git over HTTPS, or
any tool with a credential helper, see the policy page — admitting a helper is
now possible and is still opt-in.
Neither fix loosened a boundary. The Command Engine still refuses an unpinned
request, and every gcloud change is still denied at selector_bound strength;
both are now asserted by the install proof, which executes one real operation
per transport.
v0.9.0¶
Reliable capability authoring from one ask. Runtime now makes the two facts an author must not guess directly inspectable: which authoritative worktree is selected for writes, and whether a capability with representative inputs would pass effective policy before its first side effect.
Config schema v2 adds optional capabilities.authoring_source. It must name
exactly one configured source with an absolute directory. Runtime never chooses
the first source, never falls back to the Home/RUNTIME_CAPABILITIES_DIR
compatibility cache, and never fetches, creates, commits or publishes the
worktree. Existing config v1 remains readable with unchanged behaviour.
New commands:
runtime --output json capability authoring-context
runtime capability plan <path|name> --input key=value
authoring-context reports the version-matched installed contracts and
digests, config/policy provenance, exact selected source, provider surface,
allowed binaries and File Engine write readiness. Source selection grants no
write permission; policy must independently grant the directory.
capability plan validates, substitutes inputs and applies context, File
Engine grants, the compiled safety floor and declarative policy to every step.
It reports every denial and exits non-zero for denial or missing required
inputs, while performing no authentication, command/network execution,
mutation or audit write. File-write payloads and GitHub content are omitted.
Identity allow-list evaluation is deferred until separately authorized
execution resolves an identity.
What to do: existing execution-only setups need no config change. For
managed authoring, migrate or create config v2, select one named source, grant
its absolute directory narrowly under file_policy.write_roots, then follow
authoring-context → write through runtime files → validate → plan → review.
A successful plan is evidence for review, not permission to publish or execute.
v0.8.0¶
The supported recovery release. v0.8.0 restores the Runtime-first architecture shipped in v0.6.1 after the v0.7.0 Control Plane governance preview was withdrawn. The v0.7.0 artifacts remain available only as a historical implementation reference; do not use them for production.
This release removes the 0.7-only signed composite bundle, centrally selected
capability-source activation, persistent Runtime rollout identity and
Control-Plane-requested automatic sync path. Runtime continues to own local
policy evaluation and execution, and the optional explicit runtime portal
sync path remains the earlier local-policy delivery contract. The v0.6.1
config v1, policy v2, schema, audit-evidence and Runtime Home contracts remain
in force.
What to do: users upgrading from v0.6.1 or earlier can upgrade normally and
run runtime config validate. If you evaluated v0.7.0, install v0.8.0, keep a
backup of any 0.7-only enterprise/rollout state for reference, and validate the
effective config and policy before executing governed work. v0.8.0 does not
consume the withdrawn 0.7 bundle contract.
v0.7.0 — withdrawn reference¶
v0.7.0 was the 07b Control Plane bundle preview. Its release and source tag are retained so the experiment can be inspected, but it is superseded by v0.8.0, is not the supported release line, and should not be deployed to production.
v0.6.1¶
Closes the 07a functional release gate. Runtime now ships explicit config
v1 and policy v2 JSON Schemas in both Runtime Home and release archives. Policy
v2 removes the retired top-level enabled key; legacy v1 with the key absent or
true migrates in memory without changing the file, while enabled: false
blocks for an operator decision.
This patch also reserves durable execution evidence before portal sync
performs either its network request or local policy write, and rejects a newer
signed enterprise generation that tries to lower required audit delivery back
to local. Bootstrap wording now matches the executable: every Runtime command
prepares Runtime Home automatically; runtime bootstrap is the explicit
report, not a prerequisite.
What to do: upgrade normally, run runtime config validate, and inspect
<Runtime Home>/specs/schema-contract.json. If a legacy policy contains
top-level enabled: false, remove that key deliberately and validate again.
v0.6.0¶
The release with breaking changes in it. Three things that used to work will stop, each deliberately, and each with a one-line fix.
Customer-facing surface: github gains one operation — file put, which
creates or updates a file through the Contents API and is how a capability is
published without a raw API call (github 20 · files 5 — verify with
runtime config validate). What else changed is what a governed operation is
allowed to reach.
| Change | Why | What to do |
|---|---|---|
The File Engine is default-deny. A policy document with no file_policy block grants no file access at all, and read and write are separate authorities |
files read ~/.ssh/id_rsa used to return a private key to whatever asked — which in an AI-driven workflow means into a context window |
Add a file_policy block naming the roots you actually work in. runtime config validate reports what your document grants |
A tool no longer inherits your environment. A variable exported in your shell reaches a command run tool only if the runtime carries a contract naming it for that tool and your policy permits it |
An approved binary received every ambient secret the shell held — unrelated tokens, session credentials, and the loader variables that turn any binary into a launcher for unreviewed code | Add the name to command_policy.rules.<binary>.environment. See what a tool receives |
gh, aws and az are refused through command run |
Each resolves its target from ambient state Runtime cannot observe, so it could not say which repository, account or subscription an operation would reach | Use runtime github ... for GitHub, which takes the repository as an argument. For AWS and Azure there is no adapter yet; run them outside Runtime until there is |
Two more refusals you may meet, both compiled into the binary and not removable by any policy:
- Credential export — an operation whose output is a secret (
gcloud auth print-access-token,kubectl get secret,vault kv get,sops -d). Using a credential is untouched;kubectl applyis fine. - Tool reconfiguration — an operation that changes the tool rather than
your systems (
gcloud config set,gcloud components install,kubectl config use-context,oc login,git config --global). Reading the same configuration still works. Do these in your own shell, deliberately.
Also in this release: a command run process starts in a private empty
working directory, so a command that depended on the directory you ran
runtime from (a git repository, a Terraform project) will not see it; results
and error text pass a size and redaction boundary before they reach output, a
capability step or the audit log; the audit record carries your account as a
keyed digest rather than in the clear; and runtime context observes where
your tools point rather than keeping a context.yaml of its own — a leftover
one now blocks, and runtime context retire says what each value maps to.
None of this is a sandbox, and the documentation does not claim it is. An
approved tool still handles its own credentials and makes its own network
calls. See command run for exactly what is and is not
bounded.
What to do: install or upgrade with Installation
/ Upgrading, then run runtime config validate
before your first real command — it reports the policy in force, what it
grants, and anything left in your Runtime Home that no longer governs.
v0.5.4¶
Published: GitHub Release v0.5.4.
Customer-facing surface: same provider operation counts as 0.5.3
(github 19 · files 5 — verify with runtime config validate). No new
CLI verbs in this tag.
What to do: install or upgrade with Installation
/ Upgrading. If you pin CI versions, bump the pin to
v0.5.4 when you want this binary.
Internal packaging and Control Plane contract-vendoring work landed around this
release; it does not change day-to-day runtime github / runtime files usage.
v0.5.3¶
Published: GitHub Release v0.5.3.
Historical Portal topology
The API prefixes and api.engineeringruntime.com backend mapping below
describe v0.5.3 only. The v0.9.7 candidate retires /api/public; api. is
a static reference and an Enterprise deployment supplies its own Portal
base URL.
Customer-facing surface (relative to 0.5.2):
| Change | What to do |
|---|---|
Optional Control Plane client matured (runtime portal status / sync, audited sync, correct path when RUNTIME_POLICY_FILE is set) |
Read Control Plane (Portal) if you uplink; otherwise ignore — still off by default |
Dual API prefixes: portal.path_prefix /api/public (demo) or /api/v1 (enterprise) |
Set the prefix to match the UI you watch (demo vs app) |
Demo hostname is demo.engineeringruntime.com (not portal.) |
Update bookmarks and any old portal. URLs |
Recipes point at api.engineeringruntime.com as portal.base_url |
Do not point base_url at a UI host |
Provider counts unchanged vs prior 0.5.x (github 19 · files 5).
The binary is always the authority¶
Operational examples on this site are verified against Runtime 0.9.1 unless a page states otherwise. This is the site's single verification claim: pages do not repeat the version, and updating this line is an assertion that the examples were re-run — not a version bump. If a release ships without that work, this sentence should name the version they were verified against and say so. Install examples install latest by default. When a page and your installed binary disagree, your binary wins — check it directly:
runtime <provider> --help is generated from the provider's real operation
surface, so it can never drift from what you have installed.
After every upgrade¶
Three checks, about ten seconds, that catch the overwhelming majority of post-upgrade surprises:
# 1. Does the active configuration still resolve?
runtime config validate
# 2. How does the effective policy differ from this release's default?
runtime config diff policy
# 3. Do capabilities in the selected source still validate?
find /path/to/pinned-capability-source -name '*.md' -print0 |
while IFS= read -r -d '' f; do
runtime capability validate "$f" >/dev/null || echo "FAILED: $f"
done
The policy comparison matters more than it looks — see the trap below.
Capability definitions do not ship with 0.6.0¶
A fresh Home has an empty capability inventory, and that is success. Runtime
fetches nothing and Bootstrap writes no executable workflow definitions.
Repositories or catalogs own capabilities; select an exact checkout through
capabilities.sources, or execute a reviewed file by path.
Homes upgraded from v0.5.x may still contain the examples that those releases seeded. Runtime leaves them untouched and reports that location as a non-authoritative compatibility cache. Move definitions you own to an external source deliberately; do not treat the leftover copy as the repository.
What an upgrade touches¶
| Path | On upgrade |
|---|---|
specs/, commands/ |
Replaced to match the new binary; files it no longer ships are deleted |
version |
Updated |
config.yaml, policy-config.yaml |
Never touched (and never created — the compiled defaults apply with no document) |
| capabilities directory | Untouched. No definitions are added; a fresh directory is empty and non-authoritative |
logs/, cache/ |
Untouched |
Full mechanics: Upgrading.
New defaults never reach an existing install
An explicitly selected policy-config.yaml is yours, so a release that
adds allowed_binaries entries or new deny rules does not replace it. This
has bitten real installs: a laptop sat at 6 allowed binaries while the
release compiled 21, and runtime command run helm was denied for no
apparent reason.
This is a deliberate trade — never clobbering your policy is worth more than
auto-delivering defaults — use runtime config diff policy to see the
exact allowed_binaries difference. Merge by hand; replacing the file
wholesale discards your own rules.
Where to look when something changed¶
| You noticed | Read |
|---|---|
| An operation no longer validates | runtime capability, then runtime <provider> --help |
| A command is suddenly denied | Policy and the trap above |
| A config key moved or was renamed | config.yaml, Environment Variables |
| A capability step key is now rejected | Capability Authoring |
| Something structural changed between versions | Migration Guides |
| A brand-new provider appeared | Providers |
A portal: block appeared in config.yaml, or runtime portal in --help |
Control Plane (Portal) — optional, off by default, safe to ignore |
Migration Guides documents breaking changes in detail —
the retired allowed_commands block, the move from a central command registry
to the Provider layer, and stricter capability parsing.
Downgrading¶
Supported and symmetric: specs/ and commands/ refresh back down to what
the older binary ships, because the refresh triggers on any version difference.
Your user-owned files are untouched in that direction too.
The one thing to re-check is capabilities — one written against an operation that exists only in the newer binary will fail validation after a downgrade. That is the intended behaviour, caught before execution rather than during it.
Operational examples on this site were verified against Runtime 0.9.8. After bootstrap, the version-exact files in Runtime Home win.