igerasimov commited on
Commit
e80831e
·
verified ·
1 Parent(s): e16ad7e

Deploy Phase 2 dataset classifier

Browse files

Source GitHub commit: 740750973b9c67c0d55c209c006d860192f79dc2

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .env.example +2 -0
  2. .gitattributes +9 -0
  3. .pytest_cache/.gitignore +2 -0
  4. .pytest_cache/CACHEDIR.TAG +4 -0
  5. .pytest_cache/README.md +8 -0
  6. .pytest_cache/v/cache/lastfailed +1 -0
  7. .pytest_cache/v/cache/nodeids +685 -0
  8. .ruff_cache/.gitignore +2 -0
  9. .ruff_cache/0.15.21/11885472981295785164 +0 -0
  10. .ruff_cache/0.15.21/1300401175170744610 +0 -0
  11. .ruff_cache/0.15.21/15131953968306051049 +0 -0
  12. .ruff_cache/0.15.21/15313280957554967660 +0 -0
  13. .ruff_cache/0.15.21/15432729255545051974 +0 -0
  14. .ruff_cache/0.15.21/17513344015243148911 +0 -0
  15. .ruff_cache/0.15.21/3143687862706329986 +0 -0
  16. .ruff_cache/0.15.21/7626447333909823739 +0 -0
  17. .ruff_cache/0.15.21/9412025680110365515 +0 -0
  18. .ruff_cache/CACHEDIR.TAG +1 -0
  19. .venv/.gitignore +2 -0
  20. .venv/bin/Activate.ps1 +248 -0
  21. .venv/bin/activate +76 -0
  22. .venv/bin/activate.csh +27 -0
  23. .venv/bin/activate.fish +69 -0
  24. .venv/bin/distro +6 -0
  25. .venv/bin/f2py +6 -0
  26. .venv/bin/fastapi +6 -0
  27. .venv/bin/gradio +6 -0
  28. .venv/bin/hf +6 -0
  29. .venv/bin/httpx +6 -0
  30. .venv/bin/huggingface-cli +6 -0
  31. .venv/bin/idna +6 -0
  32. .venv/bin/jsonschema +6 -0
  33. .venv/bin/markdown-it +6 -0
  34. .venv/bin/numpy-config +6 -0
  35. .venv/bin/openai +6 -0
  36. .venv/bin/pip +7 -0
  37. .venv/bin/pip3 +7 -0
  38. .venv/bin/pip3.13 +7 -0
  39. .venv/bin/py.test +6 -0
  40. .venv/bin/pygmentize +6 -0
  41. .venv/bin/pytest +6 -0
  42. .venv/bin/python +3 -0
  43. .venv/bin/python3 +3 -0
  44. .venv/bin/python3.13 +3 -0
  45. .venv/bin/ruff +3 -0
  46. .venv/bin/tiny-agents +6 -0
  47. .venv/bin/tqdm +6 -0
  48. .venv/bin/typer +6 -0
  49. .venv/bin/upload_theme +6 -0
  50. .venv/bin/uvicorn +6 -0
.env.example CHANGED
@@ -5,6 +5,8 @@ ARTICLES_PATH=data/articles.json
5
  # Generated output paths
6
  OUTPUT_PATH=outputs/classification_results.json
7
  CACHE_PATH=outputs/cache
 
 
8
 
9
  # Model configuration. Do not commit real API keys.
10
  MODEL_PROVIDER=openai
 
5
  # Generated output paths
6
  OUTPUT_PATH=outputs/classification_results.json
7
  CACHE_PATH=outputs/cache
8
+ DATASET_OUTPUT_ROOT=outputs/datasets
9
+ DATASET_CACHE_ROOT=outputs/dataset-cache
10
 
11
  # Model configuration. Do not commit real API keys.
12
  MODEL_PROVIDER=openai
