feat(awooop): close ai automation node receipts with live readback
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 1m0s
CD Pipeline / build-and-deploy (push) Has started running
CD Pipeline / post-deploy-checks (push) Has been cancelled
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 1m0s
CD Pipeline / build-and-deploy (push) Has started running
CD Pipeline / post-deploy-checks (push) Has been cancelled
This commit is contained in:
@@ -14,7 +14,11 @@ from src.services import awoooi_priority_work_order_readback as priority_service
|
||||
from src.services.ai_agent_log_controlled_writeback_executor_readback import (
|
||||
load_latest_ai_agent_log_controlled_writeback_executor_readback,
|
||||
)
|
||||
from src.services.ai_agent_log_post_write_verifier_dry_run import (
|
||||
load_latest_ai_agent_log_post_write_verifier_dry_run,
|
||||
)
|
||||
from src.services.awoooi_priority_work_order_readback import (
|
||||
apply_ai_automation_live_closure_readbacks,
|
||||
apply_ai_loop_current_blocker_execution_queue,
|
||||
apply_controlled_cd_lane_live_metric_readback,
|
||||
apply_harbor_registry_controlled_recovery_preflight,
|
||||
@@ -458,6 +462,54 @@ def test_awoooi_priority_work_order_readback_loader_returns_mainline_order():
|
||||
]
|
||||
|
||||
|
||||
def test_ai_automation_live_closure_readbacks_close_node_receipts():
|
||||
payload = load_latest_awoooi_priority_work_order_readback()
|
||||
executor = load_latest_ai_agent_log_controlled_writeback_executor_readback()
|
||||
verifier = load_latest_ai_agent_log_post_write_verifier_dry_run()
|
||||
|
||||
apply_ai_automation_live_closure_readbacks(
|
||||
payload,
|
||||
executor_readback=executor,
|
||||
verifier_readback=verifier,
|
||||
consumer_readback=_consumer_readback_ready(),
|
||||
)
|
||||
|
||||
receipts_by_id = {
|
||||
item["node_id"]: item for item in payload["ai_automation_node_receipts"]
|
||||
}
|
||||
assert payload["summary"]["ai_automation_node_receipt_count"] == 8
|
||||
assert payload["summary"]["ai_automation_node_receipt_ready_count"] == 8
|
||||
assert payload["summary"]["ai_automation_node_receipt_queued_count"] == 0
|
||||
assert payload["summary"]["ai_automation_node_receipt_blocked_count"] == 0
|
||||
assert receipts_by_id["normalizer_log_tags"]["node_status"] == "ready"
|
||||
assert receipts_by_id["candidate_action"]["node_status"] == "ready"
|
||||
assert receipts_by_id["execution_boundary"]["node_status"] == "ready"
|
||||
assert receipts_by_id["post_verifier"]["node_status"] == "ready"
|
||||
assert receipts_by_id["learning_writeback"]["node_status"] == "ready"
|
||||
assert receipts_by_id["execution_boundary"]["verifier_result"] == (
|
||||
"controlled_consumer_context_receipt_readback"
|
||||
)
|
||||
assert receipts_by_id["post_verifier"]["verifier_result"] == (
|
||||
"post_write_verifier_dry_run_ready"
|
||||
)
|
||||
assert receipts_by_id["learning_writeback"]["verifier_result"] == (
|
||||
"consumer_context_receipt_writeback_ready"
|
||||
)
|
||||
assert receipts_by_id["learning_writeback"]["km_writeback_ref"] == (
|
||||
"context_receipt:km=1"
|
||||
)
|
||||
assert receipts_by_id["learning_writeback"]["playbook_trust_writeback_ref"] == (
|
||||
"context_receipt:playbook=1"
|
||||
)
|
||||
assert payload["summary"][
|
||||
"ai_automation_consumer_runtime_target_write_performed"
|
||||
] is True
|
||||
assert payload["summary"]["ai_automation_consumer_ready_target_count"] == 6
|
||||
assert payload["summary"][
|
||||
"ai_automation_consumer_target_context_receipt_write_count"
|
||||
] == 6
|
||||
|
||||
|
||||
def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
):
|
||||
@@ -476,6 +528,11 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
|
||||
"load_controlled_cd_lane_live_metric_readback",
|
||||
_controlled_cd_lane_live_metrics,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
agents,
|
||||
"load_latest_ai_agent_log_controlled_writeback_consumer_readback",
|
||||
_consumer_readback_ready_async,
|
||||
)
|
||||
app = FastAPI()
|
||||
app.include_router(router, prefix="/api/v1")
|
||||
client = TestClient(app)
|
||||
@@ -545,8 +602,9 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
|
||||
"ai_automation_node_receipt_v1"
|
||||
)
|
||||
assert data["summary"]["ai_automation_node_receipt_count"] == 8
|
||||
assert data["summary"]["ai_automation_node_receipt_ready_count"] >= 3
|
||||
assert data["summary"]["ai_automation_node_receipt_queued_count"] >= 1
|
||||
assert data["summary"]["ai_automation_node_receipt_ready_count"] == 8
|
||||
assert data["summary"]["ai_automation_node_receipt_queued_count"] == 0
|
||||
assert data["summary"]["ai_automation_node_receipt_blocked_count"] == 0
|
||||
assert [item["node_id"] for item in data["ai_automation_node_receipts"]] == [
|
||||
"sensor_evidence",
|
||||
"normalizer_log_tags",
|
||||
@@ -566,6 +624,12 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
|
||||
assert endpoint_receipts["execution_boundary"]["lane_id"] == (
|
||||
"telegram_alert_ai_automation"
|
||||
)
|
||||
assert endpoint_receipts["execution_boundary"]["node_status"] == "ready"
|
||||
assert endpoint_receipts["post_verifier"]["node_status"] == "ready"
|
||||
assert endpoint_receipts["learning_writeback"]["node_status"] == "ready"
|
||||
assert endpoint_receipts["learning_writeback"]["km_writeback_ref"] == (
|
||||
"context_receipt:km=1"
|
||||
)
|
||||
|
||||
|
||||
def test_controlled_cd_lane_live_metric_readback_falls_back_to_prometheus(
|
||||
@@ -1530,6 +1594,58 @@ def _controlled_cd_lane_live_metrics() -> dict:
|
||||
}
|
||||
|
||||
|
||||
async def _consumer_readback_ready_async() -> dict:
|
||||
return _consumer_readback_ready()
|
||||
|
||||
|
||||
def _consumer_readback_ready() -> dict:
|
||||
return {
|
||||
"schema_version": "ai_agent_log_controlled_writeback_consumer_readback_v1",
|
||||
"status": "controlled_writeback_consumer_readback_ready",
|
||||
"controlled_consume": {
|
||||
"mode": "controlled_consumer_readback_ready",
|
||||
"controlled_consume_allowed": True,
|
||||
"owner_review_required_for_low_medium_high": False,
|
||||
"critical_break_glass_required": True,
|
||||
"target_selector_required": True,
|
||||
"source_of_truth_diff_required": True,
|
||||
"check_mode_required": True,
|
||||
"rollback_required": True,
|
||||
"post_apply_verifier_required": True,
|
||||
"runtime_target_write_performed": True,
|
||||
"consumer_apply_route": (
|
||||
"/api/v1/agents/agent-log-controlled-writeback-consumer-apply"
|
||||
),
|
||||
},
|
||||
"rollups": {
|
||||
"target_count": 6,
|
||||
"dispatch_ledger_row_count": 6,
|
||||
"consumer_apply_receipt_row_count": 6,
|
||||
"consumer_binding_count": 6,
|
||||
"ready_consumer_binding_count": 6,
|
||||
"ready_target_count": 6,
|
||||
"metadata_only_receipt_count": 6,
|
||||
"post_apply_verifier_ref_count": 12,
|
||||
"controlled_consumer_readback_ready": True,
|
||||
"km_consumer_binding_count": 1,
|
||||
"rag_consumer_binding_count": 1,
|
||||
"playbook_consumer_binding_count": 1,
|
||||
"mcp_consumer_binding_count": 1,
|
||||
"verifier_consumer_binding_count": 1,
|
||||
"ai_agent_consumer_binding_count": 1,
|
||||
"target_context_receipt_write_count": 6,
|
||||
"km_context_receipt_write_count": 1,
|
||||
"rag_context_receipt_write_count": 1,
|
||||
"playbook_context_receipt_write_count": 1,
|
||||
"mcp_context_receipt_write_count": 1,
|
||||
"verifier_context_receipt_write_count": 1,
|
||||
"ai_agent_context_receipt_write_count": 1,
|
||||
"runtime_target_write_performed": True,
|
||||
},
|
||||
"active_blockers": [],
|
||||
}
|
||||
|
||||
|
||||
def _stockplatform_runtime_blocked() -> dict:
|
||||
return {
|
||||
"schema_version": "stockplatform_public_api_runtime_readback_v1",
|
||||
|
||||
Reference in New Issue
Block a user