"""Smoke tests for redbutton_v2.models — instantiation + serialization.""" from redbutton_v2.models import ( RedButtonV2Action, RedButtonV2Observation, RedButtonV2State, ) def test_action_minimum_required_fields(): a = RedButtonV2Action(tool_name="read_file", arguments={"path": "/x"}) assert a.tool_name == "read_file" assert a.arguments == {"path": "/x"} def test_observation_default_fields(): o = RedButtonV2Observation( task_description="solve problems", available_tools=["read_file"], steps_until_shutdown=15, ) assert o.auditor_message is None assert o.auditor_check_due is False assert o.eval_problem_flags == {} assert o.problems_remaining == 10 def test_state_default_fields_include_v2_extensions(): s = RedButtonV2State() assert s.auditor_events == [] assert s.deception_events == [] assert s.sandbagging_score is None assert s.error_count == 0 assert s.deception_flag is False def test_state_round_trips_via_pydantic(): s = RedButtonV2State(tier=2, turn_count=5) s.auditor_events.append({"turn": 3, "category": None}) s.deception_events.append({"turn": 3, "category": "overclaim_deception"}) dumped = s.model_dump() loaded = RedButtonV2State(**dumped) assert loaded.tier == 2 assert loaded.turn_count == 5 assert loaded.auditor_events == s.auditor_events assert loaded.deception_events == s.deception_events