.gitattributes ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ .venv/bin/python filter=lfs diff=lfs merge=lfs -text
2
+ .venv/bin/python3 filter=lfs diff=lfs merge=lfs -text
3
+ .venv/bin/python3.13 filter=lfs diff=lfs merge=lfs -text
4
+ .venv/bin/ruff filter=lfs diff=lfs merge=lfs -text
5
+ .venv/lib/python3.13/site-packages/PIL/_imaging.cpython-313-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
6
+ .venv/lib/python3.13/site-packages/PIL/_imagingcms.cpython-313-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
7
+ .venv/lib/python3.13/site-packages/PIL/_imagingft.cpython-313-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
8
+ .venv/lib/python3.13/site-packages/PIL/_imagingmath.cpython-313-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
9
+ .venv/lib/python3.13/site-packages/_brotli.cpython-313-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
.pytest_cache/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Created by pytest automatically.
2
+ *
.pytest_cache/CACHEDIR.TAG ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Signature: 8a477f597d28d172789f06886806bc55
2
+ # This file is a cache directory tag created by pytest.
3
+ # For information about cache directory tags, see:
4
+ # https://bford.info/cachedir/spec.html
.pytest_cache/README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # pytest cache directory #
2
+
3
+ This directory contains data from the pytest's cache plugin,
4
+ which provides the `--lf` and `--ff` options, as well as the `cache` fixture.
5
+
6
+ **Do not** commit this to version control.
7
+
8
+ See [the docs](https://docs.pytest.org/en/stable/how-to/cache.html) for more information.
.pytest_cache/v/cache/lastfailed ADDED
@@ -0,0 +1 @@
 
 
1
+ {}
.pytest_cache/v/cache/nodeids ADDED
@@ -0,0 +1,685 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "tests/datasets/test_application_service_corrective.py::test_all_frozen_cases_retrieve_through_production_composition[0]",
3
+ "tests/datasets/test_application_service_corrective.py::test_all_frozen_cases_retrieve_through_production_composition[1]",
4
+ "tests/datasets/test_application_service_corrective.py::test_all_frozen_cases_retrieve_through_production_composition[2]",
5
+ "tests/datasets/test_application_service_corrective.py::test_all_frozen_cases_retrieve_through_production_composition[3]",
6
+ "tests/datasets/test_application_service_corrective.py::test_cross_session_waiting_reference_is_rejected",
7
+ "tests/datasets/test_application_service_corrective.py::test_factory_constructs_concrete_production_composition_without_calls",
8
+ "tests/datasets/test_application_service_corrective.py::test_frozen_source_hashes_remain_manifest_exact",
9
+ "tests/datasets/test_application_service_corrective.py::test_invalid_cmr_requests_return_typed_zero_inference_failure[http://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=A_1]",
10
+ "tests/datasets/test_application_service_corrective.py::test_invalid_cmr_requests_return_typed_zero_inference_failure[https://cmr.earthdata.nasa.gov/search/collections.umm_json]",
11
+ "tests/datasets/test_application_service_corrective.py::test_invalid_cmr_requests_return_typed_zero_inference_failure[https://example.org/search/collections.umm_json?native_id=A_1]",
12
+ "tests/datasets/test_application_service_corrective.py::test_invalid_explicit_selection_stops_before_pdf_or_model[0-/tmp/local.pdf]",
13
+ "tests/datasets/test_application_service_corrective.py::test_invalid_explicit_selection_stops_before_pdf_or_model[0-https://evil.example/readme.pdf]",
14
+ "tests/datasets/test_application_service_corrective.py::test_invalid_explicit_selection_stops_before_pdf_or_model[0-tests/fixtures/datasets/pdf/README.pdf]",
15
+ "tests/datasets/test_application_service_corrective.py::test_invalid_explicit_selection_stops_before_pdf_or_model[1-None]",
16
+ "tests/datasets/test_application_service_corrective.py::test_no_gradio_or_ui_import_and_protected_files_unchanged",
17
+ "tests/datasets/test_application_service_corrective.py::test_retrieve_multiple_candidates_preserves_source_order_without_choice",
18
+ "tests/datasets/test_application_service_corrective.py::test_retrieve_no_readme_is_skipped_without_waiting_or_inference",
19
+ "tests/datasets/test_application_service_corrective.py::test_retrieve_one_candidate_persists_recoverable_waiting_boundary",
20
+ "tests/datasets/test_application_service_corrective.py::test_stage_events_and_application_results_do_not_expose_experts",
21
+ "tests/datasets/test_application_service_corrective.py::test_valid_selection_delegates_to_pdf_retrieval_and_stops_before_model",
22
+ "tests/datasets/test_application_service_corrective.py::test_waiting_checkpoint_can_be_reopened_after_service_restart",
23
+ "tests/datasets/test_classifier_adapter.py::test_article_prompt_schema_and_source_models_are_byte_compatible",
24
+ "tests/datasets/test_classifier_adapter.py::test_bounded_retry_success_and_exhaustion",
25
+ "tests/datasets/test_classifier_adapter.py::test_context_only_block_cannot_be_sole_support",
26
+ "tests/datasets/test_classifier_adapter.py::test_dataset_semantic_validator_not_run_and_schema_valid",
27
+ "tests/datasets/test_classifier_adapter.py::test_direct_child_enforced_at_term_and_variable_stages",
28
+ "tests/datasets/test_classifier_adapter.py::test_four_frozen_milestone6_outcomes_feed_or_block_adapter",
29
+ "tests/datasets/test_classifier_adapter.py::test_missing_unknown_duplicate_and_context_only_citations_fail",
30
+ "tests/datasets/test_classifier_adapter.py::test_multiple_branches_and_joint_multi_section_citations",
31
+ "tests/datasets/test_classifier_adapter.py::test_packet_hash_text_component_and_review_boundary_fail_before_model",
32
+ "tests/datasets/test_classifier_adapter.py::test_prompt_injection_and_expert_sentinel_remain_source_data",
33
+ "tests/datasets/test_classifier_adapter.py::test_raw_text_blocks_manifest_and_unknown_input_are_rejected",
34
+ "tests/datasets/test_classifier_adapter.py::test_response_contracts_reject_unknown_fields_and_missing_stop_citation",
35
+ "tests/datasets/test_classifier_adapter.py::test_sealed_expert_field_rejected_from_packet_and_context",
36
+ "tests/datasets/test_classifier_adapter.py::test_semantic_not_classified_is_completed_and_model_failure_is_not",
37
+ "tests/datasets/test_classifier_adapter.py::test_separate_confidence_and_weak_product_cannot_be_overridden",
38
+ "tests/datasets/test_classifier_adapter.py::test_stop_at_topic_term_vl1_vl2_and_select_vl3",
39
+ "tests/datasets/test_classifier_adapter.py::test_unknown_skipped_uncited_fabricated_and_extra_authority_fail[<lambda>0]",
40
+ "tests/datasets/test_classifier_adapter.py::test_unknown_skipped_uncited_fabricated_and_extra_authority_fail[<lambda>1]",
41
+ "tests/datasets/test_classifier_adapter.py::test_unknown_skipped_uncited_fabricated_and_extra_authority_fail[<lambda>2]",
42
+ "tests/datasets/test_classifier_adapter.py::test_unknown_skipped_uncited_fabricated_and_extra_authority_fail[<lambda>3]",
43
+ "tests/datasets/test_classifier_adapter.py::test_unknown_skipped_uncited_fabricated_and_extra_authority_fail[<lambda>4]",
44
+ "tests/datasets/test_cmr.py::test_all_frozen_cmr_fixtures_resolve_and_remain_unchanged",
45
+ "tests/datasets/test_cmr.py::test_blind_view_is_allow_listed_and_expert_payload_is_sealed",
46
+ "tests/datasets/test_cmr.py::test_client_authorization_and_cookie_state_are_rejected",
47
+ "tests/datasets/test_cmr.py::test_declared_and_streamed_size_limits_are_enforced",
48
+ "tests/datasets/test_cmr.py::test_encoded_response_is_rejected_to_preserve_exact_entity_bytes",
49
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload0-CMR_CARDINALITY]",
50
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload1-CMR_CARDINALITY]",
51
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload2-CMR_CARDINALITY_MISMATCH]",
52
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload3-CMR_HITS_INVALID]",
53
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload4-CMR_ITEMS_INVALID]",
54
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload5-CMR_ITEM_INVALID]",
55
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload6-CMR_META_INVALID]",
56
+ "tests/datasets/test_cmr.py::test_envelope_cardinality_and_shapes_are_validated[payload7-CMR_UMM_INVALID]",
57
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[http://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001-CMR_URL_SCHEME]",
58
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.json?native_id=TARGET_001-CMR_URL_PATH]",
59
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.umm_json-CMR_URL_NATIVE_ID_COUNT]",
60
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=-CMR_URL_NATIVE_ID_EMPTY]",
61
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001#fragment-CMR_URL_FRAGMENT]",
62
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001&access_token=secret-CMR_URL_AUTH_QUERY]",
63
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001&client-secret=secret-CMR_URL_AUTH_QUERY]",
64
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001&native_id=OTHER_001-CMR_URL_NATIVE_ID_COUNT]",
65
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://cmr.earthdata.nasa.gov:444/search/collections.umm_json?native_id=TARGET_001-CMR_URL_PORT]",
66
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://example.test/search/collections.umm_json?native_id=TARGET_001-CMR_URL_HOST]",
67
+ "tests/datasets/test_cmr.py::test_invalid_cmr_urls_are_typed[https://user:password@cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001-CMR_URL_USERINFO]",
68
+ "tests/datasets/test_cmr.py::test_invalid_redirect_target_is_rejected[http://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001]",
69
+ "tests/datasets/test_cmr.py::test_invalid_redirect_target_is_rejected[https://cmr.earthdata.nasa.gov/search/collections.json?native_id=TARGET_001]",
70
+ "tests/datasets/test_cmr.py::test_invalid_redirect_target_is_rejected[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=OTHER_001]",
71
+ "tests/datasets/test_cmr.py::test_invalid_redirect_target_is_rejected[https://cmr.earthdata.nasa.gov/search/collections.umm_json?native_id=TARGET_001&token=x]",
72
+ "tests/datasets/test_cmr.py::test_invalid_redirect_target_is_rejected[https://cmr.earthdata.nasa.gov:444/search/collections.umm_json?native_id=TARGET_001]",
73
+ "tests/datasets/test_cmr.py::test_invalid_redirect_target_is_rejected[https://example.test/search/collections.umm_json?native_id=TARGET_001]",
74
+ "tests/datasets/test_cmr.py::test_leading_zeros_and_capitalization_are_preserved",
75
+ "tests/datasets/test_cmr.py::test_login_response_and_unsupported_or_missing_media_type_are_rejected",
76
+ "tests/datasets/test_cmr.py::test_manual_redirect_is_validated_and_preserved",
77
+ "tests/datasets/test_cmr.py::test_non_public_status_is_rejected[401]",
78
+ "tests/datasets/test_cmr.py::test_non_public_status_is_rejected[403]",
79
+ "tests/datasets/test_cmr.py::test_overall_operation_limit_is_enforced",
80
+ "tests/datasets/test_cmr.py::test_percent_encoded_native_id_is_decoded_once_and_preserved",
81
+ "tests/datasets/test_cmr.py::test_preclassification_failure_has_zero_inference_semantics",
82
+ "tests/datasets/test_cmr.py::test_redirect_loop_and_limit_are_rejected",
83
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD0]",
84
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD1]",
85
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD2]",
86
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD3]",
87
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD4]",
88
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD5]",
89
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD6]",
90
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REQUIRED_FIELD7]",
91
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REVISION_ID_INVALID0]",
92
+ "tests/datasets/test_cmr.py::test_required_identity_fields_are_validated[<lambda>-CMR_REVISION_ID_INVALID1]",
93
+ "tests/datasets/test_cmr.py::test_sealed_keyword_hash_is_stable_for_equivalent_payloads",
94
+ "tests/datasets/test_cmr.py::test_source_decoding_and_json_errors_are_typed[[]-CMR_JSON_ROOT]",
95
+ "tests/datasets/test_cmr.py::test_source_decoding_and_json_errors_are_typed[{\"not\":\"utf8\"}\\xff-CMR_TEXT_DECODE]",
96
+ "tests/datasets/test_cmr.py::test_source_decoding_and_json_errors_are_typed[{invalid-CMR_JSON_INVALID]",
97
+ "tests/datasets/test_cmr.py::test_submitted_returned_and_derived_native_ids_match_exactly[payload0]",
98
+ "tests/datasets/test_cmr.py::test_submitted_returned_and_derived_native_ids_match_exactly[payload1]",
99
+ "tests/datasets/test_cmr.py::test_submitted_returned_and_derived_native_ids_match_exactly[payload2]",
100
+ "tests/datasets/test_cmr.py::test_successful_retrieval_preserves_exact_bytes_headers_timestamp_and_hash",
101
+ "tests/datasets/test_cmr.py::test_transport_failures_are_typed[exception0-CMR_TIMEOUT]",
102
+ "tests/datasets/test_cmr.py::test_transport_failures_are_typed[exception1-CMR_TRANSPORT_ERROR]",
103
+ "tests/datasets/test_cmr.py::test_transport_failures_are_typed[exception2-CMR_TRANSPORT_ERROR]",
104
+ "tests/datasets/test_cmr.py::test_unknown_source_fields_are_preserved_and_entry_id_is_not_fabricated",
105
+ "tests/datasets/test_cmr.py::test_valid_url_preserves_exact_native_id_and_harmless_parameters",
106
+ "tests/datasets/test_comparison_milestone9.py::test_ambiguous_normalized_match_is_unresolved_and_review_required",
107
+ "tests/datasets/test_comparison_milestone9.py::test_authoritative_uuid_and_fields_resolve_consistently",
108
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_and_reviews_are_stable_idempotent_and_additive",
109
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_cache_is_separate_and_expert_sensitive",
110
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_category_precedence_and_review[experts0-vl1-atmosphere-carbon-already_assigned-False]",
111
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_category_precedence_and_review[experts1-vl2-carbon-dioxide-proposed_refinement-True]",
112
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_category_precedence_and_review[experts2-vl1-atmosphere-carbon-redundant_result-False]",
113
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_category_precedence_and_review[experts3-vl1-atmosphere-carbon-proposed_addition-True]",
114
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_category_precedence_and_review[experts4-vl1-atmosphere-carbon-review_required-True]",
115
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_logs_contain_counts_not_expert_values",
116
+ "tests/datasets/test_comparison_milestone9.py::test_comparison_persistence_failure_publishes_no_complete_artifact",
117
+ "tests/datasets/test_comparison_milestone9.py::test_discontinuous_uuid_chain_is_rejected",
118
+ "tests/datasets/test_comparison_milestone9.py::test_duplicate_blind_records_are_preserved_not_mutated",
119
+ "tests/datasets/test_comparison_milestone9.py::test_duplicate_experts_preserve_every_source_position",
120
+ "tests/datasets/test_comparison_milestone9.py::test_exact_assignment_at_every_supported_level[term-atmospheric-chemistry-path1]",
121
+ "tests/datasets/test_comparison_milestone9.py::test_exact_assignment_at_every_supported_level[topic-atmosphere-path0]",
122
+ "tests/datasets/test_comparison_milestone9.py::test_exact_assignment_at_every_supported_level[vl1-atmosphere-carbon-path2]",
123
+ "tests/datasets/test_comparison_milestone9.py::test_exact_assignment_at_every_supported_level[vl2-carbon-dioxide-path3]",
124
+ "tests/datasets/test_comparison_milestone9.py::test_exact_assignment_at_every_supported_level[vl3-carbon-dioxide-profiles-path4]",
125
+ "tests/datasets/test_comparison_milestone9.py::test_exact_match_precedes_broader_secondary_relationship",
126
+ "tests/datasets/test_comparison_milestone9.py::test_frozen_experts_are_used_only_after_independent_blind_result[0]",
127
+ "tests/datasets/test_comparison_milestone9.py::test_frozen_experts_are_used_only_after_independent_blind_result[1]",
128
+ "tests/datasets/test_comparison_milestone9.py::test_frozen_experts_are_used_only_after_independent_blind_result[2]",
129
+ "tests/datasets/test_comparison_milestone9.py::test_frozen_experts_are_used_only_after_independent_blind_result[3]",
130
+ "tests/datasets/test_comparison_milestone9.py::test_invalid_and_unknown_uuid_remain_unresolved[<lambda>-invalid_uuid]",
131
+ "tests/datasets/test_comparison_milestone9.py::test_invalid_and_unknown_uuid_remain_unresolved[<lambda>-unknown_uuid]",
132
+ "tests/datasets/test_comparison_milestone9.py::test_invalid_blind_hash_never_invokes_unsealer",
133
+ "tests/datasets/test_comparison_milestone9.py::test_multiple_blind_and_expert_branches_keep_independent_items",
134
+ "tests/datasets/test_comparison_milestone9.py::test_narrower_expert_precedence_preserves_broader_secondary_relationship",
135
+ "tests/datasets/test_comparison_milestone9.py::test_not_classified_unresolved_expert_creates_additive_review_only",
136
+ "tests/datasets/test_comparison_milestone9.py::test_ordered_expert_resolution[source0-resolved_exact_ordered_fields-True]",
137
+ "tests/datasets/test_comparison_milestone9.py::test_ordered_expert_resolution[source1-resolved_unique_normalized_ordered_fields-True]",
138
+ "tests/datasets/test_comparison_milestone9.py::test_ordered_expert_resolution[source2-missing_required_intermediate_level-False]",
139
+ "tests/datasets/test_comparison_milestone9.py::test_ordered_expert_resolution[source3-unmatched_path-False]",
140
+ "tests/datasets/test_comparison_milestone9.py::test_ordered_expert_resolution[source4-malformed_assignment-False]",
141
+ "tests/datasets/test_comparison_milestone9.py::test_semantic_not_classified_preserves_expert_only_without_removal",
142
+ "tests/datasets/test_comparison_milestone9.py::test_unverified_input_never_invokes_unsealer",
143
+ "tests/datasets/test_comparison_milestone9.py::test_uuid_wrong_level_and_uuid_field_conflict_are_explicit",
144
+ "tests/datasets/test_dataset_ui_milestone10.py::test_arbitrary_or_cross_session_selection_never_reaches_service[/tmp/readme.pdf]",
145
+ "tests/datasets/test_dataset_ui_milestone10.py::test_arbitrary_or_cross_session_selection_never_reaches_service[https://evil.example/a.pdf]",
146
+ "tests/datasets/test_dataset_ui_milestone10.py::test_arbitrary_or_cross_session_selection_never_reaches_service[other-session-candidate]",
147
+ "tests/datasets/test_dataset_ui_milestone10.py::test_candidates_preserve_source_order_and_exact_selection",
148
+ "tests/datasets/test_dataset_ui_milestone10.py::test_comparison_failure_preserves_verified_blind_without_partial_experts",
149
+ "tests/datasets/test_dataset_ui_milestone10.py::test_fresh_session_state_and_initial_enablement",
150
+ "tests/datasets/test_dataset_ui_milestone10.py::test_fresh_state_is_per_session_and_initially_safe",
151
+ "tests/datasets/test_dataset_ui_milestone10.py::test_multiple_candidates_preserve_order_and_exact_selected_request",
152
+ "tests/datasets/test_dataset_ui_milestone10.py::test_presenters_expose_only_sanitized_values",
153
+ "tests/datasets/test_dataset_ui_milestone10.py::test_protected_hashes_and_root_launcher_boundary",
154
+ "tests/datasets/test_dataset_ui_milestone10.py::test_protected_publication_hashes_unchanged",
155
+ "tests/datasets/test_dataset_ui_milestone10.py::test_real_gradio_builds_one_blocks_application_without_work",
156
+ "tests/datasets/test_dataset_ui_milestone10.py::test_real_gradio_constructs_exact_two_tabs_without_service_calls",
157
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_enablement[0-skipped-False]",
158
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_enablement[1-completed-True]",
159
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_enablement[2-completed-False]",
160
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_states[0-None-False]",
161
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_states[1-choice-0-True]",
162
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_states[1-dynamic-True]",
163
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_candidate_states[2-None-False]",
164
+ "tests/datasets/test_dataset_ui_milestone10.py::test_retrieval_failure_is_sanitized_and_zero_inference",
165
+ "tests/datasets/test_dataset_ui_milestone10.py::test_semantic_not_classified_is_distinct_and_comparison_may_be_authorized",
166
+ "tests/datasets/test_dataset_ui_milestone10.py::test_state_serialization_contains_no_raw_source_or_sealed_expert",
167
+ "tests/datasets/test_dataset_ui_milestone10.py::test_tampered_stale_and_local_selection_are_rejected_without_service_call",
168
+ "tests/datasets/test_dataset_ui_milestone10.py::test_two_sessions_cannot_cross_candidates_or_results",
169
+ "tests/datasets/test_dataset_ui_milestone10.py::test_two_sessions_cannot_cross_selection_or_results",
170
+ "tests/datasets/test_dataset_ui_milestone10.py::test_typed_failures_are_sanitized_and_preinference",
171
+ "tests/datasets/test_dataset_ui_milestone10.py::test_untyped_failures_hide_raw_secret_path_and_markup",
172
+ "tests/datasets/test_dataset_ui_milestone10.py::test_unverified_failure_never_exposes_blind_or_expert_values",
173
+ "tests/datasets/test_dataset_ui_milestone10.py::test_unverified_or_comparison_failed_result_never_exposes_experts",
174
+ "tests/datasets/test_dataset_ui_milestone10.py::test_url_edit_stales_selection_and_hides_outputs",
175
+ "tests/datasets/test_dataset_ui_milestone10.py::test_verified_blind_and_authorized_comparison_render_separately",
176
+ "tests/datasets/test_dataset_ui_milestone10.py::test_verified_result_controls_expert_visibility_and_preserves_confidences",
177
+ "tests/datasets/test_documents.py::test_all_frozen_cases_require_discovery_selection_and_exact_mocked_bytes",
178
+ "tests/datasets/test_documents.py::test_authentication_status_is_not_public[401]",
179
+ "tests/datasets/test_documents.py::test_authentication_status_is_not_public[403]",
180
+ "tests/datasets/test_documents.py::test_empty_invalid_dns_results_are_typed",
181
+ "tests/datasets/test_documents.py::test_failure_preserves_partial_artifact_and_performs_no_cleanup",
182
+ "tests/datasets/test_documents.py::test_login_html_is_not_public",
183
+ "tests/datasets/test_documents.py::test_mixed_public_nonpublic_and_dns_rebinding_are_rejected",
184
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[0.0.0.0]",
185
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[10.0.0.1]",
186
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[127.0.0.1]",
187
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[169.254.1.1]",
188
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[169.254.169.254]",
189
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[192.0.2.1]",
190
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[2001:db8::1]",
191
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[224.0.0.1]",
192
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[::1]",
193
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[::]",
194
+ "tests/datasets/test_documents.py::test_non_public_destinations_are_rejected_without_http[fe80::1]",
195
+ "tests/datasets/test_documents.py::test_operation_metadata_encoding_client_state_and_run_collision_controls",
196
+ "tests/datasets/test_documents.py::test_pdf_byte_validation_is_extension_independent_and_stable[None]",
197
+ "tests/datasets/test_documents.py::test_pdf_byte_validation_is_extension_independent_and_stable[application/octet-stream]",
198
+ "tests/datasets/test_documents.py::test_pdf_byte_validation_is_extension_independent_and_stable[application/pdf]",
199
+ "tests/datasets/test_documents.py::test_public_ipv4_ipv6_and_mixed_public_addresses_are_allowed[addresses0]",
200
+ "tests/datasets/test_documents.py::test_public_ipv4_ipv6_and_mixed_public_addresses_are_allowed[addresses1]",
201
+ "tests/datasets/test_documents.py::test_public_ipv4_ipv6_and_mixed_public_addresses_are_allowed[addresses2]",
202
+ "tests/datasets/test_documents.py::test_raw_url_local_path_and_tampered_selection_cannot_enter_retriever",
203
+ "tests/datasets/test_documents.py::test_redirect_loop_and_limit",
204
+ "tests/datasets/test_documents.py::test_selected_url_policy_rejects_unsafe_destinations[file:///tmp/readme.pdf]",
205
+ "tests/datasets/test_documents.py::test_selected_url_policy_rejects_unsafe_destinations[https://-bad.example/readme.pdf]",
206
+ "tests/datasets/test_documents.py::test_selected_url_policy_rejects_unsafe_destinations[https://bad_host.example/readme.pdf]",
207
+ "tests/datasets/test_documents.py::test_selected_url_policy_rejects_unsafe_destinations[https://example.test/readme.pdf#fragment]",
208
+ "tests/datasets/test_documents.py::test_selected_url_policy_rejects_unsafe_destinations[https://example.test:444/readme.pdf]",
209
+ "tests/datasets/test_documents.py::test_selected_url_policy_rejects_unsafe_destinations[https://user:pass@example.test/readme.pdf]",
210
+ "tests/datasets/test_documents.py::test_size_content_length_truncation_and_operation_limits",
211
+ "tests/datasets/test_documents.py::test_transport_failures_are_typed_and_preserve_no_false_success[exc0]",
212
+ "tests/datasets/test_documents.py::test_transport_failures_are_typed_and_preserve_no_false_success[exc1]",
213
+ "tests/datasets/test_documents.py::test_transport_failures_are_typed_and_preserve_no_false_success[exc2]",
214
+ "tests/datasets/test_documents.py::test_unsafe_and_authentication_redirects_are_rejected[ftp://example.test/a.pdf]",
215
+ "tests/datasets/test_documents.py::test_unsafe_and_authentication_redirects_are_rejected[https://example.test/a.pdf#x]",
216
+ "tests/datasets/test_documents.py::test_unsafe_and_authentication_redirects_are_rejected[https://example.test/a.pdf?token=x]",
217
+ "tests/datasets/test_documents.py::test_unsafe_and_authentication_redirects_are_rejected[https://example.test/login]",
218
+ "tests/datasets/test_documents.py::test_unsafe_and_authentication_redirects_are_rejected[https://example.test:444/a.pdf]",
219
+ "tests/datasets/test_documents.py::test_unsafe_and_authentication_redirects_are_rejected[https://u:p@example.test/a.pdf]",
220
+ "tests/datasets/test_documents.py::test_unsupported_and_misleading_content_is_rejected[%PDF-1.7 malformed-application/pdf]",
221
+ "tests/datasets/test_documents.py::test_unsupported_and_misleading_content_is_rejected[-application/pdf]",
222
+ "tests/datasets/test_documents.py::test_unsupported_and_misleading_content_is_rejected[<html>not pdf</html>-text/html]",
223
+ "tests/datasets/test_documents.py::test_unsupported_and_misleading_content_is_rejected[PNG-application/pdf]",
224
+ "tests/datasets/test_documents.py::test_unsupported_and_misleading_content_is_rejected[plain-text/plain]",
225
+ "tests/datasets/test_documents.py::test_unsupported_and_misleading_content_is_rejected[{}-application/json]",
226
+ "tests/datasets/test_documents.py::test_valid_redirect_revalidates_destination_and_preserves_history",
227
+ "tests/datasets/test_evidence.py::test_all_frozen_cases_group_and_preserve_product_scope_without_keywords",
228
+ "tests/datasets/test_evidence.py::test_authoritative_text_or_hash_mismatch_rejected",
229
+ "tests/datasets/test_evidence.py::test_conflicting_repeated_decisions_are_rejected",
230
+ "tests/datasets/test_evidence.py::test_context_only_packet_and_vague_scope_stop_typed",
231
+ "tests/datasets/test_evidence.py::test_deterministic_single_and_multiple_bounded_groups",
232
+ "tests/datasets/test_evidence.py::test_expert_sentinel_rejected_by_blind_type_and_absent_everywhere",
233
+ "tests/datasets/test_evidence.py::test_explicitly_linked_context_is_labeled_and_cannot_stand_alone",
234
+ "tests/datasets/test_evidence.py::test_generated_summary_excerpt_or_altered_text_never_accepted",
235
+ "tests/datasets/test_evidence.py::test_other_product_and_ambiguous_blocks_cannot_enter_packet",
236
+ "tests/datasets/test_evidence.py::test_packet_exact_text_source_order_hashes_and_classifier_boundary",
237
+ "tests/datasets/test_evidence.py::test_packet_hash_changes_with_authoritative_source_text",
238
+ "tests/datasets/test_evidence.py::test_packet_limit_second_pass_and_single_bounded_reduction",
239
+ "tests/datasets/test_evidence.py::test_packet_still_oversized_after_one_pass_is_explicit_failure",
240
+ "tests/datasets/test_evidence.py::test_reduction_cannot_override_product_scope",
241
+ "tests/datasets/test_evidence.py::test_retry_success_and_prompt_injection_isolation",
242
+ "tests/datasets/test_evidence.py::test_schema_is_strict_and_packet_schema_validates_result",
243
+ "tests/datasets/test_evidence.py::test_stable_hashes_policy_changes_and_volatile_data_excluded",
244
+ "tests/datasets/test_evidence.py::test_stale_manifest_identity_stops_before_model_call",
245
+ "tests/datasets/test_evidence.py::test_strict_response_partition_ids_scope_and_links[<lambda>-EVIDENCE_SELECTION_RETRIES_EXHAUSTED0]",
246
+ "tests/datasets/test_evidence.py::test_strict_response_partition_ids_scope_and_links[<lambda>-EVIDENCE_SELECTION_RETRIES_EXHAUSTED1]",
247
+ "tests/datasets/test_evidence.py::test_strict_response_partition_ids_scope_and_links[<lambda>-EVIDENCE_SELECTION_RETRIES_EXHAUSTED2]",
248
+ "tests/datasets/test_evidence.py::test_strict_response_partition_ids_scope_and_links[<lambda>-EVIDENCE_SELECTION_RETRIES_EXHAUSTED3]",
249
+ "tests/datasets/test_evidence.py::test_strict_response_partition_ids_scope_and_links[<lambda>-EVIDENCE_SELECTION_RETRIES_EXHAUSTED4]",
250
+ "tests/datasets/test_evidence.py::test_unknown_fields_and_invalid_role_fail_schema_and_bounded_retry",
251
+ "tests/datasets/test_expert_source_boundary.py::test_all_frozen_sources_persist_exact_ordered_sealed_artifacts[0]",
252
+ "tests/datasets/test_expert_source_boundary.py::test_all_frozen_sources_persist_exact_ordered_sealed_artifacts[1]",
253
+ "tests/datasets/test_expert_source_boundary.py::test_all_frozen_sources_persist_exact_ordered_sealed_artifacts[2]",
254
+ "tests/datasets/test_expert_source_boundary.py::test_all_frozen_sources_persist_exact_ordered_sealed_artifacts[3]",
255
+ "tests/datasets/test_expert_source_boundary.py::test_cross_run_and_tampered_sealed_artifacts_are_rejected",
256
+ "tests/datasets/test_expert_source_boundary.py::test_expert_change_does_not_change_blind_view_result_or_cache_identity",
257
+ "tests/datasets/test_expert_source_boundary.py::test_fixture_hashes_remain_exact",
258
+ "tests/datasets/test_expert_source_boundary.py::test_generated_corrective_schemas_have_no_drift",
259
+ "tests/datasets/test_expert_source_boundary.py::test_identical_boundary_is_stable_and_immutable",
260
+ "tests/datasets/test_expert_source_boundary.py::test_legacy_verified_reference_without_binding_is_rejected",
261
+ "tests/datasets/test_expert_source_boundary.py::test_sealed_persistence_interruption_is_prepublication_and_non_deleting",
262
+ "tests/datasets/test_expert_source_boundary.py::test_verified_reference_contains_opaque_complete_provenance",
263
+ "tests/datasets/test_extraction.py::test_all_frozen_pdfs_extract_deterministically_and_validate_schema",
264
+ "tests/datasets/test_extraction.py::test_blank_page_warning_and_fully_blank_failure",
265
+ "tests/datasets/test_extraction.py::test_encrypted_and_malformed_pdf_fail_before_inference",
266
+ "tests/datasets/test_extraction.py::test_hash_page_character_block_and_timeout_limits",
267
+ "tests/datasets/test_extraction.py::test_image_only_page_and_document",
268
+ "tests/datasets/test_extraction.py::test_multiple_headings_on_page_and_heading_at_page_end",
269
+ "tests/datasets/test_extraction.py::test_multiple_pages_repeated_headings_boundary_and_cross_page_section",
270
+ "tests/datasets/test_extraction.py::test_no_heading_uses_derived_label_and_long_text_splits_deterministically",
271
+ "tests/datasets/test_extraction.py::test_one_page_exact_provenance_stability_and_reconstruction",
272
+ "tests/datasets/test_extraction.py::test_page_failure_partial_failure_and_unavailable_coordinates",
273
+ "tests/datasets/test_extraction.py::test_policy_version_change_is_explicit_but_content_ids_remain_source_based",
274
+ "tests/datasets/test_extraction.py::test_table_multicolumn_and_low_coverage_warnings",
275
+ "tests/datasets/test_fixture_manifest.py::test_canonical_source_indexes_match_original_entries_and_production_discovery",
276
+ "tests/datasets/test_fixture_manifest.py::test_fixture_case_serializes_only_canonical_source_index",
277
+ "tests/datasets/test_fixture_manifest.py::test_frozen_manifest_loads_all_cases_without_hard_coded_case_paths",
278
+ "tests/datasets/test_fixture_manifest.py::test_manifest_contains_no_expected_keyword_answers",
279
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_absolute_and_escaping_paths[../outside.json]",
280
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_absolute_and_escaping_paths[/etc/passwd]",
281
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_duplicate_case_and_native_ids",
282
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_invalid_selected_readme_source_index[-1]",
283
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_invalid_selected_readme_source_index[1.5]",
284
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_invalid_selected_readme_source_index[5]",
285
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_invalid_selected_readme_source_index[None]",
286
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_invalid_selected_readme_source_index[True]",
287
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_missing_or_non_regular_references",
288
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_noncanonical_source_index_names[selected_readme_source_position]",
289
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_noncanonical_source_index_names[source_index]",
290
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_noncanonical_source_index_names[source_position]",
291
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_semantically_wrong_source_index[0]",
292
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_semantically_wrong_source_index[10000]",
293
+ "tests/datasets/test_fixture_manifest.py::test_manifest_rejects_semantically_wrong_source_index[4]",
294
+ "tests/datasets/test_fixture_manifest.py::test_manifest_requires_selected_readme_source_index",
295
+ "tests/datasets/test_fixture_manifest.py::test_manifest_validates_hash_format_and_provenance_fields",
296
+ "tests/datasets/test_models_and_schemas.py::test_comparison_requires_persisted_blind_result",
297
+ "tests/datasets/test_models_and_schemas.py::test_core_dataset_schemas_are_valid_and_accept_typed_outputs",
298
+ "tests/datasets/test_models_and_schemas.py::test_dataset_comparison_category_and_schema_contract",
299
+ "tests/datasets/test_models_and_schemas.py::test_dataset_error_taxonomy_is_separate_and_hierarchical",
300
+ "tests/datasets/test_models_and_schemas.py::test_dataset_identity_preserves_concept_native_and_legacy_ids",
301
+ "tests/datasets/test_models_and_schemas.py::test_dataset_settings_are_namespaced_and_environment_configurable",
302
+ "tests/datasets/test_models_and_schemas.py::test_evidence_packet_rejects_duplicate_block_ids",
303
+ "tests/datasets/test_models_and_schemas.py::test_extraction_and_evidence_contracts_preserve_exact_text",
304
+ "tests/datasets/test_models_and_schemas.py::test_four_dataset_schemas_are_valid_and_accept_typed_outputs",
305
+ "tests/datasets/test_models_and_schemas.py::test_invalid_dataset_schema_example_is_rejected",
306
+ "tests/datasets/test_models_and_schemas.py::test_publication_contract_is_unchanged",
307
+ "tests/datasets/test_models_and_schemas.py::test_unattempted_classification_forbids_inference_outputs[blind_result-value2]",
308
+ "tests/datasets/test_models_and_schemas.py::test_unattempted_classification_forbids_inference_outputs[classification_outcome-classified]",
309
+ "tests/datasets/test_models_and_schemas.py::test_unattempted_classification_forbids_inference_outputs[classifications-value1]",
310
+ "tests/datasets/test_models_and_schemas.py::test_unattempted_classification_forbids_inference_outputs[comparison_reference-comparison.json]",
311
+ "tests/datasets/test_models_and_schemas.py::test_unattempted_classification_forbids_inference_outputs[processing_metadata-value4]",
312
+ "tests/datasets/test_models_and_schemas.py::test_valid_unattempted_dataset_result",
313
+ "tests/datasets/test_product_resolution.py::test_batched_responses_form_exact_source_order_partition",
314
+ "tests/datasets/test_product_resolution.py::test_boundary_aware_identity_capitalization_version_and_signal_stability",
315
+ "tests/datasets/test_product_resolution.py::test_bounded_retry_succeeds_after_invalid_coverage_response",
316
+ "tests/datasets/test_product_resolution.py::test_deterministic_complete_identity_resolution_makes_zero_model_calls",
317
+ "tests/datasets/test_product_resolution.py::test_enumeration_family_template_heading_and_optional_structure_signals",
318
+ "tests/datasets/test_product_resolution.py::test_every_coverage_mode_is_typed_and_ambiguity_requires_review[explicit_multi_product]",
319
+ "tests/datasets/test_product_resolution.py::test_every_coverage_mode_is_typed_and_ambiguity_requires_review[product_family]",
320
+ "tests/datasets/test_product_resolution.py::test_every_coverage_mode_is_typed_and_ambiguity_requires_review[single_product]",
321
+ "tests/datasets/test_product_resolution.py::test_every_coverage_mode_is_typed_and_ambiguity_requires_review[undetermined]",
322
+ "tests/datasets/test_product_resolution.py::test_every_coverage_mode_is_typed_and_ambiguity_requires_review[vague_product_scope]",
323
+ "tests/datasets/test_product_resolution.py::test_explicit_readme_alias_preserves_literal_span_and_provenance",
324
+ "tests/datasets/test_product_resolution.py::test_four_frozen_coverage_modes_scope_counts_and_expert_isolation",
325
+ "tests/datasets/test_product_resolution.py::test_invalid_model_block_partition_alias_and_products_retry_then_fail[alias]",
326
+ "tests/datasets/test_product_resolution.py::test_invalid_model_block_partition_alias_and_products_retry_then_fail[cross_document]",
327
+ "tests/datasets/test_product_resolution.py::test_invalid_model_block_partition_alias_and_products_retry_then_fail[duplicate]",
328
+ "tests/datasets/test_product_resolution.py::test_invalid_model_block_partition_alias_and_products_retry_then_fail[missing]",
329
+ "tests/datasets/test_product_resolution.py::test_invalid_model_block_partition_alias_and_products_retry_then_fail[product]",
330
+ "tests/datasets/test_product_resolution.py::test_invalid_model_block_partition_alias_and_products_retry_then_fail[unknown]",
331
+ "tests/datasets/test_product_resolution.py::test_malformed_schema_enum_confidence_timeout_and_retry_exhaustion",
332
+ "tests/datasets/test_product_resolution.py::test_model_requests_use_dataset_stages_and_strict_response_schemas",
333
+ "tests/datasets/test_product_resolution.py::test_prompt_injection_is_delimited_and_cannot_change_schema_or_target",
334
+ "tests/datasets/test_product_resolution.py::test_sealed_expert_sentinel_is_unreachable_from_blind_prompts_results_and_errors",
335
+ "tests/datasets/test_product_resolution.py::test_source_order_partition_inclusion_exclusion_ambiguity_and_context",
336
+ "tests/datasets/test_readme_discovery.py::test_blind_view_contract_rejects_non_array_related_urls",
337
+ "tests/datasets/test_readme_discovery.py::test_changed_or_stale_selection_binding_is_rejected",
338
+ "tests/datasets/test_readme_discovery.py::test_duplicate_candidates_remain_distinct_by_source_position",
339
+ "tests/datasets/test_readme_discovery.py::test_exact_match_without_usable_url_is_explicit_error[4]",
340
+ "tests/datasets/test_readme_discovery.py::test_exact_match_without_usable_url_is_explicit_error[None]",
341
+ "tests/datasets/test_readme_discovery.py::test_exact_match_without_usable_url_is_explicit_error[url2]",
342
+ "tests/datasets/test_readme_discovery.py::test_exact_match_without_usable_url_is_explicit_error[url3]",
343
+ "tests/datasets/test_readme_discovery.py::test_exact_subtype_only_and_complete_source_order_preservation",
344
+ "tests/datasets/test_readme_discovery.py::test_missing_null_non_string_and_malformed_subtypes_do_not_match[3]",
345
+ "tests/datasets/test_readme_discovery.py::test_missing_null_non_string_and_malformed_subtypes_do_not_match[None]",
346
+ "tests/datasets/test_readme_discovery.py::test_missing_null_non_string_and_malformed_subtypes_do_not_match[READ-ME ]",
347
+ "tests/datasets/test_readme_discovery.py::test_missing_null_non_string_and_malformed_subtypes_do_not_match[subtype2]",
348
+ "tests/datasets/test_readme_discovery.py::test_missing_null_non_string_and_malformed_subtypes_do_not_match[subtype3]",
349
+ "tests/datasets/test_readme_discovery.py::test_one_candidate_requires_explicit_confirmation",
350
+ "tests/datasets/test_readme_discovery.py::test_selection_rejects_missing_multiple_position_and_url_substitution[selections0]",
351
+ "tests/datasets/test_readme_discovery.py::test_selection_rejects_missing_multiple_position_and_url_substitution[selections1]",
352
+ "tests/datasets/test_readme_discovery.py::test_selection_rejects_missing_multiple_position_and_url_substitution[selections2]",
353
+ "tests/datasets/test_readme_discovery.py::test_selection_rejects_missing_multiple_position_and_url_substitution[selections3]",
354
+ "tests/datasets/test_readme_discovery.py::test_selection_rejects_missing_multiple_position_and_url_substitution[selections4]",
355
+ "tests/datasets/test_readme_discovery.py::test_zero_candidate_outcome_has_exact_nonsemantic_boundary",
356
+ "tests/datasets/test_runtime_milestone8.py::test_artifact_store_is_atomic_immutable_and_run_isolated",
357
+ "tests/datasets/test_runtime_milestone8.py::test_atomic_failure_never_publishes_success",
358
+ "tests/datasets/test_runtime_milestone8.py::test_blind_cache_round_trip_and_tamper_detection",
359
+ "tests/datasets/test_runtime_milestone8.py::test_cache_identity_requires_complete_stage_inputs",
360
+ "tests/datasets/test_runtime_milestone8.py::test_failed_attempt_checkpoint_prevents_transport",
361
+ "tests/datasets/test_runtime_milestone8.py::test_illegal_and_terminal_transitions_are_rejected",
362
+ "tests/datasets/test_runtime_milestone8.py::test_inference_attempt_is_durable_before_transport",
363
+ "tests/datasets/test_runtime_milestone8.py::test_log_contract_rejects_absolute_reference",
364
+ "tests/datasets/test_runtime_milestone8.py::test_ordered_pipeline_no_readme_is_preinference_skip",
365
+ "tests/datasets/test_runtime_milestone8.py::test_recovery_uses_validated_checkpoint_chain",
366
+ "tests/datasets/test_runtime_milestone8.py::test_runtime_models_reject_unknown_fields",
367
+ "tests/datasets/test_runtime_milestone8.py::test_sealed_artifact_failure_stops_pipeline_before_inference",
368
+ "tests/datasets/test_runtime_milestone8.py::test_storage_rejects_fixture_root",
369
+ "tests/datasets/test_runtime_milestone8.py::test_successful_not_classified_pipeline_is_persisted_and_verified",
370
+ "tests/datasets/test_runtime_milestone8.py::test_verified_blind_result_gate_reads_persisted_bytes",
371
+ "tests/datasets/test_smoke_milestone11.py::test_all_frozen_cases_use_real_two_step_service_without_live_boundaries",
372
+ "tests/datasets/test_smoke_milestone11.py::test_fixture_readme_is_human_policy_only_and_manifest_is_only_configuration",
373
+ "tests/datasets/test_smoke_milestone11.py::test_frozen_transport_denies_pdf_before_discovery_and_selection",
374
+ "tests/datasets/test_smoke_milestone11.py::test_manifest_has_no_expected_keyword_or_fake_answer_configuration",
375
+ "tests/datasets/test_smoke_milestone11.py::test_optional_live_public_cmr_and_readme_retrieval",
376
+ "tests/datasets/test_smoke_milestone11.py::test_preflight_rejects_provenance_mismatches_without_transport_or_model_calls",
377
+ "tests/datasets/test_smoke_milestone11.py::test_repeated_runs_have_stable_logical_report_hash_and_safe_persisted_report",
378
+ "tests/datasets/test_smoke_milestone11.py::test_report_path_must_remain_under_output_root",
379
+ "tests/test_articles.py::test_duplicate_doi_detection_excludes_duplicate_records_from_valid_records",
380
+ "tests/test_articles.py::test_empty_abstract_is_valid_and_preserved",
381
+ "tests/test_articles.py::test_empty_required_strings[record0-DOI]",
382
+ "tests/test_articles.py::test_empty_required_strings[record1-Title]",
383
+ "tests/test_articles.py::test_exact_serialization_field_names",
384
+ "tests/test_articles.py::test_exact_source_value_preservation",
385
+ "tests/test_articles.py::test_file_not_found_behavior",
386
+ "tests/test_articles.py::test_full_data_smoke_current_articles_file",
387
+ "tests/test_articles.py::test_invalid_fixture_reports_multiple_record_errors",
388
+ "tests/test_articles.py::test_invalid_json",
389
+ "tests/test_articles.py::test_invalid_year_types_rejected[2024.0]",
390
+ "tests/test_articles.py::test_invalid_year_types_rejected[2024]",
391
+ "tests/test_articles.py::test_invalid_year_types_rejected[False]",
392
+ "tests/test_articles.py::test_invalid_year_types_rejected[True]",
393
+ "tests/test_articles.py::test_missing_required_fields[record0-DOI]",
394
+ "tests/test_articles.py::test_missing_required_fields[record1-Title]",
395
+ "tests/test_articles.py::test_missing_required_fields[record2-Year]",
396
+ "tests/test_articles.py::test_missing_required_fields[record3-Abstract]",
397
+ "tests/test_articles.py::test_non_object_article_entry",
398
+ "tests/test_articles.py::test_non_string_fields_rejected[Abstract-42]",
399
+ "tests/test_articles.py::test_non_string_fields_rejected[DOI-123]",
400
+ "tests/test_articles.py::test_non_string_fields_rejected[Title-value1]",
401
+ "tests/test_articles.py::test_null_field_values_rejected",
402
+ "tests/test_articles.py::test_preserves_source_order",
403
+ "tests/test_articles.py::test_source_file_immutability",
404
+ "tests/test_articles.py::test_top_level_non_list_json",
405
+ "tests/test_articles.py::test_valid_article_loading",
406
+ "tests/test_articles.py::test_whitespace_only_title_is_preserved_not_normalized",
407
+ "tests/test_cache.py::test_cache_hit_returns_cache_used_true_and_completed_status",
408
+ "tests/test_cache.py::test_cache_key_changes_when_article_content_changes",
409
+ "tests/test_cache.py::test_cache_key_changes_when_model_provider_name_or_parameters_change",
410
+ "tests/test_cache.py::test_cache_key_changes_when_prompt_versions_change",
411
+ "tests/test_cache.py::test_cache_key_changes_when_relevant_config_changes",
412
+ "tests/test_cache.py::test_cache_key_changes_when_vocabulary_hash_changes",
413
+ "tests/test_cache.py::test_cache_key_includes_article_fingerprint",
414
+ "tests/test_cache.py::test_stale_cache_is_not_reused",
415
+ "tests/test_llm_config.py::test_default_model_settings_load",
416
+ "tests/test_llm_config.py::test_environment_overrides_work",
417
+ "tests/test_llm_config.py::test_model_provider_and_name_are_configurable_in_requests",
418
+ "tests/test_llm_config.py::test_prompt_versions_are_configurable_in_requests",
419
+ "tests/test_llm_fake.py::test_fake_model_can_exhaust_retries",
420
+ "tests/test_llm_fake.py::test_fake_model_can_fail_once_then_succeed_with_retry_wrapper",
421
+ "tests/test_llm_fake.py::test_fake_model_can_raise_non_retryable_errors",
422
+ "tests/test_llm_fake.py::test_fake_model_can_raise_retryable_errors",
423
+ "tests/test_llm_fake.py::test_fake_model_can_return_invalid_candidate_ids_for_later_validation",
424
+ "tests/test_llm_fake.py::test_fake_model_can_return_no_selection",
425
+ "tests/test_llm_fake.py::test_fake_model_records_requests",
426
+ "tests/test_llm_fake.py::test_fake_model_rejects_contradictory_structured_response",
427
+ "tests/test_llm_fake.py::test_fake_model_returns_typed_term_response",
428
+ "tests/test_llm_fake.py::test_fake_model_returns_typed_topic_response",
429
+ "tests/test_llm_fake.py::test_fake_model_returns_typed_variable_response",
430
+ "tests/test_llm_prompts.py::test_prompt_delimits_title_and_abstract",
431
+ "tests/test_llm_prompts.py::test_prompt_includes_untrusted_article_instruction",
432
+ "tests/test_llm_prompts.py::test_prompt_preserves_source_article_text_exactly",
433
+ "tests/test_llm_prompts.py::test_prompt_prevents_generating_authoritative_vocabulary_fields",
434
+ "tests/test_llm_prompts.py::test_prompt_remains_valid_when_abstract_is_empty",
435
+ "tests/test_llm_prompts.py::test_prompt_uses_candidate_ids_and_only_supplied_candidates_instruction",
436
+ "tests/test_llm_prompts.py::test_term_prompt_includes_parent_context_and_direct_child_candidates",
437
+ "tests/test_llm_prompts.py::test_topic_prompt_includes_supplied_candidates",
438
+ "tests/test_llm_prompts.py::test_variable_prompt_includes_parent_context_and_direct_child_candidates",
439
+ "tests/test_llm_retries.py::test_non_retryable_error_is_not_retried",
440
+ "tests/test_llm_retries.py::test_retry_count_is_recorded_as_zero_without_retry",
441
+ "tests/test_llm_retries.py::test_retryable_error_fails_after_max_retries",
442
+ "tests/test_llm_retries.py::test_retryable_error_succeeds_after_retry",
443
+ "tests/test_mvp_smoke.py::test_fake_model_mvp_smoke_run_end_to_end",
444
+ "tests/test_mvp_smoke.py::test_optional_live_model_smoke_is_skipped_unless_explicitly_enabled",
445
+ "tests/test_openai_provider.py::test_gpt4o_request_preserves_temperature_behavior",
446
+ "tests/test_openai_provider.py::test_gpt5_family_request_omits_temperature_when_configured_zero",
447
+ "tests/test_openai_provider.py::test_openai_provider_does_not_make_live_call_without_explicit_key",
448
+ "tests/test_openai_provider.py::test_openai_provider_is_isolated_from_fake_model_tests",
449
+ "tests/test_openai_provider.py::test_openai_provider_module_import_does_not_require_openai",
450
+ "tests/test_openai_provider.py::test_openai_provider_non_retryable_error_includes_sanitized_diagnostics",
451
+ "tests/test_openai_provider.py::test_openai_provider_retryable_error_includes_sanitized_diagnostics",
452
+ "tests/test_output_schema.py::test_accepted_classification_requires_valid_deterministic_validation",
453
+ "tests/test_output_schema.py::test_basic_run_summary_validates_against_json_schema",
454
+ "tests/test_output_schema.py::test_boolean_year_is_invalid_for_article_result",
455
+ "tests/test_output_schema.py::test_classified_result_validates_against_json_schema",
456
+ "tests/test_output_schema.py::test_confidence_metadata_range_validation",
457
+ "tests/test_output_schema.py::test_empty_abstract_is_allowed_in_article_result_output",
458
+ "tests/test_output_schema.py::test_failed_result_validates_against_json_schema",
459
+ "tests/test_output_schema.py::test_generated_fields_use_snake_case_and_source_fields_remain_exact",
460
+ "tests/test_output_schema.py::test_minimal_no_classification_result_validates_against_json_schema",
461
+ "tests/test_output_schema.py::test_processing_metadata_can_represent_title_only_input",
462
+ "tests/test_output_schema.py::test_review_compatible_values_can_be_represented_without_review_trigger_logic",
463
+ "tests/test_output_schema.py::test_schema_files_are_valid_json",
464
+ "tests/test_output_schema.py::test_status_scopes_do_not_accept_values_from_wrong_enum",
465
+ "tests/test_output_schema.py::test_support_type_enum_values_are_schema_compatible",
466
+ "tests/test_output_schema.py::test_valid_accepted_classification_record",
467
+ "tests/test_output_schema.py::test_valid_article_result_with_classifications",
468
+ "tests/test_output_schema.py::test_valid_failed_article_result_without_classifications",
469
+ "tests/test_output_schema.py::test_valid_minimal_no_classification_article_result",
470
+ "tests/test_output_schema.py::test_valid_partial_article_result_without_classifications",
471
+ "tests/test_output_schema.py::test_valid_reduced_to_ancestor_classification_record",
472
+ "tests/test_output_schema.py::test_valid_rejected_classification_record",
473
+ "tests/test_package_import.py::test_package_imports",
474
+ "tests/test_persistence.py::test_article_result_is_saved_after_completion",
475
+ "tests/test_persistence.py::test_atomic_checkpoint_temp_file_is_removed_after_success",
476
+ "tests/test_persistence.py::test_consolidated_output_is_valid_json",
477
+ "tests/test_persistence.py::test_duplicate_output_records_for_same_doi_are_avoided",
478
+ "tests/test_persistence.py::test_failed_article_result_is_saved",
479
+ "tests/test_persistence.py::test_loading_existing_results_works",
480
+ "tests/test_persistence.py::test_previous_results_survive_simulated_later_failure",
481
+ "tests/test_pipeline.py::test_article_stops_at_term_and_becomes_term_classification",
482
+ "tests/test_pipeline.py::test_article_stops_at_topic_and_becomes_topic_classification",
483
+ "tests/test_pipeline.py::test_batch_cache_hit_is_completed_not_skipped_and_force_reprocess_bypasses_cache",
484
+ "tests/test_pipeline.py::test_batch_continues_after_one_article_failure",
485
+ "tests/test_pipeline.py::test_batch_output_summary_validates_against_schema",
486
+ "tests/test_pipeline.py::test_batch_processes_multiple_valid_articles_and_preserves_order",
487
+ "tests/test_pipeline.py::test_batch_reports_invalid_source_records_without_inventing_doi",
488
+ "tests/test_pipeline.py::test_empty_abstract_remains_valid_and_can_be_processed",
489
+ "tests/test_pipeline.py::test_full_data_smoke_reports_current_invalid_article_without_modifying_sources",
490
+ "tests/test_pipeline.py::test_invalid_model_candidate_produces_structured_error",
491
+ "tests/test_pipeline.py::test_logging_records_processing_events_without_secrets",
492
+ "tests/test_pipeline.py::test_model_retry_counts_and_cache_flags_appear_in_metadata",
493
+ "tests/test_pipeline.py::test_no_topic_selection_is_completed_not_classified",
494
+ "tests/test_pipeline.py::test_partial_branch_failure_preserves_successful_sibling_outcome",
495
+ "tests/test_pipeline.py::test_review_risk_flagging_preserves_accepted_topic_classification",
496
+ "tests/test_pipeline.py::test_single_article_deep_variable_classification_is_accepted",
497
+ "tests/test_pipeline.py::test_structured_diagnostics_do_not_include_secrets",
498
+ "tests/test_redundancy.py::test_ancestor_preserved_when_independent_branch",
499
+ "tests/test_redundancy.py::test_ancestor_removed_when_descendant_exists_in_same_branch_lineage",
500
+ "tests/test_redundancy.py::test_deepest_descendant_retained",
501
+ "tests/test_redundancy.py::test_exact_duplicate_canonical_path_removed",
502
+ "tests/test_redundancy.py::test_exact_duplicate_uuid_removed",
503
+ "tests/test_redundancy.py::test_insufficient_branch_provenance_preserves_ancestor_with_warning",
504
+ "tests/test_redundancy.py::test_redundancy_uses_uuid_ancestry_not_string_prefix_matching",
505
+ "tests/test_redundancy.py::test_removal_and_preservation_diagnostics_include_branch_provenance",
506
+ "tests/test_redundancy.py::test_same_concept_name_in_different_branches_is_preserved_when_uuid_and_path_differ",
507
+ "tests/test_redundancy.py::test_sibling_classifications_preserved",
508
+ "tests/test_review_flagging.py::test_explicit_or_strong_mixed_classification_is_not_flagged",
509
+ "tests/test_review_flagging.py::test_inferred_low_confidence_is_flagged",
510
+ "tests/test_review_flagging.py::test_inferred_or_mixed_topic_is_flagged",
511
+ "tests/test_review_flagging.py::test_inferred_variable_level_2_is_flagged_even_with_high_confidence",
512
+ "tests/test_review_flagging.py::test_inferred_variable_level_3_is_flagged_even_with_high_confidence",
513
+ "tests/test_review_flagging.py::test_mixed_low_confidence_is_flagged",
514
+ "tests/test_review_flagging.py::test_non_accepted_classification_is_not_flagged",
515
+ "tests/test_review_flagging.py::test_review_warning_appears_in_json_output",
516
+ "tests/test_small_run_script.py::test_build_model_client_fake_returns_fake_model",
517
+ "tests/test_small_run_script.py::test_console_summary_includes_classification_and_no_classification",
518
+ "tests/test_small_run_script.py::test_fake_scripted_responses_support_requested_article_count",
519
+ "tests/test_small_run_script.py::test_limit_article_load_uses_first_valid_articles",
520
+ "tests/test_small_run_script.py::test_live_mode_requires_credentials",
521
+ "tests/test_small_run_script.py::test_live_mode_requires_openai_provider",
522
+ "tests/test_small_run_script.py::test_one_line_compacts_tabs_and_newlines",
523
+ "tests/test_small_run_script.py::test_progress_helpers_print_safe_truncated_output",
524
+ "tests/test_small_run_script.py::test_review_csv_contains_classification_and_article_level_rows",
525
+ "tests/test_small_run_script.py::test_review_csv_path_follows_output_dir",
526
+ "tests/test_small_run_script.py::test_small_run_script_imports_without_live_api_calls",
527
+ "tests/test_small_run_script.py::test_truncate_title_uses_one_line_and_limit",
528
+ "tests/test_structured_responses.py::test_empty_candidate_id_rejected",
529
+ "tests/test_structured_responses.py::test_invalid_confidence_range[-0.01]",
530
+ "tests/test_structured_responses.py::test_invalid_confidence_range[1.01]",
531
+ "tests/test_structured_responses.py::test_invalid_term_response_stopping_without_stop_reason[None]",
532
+ "tests/test_structured_responses.py::test_invalid_term_response_stopping_without_stop_reason[]",
533
+ "tests/test_structured_responses.py::test_invalid_term_response_with_stop_and_selected[payload0]",
534
+ "tests/test_structured_responses.py::test_invalid_term_response_with_stop_and_selected[payload1]",
535
+ "tests/test_structured_responses.py::test_invalid_variable_response_stopping_without_stop_reason[None]",
536
+ "tests/test_structured_responses.py::test_invalid_variable_response_stopping_without_stop_reason[]",
537
+ "tests/test_structured_responses.py::test_invalid_variable_response_with_stop_and_selected[payload0]",
538
+ "tests/test_structured_responses.py::test_invalid_variable_response_with_stop_and_selected[payload1]",
539
+ "tests/test_structured_responses.py::test_malformed_candidate_decision_rejected",
540
+ "tests/test_structured_responses.py::test_unknown_fields_rejected",
541
+ "tests/test_structured_responses.py::test_valid_missing_confidence",
542
+ "tests/test_structured_responses.py::test_valid_term_response_selecting_candidates",
543
+ "tests/test_structured_responses.py::test_valid_term_response_stopping_at_parent",
544
+ "tests/test_structured_responses.py::test_valid_topic_response_with_multiple_selected_candidates",
545
+ "tests/test_structured_responses.py::test_valid_topic_response_with_no_selected_candidates_and_reason",
546
+ "tests/test_structured_responses.py::test_valid_topic_response_with_one_selected_candidate",
547
+ "tests/test_structured_responses.py::test_valid_variable_response_selecting_candidates",
548
+ "tests/test_structured_responses.py::test_valid_variable_response_stopping_at_parent",
549
+ "tests/test_term_routing.py::test_candidate_from_sibling_topic_cannot_be_accepted",
550
+ "tests/test_term_routing.py::test_confidence_is_preserved_as_uncalibrated_metadata_only",
551
+ "tests/test_term_routing.py::test_duplicate_term_candidate_id_is_rejected",
552
+ "tests/test_term_routing.py::test_empty_abstract_remains_valid_and_is_passed_to_term_prompt",
553
+ "tests/test_term_routing.py::test_empty_or_malformed_term_candidate_id_is_rejected_by_structured_validation",
554
+ "tests/test_term_routing.py::test_fake_model_receives_article_fields_parent_context_and_direct_term_candidates",
555
+ "tests/test_term_routing.py::test_full_data_current_vocabulary_has_144_direct_term_candidates",
556
+ "tests/test_term_routing.py::test_invalid_term_candidate_id_is_rejected",
557
+ "tests/test_term_routing.py::test_manually_invalid_candidate_to_record_mapping_is_rejected",
558
+ "tests/test_term_routing.py::test_multiple_terms_selected_under_one_topic",
559
+ "tests/test_term_routing.py::test_no_fake_fallback_term_is_created",
560
+ "tests/test_term_routing.py::test_no_variable_routing_is_performed",
561
+ "tests/test_term_routing.py::test_one_term_selected_under_selected_topic",
562
+ "tests/test_term_routing.py::test_selected_term_branch_seed_is_populated_from_vocabulary_index",
563
+ "tests/test_term_routing.py::test_selected_topic_with_no_direct_term_children_is_handled_explicitly",
564
+ "tests/test_term_routing.py::test_stop_at_topic_with_stop_at_parent_true",
565
+ "tests/test_term_routing.py::test_term_candidate_construction_does_not_hard_code_term_names_or_uuids",
566
+ "tests/test_term_routing.py::test_term_candidate_ids_are_unique_within_prompt",
567
+ "tests/test_term_routing.py::test_term_candidate_ids_map_to_uuid_bearing_term_records",
568
+ "tests/test_term_routing.py::test_term_candidates_are_built_only_from_selected_topic_direct_children",
569
+ "tests/test_term_routing.py::test_term_router_never_evaluates_all_terms_globally",
570
+ "tests/test_term_routing.py::test_term_router_uses_provider_neutral_model_interface",
571
+ "tests/test_term_routing.py::test_term_selected_from_correct_topic_succeeds",
572
+ "tests/test_term_routing.py::test_terms_from_sibling_topics_are_not_included",
573
+ "tests/test_term_routing.py::test_topic_with_no_supported_term_returns_stop_at_topic_result",
574
+ "tests/test_topic_routing.py::test_candidate_construction_does_not_hard_code_topic_names_or_uuids",
575
+ "tests/test_topic_routing.py::test_candidate_ids_are_unique_and_stable",
576
+ "tests/test_topic_routing.py::test_confidence_is_preserved_as_uncalibrated_metadata_only",
577
+ "tests/test_topic_routing.py::test_duplicate_candidate_id_returned_by_model_is_rejected",
578
+ "tests/test_topic_routing.py::test_empty_abstract_remains_valid_and_is_passed_to_prompt",
579
+ "tests/test_topic_routing.py::test_empty_or_malformed_candidate_id_rejected_by_structured_schema",
580
+ "tests/test_topic_routing.py::test_every_topic_candidate_maps_to_uuid_bearing_topic_record",
581
+ "tests/test_topic_routing.py::test_fake_model_receives_article_fields_and_topic_candidates",
582
+ "tests/test_topic_routing.py::test_full_data_current_vocabulary_has_14_topic_candidates",
583
+ "tests/test_topic_routing.py::test_invalid_candidate_id_returned_by_fake_model_is_rejected",
584
+ "tests/test_topic_routing.py::test_multiple_topic_selection",
585
+ "tests/test_topic_routing.py::test_no_fake_fallback_topic_is_created",
586
+ "tests/test_topic_routing.py::test_no_term_or_variable_routing_is_performed",
587
+ "tests/test_topic_routing.py::test_no_topic_selection_with_reason",
588
+ "tests/test_topic_routing.py::test_root_category_is_never_included_as_candidate",
589
+ "tests/test_topic_routing.py::test_selected_topic_branch_seed_is_populated_from_vocabulary_index",
590
+ "tests/test_topic_routing.py::test_single_topic_selection",
591
+ "tests/test_topic_routing.py::test_topic_candidates_are_built_from_vocabulary_index",
592
+ "tests/test_topic_routing.py::test_topic_router_uses_provider_neutral_model_interface",
593
+ "tests/test_ui.py::test_classification_table_rows_include_only_demo_relevant_fields",
594
+ "tests/test_ui.py::test_classification_table_rows_include_wide_text_fields",
595
+ "tests/test_ui.py::test_classified_result_includes_uuid_and_canonical_path",
596
+ "tests/test_ui.py::test_compact_summary_includes_status_model_and_review_counts",
597
+ "tests/test_ui.py::test_create_demo_constructs_gradio_interface",
598
+ "tests/test_ui.py::test_empty_abstract_is_accepted_by_ui_input_path",
599
+ "tests/test_ui.py::test_errors_and_warnings_are_displayed",
600
+ "tests/test_ui.py::test_gradio_app_imports_without_gradio_or_api_keys",
601
+ "tests/test_ui.py::test_no_classification_result_is_formatted_correctly",
602
+ "tests/test_ui.py::test_prototype_app_remains_unchanged_during_ui_import",
603
+ "tests/test_ui.py::test_root_app_defines_zerogpu_probe_with_spaces_decorator",
604
+ "tests/test_ui.py::test_root_app_imports_when_spaces_is_not_installed",
605
+ "tests/test_ui.py::test_root_app_imports_without_launching_server",
606
+ "tests/test_ui.py::test_root_app_is_thin_launcher_without_classification_logic",
607
+ "tests/test_ui.py::test_root_app_launch_uses_spaces_compatible_settings",
608
+ "tests/test_ui.py::test_root_app_uses_spaces_default_server_settings",
609
+ "tests/test_ui.py::test_ui_calls_pipeline_service",
610
+ "tests/test_ui.py::test_ui_module_does_not_classify_or_call_model_at_import_time",
611
+ "tests/test_validation.py::test_final_concept_under_expected_topic_and_term_succeeds",
612
+ "tests/test_validation.py::test_full_data_representative_records_pass_validation",
613
+ "tests/test_validation.py::test_invalid_parent_child_chain_rejected",
614
+ "tests/test_validation.py::test_invalid_path_components_rejected",
615
+ "tests/test_validation.py::test_multiple_terminal_outcomes_validate_independently",
616
+ "tests/test_validation.py::test_nonexistent_uuid_rejected",
617
+ "tests/test_validation.py::test_rejected_invalid_candidates_do_not_appear_in_accepted_classifications",
618
+ "tests/test_validation.py::test_root_category_rejected",
619
+ "tests/test_validation.py::test_selected_variable_level_3_terminal_outcome_can_become_valid_classification",
620
+ "tests/test_validation.py::test_stop_at_term_terminal_outcome_can_become_valid_term_classification",
621
+ "tests/test_validation.py::test_stop_at_variable_level_1_terminal_outcome_can_become_valid_classification",
622
+ "tests/test_validation.py::test_term_level_final_classification_succeeds_from_term_branch",
623
+ "tests/test_validation.py::test_topic_level_final_classification_succeeds",
624
+ "tests/test_validation.py::test_uuid_canonical_path_mismatch_rejected",
625
+ "tests/test_validation.py::test_uuid_level_mismatch_rejected",
626
+ "tests/test_validation.py::test_uuid_name_mismatch_rejected",
627
+ "tests/test_validation.py::test_valid_candidate_accepted_and_populated_from_vocabulary_index",
628
+ "tests/test_validation.py::test_validation_does_not_require_model_call",
629
+ "tests/test_validation.py::test_variable_level_1_final_classification_succeeds",
630
+ "tests/test_validation.py::test_variable_level_2_final_classification_succeeds",
631
+ "tests/test_validation.py::test_variable_level_3_final_classification_succeeds",
632
+ "tests/test_validation.py::test_wrong_term_membership_rejected",
633
+ "tests/test_validation.py::test_wrong_topic_membership_rejected",
634
+ "tests/test_variable_traversal.py::test_child_branch_ids_are_distinct_and_preserve_parent_context",
635
+ "tests/test_variable_traversal.py::test_confidence_is_preserved_only_as_uncalibrated_metadata",
636
+ "tests/test_variable_traversal.py::test_duplicate_variable_candidate_id_is_rejected",
637
+ "tests/test_variable_traversal.py::test_empty_abstract_remains_valid_and_is_passed_to_variable_prompt",
638
+ "tests/test_variable_traversal.py::test_empty_or_malformed_variable_candidate_id_rejected_by_structured_validation",
639
+ "tests/test_variable_traversal.py::test_fake_model_receives_article_parent_context_and_direct_variable_candidates",
640
+ "tests/test_variable_traversal.py::test_full_data_current_variable_candidate_counts_are_direct_children_only",
641
+ "tests/test_variable_traversal.py::test_grandchildren_are_not_included_before_child_parent_is_selected",
642
+ "tests/test_variable_traversal.py::test_manually_invalid_candidate_to_record_mapping_is_rejected",
643
+ "tests/test_variable_traversal.py::test_multiple_selected_descendants_under_one_branch_continue_independently",
644
+ "tests/test_variable_traversal.py::test_multiple_selected_variable_level_1_children_create_independent_branches",
645
+ "tests/test_variable_traversal.py::test_no_forced_leaf_descent",
646
+ "tests/test_variable_traversal.py::test_no_skipped_hierarchy_levels_or_non_direct_descendant_evaluation",
647
+ "tests/test_variable_traversal.py::test_parent_with_no_direct_children_is_terminal_outcome",
648
+ "tests/test_variable_traversal.py::test_select_variable_level_3_and_stop_naturally_at_leaf",
649
+ "tests/test_variable_traversal.py::test_selected_candidate_from_sibling_parent_is_rejected",
650
+ "tests/test_variable_traversal.py::test_sibling_branch_continuation_after_one_branch_fails",
651
+ "tests/test_variable_traversal.py::test_sibling_branch_continuation_after_one_branch_stops",
652
+ "tests/test_variable_traversal.py::test_sibling_branches_are_not_included",
653
+ "tests/test_variable_traversal.py::test_stop_at_term_when_no_variable_child_supported",
654
+ "tests/test_variable_traversal.py::test_stop_at_variable_level_1",
655
+ "tests/test_variable_traversal.py::test_stop_at_variable_level_2",
656
+ "tests/test_variable_traversal.py::test_terminal_outcome_includes_provenance_and_required_fields",
657
+ "tests/test_variable_traversal.py::test_unknown_variable_candidate_id_is_rejected",
658
+ "tests/test_variable_traversal.py::test_variable_candidate_construction_does_not_hard_code_names_or_uuids",
659
+ "tests/test_variable_traversal.py::test_variable_candidate_ids_are_unique_within_prompt",
660
+ "tests/test_variable_traversal.py::test_variable_candidate_ids_map_to_uuid_bearing_variable_records",
661
+ "tests/test_variable_traversal.py::test_variable_candidates_are_built_only_from_current_parent_direct_children",
662
+ "tests/test_variable_traversal.py::test_variable_descent_uses_provider_neutral_model_interface",
663
+ "tests/test_vocabulary.py::test_ancestor_and_descendant_checks",
664
+ "tests/test_vocabulary.py::test_canonical_path_excludes_root_category",
665
+ "tests/test_vocabulary.py::test_duplicate_canonical_path_detection",
666
+ "tests/test_vocabulary.py::test_duplicate_uuid_detection",
667
+ "tests/test_vocabulary.py::test_every_current_topic_and_term_has_uuid",
668
+ "tests/test_vocabulary.py::test_full_data_smoke_counts_for_current_vocabulary",
669
+ "tests/test_vocabulary.py::test_identical_names_in_different_branches_are_allowed_when_paths_differ",
670
+ "tests/test_vocabulary.py::test_invalid_hierarchy_level_transition",
671
+ "tests/test_vocabulary.py::test_missing_required_fields[level]",
672
+ "tests/test_vocabulary.py::test_missing_required_fields[name]",
673
+ "tests/test_vocabulary.py::test_optional_and_missing_definitions",
674
+ "tests/test_vocabulary.py::test_parent_and_direct_child_lookup",
675
+ "tests/test_vocabulary.py::test_recursive_traversal_and_variable_depth_branches",
676
+ "tests/test_vocabulary.py::test_root_category_is_non_assignable_context",
677
+ "tests/test_vocabulary.py::test_source_file_immutability",
678
+ "tests/test_vocabulary.py::test_term_to_variable_lookup",
679
+ "tests/test_vocabulary.py::test_topic_term_and_variable_records_are_assignable",
680
+ "tests/test_vocabulary.py::test_topic_to_term_lookup",
681
+ "tests/test_vocabulary.py::test_unexpected_uuidless_non_root_node",
682
+ "tests/test_vocabulary.py::test_uuid_preservation_and_record_fields",
683
+ "tests/test_vocabulary.py::test_valid_hierarchy_level_transitions",
684
+ "tests/test_vocabulary.py::test_vocabulary_file_hash_stability"
685
+ ]
.ruff_cache/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Automatically created by ruff.
2
+ *
.ruff_cache/0.15.21/11885472981295785164 ADDED
Binary file (172 Bytes). View file
 
