Release OpenEnv 0.5.0 - #1190
Conversation
Set the package version from 0.4.3.dev0 to stable 0.5.0. The 47 commits since v0.4.2 add new public surface (openenv.harbor, the RFC 011 catalog/discover CLI, the RFC 008 validate contracts) and a new environment, so this cut is a minor release rather than a patch. Co-authored-by: benjamin.burtenshaw <benjamin.burtenshaw@huggingface.co>
There was a problem hiding this comment.
Stale comment
Alignment Review Report
Scope: this PR is a single-line release bump —
pyproject.tomlversion0.4.3.dev0→0.5.0(no other files changed).Automated Checks
- Lint: NOT RUN in sandbox / N/A to diff.
uvisn't available in this review environment, so.claude/hooks/lint.shcouldn't execute. The diff changes only a TOML version string (no Python undersrc//tests/), so it is lint-irrelevant. I verified independently thatpyproject.tomlstill parses as valid TOML withproject.version == "0.5.0".- Debug code: CLEAN (for this diff).
check-debug.shreported pre-existingprint()/TODO items (e.g.src/openenv/core/mcp_client.py,core/containers/runtime/providers.py— mostly docstring examples), but none are in this PR's diff, so nothing is attributable to this change.Open RFCs Context
- Draft: RFC 010 (ECHO token world model), RFC 011 (ARD catalog discovery, @thegovind).
- In Review: RFC 000/001/002/003/005, RFC 008 (auto-validation, @zkwentz), RFC 012 (Harbor capture providers, @adithya-s-k).
- Relevant here: 0.5.0 packages already-merged work tied to these non-final RFCs — RFC 011 discovery (#1138), RFC 012 Harbor (#1036,
openenv.harbor), RFC 008 validate contracts.Tier 1: Fixes Required
None. The version bump is valid TOML and introduces no lint/debug/syntax/type/import/security issues.
Tier 2: Alignment Discussion
Principle Conflicts
None identified. A packaging version bump touches no API signature, client/server boundary, reward path, or MCP/WebSocket interface — no INVARIANTS/PRINCIPLES surface is affected.
RFC Conflicts
ALIGNMENT FLAG: Cutting a stable
0.5.0that publishes public surface governed by non-final RFCs
- Principle/RFC at stake: INVARIANTS "Breaking Change Policy → Pre-1.0" (authored by @Darktex); RFC 011 (Draft), RFC 008 (In Review), RFC 012 (In Review)
- The concern: The commit message notes 0.5.0 adds new public surface —
openenv.harbor, the RFC 011 catalog/discoverCLI, and the RFC 008validatecontracts — shipped as a stable (non-rc) PyPI release while those RFCs are still Draft/In Review. Pre-1.0 policy explicitly permits breaking changes if documented in release notes, so this is acceptable, not a blocker — but the team may want to (a) consider anrcpre-release for those surfaces, and/or (b) ensure the auto-generated GitHub release notes mark them as provisional/subject-to-change so downstream consumers aren't surprised when the RFCs finalize.- Suggested reviewer: @Darktex (semver / breaking-change policy owner), @thegovind (RFC 011), @zkwentz (RFC 008), @adithya-s-k (RFC 012)
Observations (non-blocking)
- Minor-bump intent verified. The post-release dev marker was
0.4.3.dev0, but this cuts0.5.0(minor, not patch). The commit message documents the rationale (47 commits sincev0.4.2add new public surface + a new env → minor). This is consistent with.github/workflows/publish-pypi.yml, which accepts anyvX.Y.Ztag, hard-gatestag == pyproject.tomlversion, and auto-opens the next.dev0bump PR post-publish. No concern.- Release mechanics reminder. This PR only bumps
pyproject.toml. Actual publishing requires pushing tagv0.5.0onmainafter merge — that triggers PyPI publish, the GitHub release, and the automated0.5.1.dev0post-release bump PR.- Pre-existing, outside diff:
src/openenv/cli/__init__.pyhardcodes__version__ = "0.1.0". It appears unused (skills.pyimports the dynamic package-levelopenenv.__version__, which resolves from metadata →0.5.0), so it won't affect the release, but consider aligning or removing it in a follow-up.Summary
- 0 mechanical issues to fix (Tier 1)
- 1 alignment point for human review (soft, non-blocking)
- 0 hard RFC conflicts (1 discussion flag)
No blockers found. Not approving/merging — this is an advisory alignment review only.
Sent by Cursor Automation: Pre-review
Co-authored-by: benjamin.burtenshaw <benjamin.burtenshaw@huggingface.co>
There was a problem hiding this comment.
Candidate refreshed: branch head is now 5937a6cf, which is current main 4a1fa2a8 plus the one-line version change. (I cannot edit the PR description — updatePullRequest returns 403 for this integration — so the "Candidate head: 34825a77" line in the body above is stale by one commit: #1173, the envs lockfile security rollup, merged as 4a1fa2a8. It touches only envs/**/uv.lock and does not change the published package.) The cut is now 48 commits since v0.4.2.
CI gates on this exact head: test (3.11), test (3.12), lint, Build and smoke-test package, Analyze (python), snapshot, check-env-docs, validate-env-locks, both ThinkingBox jobs, and Bugbot all pass on the pre-refresh head aab0e319; they are rerunning on 5937a6cf.
I am not merging this and not publishing today. The blockers in the description are unresolved — above all the capture proxy shipping without an admin key on run_batch()'s default public expose="gradio" path, which would reach PyPI users. TestPyPI has deliberately not been dispatched: validating a candidate that is held on a security finding would only produce a misleading green. Production PyPI and the GitHub release both remain 0.4.2.
What I need to proceed: the version confirmation (0.5.0 as written, or a stated rollback for a true patch), and a fix, revert, or explicit accepted-risk decision on the capture-proxy auth finding. Once those land I will refresh onto main, rerun every gate on the exact head, dispatch TestPyPI, and only then merge, tag, and publish.
Sent by Cursor Automation: Release
Co-authored-by: benjamin.burtenshaw <benjamin.burtenshaw@huggingface.co>
|
Version decision from @burtenshaw: go with Capture-proxy finding: a forward-fix PR is being opened now (mint an admin key in |
|
Forward-fix for the capture-proxy admin-key finding: #1193. Review requested from @adithya-s-k. Once it merges, this candidate should be refreshed onto main (which now also includes #1174, #1192, and the finqa fix from #1008) and the gates rerun. |
…1193) * fix(harbor): gate capture proxy control plane with an admin key in run_batch and the server CLI The capture proxy's session-management routes (POST /sessions, GET /sessions, GET /sessions/{id}, GET /sessions/{id}/rollout, GET /sessions/{id}/trace_entries, DELETE /sessions/{id}) are gated by `_admin_ok`, which admits every caller when `app.state.admin_key` is unset. That is fine on a private port, but `run_batch` (behind `openenv harbor rollout`) built its `CaptureServer` without an admin key and then published it through a public tunnel, since `expose` defaults to "gradio". Anyone who found the URL could enumerate live rollouts, read their token-level training data, delete them, or mint a session key the proxy would then honour, turning it into an open relay to the upstream engine. The standalone `python -m openenv.core.harness.capture.server` had no way to set a key at all. `run_batch` now takes `admin_key`, resolving it as: explicit argument, else $OPENENV_CAPTURE_ADMIN_KEY, else `secrets.token_urlsafe(32)`, and passes it to `CaptureServer` -- the same handling `HarborService` already does for `harbor serve`/`push`. The rollout path mints and deletes sessions through the in-process registry, and the sandboxed agent only uses the data plane, so no caller needs the key. The server CLI gains `--admin-key`, defaulting to the same env var. Release blocker for 0.5.0, tracked on #1190. * fix(harbor): mint capture admin key for non-loopback CLI binds Default --host 0.0.0.0 left /sessions* ungated when --admin-key was unset. Mint a random key (and print it) unless the bind is loopback, matching the run_batch fail-closed policy. Co-authored-by: benjamin.burtenshaw <benjamin.burtenshaw@huggingface.co> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Includes #1193 capture-proxy admin_key gate (release blocker cleared). Co-authored-by: benjamin.burtenshaw <benjamin.burtenshaw@huggingface.co>
Includes #1194 capture CLI no-leak (loopback default; refuse non-loopback without an explicit admin key). Co-authored-by: benjamin.burtenshaw <benjamin.burtenshaw@huggingface.co>
There was a problem hiding this comment.
Alignment Review Report
Scope: This is the OpenEnv 0.5.0 release PR. The entire change is a single line in pyproject.toml (version = "0.4.3.dev0" → "0.5.0"); git diff against both main and the merge-base confirms nothing else changed. Findings below are verified against the repo's actual CI. (Note: this PR is already merged — posting for the record.)
Automated Checks
- Lint: PASS (CI-verified). The
lintcheck on this PR is green, and I reproduced it locally:ruff check src/ tests/→ "All checks passed!", and the CI format pipeline (usort formatthenruff format src/ tests/) yields no net change.- The local
.claude/hooks/lint.shreports FAIL, but this is entirely pre-existing and outside CI's scope — unrelated to this diff:usort checkflagstests/envs/test_grid_world.pyandtests/envs/test_julia_env.py(one blank-line-after-import each) — the two files already documented inAGENTS.md.usort-alone disagrees, but the combined CI pipeline (usort→ruff format) reconciles to a no-op, which is why CI stays green. Unchanged since #895 (Jul 2026).ruff format --check envs/flags 56 files, but CI only formatssrc/ tests/; the local hook additionally lintsenvs/.
- The diff itself (a TOML version string) introduces zero lint issues.
- The local
- Debug code: CLEAN (w.r.t. diff).
check-debug.shsurfaces only pre-existing docstringprint(...)examples, Richconsole.print, and deferred-featureTODOs insrc/; nobreakpoint()/pdb. None are in this diff.
Open RFCs Context
In Review: 000, 001, 002, 003, 005, 008, 012 (Harbor capture providers). Draft: 010, 011. A version-string bump implements no design surface, so none of these RFCs are affected or pre-empted.
Tier 1: Fixes Required
None. The one-line bump has no mechanical issues:
0.5.0is valid PEP 440, and thepublish-pypiworkflow's guard (release tagvX.Y.Zmust equal thepyprojectversion and be a stable release) is satisfied — this bump is exactly what enables a cleanv0.5.0tag.openenv.__version__resolves dynamically via_load_package_version()from installed metadata, so no code needs updating to match.- The hardcoded
__version__ = "0.1.0"insrc/openenv/cli/__init__.pyis stale, but it is unused (not imported or wired to any--versionflag) and pre-existing — out of scope for this PR.
Tier 2: Alignment Discussion
Principle Conflicts
None identified. There is no functional change, so nothing touches rewards-in-environment, client/server separation, the dual API boundary, or the Gymnasium reset/step/state signatures.
RFC Conflicts
None identified.
Process note (non-blocking)
ALIGNMENT FLAG: Minor-version release without in-repo release notes
- Principle/RFC at stake: INVARIANTS "Breaking Change Policy" / PRINCIPLES pre-1.0 versioning
- The concern: The policy states pre-1.0 breaking changes are "acceptable if documented in release notes." This is a MINOR bump (0.4.x → 0.5.0) covering 59 commits since
v0.4.2, including the Harbor integration (#1036), yet there is noCHANGELOGin-repo. Recommend confirming thev0.5.0GitHub Release carries notes. Also a quick confirm that0.5.0is intended rather than0.4.3(which the prior0.4.3.dev0marker implied) — since MINOR is the correct bucket for new features (PATCH is "bug fixes only"),0.5.0looks like the right call. - Suggested reviewer: @Darktex (author of the Breaking Change Policy lines in INVARIANTS.md / PRINCIPLES.md)
Summary
- 0 mechanical issues to fix
- 1 low-priority process note for human review (release notes + version-intent confirmation)
- 0 RFC conflicts
Sent by Cursor Automation: Pre-review


Release PR: v0.5.0
Planned release: Thursday, September 17, 2026 at 10:00 Europe/Brussels (08:00 UTC) — currently held, see Outstanding blockers.
Candidate head:
34825a77(main tip at the time of writing). 47 commits sincev0.4.2.Why 0.5.0 and not 0.4.3: this cut adds new public surface — the
openenv.harborpackage, the RFC 011openenv catalog/openenv discovercommands, the RFC 008validatecontracts — plus a new environment. A patch number would misrepresent it. A true0.4.3would require reverting those features through review. The version line is a one-line edit if you want a different number.Release notes
openenv catalogandopenenv discover, packaged environment-card schemas, authored discovery declarations, and a catalog artifact workflow (#1138, #1093, #1161, #1167).openenv validateskeleton, and schema-valid scaffolds (#1110, #1111, #1112, #1137).EnvClientteardown, reconnect after a far-end close, and per-user discovery cache paths that reject control characters (#1162, #1172, #1167).collectresume files, read reward and done from the step envelope in typed clients, and declare importable manifest app paths (#1171, #1017, #1164).Full candidate comparison: v0.4.2...34825a7
Release-maintenance changes in this PR
0.4.3.dev0to stable0.5.0. Nothing else.Outstanding blockers
run_batch()defaults toexpose="gradio", which publishes the capture proxy through a public tunnel, but it constructsCaptureServer(...)withoutadmin_key(src/openenv/harbor/runner.py:97). With no admin key,_admin_ok()returnsTruefor every caller (src/openenv/core/harness/capture/server.py:698), soGET /sessions,GET /sessions/{id}/rollout,DELETE /sessions/{id}, andPOST /sessionsare open — exactly the enumeration, token-level trace disclosure, session deletion, and key-minting relay that the function's own docstring says the key exists to prevent.harbor serve/pushset the key correctly (src/openenv/harbor/serving.py:83);run_batchand the standalonepython -m openenv.core.harness.capture.serverCLI (no--admin-keyflag) do not.openenv.harborandopenenv.core.harness.captureare both shipped bysetuptools.packages.find, so this reaches PyPI users. Needs a fix, a revert, or an explicit accepted-risk decision before publication.0.5.0(recommended) or state what should be reverted for a true patch.publish-testpypi.ymlfrom this exact branch with a unique0.5.0pre/dev suffix.mainimmediately before merge; rerun all required checks if the head or base changes.Lower severity, not release-gating on its own:
_ContextEnviron.__delitem__deletes only from the base mapping (src/openenv/harbor/proc_env_context.py:98), sopop("OVERLAY_ONLY", default)raisesKeyErrordespite the default andclear()leaves overlay keys behind while emptying real process environment keys.Excluded from this candidate: #1145, #1174, #1187, #1189, and #1008 — none is exact-head green with the reviews its content requires. #1173 (envs lockfile security bumps) touches only
envs/**/uv.lockand does not affect the published package either way.Release Checklist
Before opening this PR
pyproject.tomlversion changed from0.4.3.dev0→0.5.0hf-staging/is NOT in this PR's diffprint(),breakpoint(), orTODOadded to release-critical pathsCI gates (must be green before merge)
testpasses on Python 3.11testpasses on Python 3.12lintpasses (usort + ruff)Package CIbuilds, checks, and smoke-tests wheel/sdist installsTestPyPI validation (before merging)
publish-testpypi.ymlfrom this branch0.5.0.devNpip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ openenv==0.5.0.devNPost-merge steps
v0.5.0pushed against the exact merge commitpublish-pypi.ymlcompleted successfully from the tagpip install openenv==0.5.0from production PyPI verified (import,__version__, CLI, real Echo reset/step)RFC Status
Note
Low Risk
Single-line version metadata change with no runtime or dependency edits in this diff.
Overview
Bumps the published openenv package version from
0.4.3.dev0to stable0.5.0inpyproject.toml. This is the only code change in the PR; it aligns wheels/sdist andimportlib.metadata/openenv.__version__with the 0.5.0 release cut described in the release notes (Harbor, catalog/discover, validate, etc. are already on the candidate branch, not introduced here).Reviewed by Cursor Bugbot for commit cbe0808. Bugbot is set up for automated code reviews on this repo. Configure here.