mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-07-09 16:00:59 +00:00
Update release control to use main
This commit is contained in:
parent
c384d5e0c8
commit
cf6161e035
5 changed files with 44 additions and 40 deletions
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"])
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue