588 lines
21 KiB
JSON
588 lines
21 KiB
JSON
{
|
|
"schema_version": "sre_k3s_controlled_automation_work_items_v1",
|
|
"governance_version": "global_product_governance_v2",
|
|
"program_id": "AIA-SRE-P0-20260715",
|
|
"generated_at": "2026-07-15T15:30:00+08:00",
|
|
"status": "phase_1_canonical_identity_and_typed_routing_in_progress",
|
|
"scope_complete": false,
|
|
"current_p0": {
|
|
"id": "AIA-SRE-004",
|
|
"title": "Canonical Asset Normalize 與 Typed Domain Router production closure",
|
|
"phase": "phase_1",
|
|
"terminal_condition": "同一 source SHA 通過 focused/full tests、Gitea CD、production registry parity、typed route replay 與 Sentry exact-container verifier readback"
|
|
},
|
|
"architecture": {
|
|
"pipeline": [
|
|
"Alert",
|
|
"Canonical Asset Normalize",
|
|
"Typed Domain Router",
|
|
"HolmesGPT Investigator",
|
|
"Ollama RCA / Gemini Critic",
|
|
"Deterministic Policy",
|
|
"Single Controlled Executor",
|
|
"Independent Verifier",
|
|
"Incident Closure + KM/RAG/MCP/PlayBook"
|
|
],
|
|
"cross_domain_fallback_allowed": false,
|
|
"unknown_asset_terminal": "asset_identity_unresolved",
|
|
"circuit_open_terminal": "stay_in_same_domain_and_create_repair_work_item",
|
|
"same_run_identity_required": [
|
|
"trace_id",
|
|
"run_id",
|
|
"work_item_id"
|
|
]
|
|
},
|
|
"provider_policy": {
|
|
"ordered_route": [
|
|
"ollama_gcp_a",
|
|
"ollama_gcp_b",
|
|
"ollama_local",
|
|
"gemini"
|
|
],
|
|
"route_label": "GCP-A -> GCP-B -> host111 Ollama -> Gemini API",
|
|
"hops": [
|
|
{
|
|
"position": 1,
|
|
"provider": "ollama_gcp_a",
|
|
"identity": "GCP-A"
|
|
},
|
|
{
|
|
"position": 2,
|
|
"provider": "ollama_gcp_b",
|
|
"identity": "GCP-B"
|
|
},
|
|
{
|
|
"position": 3,
|
|
"provider": "ollama_local",
|
|
"identity": "host111"
|
|
},
|
|
{
|
|
"position": 4,
|
|
"provider": "gemini",
|
|
"identity": "Gemini API"
|
|
}
|
|
],
|
|
"ollama_role": "primary_rca_and_action_planning",
|
|
"gemini_role": "final_fallback_and_optional_critic_only",
|
|
"gemini_paid_call_allowed": false,
|
|
"gemini_cost_cap_status": "explicit_cost_cap_not_approved",
|
|
"gemini_credential_status": "runtime_secret_reference_verifier_pending_no_secret_value_read",
|
|
"production_provider_route_switch_allowed": false,
|
|
"required_before_gemini_enablement": [
|
|
"offline_replay_scorecard",
|
|
"shadow_comparison",
|
|
"bounded_canary",
|
|
"daily_and_monthly_cost_cap",
|
|
"per_incident_token_cap",
|
|
"rate_limit_and_circuit_breaker",
|
|
"rollback_to_ollama_chain",
|
|
"production_cost_readback"
|
|
]
|
|
},
|
|
"agent99_host_operations_bridge": {
|
|
"role": "on_prem_policy_controlled_ai_execution_node",
|
|
"single_executor_domains": [
|
|
"windows_vmware",
|
|
"control_plane_recovery"
|
|
],
|
|
"relay_only_domains": [
|
|
"host_systemd",
|
|
"docker_container"
|
|
],
|
|
"dispatch_identity_schema": "agent99_controlled_dispatch_identity_v1",
|
|
"command_envelope_schema": "agent99_controlled_dispatch_input_v1",
|
|
"dispatch_receipt_schema": "agent99_controlled_dispatch_receipt_v1",
|
|
"outcome_schema": "agent99_outcome_contract_v1",
|
|
"completion_callback": "/api/v1/agents/agent99/completion-callback",
|
|
"arbitrary_command_allowed": false,
|
|
"unknown_asset_dispatch_allowed": false,
|
|
"cross_domain_fallback_allowed": false,
|
|
"runtime_terminal": "callback_plus_independent_verifier_plus_learning_writeback"
|
|
},
|
|
"domain_routes": [
|
|
{
|
|
"domain": "kubernetes_workload",
|
|
"executor": "kubernetes_controlled_executor",
|
|
"verifier": "kubernetes_rollout_verifier",
|
|
"fallback": "forbidden"
|
|
},
|
|
{
|
|
"domain": "host_systemd",
|
|
"executor": "host_ansible_executor",
|
|
"verifier": "host_runtime_independent_verifier",
|
|
"fallback": "forbidden"
|
|
},
|
|
{
|
|
"domain": "docker_container",
|
|
"executor": "host_ansible_executor_with_exact_container_playbook",
|
|
"verifier": "container_runtime_independent_verifier",
|
|
"fallback": "forbidden"
|
|
},
|
|
{
|
|
"domain": "windows_vmware",
|
|
"executor": "Agent99",
|
|
"verifier": "agent99_independent_runtime_verifier",
|
|
"fallback": "forbidden"
|
|
},
|
|
{
|
|
"domain": "database",
|
|
"executor": "db_bounded_executor",
|
|
"verifier": "db_independent_verifier",
|
|
"fallback": "forbidden"
|
|
},
|
|
{
|
|
"domain": "backup_restore",
|
|
"executor": "backup_restore_break_glass",
|
|
"verifier": "backup_restore_readback_verifier",
|
|
"fallback": "forbidden",
|
|
"critical_read_only_default": true
|
|
},
|
|
{
|
|
"domain": "unknown",
|
|
"executor": null,
|
|
"verifier": null,
|
|
"terminal": "asset_identity_unresolved",
|
|
"fallback": "forbidden"
|
|
}
|
|
],
|
|
"work_items": [
|
|
{
|
|
"id": "AIA-SRE-001",
|
|
"order": 1,
|
|
"priority": "P0",
|
|
"phase": "phase_1",
|
|
"title": "建立唯一 machine-readable 架構與工作總帳",
|
|
"owner_lane": "AIControlPlane",
|
|
"risk": "low",
|
|
"status": "source_implemented_runtime_pending",
|
|
"dependencies": [],
|
|
"source_refs": [
|
|
"docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json",
|
|
"apps/api/src/services/sre_k3s_controlled_automation_work_items.py"
|
|
],
|
|
"executor": "Gitea controlled CD",
|
|
"verifier": "ledger schema and API readback verifier",
|
|
"rollback": "revert source commit",
|
|
"exit_condition": "production API returns the exact committed ledger and rollups",
|
|
"next_action": "complete loader/API tests then deploy"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-002",
|
|
"order": 2,
|
|
"priority": "P0",
|
|
"phase": "phase_1",
|
|
"title": "Canonical Service Registry 單一來源與 runtime exact mirror",
|
|
"owner_lane": "AssetIdentity",
|
|
"risk": "medium",
|
|
"status": "source_implemented_runtime_pending",
|
|
"dependencies": [
|
|
"AIA-SRE-001"
|
|
],
|
|
"source_refs": [
|
|
"ops/config/service-registry.yaml",
|
|
"scripts/ops/render-service-registry-configmap.py",
|
|
"k8s/awoooi-prod/15-service-registry-configmap.yaml"
|
|
],
|
|
"executor": "service registry renderer plus Gitea CD",
|
|
"verifier": "source hash and exact embedded YAML parity",
|
|
"rollback": "reapply previous ConfigMap from prior Gitea SHA",
|
|
"exit_condition": "production ConfigMap source hash and API identity lookup match Gitea main",
|
|
"next_action": "deploy and read back ConfigMap annotation"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-003",
|
|
"order": 3,
|
|
"priority": "P0",
|
|
"phase": "phase_1",
|
|
"title": "Unknown asset fail-closed 與 deterministic drift work item",
|
|
"owner_lane": "AssetIdentity",
|
|
"risk": "medium",
|
|
"status": "source_implemented_runtime_pending",
|
|
"dependencies": [
|
|
"AIA-SRE-002"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/service_registry.py",
|
|
"apps/api/src/services/auto_repair_service.py"
|
|
],
|
|
"executor": "none for unresolved identity",
|
|
"verifier": "unknown asset replay must return UNRESOLVED and zero candidates",
|
|
"rollback": "not applicable; no-write terminal",
|
|
"exit_condition": "unknown assets create a stable drift ID and never return AUTO/restart fallback",
|
|
"next_action": "production replay one unknown asset without runtime apply"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-004",
|
|
"order": 4,
|
|
"priority": "P0",
|
|
"phase": "phase_1",
|
|
"title": "Typed Domain Router 與跨 domain fallback 禁止",
|
|
"owner_lane": "AutomationRouter",
|
|
"risk": "high",
|
|
"status": "source_implemented_runtime_pending",
|
|
"dependencies": [
|
|
"AIA-SRE-003"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/controlled_alert_target_router.py",
|
|
"apps/api/src/services/awooop_ansible_audit_service.py",
|
|
"apps/api/src/services/awooop_ansible_check_mode_service.py",
|
|
"apps/api/src/api/v1/agents.py"
|
|
],
|
|
"executor": "typed policy router",
|
|
"verifier": "domain/catalog/host/canonical ID scope verifier",
|
|
"rollback": "revert router source while keeping unknown fail-closed",
|
|
"exit_condition": "every candidate is exact-domain scoped and circuit-open never selects another host/domain",
|
|
"next_action": "run full Ansible replay regression"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-005",
|
|
"order": 5,
|
|
"priority": "P0",
|
|
"phase": "phase_1",
|
|
"title": "Sentry profiling consumer exact-container bounded recovery",
|
|
"owner_lane": "HostContainerAutomation",
|
|
"risk": "medium",
|
|
"status": "source_implemented_runtime_pending",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"infra/ansible/playbooks/110-sentry-profiling-consumer-recovery.yml",
|
|
"apps/api/src/services/awooop_ansible_post_verifier.py"
|
|
],
|
|
"executor": "awoooi-ansible-executor-broker",
|
|
"verifier": "exact container running plus healthy readback",
|
|
"rollback": "stop further writes, same-domain check replay and cooldown",
|
|
"exit_condition": "INC-20260714-471307 replay selects only host_110 exact playbook and post-verifier passes",
|
|
"next_action": "deploy then execute one bounded same-fingerprint controlled replay"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-006",
|
|
"order": 6,
|
|
"priority": "P0",
|
|
"phase": "phase_2",
|
|
"title": "Agent99 Host Operations Bridge typed enforcement",
|
|
"owner_lane": "Agent99",
|
|
"risk": "high",
|
|
"status": "source_implemented_runtime_pending",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/agent99_sre_bridge.py",
|
|
"apps/api/src/services/agent99_controlled_dispatch_ledger.py",
|
|
"apps/api/src/services/agent99_completion_callback.py",
|
|
"apps/api/src/api/v1/agents.py"
|
|
],
|
|
"executor": "Agent99 for Windows/VMware/control-plane; relay-only elsewhere",
|
|
"verifier": "Agent99 callback plus external same-run verifier",
|
|
"rollback": "disable typed dispatch route and retain no-write Status readback",
|
|
"exit_condition": "all Agent99 dispatches carry canonical typed scope and no legacy catch-all can mutate",
|
|
"next_action": "deploy then replay one allowlisted Host112 or cold-start run plus one cross-domain denied candidate"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-007",
|
|
"order": 7,
|
|
"priority": "P0",
|
|
"phase": "phase_2",
|
|
"title": "K3s workload 專屬 executor 與 rollout verifier",
|
|
"owner_lane": "KubernetesAutomation",
|
|
"risk": "high",
|
|
"status": "planned",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/executor.py",
|
|
"apps/api/src/services/post_execution_verifier.py"
|
|
],
|
|
"executor": "kubernetes_controlled_executor",
|
|
"verifier": "kubernetes_rollout_verifier",
|
|
"rollback": "declarative rollout undo or previous immutable revision",
|
|
"exit_condition": "K3s incidents never enter Ansible/Agent99 fallback and close with rollout evidence",
|
|
"next_action": "inventory current kubernetes actions and bind allowlisted declarative routes"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-008",
|
|
"order": 8,
|
|
"priority": "P0",
|
|
"phase": "phase_2",
|
|
"title": "Host/systemd 專屬 Ansible executor inventory",
|
|
"owner_lane": "HostAutomation",
|
|
"risk": "high",
|
|
"status": "in_progress",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"infra/ansible/inventory/hosts.yml",
|
|
"apps/api/src/services/awooop_ansible_audit_service.py"
|
|
],
|
|
"executor": "host_ansible_executor",
|
|
"verifier": "host_runtime_independent_verifier",
|
|
"rollback": "catalog-specific compensating action",
|
|
"exit_condition": "every host action has one exact inventory host, check mode, bounded apply and postcondition",
|
|
"next_action": "close catalogs still backed by broad convergence playbooks"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-009",
|
|
"order": 9,
|
|
"priority": "P0",
|
|
"phase": "phase_2",
|
|
"title": "Windows/VMware Agent99 single-executor closure",
|
|
"owner_lane": "Agent99",
|
|
"risk": "high",
|
|
"status": "in_progress",
|
|
"dependencies": [
|
|
"AIA-SRE-006"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/agent99_controlled_dispatch_ledger.py",
|
|
"apps/api/src/services/agent99_same_run_reconcile.py"
|
|
],
|
|
"executor": "Agent99",
|
|
"verifier": "agent99_independent_runtime_verifier",
|
|
"rollback": "allowlisted Status/no-write reconciliation and bounded generation retry",
|
|
"exit_condition": "Windows/VMware runs use durable identity, callback, verifier and learning receipt",
|
|
"next_action": "reconcile remaining Agent99 enterprise work ledger with this program"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-010",
|
|
"order": 10,
|
|
"priority": "P0",
|
|
"phase": "phase_3",
|
|
"title": "DB 專屬 verifier 與 bounded executor",
|
|
"owner_lane": "DatabaseAutomation",
|
|
"risk": "high",
|
|
"status": "planned",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"ops/config/service-registry.yaml"
|
|
],
|
|
"executor": "db_bounded_executor",
|
|
"verifier": "db_independent_verifier",
|
|
"rollback": "transactional or compensating action only; destructive restore remains break-glass",
|
|
"exit_condition": "DB incidents use DB-native preflight/postconditions and never generic host restart",
|
|
"next_action": "classify read-only, session, pool, replication and bounded maintenance actions"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-011",
|
|
"order": 11,
|
|
"priority": "P0",
|
|
"phase": "phase_3",
|
|
"title": "Backup/restore readback 與 critical break-glass",
|
|
"owner_lane": "DataProtection",
|
|
"risk": "critical",
|
|
"status": "policy_active",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/backup_restore_signal_automation.py"
|
|
],
|
|
"executor": "backup_restore_break_glass",
|
|
"verifier": "backup_restore_readback_verifier",
|
|
"rollback": "no-write default; destructive action requires incident-specific break-glass",
|
|
"exit_condition": "freshness, offsite, escrow and restore-drill evidence close without false green",
|
|
"next_action": "bind typed route to DR scorecard without running backup/restore"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-012",
|
|
"order": 12,
|
|
"priority": "P0",
|
|
"phase": "phase_3",
|
|
"title": "HolmesGPT Investigator shadow integration",
|
|
"owner_lane": "Investigator",
|
|
"risk": "high",
|
|
"status": "planned",
|
|
"dependencies": [
|
|
"AIA-SRE-004"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/pre_decision_investigator.py"
|
|
],
|
|
"executor": "none in shadow",
|
|
"verifier": "offline replay quality and prompt-injection safety scorecard",
|
|
"rollback": "remove shadow consumer; active PreDecisionInvestigator remains",
|
|
"exit_condition": "internal immutable artifact passes replay, shadow and canary before core replacement",
|
|
"next_action": "source HolmesGPT from approved internal mirror without GitHub access"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-013",
|
|
"order": 13,
|
|
"priority": "P0",
|
|
"phase": "phase_3",
|
|
"title": "Ollama RCA 與 Gemini Critic/cost gate",
|
|
"owner_lane": "ModelRouter",
|
|
"risk": "critical",
|
|
"status": "in_progress",
|
|
"dependencies": [
|
|
"AIA-SRE-012"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/ai_router.py",
|
|
"apps/api/src/services/ollama_failover.py"
|
|
],
|
|
"executor": "ordered model router",
|
|
"verifier": "provider-attributed replay accuracy, latency and cost readback",
|
|
"rollback": "Gemini disabled; remain on ordered Ollama chain",
|
|
"exit_condition": "provider order is enforced and Gemini cannot run without explicit cost cap",
|
|
"next_action": "verify secret metadata presence without reading value, then build offline comparison"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-014",
|
|
"order": 14,
|
|
"priority": "P0",
|
|
"phase": "phase_4",
|
|
"title": "Independent verifier registry 完整覆蓋",
|
|
"owner_lane": "PostExecutionVerifier",
|
|
"risk": "high",
|
|
"status": "in_progress",
|
|
"dependencies": [
|
|
"AIA-SRE-005",
|
|
"AIA-SRE-007",
|
|
"AIA-SRE-008",
|
|
"AIA-SRE-009",
|
|
"AIA-SRE-010"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/awooop_ansible_post_verifier.py",
|
|
"apps/api/src/services/post_execution_verifier.py"
|
|
],
|
|
"executor": "none",
|
|
"verifier": "domain-specific external readback",
|
|
"rollback": "failed verifier triggers same-domain retry or compensating action",
|
|
"exit_condition": "100 percent of mutating catalogs have independent postconditions",
|
|
"next_action": "reconcile catalog IDs against postcondition registry"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-015",
|
|
"order": 15,
|
|
"priority": "P0",
|
|
"phase": "phase_4",
|
|
"title": "Incident closure 與 KM/RAG/MCP/PlayBook durable writeback",
|
|
"owner_lane": "LearningControlPlane",
|
|
"risk": "medium",
|
|
"status": "in_progress",
|
|
"dependencies": [
|
|
"AIA-SRE-014"
|
|
],
|
|
"source_refs": [
|
|
"apps/api/src/services/learning_service.py",
|
|
"apps/api/src/services/awooop_ansible_learning_writeback.py"
|
|
],
|
|
"executor": "learning writeback consumer",
|
|
"verifier": "durable same-run acknowledgement readback",
|
|
"rollback": "append-only correction event; immutable receipts are not overwritten",
|
|
"exit_condition": "closure requires all learning acknowledgements on the same run",
|
|
"next_action": "bind typed domain and verifier outcome into immutable learning receipt"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-016",
|
|
"order": 16,
|
|
"priority": "P1",
|
|
"phase": "phase_5",
|
|
"title": "24h replay、MTTA/MTTR、誤判、復發與成本 scorecard",
|
|
"owner_lane": "AutomationSLO",
|
|
"risk": "low",
|
|
"status": "planned",
|
|
"dependencies": [
|
|
"AIA-SRE-015"
|
|
],
|
|
"source_refs": [],
|
|
"executor": "offline replay worker",
|
|
"verifier": "production aggregate versus same-run receipts",
|
|
"rollback": "read-only scorecard",
|
|
"exit_condition": "all lanes publish MTTA, MTTR, false positive, recurrence, human intervention, verifier and rollback metrics",
|
|
"next_action": "replay the latest 24h alert/runs corpus after phase 1 deploy"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-017",
|
|
"order": 17,
|
|
"priority": "P1",
|
|
"phase": "phase_5",
|
|
"title": "Telegram 與 cockpit 只呈現 canonical lifecycle truth",
|
|
"owner_lane": "ProductExperience",
|
|
"risk": "medium",
|
|
"status": "in_progress",
|
|
"dependencies": [
|
|
"AIA-SRE-015"
|
|
],
|
|
"source_refs": [
|
|
"ops/config/telegram-routing-registry.yaml"
|
|
],
|
|
"executor": "canonical Telegram gateway",
|
|
"verifier": "delivery receipt plus desktop/mobile visible smoke",
|
|
"rollback": "suppress duplicate projection; retain incident ledger",
|
|
"exit_condition": "no alert is sprayed across groups/bots and every card links one canonical run",
|
|
"next_action": "reconcile project/product/alert class routing against the typed domain"
|
|
},
|
|
{
|
|
"id": "AIA-SRE-018",
|
|
"order": 18,
|
|
"priority": "P0",
|
|
"phase": "phase_6",
|
|
"title": "Gitea CD、production runtime 與 visible closure",
|
|
"owner_lane": "ReleaseControl",
|
|
"risk": "high",
|
|
"status": "planned",
|
|
"dependencies": [
|
|
"AIA-SRE-001",
|
|
"AIA-SRE-002",
|
|
"AIA-SRE-003",
|
|
"AIA-SRE-004",
|
|
"AIA-SRE-005",
|
|
"AIA-SRE-006",
|
|
"AIA-SRE-014",
|
|
"AIA-SRE-015"
|
|
],
|
|
"source_refs": [
|
|
".gitea/workflows/cd.yaml"
|
|
],
|
|
"executor": "Gitea controlled CD",
|
|
"verifier": "deploy marker, image SHA, API readback and desktop/mobile smoke",
|
|
"rollback": "previous immutable image revision and ConfigMap source SHA",
|
|
"exit_condition": "source/test/CD/runtime/UI evidence all match one deployed SHA",
|
|
"next_action": "commit phase 1, normal push after shared writer release, then terminal CD/readback"
|
|
}
|
|
],
|
|
"rollups": {
|
|
"total_items": 18,
|
|
"by_priority": {
|
|
"P0": 16,
|
|
"P1": 2
|
|
},
|
|
"by_status": {
|
|
"source_implemented_runtime_pending": 6,
|
|
"in_progress": 6,
|
|
"planned": 5,
|
|
"policy_active": 1
|
|
},
|
|
"source_implemented_items": 6,
|
|
"runtime_closed_items": 0,
|
|
"program_completion_percent": 0,
|
|
"asset_coverage_status": "partial",
|
|
"runtime_closure_status": "not_started_for_this_program_sha"
|
|
},
|
|
"completion_contract": {
|
|
"required_stages": [
|
|
"sensor_source_receipt",
|
|
"canonical_asset_identity",
|
|
"source_truth_diff",
|
|
"ai_decision_candidate",
|
|
"risk_policy_decision",
|
|
"check_mode_receipt",
|
|
"bounded_execution_receipt",
|
|
"independent_verifier_or_no_write_terminal",
|
|
"incident_closure",
|
|
"telegram_receipt",
|
|
"km_rag_mcp_playbook_writeback_ack"
|
|
],
|
|
"terminal_without_all_stages": "partial_or_degraded_with_safe_next_action",
|
|
"source_test_cd_green_is_runtime_closure": false
|
|
}
|
|
}
|