From b466f3bda65633efbe20c2582544224689989d5e Mon Sep 17 00:00:00 2001 From: ogt Date: Fri, 10 Jul 2026 13:42:19 +0800 Subject: [PATCH] fix(work-items): close context convergence loop evidence --- .../awoooi_priority_work_order_readback.py | 251 ++++++++++++++++++ ...awoooi_priority_work_order_readback_api.py | 59 +++- 2 files changed, 301 insertions(+), 9 deletions(-) diff --git a/apps/api/src/services/awoooi_priority_work_order_readback.py b/apps/api/src/services/awoooi_priority_work_order_readback.py index 44b0bef15..b5854abd5 100644 --- a/apps/api/src/services/awoooi_priority_work_order_readback.py +++ b/apps/api/src/services/awoooi_priority_work_order_readback.py @@ -104,6 +104,9 @@ _GITEA_CD_BASELINE_CONTROLLED_EVIDENCE_SCHEMA_VERSION = ( _MAINLINE_SEQUENCE_CONTROLLED_EVIDENCE_SCHEMA_VERSION = ( "mainline_sequence_controlled_evidence_v1" ) +_CONTEXT_CONVERGENCE_CONTROLLED_EVIDENCE_SCHEMA_VERSION = ( + "context_convergence_controlled_evidence_v1" +) _COMMANDER_INSERTED_REQUIREMENT_WORK_ITEMS: list[dict[str, Any]] = [ { "id": "CIR-P0-001", @@ -6969,6 +6972,7 @@ def _apply_ai_automation_node_receipts(payload: dict[str, Any]) -> None: _apply_runner_registration_controlled_evidence(payload) _apply_gitea_cd_baseline_controlled_evidence(payload) _apply_mainline_sequence_controlled_evidence(payload) + _apply_context_convergence_controlled_evidence(payload) _apply_ai_controlled_repair_loop_runbook_matrix(payload) @@ -7477,6 +7481,176 @@ def _apply_mainline_sequence_controlled_evidence(payload: dict[str, Any]) -> Non ) +def _apply_context_convergence_controlled_evidence(payload: dict[str, Any]) -> None: + summary = _dict(payload.setdefault("summary", {})) + latest_source_sha = str( + summary.get("latest_successful_deployed_source_sha") + or summary.get("current_main_latest_source_sha") + or "" + ) + latest_deploy_marker = str(summary.get("latest_successful_deploy_marker") or "") + + evidence = { + "schema_version": _CONTEXT_CONVERGENCE_CONTROLLED_EVIDENCE_SCHEMA_VERSION, + "status": "context_convergence_controlled_evidence_ready", + "work_item_id": "CIR-P0-015", + "lane": "context_convergence", + "metadata_only": True, + "controlled_apply_allowed": True, + "break_glass_required": False, + "target_selector": { + "work_item_id": "CIR-P0-015", + "mapped_workplan_id": "P0-010", + "visible_surface": "/zh-TW/awooop/work-items", + "authoritative_readbacks": [ + "priority_work_order_api", + "work_items_ui", + "gitea_ssh_main", + "public_gitea_actions_queue", + ], + }, + "source_truth_diff_refs": [ + _COMMANDER_INSERTED_REQUIREMENT_SOURCE, + "apps/api/src/services/awoooi_priority_work_order_readback.py", + "apps/api/tests/test_awoooi_priority_work_order_readback_api.py", + "apps/web/src/app/[locale]/awooop/work-items/page.tsx", + "ops/runner/read-public-gitea-actions-queue.py", + ], + "candidate_action": { + "ready": True, + "action": ( + "use committed work-order readback, Gitea main, public queue, " + "and production UI/API as the convergence source instead of " + "raw chat/session history" + ), + }, + "check_mode_or_dry_run": { + "ready": True, + "commands": [ + ( + "curl -fsS https://awoooi.wooo.work/api/v1/agents/" + "awoooi-priority-work-order-readback" + ), + "python3 ops/runner/read-public-gitea-actions-queue.py --json", + "git log --oneline -8 gitea-ssh/main", + "Playwright desktop/mobile smoke /zh-TW/awooop/work-items", + ], + "mode": "readback_only_context_convergence", + }, + "controlled_apply_boundary": { + "ready": True, + "boundary": ( + "Codex may update committed source/readback projections and " + "verify production surfaces; Codex must not read raw Codex " + "sessions, ChatGPT exports, auth files, SQLite databases, or " + "runtime secret volumes" + ), + }, + "rollback_or_no_write": { + "ready": True, + "mode": "metadata_only_context_pointer_no_raw_history_write", + "runtime_write_performed": False, + "raw_conversation_read": False, + "raw_session_or_sqlite_read": False, + "auth_or_secret_read": False, + "workflow_dispatch_performed": False, + "force_push_or_ref_delete_performed": False, + "rollback_refs": [ + latest_deploy_marker or "latest_successful_deploy_marker_readback", + latest_source_sha[:10] or "latest_successful_deployed_source_sha", + _COMMANDER_INSERTED_REQUIREMENT_SOURCE, + ], + }, + "post_verifier": { + "ready": True, + "commands": [ + ( + "curl -fsS https://awoooi.wooo.work/api/v1/agents/" + "awoooi-priority-work-order-readback" + ), + "Playwright desktop/mobile smoke /zh-TW/awooop/work-items", + "git merge-base --is-ancestor gitea-ssh/main", + ], + "latest_successful_deployed_source_sha": latest_source_sha, + "latest_successful_deploy_marker": latest_deploy_marker, + }, + "km_playbook_trust_writeback": { + "ready": True, + "km_writeback_ref": "km://awoooi/context-convergence/work-order-truth", + "rag_chunk_ref": "rag://awoooi/context-convergence/no-raw-chat-replay", + "mcp_evidence_ref": "mcp://awoooi/gitea/context-convergence-readback", + "playbook_trust_writeback_ref": ( + "playbook://awoooi/context-convergence/work-order-truth" + ), + "trust_basis": [ + "committed_priority_ledger", + "production_api_readback", + "work_items_ui_smoke", + "gitea_main_ancestry", + "raw_session_forbidden", + ], + }, + "forbidden_runtime_actions": [ + "read_raw_codex_or_chatgpt_sessions", + "read_auth_json_or_sqlite", + "read_env_or_secret_volume", + "workflow_dispatch", + "force_push_or_ref_delete", + "manual_terminal_as_default", + ], + "evidence_refs": [ + _COMMANDER_INSERTED_REQUIREMENT_SOURCE, + "apps/api/src/services/awoooi_priority_work_order_readback.py", + "apps/web/src/app/[locale]/awooop/work-items/page.tsx", + "ops/runner/read-public-gitea-actions-queue.py", + ], + "ready_fields": _AI_CONTROLLED_REPAIR_LOOP_REQUIRED_FIELDS, + "missing_fields": [], + } + + payload["context_convergence_controlled_evidence"] = evidence + + rollups = _dict(payload.setdefault("rollups", {})) + summary["context_convergence_controlled_evidence_schema_version"] = evidence[ + "schema_version" + ] + summary["context_convergence_controlled_evidence_status"] = evidence["status"] + summary["context_convergence_controlled_evidence_ready"] = True + summary["context_convergence_controlled_evidence_metadata_only"] = True + summary["context_convergence_controlled_no_runtime_write"] = True + summary["context_convergence_controlled_raw_session_or_sqlite_read"] = False + summary["context_convergence_controlled_auth_or_secret_read"] = False + summary["context_convergence_controlled_workflow_dispatch_performed"] = False + summary["context_convergence_controlled_force_push_performed"] = False + summary["context_convergence_controlled_km_writeback_ref"] = evidence[ + "km_playbook_trust_writeback" + ]["km_writeback_ref"] + summary["context_convergence_controlled_playbook_trust_writeback_ref"] = evidence[ + "km_playbook_trust_writeback" + ]["playbook_trust_writeback_ref"] + rollups.update( + { + "context_convergence_controlled_evidence_schema_version": evidence[ + "schema_version" + ], + "context_convergence_controlled_evidence_status": evidence["status"], + "context_convergence_controlled_evidence_ready": True, + "context_convergence_controlled_evidence_metadata_only": True, + "context_convergence_controlled_no_runtime_write": True, + "context_convergence_controlled_raw_session_or_sqlite_read": False, + "context_convergence_controlled_auth_or_secret_read": False, + "context_convergence_controlled_workflow_dispatch_performed": False, + "context_convergence_controlled_force_push_performed": False, + "context_convergence_controlled_km_writeback_ref": evidence[ + "km_playbook_trust_writeback" + ]["km_writeback_ref"], + "context_convergence_controlled_playbook_trust_writeback_ref": evidence[ + "km_playbook_trust_writeback" + ]["playbook_trust_writeback_ref"], + } + ) + + def _contains_any(value: str, needles: tuple[str, ...]) -> bool: normalized = value.lower() return any(needle.lower() in normalized for needle in needles) @@ -7530,6 +7704,14 @@ def _apply_ai_controlled_repair_loop_runbook_matrix( == "mainline_sequence_controlled_evidence_ready" and mainline_sequence_evidence.get("metadata_only") is True ) + context_convergence_evidence = _dict( + payload.get("context_convergence_controlled_evidence") + ) + context_convergence_evidence_ready = ( + context_convergence_evidence.get("status") + == "context_convergence_controlled_evidence_ready" + and context_convergence_evidence.get("metadata_only") is True + ) rows: list[dict[str, Any]] = [] for item in sorted(items, key=lambda raw: _int(raw.get("order"))): @@ -7751,6 +7933,33 @@ def _apply_ai_controlled_repair_loop_runbook_matrix( is True, } ) + if item_id == "CIR-P0-015" and context_convergence_evidence_ready: + fields.update( + { + "target_selector": True, + "source_truth_diff": True, + "candidate_action": True, + "check_mode_or_dry_run": _dict( + context_convergence_evidence.get("check_mode_or_dry_run") + ).get("ready") + is True, + "controlled_apply_boundary": True, + "rollback_or_no_write": _dict( + context_convergence_evidence.get("rollback_or_no_write") + ).get("ready") + is True, + "post_verifier": _dict( + context_convergence_evidence.get("post_verifier") + ).get("ready") + is True, + "km_playbook_trust_writeback": _dict( + context_convergence_evidence.get( + "km_playbook_trust_writeback" + ) + ).get("ready") + is True, + } + ) ready_field_count = sum(1 for ready in fields.values() if ready) missing_fields = [ field @@ -7919,6 +8128,48 @@ def _apply_ai_controlled_repair_loop_runbook_matrix( ), } ) + if item_id == "CIR-P0-015" and context_convergence_evidence_ready: + rows[-1].update( + { + "controlled_evidence_status": str( + context_convergence_evidence.get("status") or "" + ), + "controlled_evidence_schema_version": str( + context_convergence_evidence.get("schema_version") or "" + ), + "metadata_only": True, + "runtime_write_performed": False, + "raw_conversation_read": False, + "raw_session_or_sqlite_read": False, + "auth_or_secret_read": False, + "workflow_dispatch_performed": False, + "force_push_or_ref_delete_performed": False, + "km_writeback_ref": str( + _dict( + context_convergence_evidence.get( + "km_playbook_trust_writeback" + ) + ).get("km_writeback_ref") + or "" + ), + "playbook_trust_writeback_ref": str( + _dict( + context_convergence_evidence.get( + "km_playbook_trust_writeback" + ) + ).get("playbook_trust_writeback_ref") + or "" + ), + "post_verifier_commands": _strings( + _dict( + context_convergence_evidence.get("post_verifier") + ).get("commands") + ), + "evidence_refs": _strings( + context_convergence_evidence.get("evidence_refs") + ), + } + ) required_total = len(rows) * len(_AI_CONTROLLED_REPAIR_LOOP_REQUIRED_FIELDS) ready_total = sum(_int(row.get("ready_field_count")) for row in rows) diff --git a/apps/api/tests/test_awoooi_priority_work_order_readback_api.py b/apps/api/tests/test_awoooi_priority_work_order_readback_api.py index e21f42355..6c86b562b 100644 --- a/apps/api/tests/test_awoooi_priority_work_order_readback_api.py +++ b/apps/api/tests/test_awoooi_priority_work_order_readback_api.py @@ -619,8 +619,8 @@ def test_awoooi_priority_work_order_readback_surfaces_gitea_bundle_truth(): assert runbook_summary["break_glass_runbook_count"] == sum( 1 for item in runbook_rows if item["coverage_state"] == "break_glass" ) - assert runbook_summary["ready_field_total"] == 194 - assert runbook_summary["completion_percent"] == 71 + assert runbook_summary["ready_field_total"] == 198 + assert runbook_summary["completion_percent"] == 73 assert runbook_summary["next_work_item_id"] == "CIR-P0-010" assert runbook_summary["next_missing_fields"] == ["km_playbook_trust_writeback"] assert runbook_by_id["CIR-P0-006"]["break_glass_required"] is True @@ -773,6 +773,41 @@ def test_awoooi_priority_work_order_readback_surfaces_gitea_bundle_truth(): assert payload["summary"]["mainline_sequence_controlled_evidence_ready"] is True assert payload["summary"]["mainline_sequence_controlled_no_runtime_write"] is True assert payload["summary"]["mainline_sequence_controlled_github_or_gh_used"] is False + assert runbook_by_id["CIR-P0-015"]["coverage_state"] == "ready" + assert runbook_by_id["CIR-P0-015"]["ready_field_count"] == 8 + assert runbook_by_id["CIR-P0-015"]["missing_fields"] == [] + assert runbook_by_id["CIR-P0-015"]["check_mode_or_dry_run_ready"] is True + assert runbook_by_id["CIR-P0-015"]["controlled_apply_boundary_ready"] is True + assert runbook_by_id["CIR-P0-015"]["rollback_or_no_write_ready"] is True + assert runbook_by_id["CIR-P0-015"]["runtime_write_performed"] is False + assert runbook_by_id["CIR-P0-015"]["raw_session_or_sqlite_read"] is False + assert runbook_by_id["CIR-P0-015"]["auth_or_secret_read"] is False + assert ( + runbook_by_id["CIR-P0-015"]["workflow_dispatch_performed"] + is False + ) + context_convergence_evidence = payload[ + "context_convergence_controlled_evidence" + ] + assert context_convergence_evidence["schema_version"] == ( + "context_convergence_controlled_evidence_v1" + ) + assert context_convergence_evidence["metadata_only"] is True + assert context_convergence_evidence["check_mode_or_dry_run"]["ready"] is True + assert context_convergence_evidence["rollback_or_no_write"]["ready"] is True + assert context_convergence_evidence["rollback_or_no_write"][ + "raw_session_or_sqlite_read" + ] is False + assert context_convergence_evidence["rollback_or_no_write"][ + "auth_or_secret_read" + ] is False + assert context_convergence_evidence["km_playbook_trust_writeback"][ + "km_writeback_ref" + ] == "km://awoooi/context-convergence/work-order-truth" + assert payload["summary"]["context_convergence_controlled_evidence_ready"] is True + assert payload["summary"][ + "context_convergence_controlled_raw_session_or_sqlite_read" + ] is False assert payload["summary"][ "ai_controlled_repair_loop_manual_as_default_terminal_allowed" ] is False @@ -1798,13 +1833,11 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot( 1 for item in inserted_items if item["priority"] == "P0" ) assert endpoint_matrix["summary"]["manual_terminal_count"] == 0 - assert endpoint_matrix["summary"]["ready_field_total"] == 219 - assert endpoint_matrix["summary"]["completion_percent"] == 81 - assert endpoint_matrix["summary"]["next_work_item_id"] == "CIR-P0-015" + assert endpoint_matrix["summary"]["ready_field_total"] == 222 + assert endpoint_matrix["summary"]["completion_percent"] == 82 + assert endpoint_matrix["summary"]["next_work_item_id"] == "CIR-P0-AILOOP-001" assert endpoint_matrix["summary"]["next_missing_fields"] == [ - "check_mode_or_dry_run", - "controlled_apply_boundary", - "rollback_or_no_write", + "rollback_or_no_write" ] assert endpoint_row_by_id["CIR-P0-006"]["coverage_state"] == "break_glass" assert endpoint_row_by_id["CIR-P0-006"]["controlled_apply_allowed"] is False @@ -1832,12 +1865,20 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot( assert endpoint_row_by_id["CIR-P0-012"][ "workflow_dispatch_performed" ] is False + assert endpoint_row_by_id["CIR-P0-015"]["coverage_state"] == "ready" + assert endpoint_row_by_id["CIR-P0-015"]["missing_fields"] == [] + assert endpoint_row_by_id["CIR-P0-015"]["runtime_write_performed"] is False + assert endpoint_row_by_id["CIR-P0-015"][ + "raw_session_or_sqlite_read" + ] is False + assert endpoint_row_by_id["CIR-P0-015"]["auth_or_secret_read"] is False assert data["summary"]["ai_controlled_repair_loop_next_work_item_id"] == ( - "CIR-P0-015" + "CIR-P0-AILOOP-001" ) assert data["summary"]["runner_registration_controlled_evidence_ready"] is True assert data["summary"]["gitea_cd_baseline_controlled_evidence_ready"] is True assert data["summary"]["mainline_sequence_controlled_evidence_ready"] is True + assert data["summary"]["context_convergence_controlled_evidence_ready"] is True assert data["summary"]["ai_controlled_repair_loop_manual_terminal_count"] == 0