mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-10 02:25:56 +00:00
Promote lane expansion as active v6 target
This commit is contained in:
@@ -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-rc-stabilization",
|
||||
"active_target_id": "v6-product-lane-expansion",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "v6",
|
||||
@@ -38,7 +38,7 @@
|
||||
"id": "v6-rc-stabilization",
|
||||
"profile_id": "v6",
|
||||
"kind": "stabilization",
|
||||
"status": "active",
|
||||
"status": "superseded",
|
||||
"summary": "Keep Pulse v6 in RC stabilization until remaining product/runtime concerns are resolved or normalized into governed proofs before GA promotion is resumed, while broader post-RC polish stays out of the release floor by default.",
|
||||
"completion_rule": "manual",
|
||||
"proof_scope": "none"
|
||||
@@ -55,8 +55,8 @@
|
||||
"id": "v6-product-lane-expansion",
|
||||
"profile_id": "v6",
|
||||
"kind": "feature",
|
||||
"status": "planned",
|
||||
"summary": "Expand the governed lane taxonomy from the current RC-stabilization map toward the v6 bridge-release foundation by promoting resource-graph, policy-governance, action-governance, and fleet-governance gaps into explicit lanes, lane splits, or lane expansions.",
|
||||
"status": "active",
|
||||
"summary": "Default v6 engineering work to the bridge-release foundation by promoting and landing the known resource-graph, policy-governance, action-governance, and fleet-governance gaps ahead of further local RC cleanup.",
|
||||
"completion_rule": "manual",
|
||||
"proof_scope": "none"
|
||||
}
|
||||
|
||||
@@ -473,8 +473,10 @@ func TestReleaseControlPlaneFilesExist(t *testing.T) {
|
||||
"Direction changes must be normalized",
|
||||
"Do not wait for a special governance prompt",
|
||||
"stable or GA promotion readiness",
|
||||
"v6-product-lane-expansion",
|
||||
"v6-ga-promotion",
|
||||
"v6-rc-stabilization",
|
||||
"available_candidate_lane_queue",
|
||||
"should always be true",
|
||||
"Lane work must follow canonical v6 modernization rules",
|
||||
"These modernization rules are retrospective as well as forward-looking",
|
||||
@@ -508,7 +510,7 @@ func TestReleaseControlPlaneFilesExist(t *testing.T) {
|
||||
if !ok || activeTargetID == "" {
|
||||
t.Fatalf("%s missing active_target_id", jsonRel)
|
||||
}
|
||||
if activeTargetID != "v6-rc-stabilization" && activeTargetID != "v6-ga-promotion" {
|
||||
if activeTargetID != "v6-rc-stabilization" && activeTargetID != "v6-ga-promotion" && activeTargetID != "v6-product-lane-expansion" {
|
||||
t.Fatalf("%s has unexpected active_target_id %q", jsonRel, activeTargetID)
|
||||
}
|
||||
|
||||
@@ -535,7 +537,7 @@ func TestReleaseControlPlaneFilesExist(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
for _, requiredID := range []string{"v6-rc-cut", "v6-rc-stabilization", "v6-ga-promotion"} {
|
||||
for _, requiredID := range []string{"v6-rc-cut", "v6-rc-stabilization", "v6-ga-promotion", "v6-product-lane-expansion"} {
|
||||
if _, ok := targetsByID[requiredID]; !ok {
|
||||
t.Fatalf("%s missing target %q", jsonRel, requiredID)
|
||||
}
|
||||
@@ -555,6 +557,9 @@ func TestReleaseControlPlaneFilesExist(t *testing.T) {
|
||||
if scope, _ := targetsByID["v6-rc-stabilization"]["proof_scope"].(string); scope != "none" {
|
||||
t.Fatalf("%s v6-rc-stabilization must keep proof_scope=none", jsonRel)
|
||||
}
|
||||
if rule, _ := targetsByID["v6-product-lane-expansion"]["completion_rule"].(string); rule != "manual" {
|
||||
t.Fatalf("%s v6-product-lane-expansion must keep completion_rule=manual", jsonRel)
|
||||
}
|
||||
|
||||
schemaRel := "docs/release-control/control_plane.schema.json"
|
||||
schemaContent := readRepoFile(t, schemaRel)
|
||||
|
||||
@@ -299,6 +299,7 @@ def active_control_plane(*, staged: bool = False) -> dict[str, Any]:
|
||||
|
||||
def agent_entrypoint(*, staged: bool = False) -> dict[str, Any]:
|
||||
resolved = active_control_plane(staged=staged)
|
||||
active_target_id = str(resolved["active_target_id"])
|
||||
startup_files = [
|
||||
resolved["agent_values_doc_rel"],
|
||||
resolved["control_plane_doc_rel"],
|
||||
@@ -315,17 +316,37 @@ def agent_entrypoint(*, staged: bool = False) -> dict[str, Any]:
|
||||
startup_commands = [
|
||||
"python3 scripts/release_control/status_audit.py --pretty",
|
||||
]
|
||||
targeted_lookup_commands = [
|
||||
"python3 scripts/release_control/status_lookup.py --lane <LANE_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --assertion <ASSERTION_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --release-gate <GATE_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --followup <FOLLOWUP_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --work-claim <CLAIM_ID> --pretty",
|
||||
"python3 scripts/release_control/subsystem_lookup.py <path> [<path> ...] --pretty",
|
||||
"python3 scripts/release_control/worktree_base.py --base-branch <BASE_BRANCH> --pretty",
|
||||
"python3 scripts/release_control/worktree_claim.py --kind <KIND> --id <ID> --summary <SUMMARY> --agent-id <AGENT_ID> --pretty",
|
||||
"python3 scripts/release_control/worktree_finish.py --base-branch <BASE_BRANCH> --pretty",
|
||||
]
|
||||
targeted_lookup_commands = []
|
||||
if active_target_id == "v6-product-lane-expansion":
|
||||
targeted_lookup_commands.extend(
|
||||
[
|
||||
"python3 scripts/release_control/status_lookup.py --candidate-lane <CANDIDATE_LANE_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --coverage-gap <COVERAGE_GAP_ID> --pretty",
|
||||
]
|
||||
)
|
||||
targeted_lookup_commands.extend(
|
||||
[
|
||||
"python3 scripts/release_control/status_lookup.py --lane <LANE_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --assertion <ASSERTION_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --release-gate <GATE_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --followup <FOLLOWUP_ID> --pretty",
|
||||
"python3 scripts/release_control/status_lookup.py --work-claim <CLAIM_ID> --pretty",
|
||||
"python3 scripts/release_control/subsystem_lookup.py <path> [<path> ...] --pretty",
|
||||
"python3 scripts/release_control/worktree_base.py --base-branch <BASE_BRANCH> --pretty",
|
||||
"python3 scripts/release_control/worktree_claim.py --kind <KIND> --id <ID> --summary <SUMMARY> --agent-id <AGENT_ID> --pretty",
|
||||
"python3 scripts/release_control/worktree_finish.py --base-branch <BASE_BRANCH> --pretty",
|
||||
]
|
||||
)
|
||||
if active_target_id == "v6-product-lane-expansion":
|
||||
default_pick_surface = "available_candidate_lane_queue"
|
||||
selection_rule = (
|
||||
"Pick from available candidate lanes and linked coverage gaps before local RC cleanup unless the user overrides the priority or a release-blocking surface needs immediate containment."
|
||||
)
|
||||
else:
|
||||
default_pick_surface = "lanes"
|
||||
selection_rule = (
|
||||
"Pick from the current lane map first unless the user overrides the priority or a narrower governed surface is already the explicit task."
|
||||
)
|
||||
return {
|
||||
"active_profile_id": resolved["active_profile_id"],
|
||||
"active_target_id": resolved["active_target_id"],
|
||||
@@ -337,6 +358,8 @@ def agent_entrypoint(*, staged: bool = False) -> dict[str, Any]:
|
||||
"ordered_files": startup_files + escalation_files,
|
||||
"startup_commands": startup_commands,
|
||||
"targeted_lookup_commands": targeted_lookup_commands,
|
||||
"default_pick_surface": default_pick_surface,
|
||||
"selection_rule": selection_rule,
|
||||
"subsystems_dir": resolved["subsystems_dir_rel"],
|
||||
"subsystem_lookup": "scripts/release_control/subsystem_lookup.py",
|
||||
"status_lookup": "scripts/release_control/status_lookup.py",
|
||||
@@ -420,6 +443,8 @@ def main(argv: list[str] | None = None) -> int:
|
||||
*[f" - {rel}" for rel in payload["startup_files"]],
|
||||
"startup_commands:",
|
||||
*[f" - {command}" for command in payload["startup_commands"]],
|
||||
f"default_pick_surface={payload['default_pick_surface']}",
|
||||
f"selection_rule={payload['selection_rule']}",
|
||||
"targeted_lookup_commands:",
|
||||
*[f" - {command}" for command in payload["targeted_lookup_commands"]],
|
||||
"escalation_files:",
|
||||
|
||||
@@ -98,6 +98,16 @@ class ControlPlaneAuditTest(unittest.TestCase):
|
||||
entrypoint["startup_commands"],
|
||||
["python3 scripts/release_control/status_audit.py --pretty"],
|
||||
)
|
||||
self.assertEqual(entrypoint["default_pick_surface"], "available_candidate_lane_queue")
|
||||
self.assertIn("candidate lanes", entrypoint["selection_rule"])
|
||||
self.assertIn(
|
||||
"python3 scripts/release_control/status_lookup.py --candidate-lane <CANDIDATE_LANE_ID> --pretty",
|
||||
entrypoint["targeted_lookup_commands"],
|
||||
)
|
||||
self.assertIn(
|
||||
"python3 scripts/release_control/status_lookup.py --coverage-gap <COVERAGE_GAP_ID> --pretty",
|
||||
entrypoint["targeted_lookup_commands"],
|
||||
)
|
||||
self.assertIn(
|
||||
"python3 scripts/release_control/status_lookup.py --lane <LANE_ID> --pretty",
|
||||
entrypoint["targeted_lookup_commands"],
|
||||
|
||||
@@ -13,6 +13,8 @@ from status_audit import audit_status_payload, load_status_payload, status_schem
|
||||
|
||||
|
||||
ENTRY_OPTIONS: tuple[tuple[str, str, str], ...] = (
|
||||
("coverage_gap", "coverage_gaps", "id"),
|
||||
("candidate_lane", "candidate_lanes", "id"),
|
||||
("lane", "lanes", "id"),
|
||||
("assertion", "readiness_assertions", "id"),
|
||||
("release_gate", "release_gates", "id"),
|
||||
@@ -52,7 +54,7 @@ def lookup_status_entry(report: dict[str, Any], *, kind: str, entry_id: str) ->
|
||||
raise KeyError(f"{collection} is not a list in status report")
|
||||
for entry in entries:
|
||||
if isinstance(entry, dict) and str(entry.get(key)) == entry_id:
|
||||
return {
|
||||
result = {
|
||||
"kind": kind,
|
||||
"collection": collection,
|
||||
"id": entry_id,
|
||||
@@ -60,12 +62,34 @@ def lookup_status_entry(report: dict[str, Any], *, kind: str, entry_id: str) ->
|
||||
"control_plane": report.get("control_plane", {}),
|
||||
"summary": report.get("summary", {}),
|
||||
}
|
||||
if kind == "candidate_lane":
|
||||
queue_item = next(
|
||||
(
|
||||
item
|
||||
for item in report.get("candidate_lane_queue", [])
|
||||
if isinstance(item, dict) and str(item.get("candidate_lane_id")) == entry_id
|
||||
),
|
||||
None,
|
||||
)
|
||||
if queue_item is not None:
|
||||
result["queue_item"] = queue_item
|
||||
if kind == "coverage_gap":
|
||||
linked_candidates = [
|
||||
str(candidate.get("id"))
|
||||
for candidate in report.get("candidate_lanes", [])
|
||||
if isinstance(candidate, dict)
|
||||
and entry_id in [str(gap_id) for gap_id in candidate.get("coverage_gap_ids", [])]
|
||||
]
|
||||
result["linked_candidate_lane_ids"] = linked_candidates
|
||||
return result
|
||||
raise KeyError(f"{kind} {entry_id!r} not found")
|
||||
raise KeyError(f"unsupported kind {kind!r}")
|
||||
|
||||
|
||||
def parse_args(argv: list[str]) -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(description="Lookup one release-control status entry by id.")
|
||||
parser.add_argument("--coverage-gap", dest="coverage_gap", help="Coverage gap id.")
|
||||
parser.add_argument("--candidate-lane", dest="candidate_lane", help="Candidate lane id.")
|
||||
parser.add_argument("--lane", help="Lane id, such as L16.")
|
||||
parser.add_argument("--assertion", help="Readiness assertion id, such as RA8.")
|
||||
parser.add_argument("--release-gate", dest="release_gate", help="Release gate id.")
|
||||
@@ -87,6 +111,22 @@ def parse_args(argv: list[str]) -> argparse.Namespace:
|
||||
|
||||
|
||||
def _render_collection_specific(lines: list[str], kind: str, entry: dict[str, Any]) -> None:
|
||||
if kind == "coverage_gap":
|
||||
lines.extend(
|
||||
[
|
||||
f"status={entry.get('status')} resolution={entry.get('proposed_resolution')} impact={entry.get('coverage_impact')}",
|
||||
f"lanes={','.join(entry.get('lane_ids', [])) or '-'} repos={','.join(entry.get('repo_ids', [])) or '-'} subsystems={','.join(entry.get('subsystem_ids', [])) or '-'}",
|
||||
]
|
||||
)
|
||||
return
|
||||
if kind == "candidate_lane":
|
||||
lines.extend(
|
||||
[
|
||||
f"status={entry.get('status')} target={entry.get('target_id')} repos={','.join(entry.get('repo_ids', [])) or '-'}",
|
||||
f"current_lanes={','.join(entry.get('current_lane_ids', [])) or '-'} subsystems={','.join(entry.get('subsystem_ids', [])) or '-'} coverage_gaps={','.join(entry.get('coverage_gap_ids', [])) or '-'}",
|
||||
]
|
||||
)
|
||||
return
|
||||
if kind == "lane":
|
||||
lines.extend(
|
||||
[
|
||||
@@ -163,6 +203,15 @@ def render_pretty(result: dict[str, Any]) -> str:
|
||||
f"{result['kind']} {result['id']}: {entry.get('summary') or '-'}",
|
||||
]
|
||||
_render_collection_specific(lines, result["kind"], entry)
|
||||
if result["kind"] == "candidate_lane":
|
||||
queue_item = result.get("queue_item", {})
|
||||
if queue_item:
|
||||
lines.append(
|
||||
f"queue: rank={queue_item.get('rank')} available={queue_item.get('available')} available_rank={queue_item.get('available_rank')}"
|
||||
)
|
||||
if result["kind"] == "coverage_gap":
|
||||
linked = result.get("linked_candidate_lane_ids", [])
|
||||
lines.append(f"linked_candidate_lanes={','.join(linked) or '-'}")
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,30 @@ REPORT = {
|
||||
"summary": {
|
||||
"lane_count": 16,
|
||||
},
|
||||
"coverage_gaps": [
|
||||
{
|
||||
"id": "resource-graph-and-change-timeline",
|
||||
"summary": "Resource graph and timeline are still under-modeled.",
|
||||
"status": "planned",
|
||||
"proposed_resolution": "lane-split",
|
||||
"coverage_impact": 15,
|
||||
"lane_ids": ["L6", "L13"],
|
||||
"repo_ids": ["pulse", "pulse-enterprise"],
|
||||
"subsystem_ids": ["alerts", "api-contracts", "monitoring", "unified-resources"],
|
||||
}
|
||||
],
|
||||
"candidate_lanes": [
|
||||
{
|
||||
"id": "resource-graph-change-intelligence",
|
||||
"summary": "Promote canonical resource relationships and cross-resource timelines into an explicit lane.",
|
||||
"status": "planned",
|
||||
"target_id": "v6-product-lane-expansion",
|
||||
"repo_ids": ["pulse", "pulse-enterprise"],
|
||||
"current_lane_ids": ["L6", "L13"],
|
||||
"subsystem_ids": ["alerts", "api-contracts", "monitoring", "unified-resources"],
|
||||
"coverage_gap_ids": ["resource-graph-and-change-timeline"],
|
||||
}
|
||||
],
|
||||
"lanes": [
|
||||
{
|
||||
"id": "L16",
|
||||
@@ -30,6 +54,14 @@ REPORT = {
|
||||
"blockers": [],
|
||||
}
|
||||
],
|
||||
"candidate_lane_queue": [
|
||||
{
|
||||
"candidate_lane_id": "resource-graph-change-intelligence",
|
||||
"rank": 1,
|
||||
"available": True,
|
||||
"available_rank": 1,
|
||||
}
|
||||
],
|
||||
"readiness_assertions": [
|
||||
{
|
||||
"id": "RA8",
|
||||
@@ -92,11 +124,26 @@ class StatusLookupTest(unittest.TestCase):
|
||||
self.assertEqual(args.lane, "L16")
|
||||
self.assertTrue(args.pretty)
|
||||
|
||||
def test_parse_args_accepts_candidate_lane_selector(self) -> None:
|
||||
args = parse_args(["--candidate-lane", "resource-graph-change-intelligence", "--pretty"])
|
||||
self.assertEqual(args.candidate_lane, "resource-graph-change-intelligence")
|
||||
self.assertTrue(args.pretty)
|
||||
|
||||
def test_lookup_status_entry_returns_lane(self) -> None:
|
||||
result = lookup_status_entry(REPORT, kind="lane", entry_id="L16")
|
||||
self.assertEqual(result["entry"]["summary"], "Agent lifecycle and fleet operations.")
|
||||
self.assertEqual(result["control_plane"]["active_profile_id"], "v6")
|
||||
|
||||
def test_lookup_status_entry_returns_candidate_lane(self) -> None:
|
||||
result = lookup_status_entry(REPORT, kind="candidate_lane", entry_id="resource-graph-change-intelligence")
|
||||
self.assertEqual(result["entry"]["target_id"], "v6-product-lane-expansion")
|
||||
self.assertEqual(result["queue_item"]["rank"], 1)
|
||||
|
||||
def test_lookup_status_entry_returns_coverage_gap(self) -> None:
|
||||
result = lookup_status_entry(REPORT, kind="coverage_gap", entry_id="resource-graph-and-change-timeline")
|
||||
self.assertEqual(result["entry"]["coverage_impact"], 15)
|
||||
self.assertEqual(result["linked_candidate_lane_ids"], ["resource-graph-change-intelligence"])
|
||||
|
||||
def test_lookup_status_entry_returns_release_gate(self) -> None:
|
||||
result = lookup_status_entry(
|
||||
REPORT,
|
||||
@@ -122,6 +169,19 @@ class StatusLookupTest(unittest.TestCase):
|
||||
self.assertIn("work=lane:L16", rendered)
|
||||
self.assertIn("agent=codex", rendered)
|
||||
|
||||
def test_render_pretty_includes_candidate_lane_queue_details(self) -> None:
|
||||
result = lookup_status_entry(REPORT, kind="candidate_lane", entry_id="resource-graph-change-intelligence")
|
||||
rendered = render_pretty(result)
|
||||
self.assertIn("candidate_lane resource-graph-change-intelligence", rendered)
|
||||
self.assertIn("target=v6-product-lane-expansion", rendered)
|
||||
self.assertIn("queue: rank=1 available=True available_rank=1", rendered)
|
||||
|
||||
def test_render_pretty_includes_coverage_gap_links(self) -> None:
|
||||
result = lookup_status_entry(REPORT, kind="coverage_gap", entry_id="resource-graph-and-change-timeline")
|
||||
rendered = render_pretty(result)
|
||||
self.assertIn("resolution=lane-split impact=15", rendered)
|
||||
self.assertIn("linked_candidate_lanes=resource-graph-change-intelligence", rendered)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -13,7 +13,7 @@ class SubsystemLookupTest(unittest.TestCase):
|
||||
self.assertEqual(result["status_audit_errors"], [])
|
||||
self.assertIn(
|
||||
result["control_plane"]["active_target"]["id"],
|
||||
{"v6-rc-stabilization", "v6-ga-promotion"},
|
||||
{"v6-rc-stabilization", "v6-ga-promotion", "v6-product-lane-expansion"},
|
||||
)
|
||||
self.assertEqual(result["scope"]["control_plane_repo"], "pulse")
|
||||
self.assertEqual(result["status_summary"]["lane_count"], 16)
|
||||
|
||||
Reference in New Issue
Block a user