diff --git a/docs/release-control/control_plane.json b/docs/release-control/control_plane.json index 5086d1513..80f65b05e 100644 --- a/docs/release-control/control_plane.json +++ b/docs/release-control/control_plane.json @@ -6,7 +6,7 @@ "control_plane_doc": "docs/release-control/internal/CONTROL_PLANE.md", "control_plane_schema": "docs/release-control/control_plane.schema.json", "active_profile_id": "v6", - "active_target_id": "v6-ga-promotion", + "active_target_id": "v6-product-lane-expansion", "legacy_release_lines": [ { "version_prefix": "5.1.", @@ -19,8 +19,8 @@ "id": "v6", "lifecycle": "active", "root": "docs/release-control/v6", - "prerelease_branch": "pulse/v6-release", - "stable_branch": "pulse/v6-release", + "prerelease_branch": "main", + "stable_branch": "main", "source_of_truth": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md", "status": "docs/release-control/v6/internal/status.json", "status_schema": "docs/release-control/v6/status.schema.json", @@ -54,8 +54,8 @@ "id": "v6-ga-promotion", "profile_id": "v6", "kind": "release", - "status": "active", - "summary": "Prepare Pulse v6 GA from the current pulse/v6-release branch after accumulated post-RC7 fixes. Do not promote the published RC7 candidate unchanged, and do not plan another RC by default; on 2026-07-02 the release owner accepted the remaining current-branch validation risk for GA rather than requiring RC8 or another soak, while newly reported RC7 issues stay regression signals unless a release-owner decision changes direction and release-day execution plus public cutover still require explicit owner approval.", + "status": "completed", + "summary": "Pulse v6 GA and the initial 6.0.x patch line shipped from the governed v6 release branch; after the v6 public cutover, main is the canonical latest-and-greatest branch for active development and stable release preparation.", "completion_rule": "manual", "proof_scope": "none" }, @@ -63,8 +63,8 @@ "id": "v6-product-lane-expansion", "profile_id": "v6", "kind": "feature", - "status": "planned", - "summary": "Promote proactive Pulse Intelligence, policy-aware data governance, resource-change intelligence, action-governance, fleet-governance, agent-operable infrastructure onboarding, continuous discovery reconciliation, and agent-ready operations contract proof only after the monitoring-first RC target is satisfied and the broader surfaced product case is proven; Patrol is the detection and investigation engine, Assistant is the contextual explanation, approval, and governed action surface, and agent-ready proof is API/CLI-first with MCP only as an adapter over canonical contracts.", + "status": "active", + "summary": "Post-GA active development runs on main and promotes proactive Pulse Intelligence, policy-aware data governance, resource-change intelligence, action-governance, fleet-governance, agent-operable infrastructure onboarding, continuous discovery reconciliation, and agent-ready operations contract proof after the monitoring-first v6 floor; Patrol is the detection and investigation engine, Assistant is the contextual explanation, approval, and governed action surface, and agent-ready proof is API/CLI-first with MCP only as an adapter over canonical contracts.", "completion_rule": "manual", "proof_scope": "none" } diff --git a/internal/repoctl/canonical_development_protocol_test.go b/internal/repoctl/canonical_development_protocol_test.go index ef44fb37d..f65fe0dd8 100644 --- a/internal/repoctl/canonical_development_protocol_test.go +++ b/internal/repoctl/canonical_development_protocol_test.go @@ -566,13 +566,13 @@ func TestReleaseControlPlaneFilesExist(t *testing.T) { "\"system\": \"pulse-release-control\"", "\"agent_values_doc\": \"docs/release-control/internal/AGENT_VALUES.md\"", "\"active_profile_id\": \"v6\"", - "\"prerelease_branch\": \"pulse/v6-release\"", - "\"stable_branch\": \"pulse/v6-release\"", + "\"prerelease_branch\": \"main\"", + "\"stable_branch\": \"main\"", "\"completion_rule\": \"rc_ready\"", "\"completion_rule\": \"manual\"", "\"proof_scope\": \"none\"", - "release-day execution", - "newly reported RC7 issues", + "main is the canonical latest-and-greatest branch", + "Post-GA active development runs on main", }) var controlPlane map[string]any diff --git a/scripts/release_control/agent_preflight_test.py b/scripts/release_control/agent_preflight_test.py index 4fcbf1d0c..b858e42aa 100644 --- a/scripts/release_control/agent_preflight_test.py +++ b/scripts/release_control/agent_preflight_test.py @@ -8,7 +8,7 @@ import agent_preflight class AgentPreflightTest(unittest.TestCase): def test_audit_preflight_passes_when_branch_and_active_claim_match(self) -> None: control_plane = { - "prerelease_branch": "pulse/v6-release", + "prerelease_branch": "main", "active_profile_id": "v6", "active_target_id": "v6-rc-stabilization", } @@ -33,7 +33,7 @@ class AgentPreflightTest(unittest.TestCase): with patch.object(agent_preflight, "active_control_plane", return_value=control_plane), patch.object( agent_preflight, "load_status_payload", return_value=status_payload - ), patch.object(agent_preflight, "current_branch", return_value="pulse/v6-release"): + ), patch.object(agent_preflight, "current_branch", return_value="main"): report = agent_preflight.audit_preflight(agent_id="codex", require_active_claim=True) self.assertEqual(report["errors"], []) @@ -42,23 +42,7 @@ class AgentPreflightTest(unittest.TestCase): def test_audit_preflight_requires_active_claim_for_agent(self) -> None: control_plane = { - "prerelease_branch": "pulse/v6-release", - "active_profile_id": "v6", - "active_target_id": "v6-rc-stabilization", - } - status_payload = {"work_claims": []} - - with patch.object(agent_preflight, "active_control_plane", return_value=control_plane), patch.object( - agent_preflight, "load_status_payload", return_value=status_payload - ), patch.object(agent_preflight, "current_branch", return_value="pulse/v6-release"): - report = agent_preflight.audit_preflight(agent_id="codex", require_active_claim=True) - - self.assertTrue(report["errors"]) - self.assertIn("expected exactly one active work claim", report["errors"][0]) - - def test_audit_preflight_flags_branch_mismatch(self) -> None: - control_plane = { - "prerelease_branch": "pulse/v6-release", + "prerelease_branch": "main", "active_profile_id": "v6", "active_target_id": "v6-rc-stabilization", } @@ -67,6 +51,22 @@ class AgentPreflightTest(unittest.TestCase): with patch.object(agent_preflight, "active_control_plane", return_value=control_plane), patch.object( agent_preflight, "load_status_payload", return_value=status_payload ), patch.object(agent_preflight, "current_branch", return_value="main"): + report = agent_preflight.audit_preflight(agent_id="codex", require_active_claim=True) + + self.assertTrue(report["errors"]) + self.assertIn("expected exactly one active work claim", report["errors"][0]) + + def test_audit_preflight_flags_branch_mismatch(self) -> None: + control_plane = { + "prerelease_branch": "main", + "active_profile_id": "v6", + "active_target_id": "v6-rc-stabilization", + } + status_payload = {"work_claims": []} + + with patch.object(agent_preflight, "active_control_plane", return_value=control_plane), patch.object( + agent_preflight, "load_status_payload", return_value=status_payload + ), patch.object(agent_preflight, "current_branch", return_value="pulse/v6-release"): report = agent_preflight.audit_preflight(agent_id="codex", require_active_claim=False) self.assertTrue(report["errors"]) diff --git a/scripts/release_control/control_plane_audit_test.py b/scripts/release_control/control_plane_audit_test.py index fea298234..8365cf1a6 100644 --- a/scripts/release_control/control_plane_audit_test.py +++ b/scripts/release_control/control_plane_audit_test.py @@ -25,8 +25,8 @@ VALID_PAYLOAD = { "id": "v6", "lifecycle": "active", "root": "docs/release-control/v6", - "prerelease_branch": "pulse/v6-release", - "stable_branch": "pulse/v6-release", + "prerelease_branch": "main", + "stable_branch": "main", "source_of_truth": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md", "status": "docs/release-control/v6/internal/status.json", "status_schema": "docs/release-control/v6/status.schema.json", @@ -176,9 +176,9 @@ class ControlPlaneAuditTest(unittest.TestCase): def test_release_branch_for_version_uses_profile_branch_policy(self) -> None: self.assertEqual(release_branch_for_version("5.1.27", control_plane=VALID_PAYLOAD), "main") self.assertEqual(release_branch_for_version("5.1.27-rc.3", control_plane=VALID_PAYLOAD), "main") - self.assertEqual(release_branch_for_version("6.0.0-rc.1", control_plane=VALID_PAYLOAD), "pulse/v6-release") - self.assertEqual(release_branch_for_version("6.0.0-dev", control_plane=VALID_PAYLOAD), "pulse/v6-release") - self.assertEqual(release_branch_for_version("6.0.0", control_plane=VALID_PAYLOAD), "pulse/v6-release") + self.assertEqual(release_branch_for_version("6.0.0-rc.1", control_plane=VALID_PAYLOAD), "main") + self.assertEqual(release_branch_for_version("6.0.0-dev", control_plane=VALID_PAYLOAD), "main") + self.assertEqual(release_branch_for_version("6.0.0", control_plane=VALID_PAYLOAD), "main") def test_release_branch_for_version_prefers_longest_legacy_prefix(self) -> None: payload = dict(VALID_PAYLOAD) diff --git a/scripts/release_control/release_promotion_policy_test.py b/scripts/release_control/release_promotion_policy_test.py index 0ff6eb33e..00e90002a 100644 --- a/scripts/release_control/release_promotion_policy_test.py +++ b/scripts/release_control/release_promotion_policy_test.py @@ -193,10 +193,9 @@ class ReleasePromotionPolicyTest(unittest.TestCase): "2026-07-02", ) - active_target = next( - target for target in control_plane["targets"] if target["id"] == control_plane["active_target_id"] - ) - self.assertIn("accepted the remaining current-branch validation risk", active_target["summary"]) + ga_target = next(target for target in control_plane["targets"] if target["id"] == "v6-ga-promotion") + self.assertIn("Pulse v6 GA", ga_target["summary"]) + self.assertIn("main is the canonical latest-and-greatest branch", ga_target["summary"]) def test_pre_release_checklist_tracks_rc_to_ga_gate_inputs(self) -> None: content = read("docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md") @@ -866,12 +865,17 @@ class ReleasePromotionPolicyTest(unittest.TestCase): f"The active control-plane target is `{active_target_id}`, so stable or GA", blocked, ) + elif active_target_id == "v6-product-lane-expansion": + self.assertIn( + "The active control-plane target is `v6-ga-promotion`, so stable or GA", + blocked, + ) else: self.assertIn(f"The active control-plane target is still `{active_target_id}`, not", blocked) matrix = read("docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md") self.assertIn(promotion_metadata_envelope(), normalize_ws(matrix)) expected = blocked_record.build_blocked_record(record_date="2026-04-04") - if current_version != "6.0.0": + if current_version != "6.0.0" or active_target_id != "v6-ga-promotion": return if blocked != expected: record_path = REPO_ROOT / "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-04-04.md"