diff --git a/.gitignore b/.gitignore index cbd04f53b..1c8d0aaa5 100644 --- a/.gitignore +++ b/.gitignore @@ -278,6 +278,9 @@ scripts/release_control/* !scripts/release_control/ssh_host_key_policy_test.py !scripts/release_control/work_claim.py !scripts/release_control/work_claim_test.py +!scripts/release_control/worktree_base.py +!scripts/release_control/worktree_claim.py +!scripts/release_control/worktree_finish.py .agent/ # Pulse Pro landing page (private) diff --git a/docs/release-control/v6/internal/status.json b/docs/release-control/v6/internal/status.json index a04c1b596..e4f22fcfb 100644 --- a/docs/release-control/v6/internal/status.json +++ b/docs/release-control/v6/internal/status.json @@ -9118,7 +9118,21 @@ ], "coverage_gaps": [], "candidate_lanes": [], - "work_claims": [], + "work_claims": [ + { + "id": "codex-v6-control-plane-lane-followup-architecture-post-rc-canonicalization", + "agent_id": "codex-v6-control-plane", + "summary": "Restore the canonical control-plane worktree helper public entrypoints and executable regression coverage for the advertised isolated-worktree workflow.", + "target_id": "v6-product-lane-expansion", + "claimed_at": "2026-08-08T03:02:17Z", + "heartbeat_at": "2026-08-08T03:02:17Z", + "expires_at": "2026-08-08T05:02:17Z", + "work_item": { + "kind": "lane-followup", + "id": "architecture-post-rc-canonicalization" + } + } + ], "open_decisions": [ { "id": "self-hosted-commercial-surfaces-owner-approval", diff --git a/scripts/release_control/control_plane_audit_test.py b/scripts/release_control/control_plane_audit_test.py index 8365cf1a6..094e5e1e3 100644 --- a/scripts/release_control/control_plane_audit_test.py +++ b/scripts/release_control/control_plane_audit_test.py @@ -1,6 +1,14 @@ +import shlex +import subprocess +import sys import unittest -from control_plane import agent_entrypoint, parse_args as control_plane_parse_args, release_branch_for_version +from control_plane import ( + REPO_ROOT, + agent_entrypoint, + parse_args as control_plane_parse_args, + release_branch_for_version, +) from control_plane_audit import audit_control_plane_payload, parse_args @@ -162,6 +170,38 @@ class ControlPlaneAuditTest(unittest.TestCase): self.assertEqual(entrypoint["worktree_claim"], "scripts/release_control/worktree_claim.py") self.assertEqual(entrypoint["worktree_finish"], "scripts/release_control/worktree_finish.py") + def test_every_advertised_helper_entrypoint_executes(self) -> None: + entrypoint = agent_entrypoint() + commands = entrypoint["startup_commands"] + entrypoint["targeted_lookup_commands"] + helper_paths = { + tokens[1] + for command in commands + if len(tokens := shlex.split(command)) >= 2 and tokens[0] == "python3" + } + helper_paths.update( + value + for value in entrypoint.values() + if isinstance(value, str) and value.endswith(".py") + ) + + for helper_rel in sorted(helper_paths): + with self.subTest(helper=helper_rel): + helper_path = REPO_ROOT / helper_rel + self.assertTrue(helper_path.is_file(), f"advertised helper is missing: {helper_rel}") + result = subprocess.run( + [sys.executable, str(helper_path), "--help"], + cwd=REPO_ROOT, + capture_output=True, + text=True, + check=False, + ) + self.assertEqual( + result.returncode, + 0, + f"advertised helper failed to execute: {helper_rel}\n{result.stderr}", + ) + self.assertIn("usage:", result.stdout) + def test_audit_accepts_valid_payload(self) -> None: report = audit_control_plane_payload( VALID_PAYLOAD, diff --git a/scripts/release_control/worktree_base.py b/scripts/release_control/worktree_base.py new file mode 100644 index 000000000..4eca1ea8e --- /dev/null +++ b/scripts/release_control/worktree_base.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""Public entrypoint for the canonical landing-worktree helper.""" + +from __future__ import annotations + +from pathlib import Path +import runpy +import sys + + +def main(argv: list[str] | None = None) -> int: + internal_dir = Path(__file__).resolve().parent / "internal" + sys.path.insert(0, str(internal_dir)) + try: + namespace = runpy.run_path(str(internal_dir / "worktree_base.py")) + return namespace["main"](list(sys.argv[1:] if argv is None else argv)) + finally: + sys.path.pop(0) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/release_control/worktree_claim.py b/scripts/release_control/worktree_claim.py new file mode 100644 index 000000000..53875ab9b --- /dev/null +++ b/scripts/release_control/worktree_claim.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""Public entrypoint for governed isolated-worktree claims.""" + +from __future__ import annotations + +from pathlib import Path +import runpy +import sys + + +def main(argv: list[str] | None = None) -> int: + internal_dir = Path(__file__).resolve().parent / "internal" + sys.path.insert(0, str(internal_dir)) + try: + namespace = runpy.run_path(str(internal_dir / "worktree_claim.py")) + return namespace["main"](list(sys.argv[1:] if argv is None else argv)) + finally: + sys.path.pop(0) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/release_control/worktree_finish.py b/scripts/release_control/worktree_finish.py new file mode 100644 index 000000000..1f9af6284 --- /dev/null +++ b/scripts/release_control/worktree_finish.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""Public entrypoint for landing an isolated worktree slice.""" + +from __future__ import annotations + +from pathlib import Path +import runpy +import sys + + +def main(argv: list[str] | None = None) -> int: + internal_dir = Path(__file__).resolve().parent / "internal" + sys.path.insert(0, str(internal_dir)) + try: + namespace = runpy.run_path(str(internal_dir / "worktree_finish.py")) + return namespace["main"](list(sys.argv[1:] if argv is None else argv)) + finally: + sys.path.pop(0) + + +if __name__ == "__main__": + raise SystemExit(main())