| [ | |
| "tests/test_comfy_transport.py::test_comfy_embed_health_false_without_models", | |
| "tests/test_comfy_transport.py::test_default_mode_is_http", | |
| "tests/test_comfy_transport.py::test_embed_fetch_copies_from_path", | |
| "tests/test_comfy_transport.py::test_embed_fetch_missing_path_returns_none", | |
| "tests/test_comfy_transport.py::test_embed_free_vram_is_noop", | |
| "tests/test_comfy_transport.py::test_embed_health_routes_to_comfy_embed", | |
| "tests/test_comfy_transport.py::test_embed_mode_set", | |
| "tests/test_comfy_transport.py::test_embed_run_routes_to_executor", | |
| "tests/test_comfy_transport.py::test_embed_upload_copies_into_input_dir", | |
| "tests/test_comfy_transport.py::test_output_node_ids_picks_saveimage", | |
| "tests/test_engine_mock.py::TestChoiceFlow::test_apply_choice_effects", | |
| "tests/test_engine_mock.py::TestChoiceFlow::test_choice_affection_triggers", | |
| "tests/test_engine_mock.py::TestChoiceFlow::test_choices_set_by_model", | |
| "tests/test_engine_mock.py::TestSaveLoad::test_cast_persistence_across_saves", | |
| "tests/test_engine_mock.py::TestSaveLoad::test_scene_state_roundtrip", | |
| "tests/test_engine_mock.py::TestStreaming::test_dialogue_recorded_via_stream", | |
| "tests/test_engine_mock.py::TestStreaming::test_multiline_tool_call_not_split", | |
| "tests/test_engine_mock.py::TestStreaming::test_stream_final_matches_blocking", | |
| "tests/test_engine_mock.py::TestVNTurnLoop::test_cast_lock_cleanup", | |
| "tests/test_engine_mock.py::TestVNTurnLoop::test_expression_changes_in_narration", | |
| "tests/test_engine_mock.py::TestVNTurnLoop::test_first_turn_returns_narration", | |
| "tests/test_engine_mock.py::TestVNTurnLoop::test_multi_turn_preserves_state", | |
| "tests/test_engine_mock.py::TestVNTurnLoop::test_tool_calls_parsed_in_narration", | |
| "tests/test_trace_log.py::test_mock_model_is_not_logged", | |
| "tests/test_trace_log.py::test_real_model_turn_is_logged", | |
| "tests/test_trace_log.py::test_trace_disabled_by_env", | |
| "tests/test_unit.py::TestCastLock::test_check_case_insensitive", | |
| "tests/test_unit.py::TestCastLock::test_check_nonexistent_character", | |
| "tests/test_unit.py::TestCastLock::test_check_valid_character", | |
| "tests/test_unit.py::TestCastLock::test_clean_noncast_dialogue", | |
| "tests/test_unit.py::TestCastLock::test_repair_cast_violation_flags", | |
| "tests/test_unit.py::TestCastMember::test_character_immutability", | |
| "tests/test_unit.py::TestCastMember::test_expression_map_completeness", | |
| "tests/test_unit.py::TestCastMember::test_get_sprite_fallback", | |
| "tests/test_unit.py::TestCastPipeline::test_cast_character_identity", | |
| "tests/test_unit.py::TestCastPipeline::test_cast_to_dict_roundtrip", | |
| "tests/test_unit.py::TestCastPipeline::test_curated_cast_has_all_expressions", | |
| "tests/test_unit.py::TestCastPipeline::test_curated_cast_sprite_paths_exist", | |
| "tests/test_unit.py::TestCastPipeline::test_pipeline_returns_list", | |
| "tests/test_unit.py::TestCastPipeline::test_standard_expressions_constant", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_enter_character_adds_to_present", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_enter_character_cast_lock_violation", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_enter_character_idempotent", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_enter_character_routed", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_exit_character_cast_lock_violation", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_exit_character_not_present_no_error", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_exit_character_removes_from_present", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_exit_character_routed", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_parse_enter_character", | |
| "tests/test_unit.py::TestEnterExitCharacter::test_parse_exit_character", | |
| "tests/test_unit.py::TestExpressionState::test_choice_expression_changes_applied", | |
| "tests/test_unit.py::TestExpressionState::test_invalid_expression_leaves_state", | |
| "tests/test_unit.py::TestExpressionState::test_set_expression_updates_scene_state", | |
| "tests/test_unit.py::TestExpressionState::test_state_banner_shows_expressions", | |
| "tests/test_unit.py::TestSaveLoadJson::test_engine_save_load_roundtrip", | |
| "tests/test_unit.py::TestSaveLoadJson::test_load_missing_slot_raises", | |
| "tests/test_unit.py::TestSaveLoadJson::test_savedata_dict_roundtrip", | |
| "tests/test_unit.py::TestSceneState::test_affection_flags", | |
| "tests/test_unit.py::TestSceneState::test_has_affection", | |
| "tests/test_unit.py::TestSceneState::test_initial_state", | |
| "tests/test_unit.py::TestSceneState::test_present_characters", | |
| "tests/test_unit.py::TestSelectiveVoicing::test_dialogue_recorded_in_scene", | |
| "tests/test_unit.py::TestSelectiveVoicing::test_no_voice_without_expression_change", | |
| "tests/test_unit.py::TestSelectiveVoicing::test_voices_line_after_expression_change", | |
| "tests/test_unit.py::TestSetBackgroundTool::test_parse_set_background", | |
| "tests/test_unit.py::TestSetBackgroundTool::test_set_background_mutation", | |
| "tests/test_unit.py::TestSetBackgroundTool::test_set_background_requires_key", | |
| "tests/test_unit.py::TestSetBackgroundTool::test_set_background_routed", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_apostrophe_in_single_quoted_value", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_bare_keys_with_single_quoted_values", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_garbage_still_raises", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_mixed_quoting", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_preserves_colon_in_values", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_single_quoted_python_repr", | |
| "tests/test_unit.py::TestToolParsing::test_loads_lenient_strict_json_unchanged", | |
| "tests/test_unit.py::TestToolParsing::test_no_tools_returns_empty", | |
| "tests/test_unit.py::TestToolParsing::test_offer_choices_lenient_loose_json", | |
| "tests/test_unit.py::TestToolParsing::test_offer_choices_with_apostrophes_routes_ok", | |
| "tests/test_unit.py::TestToolParsing::test_parse_advance_scene", | |
| "tests/test_unit.py::TestToolParsing::test_parse_apostrophe_in_double_quoted_arg", | |
| "tests/test_unit.py::TestToolParsing::test_parse_apostrophe_in_plain_single_quoted_arg", | |
| "tests/test_unit.py::TestToolParsing::test_parse_apostrophe_in_trailing_single_quoted_arg", | |
| "tests/test_unit.py::TestToolParsing::test_parse_bare_unquoted_json_value", | |
| "tests/test_unit.py::TestToolParsing::test_parse_choices_with_apostrophes", | |
| "tests/test_unit.py::TestToolParsing::test_parse_multiple_tools", | |
| "tests/test_unit.py::TestToolParsing::test_parse_offer_choices", | |
| "tests/test_unit.py::TestToolParsing::test_parse_save_checkpoint", | |
| "tests/test_unit.py::TestToolParsing::test_parse_set_expression", | |
| "tests/test_unit.py::TestToolRouting::test_advance_scene_mutation", | |
| "tests/test_unit.py::TestToolRouting::test_apply_choice_effects", | |
| "tests/test_unit.py::TestToolRouting::test_offer_choices_sets_state", | |
| "tests/test_unit.py::TestToolRouting::test_set_expression_invalid_character", | |
| "tests/test_unit.py::TestToolRouting::test_set_expression_valid", | |
| "tests/test_validate.py::TestNgramOverlap::test_disjoint_is_zero", | |
| "tests/test_validate.py::TestNgramOverlap::test_identical_is_one", | |
| "tests/test_validate.py::TestNgramOverlap::test_too_short_is_none", | |
| "tests/test_validate.py::TestPromptEnums::test_enums_injected_into_prompt", | |
| "tests/test_validate.py::TestRecentHistory::test_char_cap", | |
| "tests/test_validate.py::TestRecentHistory::test_empty_log", | |
| "tests/test_validate.py::TestRecentHistory::test_keeps_tail_turns", | |
| "tests/test_validate.py::TestRecentHistory::test_prompt_injection", | |
| "tests/test_validate.py::TestValidateTurn::test_bad_background", | |
| "tests/test_validate.py::TestValidateTurn::test_bad_choices_json", | |
| "tests/test_validate.py::TestValidateTurn::test_bad_mood_and_expression", | |
| "tests/test_validate.py::TestValidateTurn::test_cast_from_system_prompt", | |
| "tests/test_validate.py::TestValidateTurn::test_cast_violation_dialogue", | |
| "tests/test_validate.py::TestValidateTurn::test_cast_violation_tool_character", | |
| "tests/test_validate.py::TestValidateTurn::test_clean_turn_passes", | |
| "tests/test_validate.py::TestValidateTurn::test_clean_unicode_not_flagged", | |
| "tests/test_validate.py::TestValidateTurn::test_duplicate_choice_ids", | |
| "tests/test_validate.py::TestValidateTurn::test_empty_completion_rejected", | |
| "tests/test_validate.py::TestValidateTurn::test_malformed_tool_call", | |
| "tests/test_validate.py::TestValidateTurn::test_mojibake_rejected", | |
| "tests/test_validate.py::TestValidateTurn::test_no_choices_but_narration_ok", | |
| "tests/test_validate.py::TestValidateTurn::test_overlap_recorded_with_history", | |
| "tests/test_validate.py::TestValidateTurn::test_unknown_tool" | |
| ] |