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

This commit is contained in:
Your Name
2026-07-02 19:06:10 +08:00
parent 3cf54f3bf9
commit e2447d49a0
3 changed files with 407 additions and 18 deletions

View File

@@ -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",