# DEVX-182: feat(molecule): release lease emission (ships DEVX-181) - Task: DEVX-182 - Status: draft ## Problem DEVX-181 landed on master but was never released: the squash subject came out `DEVX-181: ci: retrigger validation` because the branch's last commit was an empty `ci:` retrigger. git-cliff found no bump-worthy commit, so `v0.55.5` is still latest and the S08 lease producer is unshipped. A `feat:` merge is needed to cut the release — and while shipping, the emission log line is upgraded from a bare count to the actual lease owner and UTC expiry, which is what an operator needs when debugging a cleanup race. ## Approach REQ-1: `start_docker.main()` computes `lease_env()` once and logs `owner=` + ISO-8601 `until=` alongside the export confirmation. The single call also removes a latent second-boundary inconsistency where `emit_github_env` and the count message each re-derived `now`. REQ-2: Merge squash commit carries `feat(molecule):` so git-cliff cuts the next minor release containing DEVX-181's emitter and this change. ## Test Plan - Update `test_emits_lease_on_success` + `test_prints_and_exports` for the new log format; keep 100 % coverage. - `make pre-push` — full devx suite green. - Post-merge: verify a `v*` tag > v0.55.5 exists and `pip index versions devx` (Gitea PyPI) lists it. ## Deploy Plan - Auto-merge; post-merge release job tags + publishes. - Infra (OBL-INFRA-658) and GRM (GRM-174) consume the new pin. ## Rollback Plan - Revert merge; the unreleased module remains dormant regardless. ## Acceptance Criteria - [x] REQ-1: emission log includes owner and ISO-8601 expiry; lease env computed once — covered by updated unit tests. - [x] REQ-2: merge commit uses `feat(molecule):` so the release job cuts a version bump.