def test_handoff_contracts(tmp_path):
trace_dir = str(tmp_path)
with reagent_flow.session("intake", trace_dir=trace_dir) as parent:
parent.log_llm_call(
tool_calls=[{"name": "extract_vendor_packet", "arguments": {"vendor_name": "ClearVoice AI"}}],
)
parent.log_tool_result(
"extract_vendor_packet",
result={
"vendor_name": "ClearVoice AI",
"data_access": {"contains_customer_pii": True},
},
)
handoff = {
"vendor_name": "ClearVoice AI",
"data_access": {"contains_customer_pii": True},
}
with reagent_flow.session(
"security-review",
trace_dir=trace_dir,
parent_trace_id=parent.trace.trace_id,
handoff_context=handoff,
) as child:
child.log_llm_call(
tool_calls=[{"name": "assess_security_risk", "arguments": {"vendor_name": "ClearVoice AI"}}],
)
child.log_tool_result("assess_security_risk", result={"risk_level": "HIGH"})
# All handoff contracts
child.assert_handoff_received(parent)
child.assert_handoff_has_fields(["vendor_name", "data_access"])
child.assert_handoff_matches(schema={
"vendor_name": str,
"data_access": {"contains_customer_pii": bool},
})
child.assert_no_extra_fields(allowed=["vendor_name", "data_access"])
child.assert_context_preserved({"vendor_name": "ClearVoice AI"}, fields=["vendor_name"])