.ruff_cache/0.15.21/1300401175170744610 ADDED
Binary file (236 Bytes). View file
 
.ruff_cache/0.15.21/15131953968306051049 ADDED
Binary file (180 Bytes). View file
 
.ruff_cache/0.15.21/15313280957554967660 ADDED
Binary file (148 Bytes). View file
 
.ruff_cache/0.15.21/15432729255545051974 ADDED
Binary file (2.55 kB). View file
 
.ruff_cache/0.15.21/17513344015243148911 ADDED
Binary file (3.45 kB). View file
 
.ruff_cache/0.15.21/3143687862706329986 ADDED
Binary file (340 Bytes). View file
 
.ruff_cache/0.15.21/7626447333909823739 ADDED
Binary file (284 Bytes). View file
 
.ruff_cache/0.15.21/9412025680110365515 ADDED
Binary file (180 Bytes). View file
 
.ruff_cache/CACHEDIR.TAG ADDED
@@ -0,0 +1 @@
 
 
1
+ Signature: 8a477f597d28d172789f06886806bc55
.venv/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Created by venv; see https://docs.python.org/3/library/venv.html
2
+ *
.venv/bin/Activate.ps1 ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <#
2
+ .Synopsis
3
+ Activate a Python virtual environment for the current PowerShell session.
4
+
5
+ .Description
6
+ Pushes the python executable for a virtual environment to the front of the
7
+ $Env:PATH environment variable and sets the prompt to signify that you are
8
+ in a Python virtual environment. Makes use of the command line switches as
9
+ well as the `pyvenv.cfg` file values present in the virtual environment.
10
+
11
+ .Parameter VenvDir
12
+ Path to the directory that contains the virtual environment to activate. The
13
+ default value for this is the parent of the directory that the Activate.ps1
14
+ script is located within.
15
+
16
+ .Parameter Prompt
17
+ The prompt prefix to display when this virtual environment is activated. By
18
+ default, this prompt is the name of the virtual environment folder (VenvDir)
19
+ surrounded by parentheses and followed by a single space (ie. '(.venv) ').
20
+
21
+ .Example
22
+ Activate.ps1
23
+ Activates the Python virtual environment that contains the Activate.ps1 script.
24
+
25
+ .Example
26
+ Activate.ps1 -Verbose
27
+ Activates the Python virtual environment that contains the Activate.ps1 script,
28
+ and shows extra information about the activation as it executes.
29
+
30
+ .Example
31
+ Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
32
+ Activates the Python virtual environment located in the specified location.
33
+
34
+ .Example
35
+ Activate.ps1 -Prompt "MyPython"
36
+ Activates the Python virtual environment that contains the Activate.ps1 script,
37
+ and prefixes the current prompt with the specified string (surrounded in
38
+ parentheses) while the virtual environment is active.
39
+
40
+ .Notes
41
+ On Windows, it may be required to enable this Activate.ps1 script by setting the
42
+ execution policy for the user. You can do this by issuing the following PowerShell
43
+ command:
44
+
45
+ PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
46
+
47
+ For more information on Execution Policies:
48
+ https://go.microsoft.com/fwlink/?LinkID=135170
49
+
50
+ #>
51
+ Param(
52
+ [Parameter(Mandatory = $false)]
53
+ [String]
54
+ $VenvDir,
55
+ [Parameter(Mandatory = $false)]
56
+ [String]
57
+ $Prompt
58
+ )
59
+
60
+ <# Function declarations --------------------------------------------------- #>
61
+
62
+ <#
63
+ .Synopsis
64
+ Remove all shell session elements added by the Activate script, including the
65
+ addition of the virtual environment's Python executable from the beginning of
66
+ the PATH variable.
67
+
68
+ .Parameter NonDestructive
69
+ If present, do not remove this function from the global namespace for the
70
+ session.
71
+
72
+ #>
73
+ function global:deactivate ([switch]$NonDestructive) {
74
+ # Revert to original values
75
+
76
+ # The prior prompt:
77
+ if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
78
+ Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
79
+ Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
80
+ }
81
+
82
+ # The prior PYTHONHOME:
83
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
84
+ Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
85
+ Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
86
+ }
87
+
88
+ # The prior PATH:
89
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
90
+ Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
91
+ Remove-Item -Path Env:_OLD_VIRTUAL_PATH
92
+ }
93
+
94
+ # Just remove the VIRTUAL_ENV altogether:
95
+ if (Test-Path -Path Env:VIRTUAL_ENV) {
96
+ Remove-Item -Path env:VIRTUAL_ENV
97
+ }
98
+
99
+ # Just remove VIRTUAL_ENV_PROMPT altogether.
100
+ if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
101
+ Remove-Item -Path env:VIRTUAL_ENV_PROMPT
102
+ }
103
+
104
+ # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
105
+ if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
106
+ Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
107
+ }
108
+
109
+ # Leave deactivate function in the global namespace if requested:
110
+ if (-not $NonDestructive) {
111
+ Remove-Item -Path function:deactivate
112
+ }
113
+ }
114
+
115
+ <#
116
+ .Description
117
+ Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
118
+ given folder, and returns them in a map.
119
+
120
+ For each line in the pyvenv.cfg file, if that line can be parsed into exactly
121
+ two strings separated by `=` (with any amount of whitespace surrounding the =)
122
+ then it is considered a `key = value` line. The left hand string is the key,
123
+ the right hand is the value.
124
+
125
+ If the value starts with a `'` or a `"` then the first and last character is
126
+ stripped from the value before being captured.
127
+
128
+ .Parameter ConfigDir
129
+ Path to the directory that contains the `pyvenv.cfg` file.
130
+ #>
131
+ function Get-PyVenvConfig(
132
+ [String]
133
+ $ConfigDir
134
+ ) {
135
+ Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
136
+
137
+ # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
138
+ $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
139
+
140
+ # An empty map will be returned if no config file is found.
141
+ $pyvenvConfig = @{ }
142
+
143
+ if ($pyvenvConfigPath) {
144
+
145
+ Write-Verbose "File exists, parse `key = value` lines"
146
+ $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
147
+
148
+ $pyvenvConfigContent | ForEach-Object {
149
+ $keyval = $PSItem -split "\s*=\s*", 2
150
+ if ($keyval[0] -and $keyval[1]) {
151
+ $val = $keyval[1]
152
+
153
+ # Remove extraneous quotations around a string value.
154
+ if ("'""".Contains($val.Substring(0, 1))) {
155
+ $val = $val.Substring(1, $val.Length - 2)
156
+ }
157
+
158
+ $pyvenvConfig[$keyval[0]] = $val
159
+ Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
160
+ }
161
+ }
162
+ }
163
+ return $pyvenvConfig
164
+ }
165
+
166
+
167
+ <# Begin Activate script --------------------------------------------------- #>
168
+
169
+ # Determine the containing directory of this script
170
+ $VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
171
+ $VenvExecDir = Get-Item -Path $VenvExecPath
172
+
173
+ Write-Verbose "Activation script is located in path: '$VenvExecPath'"
174
+ Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
175
+ Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
176
+
177
+ # Set values required in priority: CmdLine, ConfigFile, Default
178
+ # First, get the location of the virtual environment, it might not be
179
+ # VenvExecDir if specified on the command line.
180
+ if ($VenvDir) {
181
+ Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
182
+ }
183
+ else {
184
+ Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
185
+ $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
186
+ Write-Verbose "VenvDir=$VenvDir"
187
+ }
188
+
189
+ # Next, read the `pyvenv.cfg` file to determine any required value such
190
+ # as `prompt`.
191
+ $pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
192
+
193
+ # Next, set the prompt from the command line, or the config file, or
194
+ # just use the name of the virtual environment folder.
195
+ if ($Prompt) {
196
+ Write-Verbose "Prompt specified as argument, using '$Prompt'"
197
+ }
198
+ else {
199
+ Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
200
+ if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
201
+ Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
202
+ $Prompt = $pyvenvCfg['prompt'];
203
+ }
204
+ else {
205
+ Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
206
+ Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
207
+ $Prompt = Split-Path -Path $venvDir -Leaf
208
+ }
209
+ }
210
+
211
+ Write-Verbose "Prompt = '$Prompt'"
212
+ Write-Verbose "VenvDir='$VenvDir'"
213
+
214
+ # Deactivate any currently active virtual environment, but leave the
215
+ # deactivate function in place.
216
+ deactivate -nondestructive
217
+
218
+ # Now set the environment variable VIRTUAL_ENV, used by many tools to determine
219
+ # that there is an activated venv.
220
+ $env:VIRTUAL_ENV = $VenvDir
221
+
222
+ $env:VIRTUAL_ENV_PROMPT = $Prompt
223
+
224
+ if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
225
+
226
+ Write-Verbose "Setting prompt to '$Prompt'"
227
+
228
+ # Set the prompt to include the env name
229
+ # Make sure _OLD_VIRTUAL_PROMPT is global
230
+ function global:_OLD_VIRTUAL_PROMPT { "" }
231
+ Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
232
+ New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
233
+
234
+ function global:prompt {
235
+ Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
236
+ _OLD_VIRTUAL_PROMPT
237
+ }
238
+ }
239
+
240
+ # Clear PYTHONHOME
241
+ if (Test-Path -Path Env:PYTHONHOME) {
242
+ Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
243
+ Remove-Item -Path Env:PYTHONHOME
244
+ }
245
+
246
+ # Add the venv to the PATH
247
+ Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
248
+ $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
.venv/bin/activate ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file must be used with "source bin/activate" *from bash*
2
+ # You cannot run it directly
3
+
4
+ deactivate () {
5
+ # reset old environment variables
6
+ if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
7
+ PATH="${_OLD_VIRTUAL_PATH:-}"
8
+ export PATH
9
+ unset _OLD_VIRTUAL_PATH
10
+ fi
11
+ if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
12
+ PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
13
+ export PYTHONHOME
14
+ unset _OLD_VIRTUAL_PYTHONHOME
15
+ fi
16
+
17
+ # Call hash to forget past locations. Without forgetting
18
+ # past locations the $PATH changes we made may not be respected.
19
+ # See "man bash" for more details. hash is usually a builtin of your shell
20
+ hash -r 2> /dev/null
21
+
22
+ if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
23
+ PS1="${_OLD_VIRTUAL_PS1:-}"
24
+ export PS1
25
+ unset _OLD_VIRTUAL_PS1
26
+ fi
27
+
28
+ unset VIRTUAL_ENV
29
+ unset VIRTUAL_ENV_PROMPT
30
+ if [ ! "${1:-}" = "nondestructive" ] ; then
31
+ # Self destruct!
32
+ unset -f deactivate
33
+ fi
34
+ }
35
+
36
+ # unset irrelevant variables
37
+ deactivate nondestructive
38
+
39
+ # on Windows, a path can contain colons and backslashes and has to be converted:
40
+ case "$(uname)" in
41
+ CYGWIN*|MSYS*|MINGW*)
42
+ # transform D:\path\to\venv to /d/path/to/venv on MSYS and MINGW
43
+ # and to /cygdrive/d/path/to/venv on Cygwin
44
+ VIRTUAL_ENV=$(cygpath /home/igerasim/GCMD_Classifier/.venv)
45
+ export VIRTUAL_ENV
46
+ ;;
47
+ *)
48
+ # use the path as-is
49
+ export VIRTUAL_ENV=/home/igerasim/GCMD_Classifier/.venv
50
+ ;;
51
+ esac
52
+
53
+ _OLD_VIRTUAL_PATH="$PATH"
54
+ PATH="$VIRTUAL_ENV/"bin":$PATH"
55
+ export PATH
56
+
57
+ VIRTUAL_ENV_PROMPT=.venv
58
+ export VIRTUAL_ENV_PROMPT
59
+
60
+ # unset PYTHONHOME if set
61
+ # this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
62
+ # could use `if (set -u; : $PYTHONHOME) ;` in bash
63
+ if [ -n "${PYTHONHOME:-}" ] ; then
64
+ _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
65
+ unset PYTHONHOME
66
+ fi
67
+
68
+ if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
69
+ _OLD_VIRTUAL_PS1="${PS1:-}"
70
+ PS1="(".venv") ${PS1:-}"
71
+ export PS1
72
+ fi
73
+
74
+ # Call hash to forget past commands. Without forgetting
75
+ # past commands the $PATH changes we made may not be respected
76
+ hash -r 2> /dev/null
.venv/bin/activate.csh ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file must be used with "source bin/activate.csh" *from csh*.
2
+ # You cannot run it directly.
3
+
4
+ # Created by Davide Di Blasi <davidedb@gmail.com>.
5
+ # Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
6
+
7
+ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
8
+
9
+ # Unset irrelevant variables.
10
+ deactivate nondestructive
11
+
12
+ setenv VIRTUAL_ENV /home/igerasim/GCMD_Classifier/.venv
13
+
14
+ set _OLD_VIRTUAL_PATH="$PATH"
15
+ setenv PATH "$VIRTUAL_ENV/"bin":$PATH"
16
+ setenv VIRTUAL_ENV_PROMPT .venv
17
+
18
+
19
+ set _OLD_VIRTUAL_PROMPT="$prompt"
20
+
21
+ if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
22
+ set prompt = "(".venv") $prompt:q"
23
+ endif
24
+
25
+ alias pydoc python -m pydoc
26
+
27
+ rehash
.venv/bin/activate.fish ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file must be used with "source <venv>/bin/activate.fish" *from fish*
2
+ # (https://fishshell.com/). You cannot run it directly.
3
+
4
+ function deactivate -d "Exit virtual environment and return to normal shell environment"
5
+ # reset old environment variables
6
+ if test -n "$_OLD_VIRTUAL_PATH"
7
+ set -gx PATH $_OLD_VIRTUAL_PATH
8
+ set -e _OLD_VIRTUAL_PATH
9
+ end
10
+ if test -n "$_OLD_VIRTUAL_PYTHONHOME"
11
+ set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
12
+ set -e _OLD_VIRTUAL_PYTHONHOME
13
+ end
14
+
15
+ if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
16
+ set -e _OLD_FISH_PROMPT_OVERRIDE
17
+ # prevents error when using nested fish instances (Issue #93858)
18
+ if functions -q _old_fish_prompt
19
+ functions -e fish_prompt
20
+ functions -c _old_fish_prompt fish_prompt
21
+ functions -e _old_fish_prompt
22
+ end
23
+ end
24
+
25
+ set -e VIRTUAL_ENV
26
+ set -e VIRTUAL_ENV_PROMPT
27
+ if test "$argv[1]" != "nondestructive"
28
+ # Self-destruct!
29
+ functions -e deactivate
30
+ end
31
+ end
32
+
33
+ # Unset irrelevant variables.
34
+ deactivate nondestructive
35
+
36
+ set -gx VIRTUAL_ENV /home/igerasim/GCMD_Classifier/.venv
37
+
38
+ set -gx _OLD_VIRTUAL_PATH $PATH
39
+ set -gx PATH "$VIRTUAL_ENV/"bin $PATH
40
+ set -gx VIRTUAL_ENV_PROMPT .venv
41
+
42
+ # Unset PYTHONHOME if set.
43
+ if set -q PYTHONHOME
44
+ set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
45
+ set -e PYTHONHOME
46
+ end
47
+
48
+ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
49
+ # fish uses a function instead of an env var to generate the prompt.
50
+
51
+ # Save the current fish_prompt function as the function _old_fish_prompt.
52
+ functions -c fish_prompt _old_fish_prompt
53
+
54
+ # With the original prompt function renamed, we can override with our own.
55
+ function fish_prompt
56
+ # Save the return status of the last command.
57
+ set -l old_status $status
58
+
59
+ # Output the venv prompt; color taken from the blue of the Python logo.
60
+ printf "%s(%s)%s " (set_color 4B8BBE) .venv (set_color normal)
61
+
62
+ # Restore the return status of the previous command.
63
+ echo "exit $old_status" | .
64
+ # Output the original/"old" prompt.
65
+ _old_fish_prompt
66
+ end
67
+
68
+ set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
69
+ end
.venv/bin/distro ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from distro.distro import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/f2py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from numpy.f2py.f2py2e import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/fastapi ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from fastapi.cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/gradio ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from gradio.cli import cli
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(cli())
.venv/bin/hf ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from huggingface_hub.cli.hf import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/httpx ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from httpx import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/huggingface-cli ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from huggingface_hub.cli.deprecated_cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/idna ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from idna.cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/jsonschema ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from jsonschema.cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/markdown-it ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from markdown_it.cli.parse import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/numpy-config ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from numpy._configtool import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/openai ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from openai.cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/pip ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from pip._internal.cli.main import main
4
+ if __name__ == '__main__':
5
+ if sys.argv[0].endswith('.exe'):
6
+ sys.argv[0] = sys.argv[0][:-4]
7
+ sys.exit(main())
.venv/bin/pip3 ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from pip._internal.cli.main import main
4
+ if __name__ == '__main__':
5
+ if sys.argv[0].endswith('.exe'):
6
+ sys.argv[0] = sys.argv[0][:-4]
7
+ sys.exit(main())
.venv/bin/pip3.13 ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from pip._internal.cli.main import main
4
+ if __name__ == '__main__':
5
+ if sys.argv[0].endswith('.exe'):
6
+ sys.argv[0] = sys.argv[0][:-4]
7
+ sys.exit(main())
.venv/bin/py.test ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from pytest import console_main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(console_main())
.venv/bin/pygmentize ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from pygments.cmdline import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/pytest ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from pytest import console_main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(console_main())
.venv/bin/python ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:be5bf5719c6fda4e041336380ddb3208f440e8507557d92c98b9e23c332102d3
3
+ size 32959480
.venv/bin/python3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:be5bf5719c6fda4e041336380ddb3208f440e8507557d92c98b9e23c332102d3
3
+ size 32959480
.venv/bin/python3.13 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:be5bf5719c6fda4e041336380ddb3208f440e8507557d92c98b9e23c332102d3
3
+ size 32959480
.venv/bin/ruff ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:68971e86ff2a4bd44f45dc2dd28e590e785fea12dc966410ae269173ce6d64db
3
+ size 27942368
.venv/bin/tiny-agents ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from huggingface_hub.inference._mcp.cli import app
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(app())
.venv/bin/tqdm ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from tqdm.cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/typer ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from typer.cli import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/upload_theme ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from gradio.themes.upload_theme import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())
.venv/bin/uvicorn ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/home/igerasim/GCMD_Classifier/.venv/bin/python
2
+ import sys
3
+ from uvicorn.main import main
4
+ if __name__ == '__main__':
5
+ sys.argv[0] = sys.argv[0].removesuffix('.exe')
6
+ sys.exit(main())