diff --git a/services/pchome_mapping_backlog_service.py b/services/pchome_mapping_backlog_service.py index c52a04e..7b84bb9 100644 --- a/services/pchome_mapping_backlog_service.py +++ b/services/pchome_mapping_backlog_service.py @@ -1580,6 +1580,10 @@ def _build_candidate_exception_auto_resolution_artifact(receipt: dict[str, Any]) "writes_database": False, } + resolver_count = len(resolvers) + retry_search_ready = any(key.endswith("search_expansion") for key in resolvers) + evidence_delta_ready = "named_candidate_evidence_delta" in resolvers + return { "artifact_id": f"pchome-direct-mapping-exception-resolution-{artifact_hash[:16]}", "source_receipt_id": receipt.get("receipt_id"), @@ -1589,7 +1593,15 @@ def _build_candidate_exception_auto_resolution_artifact(receipt: dict[str, Any]) "failure_reasons": failure_reasons, "machine_actions": next_actions, "resolvers": resolvers, - "resolution_status": "AUTO_RESOLUTION_PLANNED", + "resolution_status": "AUTO_RESOLUTION_ARTIFACT_READY", + "execution_receipt": { + "resolver_artifact_built": True, + "resolver_count": resolver_count, + "ready_for_retry_search": retry_search_ready, + "ready_for_evidence_delta": evidence_delta_ready, + "writes_database": False, + "persists_candidate": False, + }, "next_package": "direct_mapping_candidate_decision_package_after_retry", "guardrails": { "machine_actionable": True, diff --git a/tests/test_pchome_mapping_backlog_report.py b/tests/test_pchome_mapping_backlog_report.py index 4529fe2..8b3a065 100644 --- a/tests/test_pchome_mapping_backlog_report.py +++ b/tests/test_pchome_mapping_backlog_report.py @@ -452,10 +452,14 @@ def test_direct_mapping_candidate_exception_auto_resolution_builds_machine_artif assert package["summary"]["unit_basis_search_expansion_count"] == 1 assert package["summary"]["retry_search_action_count"] == 1 assert artifacts[0]["artifact_id"].startswith("pchome-direct-mapping-exception-resolution-") + assert artifacts[0]["resolution_status"] == "AUTO_RESOLUTION_ARTIFACT_READY" + assert artifacts[0]["execution_receipt"]["resolver_artifact_built"] is True + assert artifacts[0]["execution_receipt"]["ready_for_evidence_delta"] is True assert artifacts[0]["resolvers"]["variant_bundle_discriminator"]["writes_database"] is False assert artifacts[0]["resolvers"]["named_candidate_evidence_delta"]["resolution"] == "ready_for_retry_search" assert "unit_basis_search_expansion" in artifacts[1]["resolvers"] assert any("40ml" in term.lower() for term in artifacts[1]["resolvers"]["unit_basis_search_expansion"]["expanded_search_terms"]) + assert artifacts[1]["execution_receipt"]["ready_for_retry_search"] is True assert artifacts[1]["guardrails"]["can_auto_execute_read_only"] is True assert package["summary"]["writes_database_count"] == 0 assert package["safety"]["writes_database"] is False