diff --git a/apps/api/tests/test_agent99_controlled_dispatch_p1.py b/apps/api/tests/test_agent99_controlled_dispatch_p1.py index 3b9104734..0a09da8aa 100644 --- a/apps/api/tests/test_agent99_controlled_dispatch_p1.py +++ b/apps/api/tests/test_agent99_controlled_dispatch_p1.py @@ -41,6 +41,16 @@ def _evidence_refs() -> dict[str, str]: } +def _learning_receipt_refs() -> dict[str, str]: + return { + "telegram_lifecycle_receipt_id": "telegram:1", + "km_writeback_ack_id": "knowledge:1", + "rag_writeback_ack_id": "rag:1", + "mcp_evidence_writeback_ack_id": "mcp:1", + "playbook_trust_writeback_ack_id": "playbook:1", + } + + def _outcome(identity, *, transport_ok: bool = True) -> dict: return { "identity": identity.public_dict(), @@ -580,11 +590,7 @@ async def test_learning_writeback_is_the_only_same_run_terminal_step( ) incomplete = await ledger.record_learning_writeback( identity=identity, - receipt_refs={ - "telegram_lifecycle_receipt_id": "telegram:fake", - "km_writeback_ack_id": "knowledge:fake", - "playbook_trust_writeback_ack_id": "playbook:fake", - }, + receipt_refs=_learning_receipt_refs(), ) assert incomplete["status"] == ( "learning_writeback_checkpoint_incomplete_fail_closed" @@ -592,11 +598,7 @@ async def test_learning_writeback_is_the_only_same_run_terminal_step( assert incomplete["runtime_closure_verified"] is False assert incomplete_db.call == 1 - checkpoint_refs = { - "telegram_lifecycle_receipt_id": "telegram-1", - "km_writeback_ack_id": "km-1", - "playbook_trust_writeback_ack_id": "playbook-1", - } + checkpoint_refs = _learning_receipt_refs() verifier_passed["learning_writeback"]["receipt_refs"] = checkpoint_refs class LearningDB: diff --git a/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py b/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py index 0082df2b8..c5a2607db 100644 --- a/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py +++ b/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py @@ -116,11 +116,11 @@ def test_loader_returns_fixed_architecture_provider_order_and_agent99_bridge() - "total_items": 18, "by_priority": {"P0": 16, "P1": 2}, "by_status": { - "source_implemented_runtime_pending": 11, - "in_progress": 3, + "source_implemented_runtime_pending": 12, + "in_progress": 2, "planned": 4, }, - "source_implemented_items": 11, + "source_implemented_items": 12, "runtime_closed_items": 0, "program_completion_percent": 0, "asset_coverage_status": "partial", @@ -141,6 +141,12 @@ def test_ledger_links_confirmed_runtime_gaps_without_false_closure() -> None: items["AIA-SRE-013"]["runtime_gaps"] ) assert "host99 Agent99" in " ".join(items["AIA-SRE-017"]["runtime_gaps"]) + assert items["AIA-SRE-009"]["status"] == ( + "source_implemented_runtime_pending" + ) + assert "arbitrary commands" in " ".join( + items["AIA-SRE-009"]["confirmed_truth"] + ) assert items["AIA-SRE-011"]["status"] == ( "source_implemented_runtime_pending" ) @@ -177,7 +183,7 @@ def test_projection_keeps_program_asset_and_runtime_truth_separate() -> None: payload = load_sre_k3s_controlled_automation_work_items() projection = build_sre_k3s_program_projection(payload) - assert projection["rollups"]["source_implemented_items"] == 11 + assert projection["rollups"]["source_implemented_items"] == 12 assert projection["rollups"]["runtime_closed_items"] == 0 assert projection["rollups"]["program_completion_percent"] == 0 assert projection["domain_count"] == 8 diff --git a/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json b/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json index ec7d8516b..3cf5aa236 100644 --- a/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json +++ b/docs/operations/sre-k3s-controlled-automation-work-items.snapshot.json @@ -512,19 +512,33 @@ "title": "Windows/VMware Agent99 single-executor closure", "owner_lane": "Agent99", "risk": "high", - "status": "in_progress", + "status": "source_implemented_runtime_pending", "dependencies": [ "AIA-SRE-006" ], "source_refs": [ "apps/api/src/services/agent99_controlled_dispatch_ledger.py", - "apps/api/src/services/agent99_same_run_reconcile.py" + "apps/api/src/services/agent99_same_run_reconcile.py", + "apps/api/src/services/agent99_sre_bridge.py", + "apps/api/src/services/agent99_completion_callback.py", + "apps/api/src/services/agent99_outcome_ingestion.py", + "apps/api/src/services/agent99_public_receipts.py", + "apps/api/src/jobs/agent99_controlled_dispatch_reconciler_job.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" + "confirmed_truth": [ + "Windows/VMware and control-plane recovery dispatches require a typed same-run identity and Agent99 executor binding", + "unknown assets, arbitrary commands and cross-domain fallback fail closed before runtime authorization", + "authenticated completion callback persists outcome and independent verifier evidence before learning writeback", + "terminal closure requires checkpointed Telegram, KM, RAG, MCP and PlayBook acknowledgements on the same run" + ], + "runtime_gaps": [ + "no production Windows/VMware same-run dispatch, authenticated callback, independent verifier and complete learning closure receipt is recorded for this exact source revision" + ], + "next_action": "deploy one exact source revision through the authorized Agent99 release lane, replay one allowlisted Windows/VMware run plus one cross-domain denial, then read back the same-run callback, verifier, Telegram and learning receipts; do not use arbitrary commands or fallback hosts" }, { "id": "AIA-SRE-010", @@ -847,11 +861,11 @@ "P1": 2 }, "by_status": { - "source_implemented_runtime_pending": 11, - "in_progress": 3, + "source_implemented_runtime_pending": 12, + "in_progress": 2, "planned": 4 }, - "source_implemented_items": 11, + "source_implemented_items": 12, "runtime_closed_items": 0, "program_completion_percent": 0, "asset_coverage_status": "partial",