test_v4_m3_scoring_replay.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from __future__ import annotations
  2. import json
  3. from content_agent.business_modules.run_record.validation import validate_run
  4. from content_agent.integrations.database_runtime import DatabaseRuntimeStore
  5. from content_agent.integrations.runtime_files import LocalRuntimeFileStore
  6. from tests.gemini_helpers import FakeGeminiVideoClient, fake_gemini_fail, fake_gemini_pool
  7. from tests.replay_harness import replay_case
  8. from tests.test_database_runtime import FakeConnection, _config, _insert_values
  9. def test_v4_m3_scoring_replay_produces_v4_runtime_contract(tmp_path):
  10. runtime_root = tmp_path / "runtime"
  11. artifacts = replay_case(
  12. "real_id45",
  13. runtime_root=runtime_root,
  14. gemini_video_client=FakeGeminiVideoClient(default_result=fake_gemini_pool()),
  15. )
  16. validation = validate_run(artifacts.run_id, LocalRuntimeFileStore(runtime_root))
  17. assert artifacts.state["status"] == "success"
  18. assert validation["status"] == "pass"
  19. assert artifacts.files["final_output.json"]["validation_status"] == "pass"
  20. assert artifacts.files["discovered_content_items.jsonl"]
  21. assert artifacts.files["pattern_recall_evidence.jsonl"]
  22. assert artifacts.decisions
  23. for item in artifacts.files["discovered_content_items.jsonl"]:
  24. assert "statistics" in item
  25. assert "platform_raw_payload" in item
  26. assert "raw_payload" in item
  27. for evidence in artifacts.files["pattern_recall_evidence.jsonl"]:
  28. summary = evidence["evidence_summary"]
  29. assert summary["schema_version"] == "v4_gemini_query_relevance.v1"
  30. assert summary["final_status"] in {"ok", "success"}
  31. assert "query_relevance_score" in summary
  32. assert "fit_senior_50plus" not in summary
  33. assert "relevance_score" not in summary
  34. for decision in artifacts.decisions:
  35. scorecard = decision["scorecard"]
  36. replay_data = decision["decision_replay_data"]
  37. assert scorecard["schema_version"] == "v4_scorecard.v1"
  38. assert "platform_performance_score" in scorecard
  39. assert "platform_performance_components" in scorecard
  40. assert "missing_observable_fields" in scorecard
  41. assert "allow_walk" in replay_data
  42. assert "walk_gate_snapshot" in replay_data
  43. assert "platform_heat" not in scorecard
  44. def test_v4_m3_scoring_replay_routes_technical_failure_to_retry(tmp_path):
  45. failed_result = fake_gemini_fail()
  46. failed_result["response_body_summary"] = {
  47. "http_status_code": 502,
  48. "json_top_level_keys": ["error"],
  49. "text_excerpt": "Provider returned error",
  50. }
  51. artifacts = replay_case(
  52. "real_id45",
  53. runtime_root=tmp_path / "runtime",
  54. gemini_video_client=FakeGeminiVideoClient(default_result=failed_result),
  55. )
  56. assert artifacts.summary["pooled_content_count"] == 0
  57. assert artifacts.summary["rejected_content_count"] == 0
  58. assert artifacts.summary["review_content_count"] == 0
  59. assert artifacts.summary["technical_retry_content_count"] == len(artifacts.decisions)
  60. assert {d["decision_reason_code"] for d in artifacts.decisions} == {"v4_technical_retry_needed"}
  61. assert {d["decision_action"] for d in artifacts.decisions} == {"TECHNICAL_RETRY_REQUIRED"}
  62. assert all(d["decision_replay_data"]["allow_walk"] is False for d in artifacts.decisions)
  63. assert all(d["scorecard"]["schema_version"] == "v4_scorecard.v1" for d in artifacts.decisions)
  64. first_evidence = artifacts.files["pattern_recall_evidence.jsonl"][0]
  65. assert first_evidence["evidence_summary"]["response_body_summary"]["http_status_code"] == 502
  66. assert first_evidence["raw_payload"]["response_body_summary"]["text_excerpt"] == "Provider returned error"
  67. def test_v4_m3_db_runtime_preserves_scoring_json_containers(tmp_path):
  68. artifacts = replay_case(
  69. "real_id45",
  70. runtime_root=tmp_path / "runtime",
  71. gemini_video_client=FakeGeminiVideoClient(default_result=fake_gemini_pool()),
  72. )
  73. connection = FakeConnection()
  74. store = DatabaseRuntimeStore(_config(), connection_factory=lambda: connection)
  75. store.append_jsonl(
  76. artifacts.run_id,
  77. "discovered_content_items.jsonl",
  78. artifacts.files["discovered_content_items.jsonl"][:1],
  79. )
  80. store.append_jsonl(
  81. artifacts.run_id,
  82. "pattern_recall_evidence.jsonl",
  83. artifacts.files["pattern_recall_evidence.jsonl"][:1],
  84. )
  85. store.append_jsonl(artifacts.run_id, "rule_decisions.jsonl", artifacts.decisions[:1])
  86. inserted = [(_table_name(sql), _insert_values(sql, params)) for sql, params in connection.statements]
  87. content_row = _only(inserted, "content_agent_discovered_content_items")
  88. evidence_row = _only(inserted, "content_agent_pattern_recall_evidence")
  89. decision_row = _only(inserted, "content_agent_rule_decisions")
  90. content_raw = json.loads(content_row["raw_payload"])
  91. assert json.loads(content_row["statistics"]) == content_raw["statistics"]
  92. assert json.loads(content_row["platform_raw_payload"]) == content_raw["platform_raw_payload"]
  93. evidence_summary = json.loads(evidence_row["evidence_summary"])
  94. evidence_raw = json.loads(evidence_row["raw_payload"])
  95. assert evidence_summary["schema_version"] == "v4_gemini_query_relevance.v1"
  96. for key, value in evidence_summary.items():
  97. assert evidence_raw[key] == value
  98. scorecard = json.loads(decision_row["scorecard"])
  99. replay_data = json.loads(decision_row["decision_replay_data"])
  100. decision_raw = json.loads(decision_row["raw_payload"])
  101. assert scorecard["schema_version"] == "v4_scorecard.v1"
  102. assert replay_data["allow_walk"] in {True, False}
  103. assert "scorecard" not in decision_raw
  104. assert "decision_replay_data" not in decision_raw
  105. assert decision_raw["record_schema_version"] == "runtime_record.v1"
  106. def _table_name(sql: str) -> str:
  107. return sql.split("`", 2)[1]
  108. def _only(rows: list[tuple[str, dict]], table: str) -> dict:
  109. matches = [values for row_table, values in rows if row_table == table]
  110. assert len(matches) == 1
  111. return matches[0]