feat(awooop): 預填 owner release 草案
All checks were successful
Code Review / ai-code-review (push) Successful in 13s
CD Pipeline / tests (push) Successful in 1m41s
CD Pipeline / build-and-deploy (push) Successful in 5m22s
CD Pipeline / post-deploy-checks (push) Successful in 1m49s

This commit is contained in:
Your Name
2026-06-26 12:49:26 +08:00
parent 898114ff6b
commit 11d23b0b7f
5 changed files with 236 additions and 19 deletions

View File

@@ -4445,6 +4445,60 @@ def _apply_gate_execution_release_contract(
route_id = f"ansible-allowlisted-apply:{catalog_id}"
mcp_evidence_ready = _safe_int(facts.get("mcp_gateway_total")) > 0
owner_release_draft = {
"schema_version": "awooop_owner_release_draft_v1",
"status": "ai_prefilled_needs_owner_decision",
"source_id": source_ref,
"work_item_id": f"owner-release-draft:awoooi:{safe_source_ref}",
"ai_prefilled_count": 6,
"human_decision_count": 3,
"runtime_execution_authorized": False,
"runtime_write_allowed": False,
"human_only_fields": [
"owner_approval_receipt",
"maintenance_window_final_approval",
"rollback_owner_confirmation",
],
"draft_fields": [
{
"key": "maintenance_window",
"status": "ai_suggested_owner_review_required",
"value": f"maintenance-window-review:awoooi:{safe_source_ref}",
"reason": "AI can prepare the maintenance packet, but final timing still needs owner approval.",
},
{
"key": "rollback_owner",
"status": "ai_suggested_owner_review_required",
"value": "sre_oncall_or_service_owner_required",
"reason": "AI can nominate the required role; owner must confirm the named responder.",
},
{
"key": "blast_radius",
"status": "ai_prefilled_owner_review_required",
"value": f"target={safe_source_ref}; route={route_id}; write_scope=single_allowlisted_apply",
"reason": "Blast radius is limited to the selected allowlisted route until owner release.",
},
{
"key": "post_apply_verifier",
"status": "ai_prefilled_owner_review_required",
"value": f"verifier-plan:{safe_source_ref}",
"reason": "Verifier plan is prepared from the same source evidence and still needs owner review.",
},
{
"key": "km_writeback_owner",
"status": "ai_prefilled_after_verified_execution",
"value": "hermes",
"reason": "Hermes prepares KM writeback only after verified execution.",
},
{
"key": "playbook_trust_owner",
"status": "ai_prefilled_after_verified_execution",
"value": "openclaw_nemotron_review",
"reason": "Trust writeback waits for verifier output and reviewer scoring.",
},
],
"next_action": "owner_reviews_ai_prefill_then_release_or_reject",
}
field_rows = [
{
"key": "incident_ref",
@@ -4483,48 +4537,55 @@ def _apply_gate_execution_release_contract(
},
{
"key": "maintenance_window",
"status": "blocked_missing_maintenance_window",
"value": "--",
"status": "ai_suggested_owner_review_required",
"value": f"maintenance-window-review:awoooi:{safe_source_ref}",
"required": True,
"next_step": "collect_maintenance_window",
"next_step": "owner_review_ai_suggested_maintenance_window",
},
{
"key": "rollback_owner",
"status": "blocked_missing_rollback_owner",
"value": "--",
"status": "ai_suggested_owner_review_required",
"value": "sre_oncall_or_service_owner_required",
"required": True,
"next_step": "confirm_rollback_owner_and_disable_plan",
"next_step": "owner_confirm_rollback_owner",
},
{
"key": "blast_radius",
"status": "blocked_missing_blast_radius",
"value": "--",
"status": "ai_prefilled_owner_review_required",
"value": f"target={safe_source_ref}; route={route_id}; write_scope=single_allowlisted_apply",
"required": True,
"next_step": "define_blast_radius_before_apply",
"next_step": "owner_review_ai_prefilled_blast_radius",
},
{
"key": "post_apply_verifier",
"status": "blocked_missing_post_apply_verifier",
"status": "ai_prefilled_owner_review_required",
"value": f"verifier-plan:{safe_source_ref}",
"required": True,
"next_step": "approve_post_apply_verifier_plan",
"next_step": "owner_review_post_apply_verifier_plan",
},
{
"key": "km_writeback_owner",
"status": "blocked_until_verified_execution",
"value": "--",
"status": "ai_prefilled_after_verified_execution",
"value": "hermes",
"required": True,
"next_step": "assign_km_writeback_owner_after_verified_execution",
},
{
"key": "playbook_trust_owner",
"status": "blocked_until_verified_execution",
"value": "--",
"status": "ai_prefilled_after_verified_execution",
"value": "openclaw_nemotron_review",
"required": True,
"next_step": "assign_playbook_trust_owner_after_verified_execution",
},
]
ready_statuses = {"prefilled", "passed", "candidate_ready_no_runtime_authority"}
ready_statuses = {
"prefilled",
"passed",
"candidate_ready_no_runtime_authority",
"ai_suggested_owner_review_required",
"ai_prefilled_owner_review_required",
"ai_prefilled_after_verified_execution",
}
ready_count = sum(1 for row in field_rows if row["status"] in ready_statuses)
blocked_count = len(field_rows) - ready_count
return {
@@ -4545,12 +4606,13 @@ def _apply_gate_execution_release_contract(
"work_item_id"
),
"fields": field_rows,
"owner_release_draft": owner_release_draft,
"next_steps": [
{
"key": "owner_release",
"owner_agent": "openclaw",
"work_item_id": f"owner-release-review:awoooi:{safe_source_ref}",
"summary": "collect owner approval receipt and redacted evidence refs",
"summary": "review AI prefilled owner release draft and record approval or rejection",
"runtime_write_allowed": False,
},
{