Update release control to use main

This commit is contained in:
rcourtman 2026-07-05 15:20:37 +01:00
parent c384d5e0c8
commit cf6161e035
5 changed files with 44 additions and 40 deletions

View file

@ -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"
}

View file

@ -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

View file

@ -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"])

View file

@ -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)

View file

@ -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"