This release includes 1 breaking change for platform teams planning a safe upgrade.
Published 1mo
Developer Productivity
✓ No known CVEs patched
✓ No known CVEs patched in this version
Topics
cli
configuration
contracts
developer-tools
infrastructure
ota
+5 more
productivity
repo-readiness
rust
validation
workspace
Affected surfaces
auth
rbac
breaking_upgrade
Summary
AI summaryAdded release-gated skills‑sync governance check requiring docs/policy/skills-sync-status.yaml updates for core schema changes.
Full changelog
- added a release-gated skills-sync governance check for contract-surface widening: maintainer
changes to core schema/validator/spec/example surfaces must now update
docs/policy/skills-sync-status.yamlwith either a syncedota-run/skillscommit or an
explicit waiver reason, and the release gate plus repo task surface now enforce that discipline - moved published repo/workspace contract schema ownership into a Rust-backed generator module and
added a sync/export path viacargo run --bin sync_published_contract_schemas; CI compatibility
tests now fail whendocs/spec/json-schemas/contract.jsonor
docs/spec/json-schemas/workspace-contract.jsondrift from that generator, closing the remaining
hand-edited published-schema split-brain - tightened generated-schema governance again: the release gate and repo
compattask now rerun
the published-schema generator and fail ongit diff --exit-codedrift before the schema/output
contract tests run, so publication proves regenerated artifacts rather than inferring sync only
from downstream test coverage - tightened the type-model boundary behind the published repo/workspace contract schemas: shipped
examples and canonical contract docs examples now validate not only as authored YAML, but also
after loading through the Rust contract types and projecting back to authoring JSON values, so
the published schemas are exercised against the real Rust-owned authoring-model boundary rather
than only raw source files - published and enforced the full machine-readable workspace contract schema at
docs/spec/json-schemas/workspace-contract.json/
https://dist.ota.run/spec/json-schemas/latest/workspace-contract.json; shipped workspace
examples and canonical workspace contract docs now validate against that published schema, and
the compatibility surface now treats both repo and workspace contract schemas as release-gated
public APIs - published and enforced the full machine-readable repo contract schema at
docs/spec/json-schemas/contract.json/
https://dist.ota.run/spec/json-schemas/latest/contract.json; shipped example contracts and
canonical repo contract docs now validate against that published schema so contract publication
is a governed release surface instead of an optional artifact - hardened finding identity across governance surfaces: advisory-backed doctor findings now carry
explicit stable identity,ota explain --jsonpreserves that code throughsteps[].code
instead of re-deriving advisory identity from rendered summary text, andota annotations
now renders additiveCode:segments when input finding JSON includes a stable code; the main
structured doctor finding families for service readiness, declared checks, runtime/tool
diagnosis, env value and env-source failures, backend/remote topology blockers, workflow
probe/surface readiness findings, policy-backed findings, repo hygiene findings, native
prerequisites, and contract drift now also emit explicit stablecode/category/owner
identity instead of depending on summary parsing; policy-backed version-rule and strict-version
findings now also preserve policy metadata/provenance consistently in doctor JSON - added a representative
ota doctor --jsoncontract pack across policy, workflow, service, env,
provisioning, and remote finding lanes, and CI now fails if a shipped doctor finding is added
without explicit identity metadata; doctor report-level contract coverage now also locks summary
verdict/counts, primary-blocker mirroring, ready-without-blocker shape, and published schema
truth formode: remoteplussummary.primary_blocker.code; the shipped doctor code catalog is
now published in a generated reference doc synced fromsrc/doctor.rs, and contract-drift
findings now publish the documentedrepo_signalsprovenance instead of falling back to generic
repo-contract provenance; monorepo aggregateota doctor --jsonnow also computes
summary.primary_blockerfrom the same rewritten emitted findings surfaced inmembers[]; the
published workspace doctor/check schemas now also expose top-levelsummary.primary_blockerand
blockercodefields in line with the shipped JSON output, and workspace repo acquisition /
repo-contract findings now also emit explicit stable workspace finding codes instead of falling
back to anonymous summary-only blockers - hardened remaining shipped command finding identity: contractless/onboarding doctor signals,
inferred starter-agent signals, policy effect-governance decisions, and adapter-bootstrap
failures now emit explicit stablecode/category/owneridentity instead of anonymous
summary-only findings; the shipped finding reference catalog now also covers command-sourced
production findings, andsrc/cli/commands.rsis guarded so new shipped command findings
cannot reintroduceidentity: None - widened
ota envwith--workflowselection so the env read path can inspect the selected
workflow’s env profile truth directly; text and JSON output now report the selected workflow,
selected profile, and any workflow-owned rendered env artifacts such as rendered dotenv files - widened execution-truth reporting for workflow-owned rendered env artifacts:
ota execution plan,
execution receipts, andota proof runtime --jsonnow surface the selected workflow env
artifacts plus consuming task/service lanes, and validate/doctor now warn when tasks duplicate
ownership of a workflow-rendered env file that Ota already auto-projects into the workflow task
closure - added first-class task
env_filesoverlays for run-path process ownership, widened
action.kind: ensure_env_filewith deterministicmode: replace,mode: remove, and
from_envprojection from resolved Ota env truth, and sharpenedota proof runtime --json
with optionallikely_causehints for high-confidence loopback service drift or detached-run
failure excerpts discovered in captured proof logs; proof phase reporting now refines blocked
runs from capturedup.logso repo check / precondition failures do not collapse into
misleadingservice readinessproof phases; invalid taskenv_filesnow failota env --task,
run preview, and task execution before env resolution falls through to misleading missing-env
diagnostics - added first-class
env.profilesplusworkflows.<name>.env.profile, so selected workflow
doctor/up/proof paths can prepend workflow-owned declared env sources and inject ordered
workflow-scopedenv_files/ literal env overlays without repeating that ownership across task
shells or task-local duplication - widened
env.profileswith first-classrender.dotenvartifact materialization, soota up
can now render workflow-owned dotenv files from selected profile truth before service startup
and setup, removing the remaining need for a separateensure_env_fileprepare task when the
workflow only needed a compose/runtime interpolation artifact - widened
env.profiles.<name>.render.dotenvwith optionaltemplatesupport, so workflow-owned
dotenv artifacts can now be re-rendered from repo example truth plus selected profile overlays
without hiding that materialization inside a separate setup task or stale shell rewrite glue - widened first-class check governance with
checks[].kind: env, a deterministic dotenv-backed
assertion surface for repo-relative env files; contracts can now replace shellgrep/findstr
glue with governedenv.pathassertions over exact values, host values, or URL hosts using the
initialpolicy: not_loopbacksurface plus first-classstate: present|missingassertions, and
requirements.checks/when.checksnow accept those env checks directly; validate/doctor now
also warn on obvious shell file-state and env-file checks that should be rewritten as
first-classkind: fileorkind: envchecks - widened
checks[].kind: envhost governance withhost.allowedandurl_host.allowed, so
contracts can now assert one env key or URL/DSN host resolves to one of a small set of truthful
service hostnames without falling back to shellgrepglue - widened
checks[].kind: envwithnot_equals, so contracts can ban a small set of known-bad
exact env values without shell assertions - widened
workflows.<name>.prepare.taskfrom nativeaction-only to native finite task bodies
(run,script,prepare, oraction) so workflow-scoped normalization and bootstrap steps
no longer need to hide behind task dependencies; service-like prepare tasks still remain invalid
throughlaunch,runtime, andrequires_servicesrejection - added
services.<name>.manager.env_fileformanager.kind: compose, so Ota-owned compose
service start/stop/ps/health command paths can carry one declarativedocker compose --env-file
input instead of forcing repo-local shell duplication - validate/doctor now also warn on obvious shell
.env*rewrite tasks so deterministic env-file
mutation can move toaction.kind: ensure_env_filewith explicit replacement keys instead of
platform-specificsed/perlglue - validate/doctor now warn when task bodies hard-code
docker compose --env-file ..., pushing
compose interpolation ownership toward declarative taskenv_filesor
services.<name>.manager.env_file - widened
action.kind: ensure_env_filewithaction.template_mode: replace, so Ota can
re-derive an env file from its template on every run before applying explicit key replacements;
this closes the shell copy-plus-sedenv normalization gap with one governed action surface - widened managed-service topology modeling so service endpoint identity is no longer forced to
equal execution-context identity:services.<name>.endpoints.<name>.context,
services.<name>.readiness.endpoint, andtasks.<name>.env_bindings.<VAR>.from_service.endpoint
now let one context expose multiple truthful service surfaces without falling back to opaque
shell glue - closed the assist authoring gap for named service endpoints:
ota assist declare-servicenow
accepts--endpoint-context, projects it into proposal JSON/YAML, and keeps generated readiness
and replay commands aligned with the authored endpoint context - widened Docker Compose service topology detection for explicit host-published ports:
ota detect,
ota init, and detect merge can now infer the canonical host execution slice
(execution.default_context,execution.contexts.host.backend), plus matching
services.<name>.endpoints.hostand structuredreadiness.from/readiness.kind: tcp
when one Compose service exposes exactly one deterministic TCP host-published port candidate;
when one Compose service exposes multiple deterministic TCP host-published port candidates, Ota
now emits named host endpoints such asservices.<name>.endpoints.host_3000.context: host
instead of dropping topology entirely, while intentionally withholding ambiguous readiness
ownership - closed the remaining readiness assist gap for multi-endpoint services:
ota assist declare-readinessnow accepts--endpoint, carries the selector through preview/apply
JSON/text output, and writesservices.<name>.readiness.endpointplus the matching
readiness.fromcontext instead of forcing manual YAML edits when one service exposes multiple
truthful projections - fixed detect-merge execution governance for inferred Compose host topology: additive merge no
longer rewrites an authoredexecution.default_context, and it now skips host-topology
additions entirely when the existing contract still uses root shorthand execution - upgraded Docker Compose service detection to the canonical managed-service surface:
ota detect,
ota init, detect merge, and detect-owned field tracking now emitservices.<name>.manager.*
and structuredreadiness.kind: compose_healthfor Compose-backed services instead of teaching
legacyprovider/start/stop/healthcheckas the inferred contract shape, with updated JSON
output docs and regressions - fixed Python toolchain host requirement projection for Poetry-owned repos: when
toolchains.python.package_managers.poetryis declared without an explicitpackage_managers.uv
requirement, Ota no longer injectsuvas a mandatory host tool on check-only/run-path surfaces;
uvremains available for explicit Python run fulfillment and for repos that actually declare
package_managers.uv - Fix native task fulfillment so inferred wildcard shell-tool requirements like
pnpm: "*"no longer conflict
with exact toolchain-owned package-manager versions; exact owned versions now win during requirement merging. - fixed agent bootstrap determinism advisories so exact
OTA_GIT_REV=<commit>source-install
pins are now recognized as deterministic, while moving branch installs still warn correctly - widened Python toolchain package-manager ownership so Poetry is first-class under
toolchains.python.package_managers.poetry, while legacy standalonetools.poetry
declarations remain temporarily accepted with migration warnings instead of a silent break - expanded first-class Python setup so Poetry is now operational as well as declarative:
prepare.kind: dependency_hydrationnow shipssource.kind: poetry, and the existing
Pythonprovider: uvfulfillment lane can now install declared Poetry versions on the
selected run path before tasks execute - expanded the managed toolchain ownership surface into named execution contexts:
execution.contexts.<name>.requirements.toolchainsis now first-class, so repos can keep
runtime and package-manager ownership undertoolchainseven when that truth is scoped to a
host, container, or other named execution context instead of falling back to split
runtimes/toolsdeclarations - expanded first-class task preparation for dependency hydration with a Yarn slice:
prepare.kind: dependency_hydration,medium: package_dependencies, and
source.kind: node_package_managerwithmanager: yarnnow let ota execute
yarn install --immutablestructurally instead of hiding lockfile-backed Yarn hydration
inside opaque shellruncommands - added first-class aggregate task bodies through
tasks.<name>.aggregate.tasks: Ota now models
named dependency-closure entrypoints such asverifystructurally instead of teaching fake
run: "true"wrappers, with schema/validation/runner/output support and updated docs/examples - fixed mixed-mode task validation for top-level fallback bodies: when a task already declares its
default native body at the task level,execution.default_mode: nativeno longer requires a
redundantexecution.modes.nativebranch just to add a non-default container override - fixed workflow-scoped
ota upservice selection: when a selected workflow does not declare
workflows.<name>.services.required, Ota no longer falls back to unrelated repo-global
required services during the final service-readiness phase - fixed Windows native POSIX-shell task execution to launch Bash without login-shell startup:
repo-rooted commands such as Bundler dependency hydration now preserve Ota's selected working
directory instead of lettingbash -lreset execution into$HOME - fixed native
ota doctor/ota up --dry-runmismatch handling fortoolchains.rubywith
fulfillment.source: rubyandmode: run: when the selected path declares Bundler under the
Ruby toolchain, Ota now checks the selected Ruby provider instead of blocking on an ambient
bundleprobe before selected-path fulfillment can occur, and the shipped Ruby fulfillment lane
now installs declared Bundler versions viaruby -S gem install bundler ... - clarified agent-facing task guidance: when a repo declares a matching safe or verification
task, agents should preferota run <task>over raw package-manager or language-tool
commands and fall back only when no truthful Ota task exists or when isolating an Ota defect - expanded first-class task preparation for dependency hydration with a native Go slice:
prepare.kind: dependency_hydration,medium: package_dependencies, and
source.kind: go_modulesnow let ota executego mod downloadstructurally instead of
hiding module hydration inside opaque shellruncommands - expanded first-class task preparation for dependency hydration with a Ruby/Bundler slice:
prepare.kind: dependency_hydration,medium: package_dependencies, and
source.kind: bundlernow let ota execute repo-local gem hydration structurally instead of
hidingbundle config set path ... && bundle installinside shellruncommands - hardened dependency-isolation volume cleanup after container-backed execution and proof:
Ota now gives container engines a longer retry window before surfacingvolume is in use
cleanup failures, reducing false-negative proof tails when Docker lags briefly after
container removal - added first-class task preparation semantics through
tasks.<name>.prepare: the shipped
prepare.kind: dependency_hydrationslices now model both docker image hydration and
node package-manager dependency hydration structurally instead of forcing finite setup phases
to live inside opaque shellrunstrings - added executable task support for the first shipped
prepareslice in schema, validation,
summaries, and runner execution, including mode-branch support and validation that keeps
docker-backed and node package-manager dependency hydration aligned with explicit
requirementsandeffects - updated the full contract example and the widened
immichpressure contract to use
first-classpreparefor registry-backed docker image hydration instead of repo-local shell
glue - added a canonical orchestration model for repo-mediated execution: contracts can now declare
top-levelorchestrators, selected tasks can opt intoexecution.orchestrator.ref/
execution.orchestrator.mode, and Ota shipsmiseas the first orchestrator for trust,
install, and mediated task execution on the selected path - fixed run-path preparation env parity for selected backends: orchestrator preparation,
toolchain fulfillment, and Corepack activation now inherit the effective backend/task env
before execution, so container-scoped repo-manager paths such asmise trust/mise install
can use declared context env (for example writableMISE_*paths) instead of failing under
backend-default locations - fixed native
ota doctor/ota up --dry-runmismatch handling fortoolchains.<name>.fulfillment.source: mise
withmode: run: when the selected path declaresmiseas the run-path authority, Ota now
checksmiseitself instead of blocking on an ambient host runtime version mismatch before
selected-path fulfillment can occur - upgraded
toolchainsto the canonical capability-first model: public contracts now use
structuredfulfillment(source+mode) instead of teaching legacy provider-coupled
toolchain shapes, while runtime compatibility still accepts legacyproviderand flat
fulfillment: runinput during migration - updated Ota's own contract, examples, and spec docs to the new canonical model, including
removal of managed-surface shell glue that duplicated declared toolchain truth - made service-task readiness budgets authoritative during startup in
ota run: when a service
task declares a projected runtime endpoint and the configured readinessstart_period/
interval/timeout/retriesbudget is exhausted before that endpoint becomes reachable,
Ota now fails startup instead of waiting indefinitely until the workload exits or the user
interrupts it - added structured readiness failure reporting for service startup in
ota run: startup failures
now carry the real probe budget and last probe error through terminal output and JSON-facing
execution surfaces, and--streamreadiness probes now emit live attempt progress instead of
only a final generic readiness failure
Breaking Changes
- Core schema/validator/spec/example surface changes must now update docs/policy/skills-sync-status.yaml with a synced ota-run/skills commit or an explicit waiver reason; the release gate enforces this discipline.
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 ota-run/ota](https:
All releases →Related context
Related tools
Earlier breaking changes
- v1.6.16 Enforce `metadata.ota.minimum_version` at contract load time across all commands.
Beta — feedback welcome: [email protected]