from content_agent.run_service import RunService from content_agent.schemas import RunStartRequest from tests.p1_helpers import FakeQueryVariantClient, REAL_SOURCE_FIXTURE def _start_mock_run(tmp_path): service = RunService( runtime_root=tmp_path / "runtime" / "v1", query_variant_client=FakeQueryVariantClient(), ) state = service.start_run( RunStartRequest(platform_mode="mock", source=str(REAL_SOURCE_FIXTURE)) ) assert state["status"] == "success" return service, state["run_id"] def test_rejected_content_is_visible_but_not_pooled(tmp_path): service, run_id = _start_mock_run(tmp_path) final_output = service.read_json(run_id, "final_output.json") content_ids = {asset["platform_content_id"] for asset in final_output["content_assets"]} reject_ids = {record["decision_target_id"] for record in final_output["reject_records"]} assert final_output["summary"]["rejected_content_count"] == len(final_output["reject_records"]) assert reject_ids assert not reject_ids & content_ids assert final_output["validation_status"] == "pass" assert final_output["summary"]["run_path_complete"] is True assert final_output["summary"]["trace_complete"] is True def test_reject_records_carry_source_evidence_refs(tmp_path): service, run_id = _start_mock_run(tmp_path) final_output = service.read_json(run_id, "final_output.json") reject = final_output["reject_records"][0] assert "source_evidence" not in reject assert reject["source_evidence_ref"]["decision_id"] == reject["decision_id"] assert reject["source_evidence_ref"]["decision_target_id"] == reject["decision_target_id"] decisions = { decision["decision_id"]: decision for decision in service.read_jsonl(run_id, "rule_decisions.jsonl") } source_evidence = decisions[reject["decision_id"]]["source_evidence"] assert source_evidence["source_post_id"] assert source_evidence["discovered_platform_content_id"] assert service.validate_run(run_id)["status"] == "pass" def test_run_service_rewrites_final_output_with_final_validation_status(tmp_path): service, run_id = _start_mock_run(tmp_path) final_output = service.read_json(run_id, "final_output.json") validation = service.validate_run(run_id) assert validation["status"] == "pass" assert final_output["validation_status"] == validation["status"] assert final_output["summary"]["run_path_complete"] is True assert final_output["summary"]["trace_complete"] is True def test_final_output_carries_v4_explanation_records(tmp_path): service, run_id = _start_mock_run(tmp_path) final_output = service.read_json(run_id, "final_output.json") v4_decision_records = [ record for record in final_output["decision_records"] if (record.get("v4_explanation") or {}).get("scorecard_schema_version") == "v4_scorecard.v1" ] assert v4_decision_records for record in v4_decision_records: assert "scorecard" not in record assert "decision_replay_data" not in record assert "source_evidence" not in record explanation = record["v4_explanation"] assert explanation["schema_version"] == "v4_decision_explanation.v1" assert explanation["scorecard_schema_version"] == "v4_scorecard.v1" assert explanation["score"] == record["score"] assert "allow_walk" in explanation assert "walk_gate_snapshot" not in explanation v4_ids = {record["decision_id"] for record in v4_decision_records} section_records = ( final_output["content_assets"] + final_output["review_records"] + final_output["reject_records"] ) assert [ record for record in section_records if record.get("decision_id") in v4_ids and record.get("v4_explanation") ]