============================= test session starts ==============================
platform darwin -- Python 3.12.9, pytest-9.0.2, pluggy-1.6.0 -- /Users/spy/Documents/PY/AI/skillgate/venv/bin/python3.12
cachedir: .pytest_cache
rootdir: /Users/spy/Documents/PY/AI/skillgate
configfile: pyproject.toml
testpaths: tests
plugins: anyio-4.12.1, xdist-3.8.0, cov-7.0.0
collecting ... collected 2244 items / 27 deselected / 2 skipped / 2217 selected

tests/defense/test_false_negative_corpus.py::test_corpus_sample_detection[backdoor-skill-expected_rule_ids0] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_sample_detection[rce-skill-expected_rule_ids1] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_sample_detection[eval-injection-expected_rule_ids2] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_sample_detection[obfuscated-malware-expected_rule_ids3] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_sample_detection[credential-harvester-expected_rule_ids4] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_completeness PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_samples_have_manifests PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_samples_have_python_files PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_minimum_severity[backdoor-skill-expected_rule_ids0] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_minimum_severity[rce-skill-expected_rule_ids1] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_minimum_severity[eval-injection-expected_rule_ids2] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_minimum_severity[obfuscated-malware-expected_rule_ids3] PASSED [  0%]
tests/defense/test_false_negative_corpus.py::test_corpus_minimum_severity[credential-harvester-expected_rule_ids4] PASSED [  0%]
tests/defense/test_mutation_detection.py::test_no_skip_markers_in_critical_mutation_suite PASSED [  0%]
tests/defense/test_mutation_detection.py::TestStringConcatenationEvasion::test_subprocess_with_string_concat PASSED [  0%]
tests/defense/test_mutation_detection.py::TestStringConcatenationEvasion::test_eval_with_concatenation PASSED [  0%]
tests/defense/test_mutation_detection.py::TestVariableAliasingEvasion::test_subprocess_aliasing PASSED [  0%]
tests/defense/test_mutation_detection.py::TestVariableAliasingEvasion::test_os_system_aliasing PASSED [  0%]
tests/defense/test_mutation_detection.py::TestBase64EncodingEvasion::test_base64_decode_usage PASSED [  0%]
tests/defense/test_mutation_detection.py::TestBase64EncodingEvasion::test_base64_with_exec PASSED [  0%]
tests/defense/test_mutation_detection.py::TestGetattrEvasion::test_getattr_subprocess PASSED [  0%]
tests/defense/test_mutation_detection.py::TestDynamicImportEvasion::test_import_lib_subprocess PASSED [  0%]
tests/defense/test_mutation_detection.py::TestMultiLayerEvasion::test_multi_layer_obfuscation PASSED [  1%]
tests/defense/test_mutation_detection.py::TestEnvironmentAccessEvasion::test_indirect_environ_access PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestAuthSecurityFixes::test_device_verify_requires_authentication_16_29[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestAuthSecurityFixes::test_device_verify_replay_protection_16_29[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestAuthSecurityFixes::test_oauth_demo_blocked_in_production_16_30[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestAuthSecurityFixes::test_rate_limit_ip_spoofing_blocked_16_34[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestBillingSecurityFixes::test_portal_requires_authentication_16_31[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestBillingSecurityFixes::test_subscription_requires_authentication_16_31[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestBillingSecurityFixes::test_subscription_ownership_check_16_31[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestSSRFProtection::test_alerts_requires_authentication_16_32[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestSSRFProtection::test_ssrf_localhost_blocked_16_32[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestSSRFProtection::test_ssrf_private_ip_blocked_16_32[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestSSRFProtection::test_ssrf_http_blocked_16_32[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestSSRFProtection::test_ssrf_allowlist_enforcement_16_32[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestDoSProtection::test_scan_payload_size_limit_16_35[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestDoSProtection::test_verify_payload_size_limit_16_35[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestDoSProtection::test_pagination_limit_capped_16_35[asyncio] PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestLicenseTierBypass::test_forged_key_rejected_16_33 PASSED [  1%]
tests/defense/test_security_fixes_16_29_35.py::TestLicenseTierBypass::test_unsigned_keys_blocked_in_production_16_33 PASSED [  1%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[README.md] PASSED [  1%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[CHANGELOG.md] PASSED [  1%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[CONTRIBUTING.md] PASSED [  1%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/POLICY-REFERENCE.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/RULE-CATALOG.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/ENTITLEMENT-GUIDE.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/ARCHITECTURE.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/PRD.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/TECHNICAL-SPEC.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/IMPLEMENTATION-PLAN.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/CLI-API-SPEC.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/TESTING-STRATEGY.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/SECURITY-COMPLIANCE.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/LEGAL-REVIEW-CHECKLIST.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/RELEASE-SAFETY.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/OBSERVABILITY-RUNBOOK.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/STANDOUT-ROADMAP.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/API-MIGRATIONS.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/ARTIFACT-COVERAGE.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/ENTERPRISE-READINESS-CHECKLIST.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/PRICING-MIGRATION-PLAN.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/LAUNCH-GUARDRAILS.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/PRICING-VALIDATION-LOG.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/sprint-7.3-hybrid-enforcement-runbook.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/SALES-CONTROL-PLANE-PLAYBOOK.md] PASSED [  2%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/SALES-ONE-PAGER-CONTROL-PLANE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_file_exists[docs/PRICING-ROLLOUT-LAUNCH-GATE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_not_empty[docs/POLICY-REFERENCE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_not_empty[docs/RULE-CATALOG.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_not_empty[docs/ENTITLEMENT-GUIDE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_not_empty[CONTRIBUTING.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_has_required_sections[docs/POLICY-REFERENCE.md-required_sections0] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_has_required_sections[docs/RULE-CATALOG.md-required_sections1] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_has_required_sections[docs/ENTITLEMENT-GUIDE.md-required_sections2] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_documentation_has_required_sections[CONTRIBUTING.md-required_sections3] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_readme_has_quickstart PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_changelog_has_version_entries PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_policy_reference_has_all_presets PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_rule_catalog_has_category_counts PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_entitlement_guide_has_all_tiers PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationExists::test_contributing_has_code_standards PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_table_of_contents[docs/POLICY-REFERENCE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_table_of_contents[docs/RULE-CATALOG.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_table_of_contents[docs/ENTITLEMENT-GUIDE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_table_of_contents[CONTRIBUTING.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_version_header[docs/POLICY-REFERENCE.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_version_header[docs/RULE-CATALOG.md] PASSED [  3%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_version_header[docs/ENTITLEMENT-GUIDE.md] PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_code_examples[docs/POLICY-REFERENCE.md] PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_code_examples[docs/RULE-CATALOG.md] PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_code_examples[docs/ENTITLEMENT-GUIDE.md] PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationQuality::test_documentation_has_code_examples[CONTRIBUTING.md] PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationLinks::test_policy_reference_links_to_rule_catalog PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationLinks::test_rule_catalog_links_to_policy_reference PASSED [  4%]
tests/docs/test_docs_exist.py::TestDocumentationLinks::test_entitlement_guide_links_to_other_docs PASSED [  4%]
tests/docs/test_explainer_provider_migration.py::test_explainer_provider_migration_doc_exists PASSED [  4%]
tests/docs/test_explainer_provider_migration.py::test_explainer_provider_migration_doc_contains_required_contract PASSED [  4%]
tests/docs/test_hybrid_runbook.py::test_hybrid_runbook_contains_migration_and_dry_run_checklist PASSED [  4%]
tests/docs/test_installation_org_enterprise_contract.py::test_team_bootstrap_docs_and_templates_exist PASSED [  4%]
tests/docs/test_installation_org_enterprise_contract.py::test_team_baseline_template_has_required_defaults PASSED [  4%]
tests/docs/test_installation_org_enterprise_contract.py::test_enterprise_private_deployment_guide_contract PASSED [  4%]
tests/docs/test_installation_spec_contract.py::test_install_spec_exists_and_has_required_shape PASSED [  4%]
tests/docs/test_installation_spec_contract.py::test_install_spec_channels_have_lifecycle_commands PASSED [  4%]
tests/docs/test_installation_spec_contract.py::test_installation_guide_exists_and_references_spec PASSED [  4%]
tests/docs/test_installation_spec_contract.py::test_installation_guide_covers_lifecycle_commands_from_spec PASSED [  4%]
tests/docs/test_installation_spec_contract.py::test_version_contract_is_deterministic PASSED [  4%]
tests/docs/test_installation_tracks.py::test_installation_track_docs_exist PASSED [  4%]
tests/docs/test_installation_tracks.py::test_installation_tracks_contain_expected_contract PASSED [  4%]
tests/docs/test_installation_tracks.py::test_installation_launch_checklist_exists_with_go_nogo PASSED [  4%]
tests/docs/test_npm_shim_contract.py::test_npm_shim_package_contract PASSED [  5%]
tests/docs/test_npm_shim_contract.py::test_npm_shim_wrapper_exists_and_is_executable_script PASSED [  5%]
tests/docs/test_npm_shim_contract.py::test_install_docs_reference_npm_shim_runtime_behavior PASSED [  5%]
tests/docs/test_pricing_launch_controls.py::test_sales_enablement_docs_cover_positioning_and_objections PASSED [  5%]
tests/docs/test_pricing_launch_controls.py::test_pricing_launch_gate_includes_hard_go_no_go_and_rollback PASSED [  5%]
tests/e2e/test_agent_mode.py::TestAgentOutputModeE2E::test_safe_skill_passes PASSED [  5%]
tests/e2e/test_agent_mode.py::TestAgentOutputModeE2E::test_malicious_skill_blocked PASSED [  5%]
tests/e2e/test_agent_mode.py::TestAgentOutputModeE2E::test_json_output_contains_policy PASSED [  5%]
tests/e2e/test_agent_mode.py::TestAgentOutputModeE2E::test_malicious_json_has_violations PASSED [  5%]
tests/e2e/test_agent_mode.py::TestAgentOutputModeE2E::test_invalid_mode_exit_code_3 PASSED [  5%]
tests/e2e/test_agent_mode.py::TestAgentOutputModeE2E::test_shorthand_flag PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_saas_mode_positive_and_quota_regression PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_private_relay_mode_positive_and_mode_isolated PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_airgap_mode_positive_and_drift PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_consume_scan_requires_authority_token_when_configured PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_reconcile_usage_requires_admin_key PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_decision_logs_redact_api_key PASSED [  5%]
tests/e2e/test_api_command_matrix.py::TestEntitlementApiModeMatrix::test_consume_scan_requires_subject_id PASSED [  5%]
tests/e2e/test_cli_command_matrix.py::TestExitCodeContract::test_safe_default_mode_exit_0 PASSED [  5%]
tests/e2e/test_cli_command_matrix.py::TestExitCodeContract::test_malicious_no_enforce_exit_0 PASSED [  5%]
tests/e2e/test_cli_command_matrix.py::TestExitCodeContract::test_malicious_enforce_exit_1_with_pro PASSED [  5%]
tests/e2e/test_cli_command_matrix.py::TestExitCodeContract::test_safe_enforce_exit_0_with_pro PASSED [  5%]
tests/e2e/test_cli_command_matrix.py::TestExitCodeContract::test_nonexistent_path_exit_3 PASSED [  5%]
tests/e2e/test_cli_command_matrix.py::TestExitCodeContract::test_enforce_without_api_key_exits_1 PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestScanModes::test_default_mode_explicit PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestScanModes::test_agent_output_mode_no_key_exits_1 PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestScanModes::test_agent_output_mode_safe_no_key_exits_0 PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestScanModes::test_pre_commit_mode_malicious_exits_1_no_key PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestScanModes::test_agent_output_mode_json_output PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_human_output_default PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_json_output_schema PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_json_output_malicious_has_findings PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_sarif_output_schema PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_unknown_output_format_falls_back_gracefully PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_json_written_to_report_file PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestOutputFormats::test_sarif_written_to_report_file PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_development_preset_passes_safe PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_staging_preset_passes_safe PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_production_preset_passes_safe PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_strict_preset_passes_safe PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_policy_file_from_fixtures PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_invalid_policy_file_exits_nonzero PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestPolicyPresets::test_invalid_preset_name_exits_nonzero PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestFleetMode::test_fleet_scan_safe_directory PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestFleetMode::test_fleet_without_key_passes_in_test_mode PASSED [  6%]
tests/e2e/test_cli_command_matrix.py::TestFleetMode::test_fleet_without_key_exits_1_in_production_mode PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestFleetMode::test_fleet_fail_on_any_with_malicious PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestVerbosityFlags::test_quiet_suppresses_stdout PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestVerbosityFlags::test_verbose_flag_produces_output PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestVerbosityFlags::test_no_color_flag PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestRulesCommand::test_rules_lists_all_categories PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestRulesCommand::test_rules_includes_known_rule_ids PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestRulesCommand::test_rules_help_exits_0 PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestVersionCommand::test_version_outputs_semver PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestVersionCommand::test_version_json PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestInitCommand::test_init_creates_policy_file PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestInitCommand::test_init_help PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestKeysCommand::test_keys_generate_creates_keypair PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestKeysCommand::test_keys_help PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestKeysCommand::test_keys_generate_help PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestHooksCommand::test_hooks_help PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestHooksCommand::test_hooks_install_in_git_repo PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestHooksCommand::test_hooks_uninstall_outside_git_repo PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestAuthCommand::test_auth_help PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestAuthCommand::test_auth_whoami_no_key_exits_gracefully PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestAuthCommand::test_auth_status_no_key PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestAuthCommand::test_auth_logout_no_key PASSED [  7%]
tests/e2e/test_cli_command_matrix.py::TestSimulateCommand::test_simulate_help PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestSimulateCommand::test_simulate_safe_bundle PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestSimulateCommand::test_simulate_multiple_bundles PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestSimulateCommand::test_simulate_no_args_exits_gracefully PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestVerifyCommand::test_verify_help PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestVerifyCommand::test_verify_nonexistent_report_exits_nonzero PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestVerifyCommand::test_verify_invalid_json_exits_nonzero PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestVerifyCommand::test_verify_signed_report_roundtrip PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_empty_directory_exits_gracefully PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_directory_with_no_manifest PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_scan_binary_file_exits_gracefully PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_scan_unicode_content_exits_gracefully PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_scan_large_file_skipped_with_warning PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_no_args_prints_usage PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_unknown_subcommand_exits_nonzero PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestNegativeEdgeCases::test_help_flag PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestEntitlementTierPaths::test_free_tier_scan_succeeds PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestEntitlementTierPaths::test_pro_tier_enforce_safe_exits_0 PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestEntitlementTierPaths::test_pro_tier_enforce_malicious_exits_1 PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestEntitlementTierPaths::test_pro_tier_sign_produces_signature PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestEntitlementTierPaths::test_enterprise_key_accepted PASSED [  8%]
tests/e2e/test_cli_command_matrix.py::TestEntitlementTierPaths::test_invalid_api_key_format_scan_succeeds_on_free PASSED [  8%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_safe_skill_passes PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_malicious_skill_fails PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_default_policy_is_production PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_malicious_development_passes PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_policy_file_path PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_invalid_policy_exit_3 PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_json_output_includes_policy PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_json_output_no_policy PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIPolicyE2E::test_enforce_quiet_mode_exit_code PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIInitE2E::test_init_creates_file PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIInitE2E::test_init_preset PASSED    [  9%]
tests/e2e/test_cli_policy.py::TestCLIInitE2E::test_init_no_overwrite PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIInitE2E::test_init_force_overwrite PASSED [  9%]
tests/e2e/test_cli_policy.py::TestCLIInitE2E::test_init_generated_is_valid_policy PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_output_safe_skill PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_output_malicious_skill PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_has_driver_rules PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_result_locations PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_with_policy PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_enforce_exit_code PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_report_file PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_quiet_mode PASSED [  9%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_schema_reference PASSED [ 10%]
tests/e2e/test_cli_sarif.py::TestCLISarifE2E::test_sarif_run_properties PASSED [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_safe_skill PASSED  [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_malicious_skill PASSED [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_json_output PASSED [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_malicious_json PASSED [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_nonexistent_exit_code_3 PASSED [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_quiet_mode PASSED  [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_version_command PASSED  [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_doctor_json_output PASSED [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_rules_command PASSED    [ 10%]
tests/e2e/test_cli_scan.py::TestCLIScanE2E::test_scan_report_file PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestSignFlag::test_scan_with_sign_produces_attestation PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestSignFlag::test_scan_without_sign_no_attestation PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestSignFlag::test_sign_without_keys_fails PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestVerifyCommand::test_verify_valid_report PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestVerifyCommand::test_verify_tampered_report_fails PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestVerifyCommand::test_verify_with_explicit_public_key PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestVerifyCommand::test_verify_nonexistent_file PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestKeysCommand::test_keys_generate PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestKeysCommand::test_keys_generate_twice_fails PASSED [ 10%]
tests/e2e/test_cli_verify.py::TestKeysCommand::test_keys_generate_force PASSED [ 10%]
tests/integration/test_bom_gate.py::test_unknown_skills_blocked_in_strict_mode PASSED [ 11%]
tests/integration/test_bom_gate.py::test_approved_skills_not_blocked PASSED [ 11%]
tests/integration/test_bom_gate.py::test_block_emitted_before_tool_call PASSED [ 11%]
tests/integration/test_ci_output.py::TestSarifPipeline::test_safe_skill_sarif PASSED [ 11%]
tests/integration/test_ci_output.py::TestSarifPipeline::test_malicious_skill_sarif PASSED [ 11%]
tests/integration/test_ci_output.py::TestSarifPipeline::test_sarif_rule_ids_match_results PASSED [ 11%]
tests/integration/test_ci_output.py::TestSarifPipeline::test_sarif_properties_match_report PASSED [ 11%]
tests/integration/test_ci_output.py::TestAnnotationPipeline::test_malicious_skill_annotations PASSED [ 11%]
tests/integration/test_ci_output.py::TestAnnotationPipeline::test_safe_skill_no_annotations PASSED [ 11%]
tests/integration/test_ci_output.py::TestAnnotationPipeline::test_status_summary_with_policy PASSED [ 11%]
tests/integration/test_ci_output.py::TestAnnotationPipeline::test_annotation_levels_match_severity PASSED [ 11%]
tests/integration/test_ci_output.py::TestSarifDeterminism::test_same_input_same_sarif PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_template_exists PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_valid_yaml PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_has_scan_job PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_scan_job_has_image PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_scan_job_has_stage PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_scan_job_has_variables PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_scan_job_has_artifacts PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_scan_job_has_sast_report PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_scan_job_has_rules PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_has_before_script PASSED [ 11%]
tests/integration/test_ci_templates.py::TestGitLabTemplate::test_has_script PASSED [ 11%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_template_exists PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_valid_yaml PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_has_definitions PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_has_steps PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_step_has_script PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_step_has_artifacts PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_step_has_image PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_has_pipelines PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_has_pull_request_trigger PASSED [ 12%]
tests/integration/test_ci_templates.py::TestBitbucketTemplate::test_has_branch_trigger PASSED [ 12%]
tests/integration/test_enrichment_pipeline.py::TestEnrichmentPipeline::test_malicious_skill_has_enrichment PASSED [ 12%]
tests/integration/test_enrichment_pipeline.py::TestEnrichmentPipeline::test_enrichment_in_json_report PASSED [ 12%]
tests/integration/test_enrichment_pipeline.py::TestEnrichmentPipeline::test_safe_skill_no_enrichment PASSED [ 12%]
tests/integration/test_enrichment_pipeline.py::TestEnrichmentPipeline::test_scan_report_backward_compatible PASSED [ 12%]
tests/integration/test_enrichment_pipeline.py::TestEnrichmentPipeline::test_determinism PASSED [ 12%]
tests/integration/test_gateway_runtime_efficacy_corpus.py::test_runtime_efficacy_corpus[dev-benign-echo-allow] PASSED [ 12%]
tests/integration/test_gateway_runtime_efficacy_corpus.py::test_runtime_efficacy_corpus[strict-destructive-rm-block] PASSED [ 12%]
tests/integration/test_gateway_runtime_efficacy_corpus.py::test_runtime_efficacy_corpus[strict-network-curl-block] PASSED [ 12%]
tests/integration/test_gateway_runtime_efficacy_corpus.py::test_runtime_efficacy_corpus[dev-network-class-not-allowlisted] PASSED [ 12%]
tests/integration/test_multilang_pipeline.py::TestGoScanPipeline::test_safe_go_skill_zero_findings PASSED [ 12%]
tests/integration/test_multilang_pipeline.py::TestGoScanPipeline::test_malicious_go_skill_has_findings PASSED [ 12%]
tests/integration/test_multilang_pipeline.py::TestGoScanPipeline::test_malicious_go_skill_positive_score PASSED [ 12%]
tests/integration/test_multilang_pipeline.py::TestRustScanPipeline::test_safe_rust_skill_zero_findings PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestRustScanPipeline::test_malicious_rust_skill_has_findings PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestRustScanPipeline::test_malicious_rust_skill_positive_score PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestRubyScanPipeline::test_safe_ruby_skill_zero_findings PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestRubyScanPipeline::test_malicious_ruby_skill_has_findings PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestRubyScanPipeline::test_malicious_ruby_skill_positive_score PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestCrossLanguageIsolation::test_go_rules_dont_fire_on_python PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestCrossLanguageIsolation::test_ruby_rules_dont_fire_on_python PASSED [ 13%]
tests/integration/test_multilang_pipeline.py::TestRuleCount::test_total_rule_count PASSED [ 13%]
tests/integration/test_performance.py::TestColdStart::test_import_under_2s PASSED [ 13%]
tests/integration/test_performance.py::TestScanPerformance::test_scan_10_files_under_3s PASSED [ 13%]
tests/integration/test_performance.py::TestScanPerformance::test_scan_100_files_under_10s PASSED [ 13%]
tests/integration/test_performance.py::TestRuleInstantiation::test_all_rules_instantiate_fast PASSED [ 13%]
tests/integration/test_performance.py::TestScoringPerformance::test_scoring_1000_findings_fast PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_safe_skill_passes_strict PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_malicious_skill_fails_production PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_malicious_skill_warns_development PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_custom_overrides_pipeline PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_resolve_policy_preset_enforcement PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_resolve_policy_file_enforcement PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_pipeline_deterministic_with_policy PASSED [ 13%]
tests/integration/test_policy_enforcement.py::TestPolicyEnforcementPipeline::test_disabled_rules_affect_score PASSED [ 13%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_safe_skill_pipeline PASSED [ 14%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_malicious_skill_pipeline PASSED [ 14%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_js_malicious_skill_pipeline PASSED [ 14%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_node_safe_skill_pipeline PASSED [ 14%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_mixed_bundle_pipeline PASSED [ 14%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_empty_bundle_pipeline PASSED [ 14%]
tests/integration/test_scan_pipeline.py::TestScanPipeline::test_pipeline_deterministic PASSED [ 14%]
tests/integration/test_security_audit.py::TestNoHardcodedSecrets::test_no_secrets_in_source PASSED [ 14%]
tests/integration/test_security_audit.py::TestNoUnsafeCodePatterns::test_no_eval_in_source PASSED [ 14%]
tests/integration/test_security_audit.py::TestNoUnsafeCodePatterns::test_no_exec_in_source PASSED [ 14%]
tests/integration/test_security_audit.py::TestNoUnsafeCodePatterns::test_no_shell_true_in_source PASSED [ 14%]
tests/integration/test_security_audit.py::TestNoPathTraversal::test_tar_extraction_blocks_traversal PASSED [ 14%]
tests/integration/test_security_audit.py::TestNoPathTraversal::test_zip_extraction_blocks_traversal PASSED [ 14%]
tests/integration/test_security_audit.py::TestDependencyVersions::test_pynacl_version PASSED [ 14%]
tests/integration/test_security_audit.py::TestDependencyVersions::test_pydantic_v2 PASSED [ 14%]
tests/integration/test_signed_reports.py::TestSignVerifyRoundtrip::test_safe_skill_roundtrip PASSED [ 14%]
tests/integration/test_signed_reports.py::TestSignVerifyRoundtrip::test_malicious_skill_roundtrip PASSED [ 14%]
tests/integration/test_signed_reports.py::TestSignVerifyRoundtrip::test_json_serialization_roundtrip PASSED [ 14%]
tests/integration/test_signed_reports.py::TestSignVerifyRoundtrip::test_tampered_finding_fails_verification PASSED [ 14%]
tests/integration/test_signed_reports.py::TestSignVerifyRoundtrip::test_tampered_score_fails_verification PASSED [ 14%]
tests/integration/test_signed_reports.py::TestSignVerifyRoundtrip::test_write_and_read_signed_report PASSED [ 14%]
tests/integration/test_top_guard.py::test_injection_detection_rate PASSED [ 14%]
tests/integration/test_top_guard.py::test_benign_false_positive_rate PASSED [ 15%]
tests/integration/test_top_guard.py::test_scan_latency_p95 PASSED        [ 15%]
tests/integration/test_top_guard.py::test_corpus_minimum_size PASSED     [ 15%]
tests/unit/test_analyzer/test_base_ast_rule.py::TestAstRuleLanguageFilter::test_skips_non_target_language PASSED [ 15%]
tests/unit/test_analyzer/test_base_ast_rule.py::TestAstRuleTreesitterUnavailable::test_returns_empty_when_unavailable PASSED [ 15%]
tests/unit/test_analyzer/test_base_ast_rule.py::TestAstRuleProcessMatches::test_process_matches_creates_findings PASSED [ 15%]
tests/unit/test_analyzer/test_base_ast_rule.py::TestAstRuleProcessMatches::test_process_matches_empty PASSED [ 15%]
tests/unit/test_analyzer/test_base_ast_rule.py::TestAstRuleProcessMatches::test_analyze_with_mock_treesitter PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestShellCorrelation::test_subprocess_without_declaration_raises PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestShellCorrelation::test_subprocess_with_shell_declared_ok PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestShellCorrelation::test_subprocess_declared_via_exec_synonym PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestShellCorrelation::test_curl_in_markdown_without_permission PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestShellCorrelation::test_corr001_severity_is_high PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestShellCorrelation::test_comment_line_not_flagged PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestEvalCorrelation::test_eval_without_declaration PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestEvalCorrelation::test_eval_with_eval_declared PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestEvalCorrelation::test_importlib_without_declaration PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestNetworkCorrelation::test_http_url_without_network_declared PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestNetworkCorrelation::test_http_url_with_network_declared PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestNetworkCorrelation::test_http_declared_via_internet_synonym PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestNetworkCorrelation::test_corr003_severity_is_medium PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestFilesystemCorrelation::test_file_write_without_fs_declared PASSED [ 15%]
tests/unit/test_analyzer/test_correlation.py::TestFilesystemCorrelation::test_file_write_with_filesystem_declared PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestFilesystemCorrelation::test_shutil_copy_without_declaration PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestCredentialCorrelation::test_api_key_without_credential_declared PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestCredentialCorrelation::test_api_key_with_credential_declared PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestCredentialCorrelation::test_credential_declared_via_secret_synonym PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestDeduplication::test_only_one_shell_finding_per_file PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestDeduplication::test_multiple_files_can_each_generate_finding PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestDeduplication::test_empty_sources_no_findings PASSED [ 16%]
tests/unit/test_analyzer/test_correlation.py::TestDeduplication::test_clean_code_no_findings PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestAnalysisEngine::test_analyze_safe_skill_no_findings PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestAnalysisEngine::test_analyze_malicious_skill_has_findings PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestAnalysisEngine::test_analyze_respects_disabled_rules PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestAnalysisEngine::test_analyze_empty_bundle PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestAnalysisEngine::test_findings_sorted_by_file_and_line PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestAnalysisEngine::test_analyze_js_malicious_skill PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestDeduplication::test_deduplicate_removes_duplicates PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestDeduplication::test_deduplicate_keeps_different_lines PASSED [ 16%]
tests/unit/test_analyzer/test_engine.py::TestDeduplication::test_deduplicate_empty_list PASSED [ 16%]
tests/unit/test_analyzer/test_engine_extended.py::TestShouldAnalyze::test_clean_file_skipped PASSED [ 16%]
tests/unit/test_analyzer/test_engine_extended.py::TestShouldAnalyze::test_suspicious_file_passes PASSED [ 16%]
tests/unit/test_analyzer/test_engine_extended.py::TestAnalyzeFile::test_rule_exception_handled PASSED [ 16%]
tests/unit/test_analyzer/test_engine_extended.py::TestAnalyzeBundleEdgeCases::test_empty_bundle_returns_empty PASSED [ 16%]
tests/unit/test_analyzer/test_engine_extended.py::TestAnalyzeBundleEdgeCases::test_no_scannable_files PASSED [ 17%]
tests/unit/test_analyzer/test_engine_extended.py::TestAnalyzeBundleEdgeCases::test_all_rules_disabled PASSED [ 17%]
tests/unit/test_analyzer/test_engine_extended.py::TestAnalyzeBundleEdgeCases::test_thread_pool_exception_handled PASSED [ 17%]
tests/unit/test_analyzer/test_engine_extended.py::TestDeduplicateFindings::test_removes_exact_duplicates PASSED [ 17%]
tests/unit/test_analyzer/test_engine_extended.py::TestDeduplicateFindings::test_keeps_different_lines PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[subprocess.run] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[subprocess.Popen] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[subprocess.call] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[os.system] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[os.popen] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[eval(user_input)] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[eval(request data)] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[exec(compile(...))] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[requests.get] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[urllib.urlopen] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[github token] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[stripe key] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[DAN keyword] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[ignore previous instructions] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[INJ-001 override] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[curl pipe bash] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[curl pipe sudo bash] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[config password] PASSED [ 17%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_detect[config debug mode] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[commented subprocess] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[commented os.system] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[evaluate_score function] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[evaluation.run method] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[url in comment] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[env var read] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[regex pattern] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[normal instruction] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[game rules] PASSED [ 18%]
tests/unit/test_analyzer/test_fn_fp_harness.py::test_must_not_detect[non-secret config key] PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestShouldSkipLargeFile::test_small_file_not_skipped PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestShouldSkipLargeFile::test_file_exactly_at_limit_not_skipped PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestShouldSkipLargeFile::test_file_over_limit_skipped PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestShouldSkipLargeFile::test_empty_file_not_skipped PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestShouldSkipLargeFile::test_path_included_in_check PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestShouldSkipLargeFile::test_unicode_heavy_file_check_uses_byte_length PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestTruncateLines::test_short_file_unchanged PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestTruncateLines::test_at_limit_unchanged PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestTruncateLines::test_over_limit_truncated PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestTruncateLines::test_empty_lines_unchanged PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestTruncateLines::test_truncated_result_is_prefix PASSED [ 18%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_initial_state PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_can_accept_within_budget PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_can_accept_exact_budget PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_cannot_accept_over_budget PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_record_updates_state PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_reject_updates_state PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_is_exhausted_after_full_budget PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_multiple_records_accumulate PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestExtractionBudget::test_remaining_never_negative PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestScanTimer::test_elapsed_ms_increases PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestScanTimer::test_elapsed_s_is_ms_divided_by_1000 PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestScanTimer::test_within_slo_returns_true PASSED [ 19%]
tests/unit/test_analyzer/test_perf_guard.py::TestScanTimer::test_exceeded_slo_returns_false PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_base_language_filter.py::TestLanguageRegexRule::test_matches_target_language PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_base_language_filter.py::TestLanguageRegexRule::test_skips_non_target_language PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_base_language_filter.py::TestLanguageRegexRule::test_skips_unknown_language PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_base_language_filter.py::TestLanguageRegexRule::test_skips_all_non_go_languages PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestEnvVariableRule::test_detects_os_environ PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestEnvVariableRule::test_detects_os_getenv PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestEnvVariableRule::test_detects_process_env PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestApiKeyPatternRule::test_detects_hardcoded_key PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestApiKeyPatternRule::test_no_false_positive_short_string PASSED [ 19%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestSshKeyReadRule::test_detects_ssh_key PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestAwsCredentialsRule::test_detects_aws_creds PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestAwsCredentialsRule::test_detects_aws_key_ref PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestKeychainAccessRule::test_detects_keyring PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestTokenExfilRule::test_detects_env_plus_http PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestTokenExfilRule::test_no_finding_env_only PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_credential.py::TestTokenExfilRule::test_no_finding_http_only PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestPythonEvalRule::test_detects_eval PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestPythonEvalRule::test_ignores_comment PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestPythonExecRule::test_detects_exec PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestJsEvalRule::test_detects_js_eval PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestJsFunctionRule::test_detects_new_function PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestCompileRule::test_detects_compile_with_string PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestImportlibRule::test_detects_importlib PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_eval.py::TestImportlibRule::test_detects_dunder_import PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestFileWriteRule::test_detects_open_write PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestFileWriteRule::test_detects_path_write_text PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestPathTraversalRule::test_detects_dotdot PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestSensitiveReadRule::test_detects_ssh_access PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestSensitiveReadRule::test_detects_aws_access PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestSensitiveReadRule::test_detects_etc_passwd PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestTmpExecutionRule::test_detects_tmp_script PASSED [ 20%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestTmpExecutionRule::test_detects_chmod_executable PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestGlobExpansionRule::test_detects_system_glob PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_filesystem.py::TestSymlinkCreationRule::test_detects_symlink PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoExecCommandRule::test_detects_exec_command PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoExecCommandRule::test_ignores_python_files PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoExecCommandRule::test_ignores_comments PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoExecOutputRule::test_detects_output PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoExecOutputRule::test_detects_run PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoExecOutputRule::test_detects_combined_output PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoHttpRequestRule::test_detects_http_get PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoHttpRequestRule::test_detects_http_post PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoHttpRequestRule::test_detects_new_request PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoNetDialRule::test_detects_net_dial PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoNetDialRule::test_detects_dial_timeout PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoHttpListenRule::test_detects_listen_and_serve PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoFileWriteRule::test_detects_os_create PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoFileWriteRule::test_detects_write_file PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoFileDeleteRule::test_detects_os_remove PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoFileDeleteRule::test_detects_remove_all PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoPathTraversalRule::test_detects_traversal PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoReflectCallRule::test_detects_reflect_call PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoPluginOpenRule::test_detects_plugin_open PASSED [ 21%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoEnvAccessRule::test_detects_getenv PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoEnvAccessRule::test_detects_setenv PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoHardcodedKeyRule::test_detects_hardcoded_key PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_go.py::TestGoSqlInjectionRule::test_detects_sql_sprintf PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_go.py::TestLanguageScoping::test_all_go_rules_skip_python PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_injection.py::TestPromptOverrideRule::test_detects_ignore_instructions PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_injection.py::TestPromptOverrideRule::test_detects_system_prompt PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_injection.py::TestCommandInjectionRule::test_detects_os_system_fstring PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_injection.py::TestCommandInjectionRule::test_detects_subprocess_fstring PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_injection.py::TestSqlInjectionRule::test_detects_fstring_sql PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_injection.py::TestTemplateInjectionRule::test_detects_render_template_string PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsChildProcessAstRule::test_skips_python PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsChildProcessAstRule::test_skips_when_ts_unavailable PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsChildProcessAstRule::test_detects_with_mock_ts PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsEvalAstRule::test_skips_non_js PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsEvalAstRule::test_has_correct_metadata PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsFetchAstRule::test_has_correct_id PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsFsAstRule::test_has_correct_id PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestJsNewFunctionAstRule::test_has_correct_id PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestLanguageScoping::test_js_rules_skip_python PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_js_ast.py::TestLanguageScoping::test_js_rules_accept_typescript PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_network.py::TestHttpRequestRule::test_detects_requests_get PASSED [ 22%]
tests/unit/test_analyzer/test_rules/test_network.py::TestHttpRequestRule::test_detects_httpx PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestHttpRequestRule::test_detects_fetch PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestHttpRequestRule::test_no_false_positive PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestSocketConnectionRule::test_detects_socket_connect PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestDnsLookupRule::test_detects_gethostbyname PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestWebhookPostRule::test_detects_requests_post PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestHardcodedIpRule::test_detects_ip_in_string PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestHardcodedIpRule::test_ignores_non_ip PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestFtpConnectionRule::test_detects_ftplib PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_network.py::TestFtpConnectionRule::test_detects_ftp_url PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestBase64PayloadRule::test_detects_b64decode PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestBase64PayloadRule::test_detects_long_base64_string PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestCharCodeConcatRule::test_detects_chr_chain PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestCharCodeConcatRule::test_no_false_positive_single_chr PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestHexEncodingRule::test_detects_hex_sequence PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestHexEncodingRule::test_detects_fromhex PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestStringReversalRule::test_detects_slice_reversal PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestMinifiedPayloadRule::test_detects_long_line PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestMinifiedPayloadRule::test_ignores_short_lines PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestMinifiedPayloadRule::test_ignores_comments PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_obfuscation.py::TestMinifiedPayloadRule::test_ignores_imports PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySystemCallRule::test_detects_system PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySystemCallRule::test_detects_kernel_system PASSED [ 23%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySystemCallRule::test_ignores_python PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyExecRule::test_detects_exec PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyBacktickRule::test_detects_backtick PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyBacktickRule::test_detects_percent_x PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyIoPopenRule::test_detects_io_popen PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyIoPopenRule::test_detects_open3 PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyProcessSpawnRule::test_detects_spawn PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyProcessSpawnRule::test_detects_process_spawn PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyHttpClientRule::test_detects_net_http PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyHttpClientRule::test_detects_httparty PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyHttpClientRule::test_detects_faraday PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyHttpClientRule::test_detects_rest_client PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySocketRule::test_detects_tcp_socket PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySocketRule::test_detects_udp_socket PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySocketRule::test_detects_socket_open PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyFileWriteRule::test_detects_file_write PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyFileWriteRule::test_detects_file_open PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyFileDeleteRule::test_detects_fileutils_rm PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyFileDeleteRule::test_detects_file_delete PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyFileDeleteRule::test_detects_rm_rf PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyPathTraversalRule::test_detects_traversal PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyEvalRule::test_detects_instance_eval PASSED [ 24%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyEvalRule::test_detects_class_eval PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySendRule::test_detects_send PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySendRule::test_detects_public_send PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyConstGetRule::test_detects_const_get PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubyEnvAccessRule::test_detects_env PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestRubySqlInjectionRule::test_detects_sql_interpolation PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_ruby.py::TestLanguageScoping::test_all_ruby_rules_skip_python PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustCommandNewRule::test_detects_command_new PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustCommandNewRule::test_ignores_python PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustCommandNewRule::test_ignores_comments PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustCommandOutputRule::test_detects_output PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustCommandOutputRule::test_detects_spawn PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustCommandOutputRule::test_detects_status PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustHttpClientRule::test_detects_reqwest PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustHttpClientRule::test_detects_hyper PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustHttpClientRule::test_detects_ureq PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustTcpConnectRule::test_detects_tcp_connect PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustTcpListenerRule::test_detects_tcp_bind PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustFileWriteRule::test_detects_file_create PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustFileWriteRule::test_detects_fs_write PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustFileDeleteRule::test_detects_remove_file PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustFileDeleteRule::test_detects_remove_dir_all PASSED [ 25%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustPathTraversalRule::test_detects_traversal PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustUnsafeBlockRule::test_detects_unsafe PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustDynamicLoadRule::test_detects_libloading PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustEnvAccessRule::test_detects_env_var PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustEnvAccessRule::test_detects_set_var PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustHardcodedKeyRule::test_detects_hardcoded_key PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestRustSqlInjectionRule::test_detects_sql_format PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_rust.py::TestLanguageScoping::test_all_rust_rules_skip_python PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestSubprocessCallRule::test_detects_subprocess_run PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestSubprocessCallRule::test_detects_subprocess_popen PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestSubprocessCallRule::test_detects_subprocess_call PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestSubprocessCallRule::test_ignores_comments PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestSubprocessCallRule::test_no_false_positive PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestSubprocessCallRule::test_correct_metadata PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestOsSystemRule::test_detects_os_system PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestOsSystemRule::test_ignores_comment PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestOsSystemAliasRule::test_detects_aliased_os_system PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestOsPopenRule::test_detects_os_popen PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestShellTrueRule::test_detects_shell_true PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestBacktickExecRule::test_detects_command_substitution PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestChildProcessRule::test_detects_child_process_exec PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestChildProcessRule::test_detects_require_child_process PASSED [ 26%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestShutilOperationsRule::test_detects_rmtree PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell.py::TestShutilOperationsRule::test_detects_move PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellCurlAstRule::test_skips_python PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellCurlAstRule::test_has_correct_id PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellCurlAstRule::test_detects_with_mock PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellSudoAstRule::test_has_correct_id PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellChmodAstRule::test_has_correct_id PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellRmAstRule::test_has_correct_id PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestShellEvalAstRule::test_has_correct_id PASSED [ 27%]
tests/unit/test_analyzer/test_rules/test_shell_ast.py::TestLanguageScoping::test_all_shell_ast_rules_skip_python PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter.py::TestTreesitterDegradation::test_is_available_returns_bool PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter.py::TestTreesitterDegradation::test_parse_returns_none_when_unavailable PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter.py::TestTreesitterDegradation::test_run_query_returns_empty_when_unavailable PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter.py::TestTreesitterDegradation::test_unknown_language_not_available PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter.py::TestTreesitterDegradation::test_run_query_unknown_returns_empty PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestGetTs::test_get_ts_caches_false PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestGetTs::test_get_ts_caches_module PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestIsAvailable::test_unknown_language_grammar_not_in_map PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestIsAvailable::test_returns_false_when_ts_unavailable PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestGetParser::test_returns_none_when_ts_unavailable PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestGetParser::test_returns_none_for_unknown_language PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestGetParser::test_caches_parser PASSED [ 27%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestGetParser::test_handles_import_error PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestParse::test_returns_none_when_parser_unavailable PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestParse::test_parses_with_mock_parser PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestRunQuery::test_returns_empty_when_ts_unavailable PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestRunQuery::test_returns_empty_when_tree_is_none PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestRunQuery::test_returns_empty_when_lang_not_in_ts_languages PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestRunQuery::test_handles_dict_captures PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestRunQuery::test_handles_list_captures PASSED [ 28%]
tests/unit/test_analyzer/test_treesitter_extended.py::TestRunQuery::test_handles_query_exception PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_cyrillic_a_replaced PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_cyrillic_e_replaced PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_cyrillic_o_replaced PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_fullwidth_letters_replaced PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_greek_alpha_replaced PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_ascii_unchanged PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_mixed_content PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestFoldConfusables::test_math_bold_letters_replaced PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestHasBidiOverrides::test_normal_text_no_bidi PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestHasBidiOverrides::test_rlo_detected PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestHasBidiOverrides::test_lro_detected PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestHasBidiOverrides::test_lri_detected PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestHasBidiOverrides::test_rlm_detected PASSED [ 28%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestHasBidiOverrides::test_empty_string_no_bidi PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_plain_ascii_unchanged PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_cyrillic_eval_normalised PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_fullwidth_subprocess_normalised PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_bidi_override_stripped PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_null_byte_stripped PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_control_chars_stripped PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_nfkc_normalisation_applied PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_path_in_warnings PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_empty_content_safe PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestNormaliseForAnalysis::test_multiple_issues_all_flagged PASSED [ 29%]
tests/unit/test_analyzer/test_unicode_normalizer.py::TestConfusableEvasionDetection::test_cyrillic_eval_caught_after_normalise PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackMessage::test_build_message_low_severity PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackMessage::test_build_message_critical_severity PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackMessage::test_build_message_no_policy PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackMessage::test_build_message_with_report_url PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackEndpoint::test_no_webhook_url_fails PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackEndpoint::test_send_alert_with_env_url PASSED [ 29%]
tests/unit/test_api/test_alerts_api.py::TestSlackEndpoint::test_alerts_blocked_for_free_tier PASSED [ 29%]
tests/unit/test_api/test_app_lifespan.py::test_lifespan_redis_init_failure_graceful_degradation[asyncio] PASSED [ 29%]
tests/unit/test_api/test_app_lifespan.py::test_lifespan_redis_none_skips_init[asyncio] PASSED [ 29%]
tests/unit/test_api/test_app_lifespan.py::test_lifespan_redis_shutdown_cleanup[asyncio] PASSED [ 29%]
tests/unit/test_api/test_audit_api.py::TestAuditExportEndpoint::test_requires_enterprise_tier PASSED [ 29%]
tests/unit/test_api/test_audit_api.py::TestAuditExportEndpoint::test_export_format_jsonl PASSED [ 30%]
tests/unit/test_api/test_audit_api.py::TestAuditExportEndpoint::test_export_format_csv PASSED [ 30%]
tests/unit/test_api/test_audit_api.py::TestAuditExportEndpoint::test_custom_policy_pack_requires_enterprise PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_signup_login_me_flow_with_session_tokens PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_refresh_rotation_and_logout_revokes_session PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_password_reset_flow PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_login_unverified_user_returns_403 PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_email_verification_flow_allows_login_after_confirm PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_demo_callback_login PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_login_lockout_after_repeated_failures PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_api_key_lifecycle PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_api_key_authz_denies_cross_user_revoke_and_rotate PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_signup_rate_limit_on_single_ip_bucket PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_unsupported_provider PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_non_demo_code_rejected PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_malformed_demo_code PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_empty_email_rejected PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_providers_list PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_oauth_returning_user_gets_token PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_login_with_wrong_email_returns_401 PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_me_without_token_returns_401 PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_me_with_invalid_token_returns_401 PASSED [ 30%]
tests/unit/test_api/test_auth_api_keys.py::test_duplicate_signup_returns_409 PASSED [ 31%]
tests/unit/test_api/test_auth_api_keys.py::test_profile_update_and_email_uniqueness PASSED [ 31%]
tests/unit/test_api/test_auth_api_keys.py::test_delete_account_soft_deletes_and_revokes_sessions_and_keys PASSED [ 31%]
tests/unit/test_api/test_auth_api_keys.py::test_usage_metrics_returns_expected_counts_and_tier PASSED [ 31%]
tests/unit/test_api/test_auth_contract_migration_modes.py::test_local_mode_auth_envelopes_remain_stable PASSED [ 31%]
tests/unit/test_api/test_auth_contract_migration_modes.py::test_supabase_mode_auth_envelopes_remain_stable_with_mocks PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_refresh_invalid_token_returns_401 PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_refresh_expired_token_is_revoked PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_refresh_inactive_account_returns_401 PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_logout_requires_valid_bearer PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_logout_all_revokes_user_sessions PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_password_reset_confirm_invalid_and_expired_token PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_password_reset_request_unknown_email_hides_existence PASSED [ 31%]
tests/unit/test_api/test_auth_edges.py::test_oauth_disabled_returns_404 PASSED [ 31%]
tests/unit/test_api/test_auth_observability.py::test_sanitize_context_redacts_sensitive_fields PASSED [ 31%]
tests/unit/test_api/test_auth_observability.py::test_failure_class_from_exception_http_mappings PASSED [ 31%]
tests/unit/test_api/test_auth_observability.py::test_failure_class_from_exception_auth_error PASSED [ 31%]
tests/unit/test_api/test_auth_observability.py::test_record_auth_decision_noop_safe PASSED [ 31%]
tests/unit/test_api/test_bot_mitigation.py::test_allows_skillgate_cli PASSED [ 31%]
tests/unit/test_api/test_bot_mitigation.py::test_allows_github_actions PASSED [ 31%]
tests/unit/test_api/test_bot_mitigation.py::test_blocks_curl PASSED      [ 31%]
tests/unit/test_api/test_bot_mitigation.py::test_blocks_scrapy PASSED    [ 31%]
tests/unit/test_api/test_bot_mitigation.py::test_blocks_python_requests PASSED [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_blocks_wget PASSED      [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_allows_normal_browser PASSED [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_allows_missing_user_agent PASSED [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_case_insensitive_matching PASSED [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_blocks_sqlmap PASSED    [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_blocks_nmap PASSED      [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_allows_gitlab_runner PASSED [ 32%]
tests/unit/test_api/test_bot_mitigation.py::test_error_response_not_retryable PASSED [ 32%]
tests/unit/test_api/test_db.py::TestDatabaseUrl::test_default_is_sqlite PASSED [ 32%]
tests/unit/test_api/test_db.py::TestDatabaseUrl::test_custom_from_env PASSED [ 32%]
tests/unit/test_api/test_db.py::TestAlembicDatabaseUrl::test_sqlite_conversion PASSED [ 32%]
tests/unit/test_api/test_db.py::TestAlembicDatabaseUrl::test_postgres_conversion PASSED [ 32%]
tests/unit/test_api/test_db.py::TestAlembicDatabaseUrl::test_passthrough_for_unknown_driver PASSED [ 32%]
tests/unit/test_api/test_db.py::TestShouldAutoInitDb::test_defaults_true_for_sqlite PASSED [ 32%]
tests/unit/test_api/test_db.py::TestShouldAutoInitDb::test_explicit_false PASSED [ 32%]
tests/unit/test_api/test_db.py::TestParseBool::test_truthy PASSED        [ 32%]
tests/unit/test_api/test_db.py::TestParseBool::test_none_default PASSED  [ 32%]
tests/unit/test_api/test_db.py::TestVerifyConnectivity::test_connectivity_succeeds PASSED [ 32%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_store_and_get PASSED [ 32%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_get_nonexistent PASSED [ 32%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_expired_code_is_pruned PASSED [ 32%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_get_by_user_code PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_get_by_user_code_not_found PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_get_by_user_code_expired PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_complete_device_code PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_complete_nonexistent PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_delete_device_code PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_delete_nonexistent PASSED [ 33%]
tests/unit/test_api/test_device_codes.py::TestDeviceCodeInMemory::test_clear_memory_store PASSED [ 33%]
tests/unit/test_api/test_entitlement_api.py::TestResolveUserEntitlement::test_returns_free_when_no_subscription PASSED [ 33%]
tests/unit/test_api/test_entitlement_api.py::TestResolveUserEntitlement::test_returns_subscription_tier PASSED [ 33%]
tests/unit/test_api/test_entitlement_api.py::TestResolveUserEntitlement::test_handles_invalid_tier_gracefully PASSED [ 33%]
tests/unit/test_api/test_entitlement_api.py::TestResolveUserEntitlement::test_prefers_most_recent_subscription PASSED [ 33%]
tests/unit/test_api/test_entitlement_api.py::TestResolveUserEntitlement::test_onprem_validation_fail_open_keeps_enterprise PASSED [ 33%]
tests/unit/test_api/test_entitlement_api.py::TestResolveUserEntitlement::test_onprem_validation_fail_closed_downgrades PASSED [ 33%]
tests/unit/test_api/test_entitlement_teams.py::TestTeamEntitlementCapabilities::test_team_tier_has_team_capabilities PASSED [ 33%]
tests/unit/test_api/test_entitlement_teams.py::TestTeamEntitlementCapabilities::test_free_tier_lacks_team_capabilities PASSED [ 33%]
tests/unit/test_api/test_entitlement_teams.py::TestTeamEntitlementCapabilities::test_enterprise_has_all_team_capabilities PASSED [ 33%]
tests/unit/test_api/test_entitlement_teams.py::TestKeyNamespace::test_get_key_namespace_default_for_non_enterprise PASSED [ 33%]
tests/unit/test_api/test_entitlement_teams.py::TestKeyNamespace::test_get_key_namespace_tier_scoped_for_enterprise PASSED [ 33%]
tests/unit/test_api/test_entitlement_teams.py::TestKeyNamespace::test_get_key_namespace_team_scoped PASSED [ 33%]
tests/unit/test_api/test_entitlements_api.py::test_consume_scan_uses_authoritative_daily_limit PASSED [ 33%]
tests/unit/test_api/test_entitlements_api.py::test_consume_scan_keys_quota_to_subject_across_multiple_api_keys PASSED [ 33%]
tests/unit/test_api/test_entitlements_api.py::test_reconcile_usage_detects_drift_and_requires_admin_key PASSED [ 34%]
tests/unit/test_api/test_entitlements_api.py::test_decision_logs_redact_sensitive_provenance PASSED [ 34%]
tests/unit/test_api/test_entitlements_api.py::test_consume_scan_requires_subject_id PASSED [ 34%]
tests/unit/test_api/test_entitlements_api.py::test_consume_scan_requires_signed_token_for_non_local_mode PASSED [ 34%]
tests/unit/test_api/test_entitlements_api.py::test_consume_scan_rejects_subject_mismatch PASSED [ 34%]
tests/unit/test_api/test_error_envelope.py::test_request_id_header_present_on_success PASSED [ 34%]
tests/unit/test_api/test_error_envelope.py::test_http_exception_uses_typed_error_envelope PASSED [ 34%]
tests/unit/test_api/test_error_envelope.py::test_validation_error_uses_typed_error_envelope PASSED [ 34%]
tests/unit/test_api/test_error_envelope.py::test_not_found_uses_typed_error_envelope PASSED [ 34%]
tests/unit/test_api/test_health.py::TestHealthEndpoint::test_health_returns_ok PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_empty PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_with_data PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_severity_filter PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_pagination PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_requires_auth PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_sort PASSED [ 34%]
tests/unit/test_api/test_hunt_api.py::TestHuntEndpoint::test_hunt_blocks_free_tier PASSED [ 34%]
tests/unit/test_api/test_license_api.py::TestLicenseValidation::test_valid_free_key PASSED [ 34%]
tests/unit/test_api/test_license_api.py::TestLicenseValidation::test_valid_pro_key PASSED [ 34%]
tests/unit/test_api/test_license_api.py::TestLicenseValidation::test_invalid_key PASSED [ 34%]
tests/unit/test_api/test_license_api.py::TestLicenseValidation::test_empty_key_rejected PASSED [ 34%]
tests/unit/test_api/test_license_api.py::TestLicenseTiers::test_list_tiers PASSED [ 34%]
tests/unit/test_api/test_payments_annual_billing.py::test_checkout_monthly_default PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_checkout_yearly_billing PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_checkout_team_yearly PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_checkout_invalid_interval PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_webhook_checkout_completed_yearly PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_webhook_subscription_updated_interval_change PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_tier_and_interval_extraction PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_subscription_response_includes_interval PASSED [ 35%]
tests/unit/test_api/test_payments_annual_billing.py::test_legacy_env_var_fallback PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_webhook_idempotency_and_checkout_provisioning PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_failed_webhook_moves_to_dead_letter_after_retries PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_replay_event_endpoint_and_reconciliation PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_stale_subscription_update_is_ignored PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_invoice_failure_paid_and_proration_transitions PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_refund_failure_compensation_and_dispute_resolution PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_customer_portal_sync_endpoint PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_checkout_rate_limit_enforced PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_out_of_order_events_do_not_override_newer_state PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_checkout_invalid_tier_returns_400 PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_checkout_missing_stripe_secret_returns_503 PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_checkout_circuit_open_returns_503 PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_create_customer_portal_and_get_subscription PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_get_subscription_not_found_returns_404 PASSED [ 35%]
tests/unit/test_api/test_payments_resilience.py::test_webhook_invalid_signature_and_missing_event_id PASSED [ 36%]
tests/unit/test_api/test_payments_resilience.py::test_webhook_missing_secret_returns_503 PASSED [ 36%]
tests/unit/test_api/test_payments_resilience.py::test_dead_letter_and_retry_endpoints_require_admin_key PASSED [ 36%]
tests/unit/test_api/test_payments_resilience.py::test_replay_not_found_and_invalid_payload PASSED [ 36%]
tests/unit/test_api/test_payments_resilience.py::test_retry_failed_skips_invalid_payload_and_returns_event_records PASSED [ 36%]
tests/unit/test_api/test_payments_resilience.py::test_reconcile_handles_remote_error_and_portal_sync_admin_required PASSED [ 36%]
tests/unit/test_api/test_pricing_api.py::test_pricing_catalog_contract PASSED [ 36%]
tests/unit/test_api/test_pricing_api.py::test_enterprise_catalog_price_band_and_annual_contract PASSED [ 36%]
tests/unit/test_api/test_pricing_api.py::test_pricing_catalog_emits_claim_ids_for_contract_validation PASSED [ 36%]
tests/unit/test_api/test_pricing_api.py::test_pricing_catalog_beta_free_onboarding_flag_overrides_paid_ctas PASSED [ 36%]
tests/unit/test_api/test_rate_limit.py::test_enforce_rate_limit_blocks_after_threshold PASSED [ 36%]
tests/unit/test_api/test_rate_limit.py::test_rate_limit_resets_after_window PASSED [ 36%]
tests/unit/test_api/test_resilience.py::test_circuit_opens_after_failures PASSED [ 36%]
tests/unit/test_api/test_resilience.py::test_success_resets_breaker PASSED [ 36%]
tests/unit/test_api/test_resilience.py::test_run_blocking_timeout_records_failure PASSED [ 36%]
tests/unit/test_api/test_resilience.py::test_run_blocking_success_path PASSED [ 36%]
tests/unit/test_api/test_retroscan_api.py::TestRetroscanEndpoint::test_retroscan_trigger_returns_job PASSED [ 36%]
tests/unit/test_api/test_retroscan_api.py::TestRetroscanEndpoint::test_retroscan_blocks_free_tier PASSED [ 36%]
tests/unit/test_api/test_roadmap_api.py::test_marketing_roadmap_contract PASSED [ 36%]
tests/unit/test_api/test_roadmap_api.py::test_marketing_roadmap_contains_removed_and_planned_items PASSED [ 36%]
tests/unit/test_api/test_scan_rate_limit.py::test_scan_submit_respects_free_tier_rate_limit PASSED [ 36%]
tests/unit/test_api/test_scan_rate_limit.py::test_scan_submit_allows_higher_rate_for_pro_tier PASSED [ 36%]
tests/unit/test_api/test_scan_rate_limit.py::test_rate_limit_blocks_temporarily PASSED [ 37%]
tests/unit/test_api/test_scans_api.py::TestScanSubmit::test_submit_scan PASSED [ 37%]
tests/unit/test_api/test_scans_api.py::TestScanSubmit::test_get_scan PASSED [ 37%]
tests/unit/test_api/test_scans_api.py::TestScanSubmit::test_get_nonexistent_scan PASSED [ 37%]
tests/unit/test_api/test_scans_api.py::TestScanSubmit::test_list_scans_empty PASSED [ 37%]
tests/unit/test_api/test_scans_api.py::TestScanSubmit::test_list_scans_with_data PASSED [ 37%]
tests/unit/test_api/test_scans_api.py::TestScanSubmit::test_list_scans_pagination PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_x_content_type_options PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_x_frame_options PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_referrer_policy PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_permissions_policy PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_csp_header PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_x_xss_protection_disabled PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_x_request_id_present PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_custom_request_id_echoed PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_hsts_not_present_in_development PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_hsts_present_when_enabled PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_headers_on_error_response PASSED [ 37%]
tests/unit/test_api/test_security_headers.py::TestSecurityHeaders::test_headers_on_post_endpoint PASSED [ 37%]
tests/unit/test_api/test_security_utils.py::TestPasswordHashing::test_hash_and_verify PASSED [ 37%]
tests/unit/test_api/test_security_utils.py::TestPasswordHashing::test_wrong_password PASSED [ 37%]
tests/unit/test_api/test_security_utils.py::TestPasswordHashing::test_invalid_hash_format PASSED [ 37%]
tests/unit/test_api/test_security_utils.py::TestAccessToken::test_create_and_decode PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestAccessToken::test_create_without_session PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestAccessToken::test_invalid_token PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestAccessToken::test_wrong_token_type PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestAccessToken::test_missing_subject PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestAccessToken::test_invalid_session_type PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestRefreshToken::test_generate_has_prefix PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestRefreshToken::test_hash_is_deterministic PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestApiKey::test_generate_has_prefix PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestApiKey::test_prefix_extraction PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestApiKey::test_hash_is_deterministic PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestProductionGuards::test_jwt_secret_from_env PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestProductionGuards::test_api_key_pepper_from_env PASSED [ 38%]
tests/unit/test_api/test_security_utils.py::TestProductionGuards::test_refresh_token_pepper_from_env PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestParseBool::test_none_returns_default PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestParseBool::test_truthy_values PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestParseBool::test_falsy_values PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestParseOrigins::test_none_returns_defaults PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestParseOrigins::test_custom_origins PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestParseOrigins::test_empty_string_returns_defaults PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_is_production_true PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_is_production_staging PASSED [ 38%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_is_production_false_for_dev PASSED [ 39%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_validate_startup_dev_passes PASSED [ 39%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_validate_startup_production_no_jwt_secret PASSED [ 39%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_validate_startup_production_no_pepper PASSED [ 39%]
tests/unit/test_api/test_settings.py::TestAppSettings::test_validate_startup_production_wildcard_cors_with_creds PASSED [ 39%]
tests/unit/test_api/test_settings.py::TestGetSettings::test_returns_cached_settings PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestExtractSupabaseUser::test_extracts_from_user_key PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestExtractSupabaseUser::test_extracts_from_root PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestExtractSupabaseUser::test_empty_data_returns_empty PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestUserMetadata::test_prefers_user_metadata PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestUserMetadata::test_falls_back_to_raw PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestUserMetadata::test_empty_if_none PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestMapSupabaseUserToProfile::test_basic_mapping PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestMapSupabaseUserToProfile::test_missing_id_raises_value_error PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestMapSupabaseUserToProfile::test_unverified_email PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestMapSupabaseUserToProfile::test_subscription_fields_loaded PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseSignup::test_signup_returns_verification_pending PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseSignup::test_signup_409_on_auth_error PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseLogin::test_login_returns_auth_response PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseLogin::test_login_401_on_bad_credentials PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseLogin::test_login_403_unverified_email PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseLogout::test_logout_revokes_session_row PASSED [ 39%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseLogout::test_logout_proceeds_even_if_supabase_signout_fails PASSED [ 40%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseOAuthCallback::test_demo_code_always_rejected PASSED [ 40%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseOAuthCallback::test_unsupported_provider_rejected PASSED [ 40%]
tests/unit/test_api/test_supabase_auth_provider.py::TestSupabaseOAuthCallback::test_successful_pkce_exchange PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignUp::test_success PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignUp::test_401_raises_auth_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignUp::test_422_raises_value_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignUp::test_429_raises_supabase_client_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignIn::test_success_returns_tokens PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignIn::test_invalid_credentials_raises_auth_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestRefreshSession::test_success PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestRefreshSession::test_expired_token_raises_auth_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignOut::test_success_204 PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestSignOut::test_transport_error_raises_supabase_client_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestRetryBehavior::test_retries_on_500_then_succeeds PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestRetryBehavior::test_exhausted_retries_raise_supabase_client_error PASSED [ 40%]
tests/unit/test_api/test_supabase_client.py::TestContextManager::test_async_context_manager PASSED [ 40%]
tests/unit/test_api/test_supabase_egress.py::test_host_from_url_extracts_lowercase_host PASSED [ 40%]
tests/unit/test_api/test_supabase_egress.py::test_host_from_url_handles_invalid PASSED [ 40%]
tests/unit/test_api/test_supabase_egress.py::test_is_host_allowed_true_for_allowlisted_host PASSED [ 40%]
tests/unit/test_api/test_supabase_egress.py::test_is_host_allowed_false_for_unexpected_host PASSED [ 40%]
tests/unit/test_api/test_supabase_egress.py::test_backoff_increases_with_attempt_number PASSED [ 40%]
tests/unit/test_api/test_supabase_egress.py::test_circuit_breaker_opens_after_threshold PASSED [ 41%]
tests/unit/test_api/test_supabase_egress.py::test_circuit_breaker_recovers_after_window PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAllowedAlgorithms::test_rs256_allowed PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAllowedAlgorithms::test_es256_allowed PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAllowedAlgorithms::test_hs256_allowed PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAllowedAlgorithms::test_none_not_allowed PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAllowedAlgorithms::test_hs512_not_allowed PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_valid_token_returns_claims PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_expired_token_raises_auth_error PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_wrong_secret_raises_auth_error PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_missing_sub_raises_auth_error PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_empty_sub_raises_auth_error PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAlgorithmEnforcement::test_junk_token_raises_auth_error PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestAlgorithmEnforcement::test_no_config_raises_auth_error PASSED [ 41%]
tests/unit/test_api/test_supabase_jwt.py::TestJwksCacheInvalidation::test_invalidate_does_not_raise PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestValidAuthProviders::test_valid_set_contains_local_and_supabase PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestValidAuthProviders::test_no_other_values_accepted PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestAuthProviderField::test_default_is_local PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestAuthProviderField::test_supabase_provider_flag PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestAuthProviderField::test_supabase_url_defaults_none PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_invalid_provider_always_raises_regardless_of_environment PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_local_provider_dev_passes PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_provider_dev_passes_without_secrets PASSED [ 41%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_provider_production_missing_url_raises PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_provider_production_missing_anon_key_raises PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_provider_production_missing_service_role_key_raises PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_production_no_jwt_or_jwks_raises PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_production_with_jwt_secret_passes PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_supabase_production_with_jwks_url_passes PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestValidateStartupAuthProvider::test_local_production_still_requires_pepper PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestGetSettingsAuthProvider::test_default_auth_provider_is_local PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestGetSettingsAuthProvider::test_supabase_provider_from_env PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestGetSettingsAuthProvider::test_jwks_url_derived_from_supabase_url PASSED [ 42%]
tests/unit/test_api/test_supabase_settings.py::TestGetSettingsAuthProvider::test_jwks_url_explicit_override PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_create_team PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_get_team PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_get_nonexistent_team PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_invite_member PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_invite_duplicate_member PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_invite_exceeds_seats PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_list_members PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_remove_member PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_remove_nonexistent_member PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::TestTeamManagement::test_used_seats_updates PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::test_team_routes_block_free_tier PASSED [ 42%]
tests/unit/test_api/test_teams_api.py::test_team_create_enforces_contract_seat_cap PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestNoOpStubs::test_noop_meter_creates_counter PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestNoOpStubs::test_noop_meter_creates_histogram PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestNoOpStubs::test_noop_counter_add PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestNoOpStubs::test_noop_histogram_record PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestNoOpStubs::test_noop_span_context_manager PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestNoOpStubs::test_noop_tracer_returns_span PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestHelpers::test_otel_enabled_truthy_values PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestHelpers::test_otel_enabled_false_when_unset PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestHelpers::test_check_otel_returns_false_without_sdk PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestGetMeter::test_returns_noop_when_disabled PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestGetMeter::test_returns_noop_when_enabled_but_no_sdk PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestGetTracer::test_returns_noop_when_disabled PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestGetTracer::test_returns_noop_when_enabled_but_no_sdk PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestInstrumentApp::test_noop_when_disabled PASSED [ 43%]
tests/unit/test_api/test_telemetry.py::TestInstrumentApp::test_warns_when_enabled_but_no_sdk PASSED [ 43%]
tests/unit/test_api/test_verify_api.py::TestVerifyEndpoint::test_verify_valid_report PASSED [ 43%]
tests/unit/test_api/test_verify_api.py::TestVerifyEndpoint::test_verify_tampered_report PASSED [ 43%]
tests/unit/test_api/test_verify_api.py::TestVerifyEndpoint::test_verify_with_explicit_key PASSED [ 43%]
tests/unit/test_api/test_verify_api.py::TestVerifyEndpoint::test_verify_no_attestation PASSED [ 43%]
tests/unit/test_api/test_worker.py::TestSendSlackNotification::test_success PASSED [ 43%]
tests/unit/test_api/test_worker.py::TestSendSlackNotification::test_missing_webhook_url PASSED [ 43%]
tests/unit/test_api/test_worker.py::TestSendSlackNotification::test_http_error_raises PASSED [ 44%]
tests/unit/test_api/test_worker.py::TestSendEmailNotification::test_returns_true PASSED [ 44%]
tests/unit/test_api/test_worker.py::TestWorkerLifecycle::test_startup PASSED [ 44%]
tests/unit/test_api/test_worker.py::TestWorkerLifecycle::test_shutdown PASSED [ 44%]
tests/unit/test_api/test_worker.py::TestWorkerSettings::test_functions_registered PASSED [ 44%]
tests/unit/test_api/test_worker.py::TestWorkerSettings::test_max_tries PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_high_severity_is_error PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_critical_severity_is_error PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_medium_severity_is_warning PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_low_severity_is_notice PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_file_and_line PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_column_included PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_no_column PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_rule_id_in_message PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_bundle_root_prefix PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestFindingToAnnotation::test_no_double_slash PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateAnnotations::test_empty_findings PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateAnnotations::test_multiple_findings PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateStatusSummary::test_passed_summary PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateStatusSummary::test_failed_summary PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateStatusSummary::test_policy_name_shown PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateStatusSummary::test_no_policy_name PASSED [ 44%]
tests/unit/test_ci/test_annotations.py::TestGenerateStatusSummary::test_markdown_table PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_deduplicate_removes_exact_duplicates PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_deduplicate_preserves_unique_findings PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_deduplicate_empty_list PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_group_annotations_enforces_per_file_limit PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_group_annotations_no_limit_when_under_threshold PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_group_annotations_handles_missing_file PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_suppress_baseline_filters_matching_findings PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_suppress_baseline_empty_baseline PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_suppress_baseline_no_matches PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_load_baseline_valid_file PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_load_baseline_missing_file PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_load_baseline_invalid_json PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_load_baseline_invalid_structure PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_load_baseline_invalid_rule_ids PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_save_baseline_creates_file PASSED [ 45%]
tests/unit/test_ci/test_noise.py::TestCINoiseFilter::test_save_baseline_sorted_keys PASSED [ 45%]
tests/unit/test_ci/test_wrapper_enforcement.py::test_wrapper_check_flags_direct_agent_cli PASSED [ 45%]
tests/unit/test_ci/test_wrapper_enforcement.py::test_wrapper_check_accepts_wrapped_agent_cli PASSED [ 45%]
tests/unit/test_claim_ledger.py::test_claim_ledger_rows_are_well_formed PASSED [ 45%]
tests/unit/test_claim_ledger.py::test_pricing_copy_matches_claim_ledger_status_contract PASSED [ 45%]
tests/unit/test_cli/test_approval_commands.py::test_approval_sign_and_verify PASSED [ 45%]
tests/unit/test_cli/test_auth.py::TestCredentialsStorage::test_save_and_load_credentials PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestCredentialsStorage::test_load_credentials_missing_file PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestCredentialsStorage::test_load_credentials_invalid_json PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestCredentialsStorage::test_clear_credentials PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestCredentialsStorage::test_clear_credentials_no_file PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetApiKey::test_get_api_key_from_env PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetApiKey::test_get_api_key_from_stored PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetApiKey::test_get_api_key_env_takes_priority PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetApiKey::test_get_api_key_none PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestIsAuthenticated::test_is_authenticated_with_env PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestIsAuthenticated::test_is_authenticated_with_stored PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestIsAuthenticated::test_is_not_authenticated PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetTier::test_get_tier_from_pro_key PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetTier::test_get_tier_from_team_key PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetTier::test_get_tier_from_enterprise_key PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestGetTier::test_get_tier_free_when_no_key PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestLoginCommand::test_login_shows_already_authenticated_via_env PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestLoginCommand::test_login_shows_already_logged_in PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestLogoutCommand::test_logout_clears_credentials PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestLogoutCommand::test_logout_shows_env_var_message PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestWhoamiCommand::test_whoami_not_logged_in PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestWhoamiCommand::test_whoami_shows_env_auth PASSED [ 46%]
tests/unit/test_cli/test_auth.py::TestWhoamiCommand::test_whoami_shows_stored_auth PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_is_tty_checks_stdout PASSED   [ 47%]
tests/unit/test_cli/test_branding.py::test_is_tty_returns_false_for_non_tty PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_term_width_returns_default_on_error PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_strip_ansi_removes_escape_sequences PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_visible_len_counts_without_ansi PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_should_show_brand_returns_true_for_no_args PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_should_show_brand_returns_false_with_args PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_should_show_brand_respects_no_banner_env PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_should_show_brand_respects_no_color_env PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_maybe_print_brand_respects_tty PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_print_skillgate_brand_skips_for_non_tty PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_center_ansi_pads_correctly PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_ansi_safe_trim_truncates_to_visible_width PASSED [ 47%]
tests/unit/test_cli/test_branding.py::test_colorize_skillgate_line_adds_colors PASSED [ 47%]
tests/unit/test_cli/test_command_tree.py::test_root_help_lists_all_top_level_commands_and_groups PASSED [ 47%]
tests/unit/test_cli/test_command_tree.py::test_each_top_level_command_help_is_accessible PASSED [ 47%]
tests/unit/test_cli/test_command_tree.py::test_each_command_group_and_subcommand_help_is_accessible PASSED [ 47%]
tests/unit/test_cli/test_command_tree.py::test_required_argument_commands_fail_without_required_inputs PASSED [ 47%]
tests/unit/test_cli/test_doctor_command.py::test_doctor_human_output_renders_sections PASSED [ 47%]
tests/unit/test_cli/test_doctor_command.py::test_doctor_json_output_contains_expected_fields PASSED [ 47%]
tests/unit/test_cli/test_doctor_command.py::test_doctor_rejects_unknown_output PASSED [ 47%]
tests/unit/test_cli/test_drift_commands.py::test_drift_baseline_and_check_detects_domain_drift PASSED [ 47%]
tests/unit/test_cli/test_drift_commands.py::test_drift_check_no_drift_passes PASSED [ 48%]
tests/unit/test_cli/test_drift_commands.py::test_drift_fleet_detects_new_bundle PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_scan_enforce_blocked_for_free_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_scan_sign_blocked_for_free_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_scan_explain_blocked_for_free_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_scan_pro_tier_allows_enforce PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_sarif_output_blocked_for_free_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_sarif_output_blocked_for_pro_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_sarif_output_allowed_for_team_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_scan_quota_enforced_for_free_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_scan_quota_not_consumed_when_no_files_scanned PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_saas_mode_ignores_local_quota_file PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_saas_mode_authority_denial_blocks_scan PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_saas_mode_authority_called_once_per_scan PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_team_contract_seat_limit_blocks_scan PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_team_contract_seat_limit_passes_when_within_limit PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_ci_blocking_requires_team_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_fleet_scan_requires_team_tier PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_saas_mode_missing_signed_token_blocks_scan PASSED [ 48%]
tests/unit/test_cli/test_entitlement_gates.py::test_mode_lock_mismatch_blocks_scan PASSED [ 48%]
tests/unit/test_cli/test_formatters/test_human.py::TestHumanFormatter::test_format_empty_report PASSED [ 48%]
tests/unit/test_cli/test_formatters/test_human.py::TestHumanFormatter::test_format_report_with_findings PASSED [ 48%]
tests/unit/test_cli/test_formatters/test_human.py::TestHumanFormatter::test_format_includes_breakdown PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestSeverityColors::test_color_map_covers_all_severities PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestSeverityColors::test_critical_is_bright_red PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestSeverityColors::test_high_is_dark_orange PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestSeverityColors::test_medium_is_yellow PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestSeverityColors::test_low_is_cyan PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestSeverityColors::test_severity_colors_in_output PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_color_green_low PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_color_yellow_mid PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_color_orange_high PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_color_red_critical PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_color_above_200 PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_bar_zero PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_bar_max PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_bar_mid PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_bar_clamps_negative PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_bar_clamps_above_200 PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_score_bar_in_header PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestScoreGradient::test_breakdown_scores_colored PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_eval PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_exec PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_subprocess PASSED [ 49%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_shell_true PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_curl_bash PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_rm_rf PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_os_system PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_no_highlight_safe_text PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_highlight_case_insensitive PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_dangerous_tokens_in_findings PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDangerousTokenHighlighting::test_dangerous_tokens_in_snippet PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestDimFilePaths::test_file_path_dim_in_table PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestNoColorFallback::test_no_color_strips_ansi PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestNoColorFallback::test_no_color_vs_color_same_content PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestNoColorFallback::test_color_output_has_ansi PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_color.py::TestNoColorFallback::test_no_color_default_is_colored PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_extended.py::TestHumanFormatterPolicyViolations::test_format_policy_passed PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_extended.py::TestHumanFormatterPolicyViolations::test_format_policy_failed_with_violations PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_extended.py::TestHumanFormatterPolicyViolations::test_format_policy_failed_string_violations PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_extended.py::TestHumanFormatterPolicyViolations::test_format_with_console_returns_empty PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_extended.py::TestHumanFormatterPolicyViolations::test_format_finding_without_remediation PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_human_extended.py::TestHumanFormatterPolicyViolations::test_format_finding_without_snippet PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_json.py::TestJsonFormatter::test_valid_json_output PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_json.py::TestJsonFormatter::test_json_includes_findings PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_json.py::TestJsonFormatter::test_json_schema_compliance PASSED [ 50%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestFormatProvenance::test_no_provenance_returns_none PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestFormatProvenance::test_code_origin_label PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestFormatProvenance::test_document_text_label PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestFormatProvenance::test_archive_member_label PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestHumanFormatterProvenance::test_origin_column_shown_when_findings_have_provenance PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestHumanFormatterProvenance::test_origin_not_shown_when_no_provenance PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestHumanFormatterProvenance::test_provenance_shown_in_details PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestHumanFormatterProvenance::test_extraction_manifest_summary_shown PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestHumanFormatterProvenance::test_extraction_manifest_warnings_shown PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestHumanFormatterProvenance::test_no_extraction_manifest_section_when_none PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestJsonFormatterProvenance::test_provenance_field_in_finding PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestJsonFormatterProvenance::test_extraction_manifest_in_json PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestJsonFormatterProvenance::test_no_provenance_serialized_as_null PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestSarifFormatterProvenance::test_srcroot_base_when_no_provenance PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestSarifFormatterProvenance::test_origin_type_in_uri_base_id PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestSarifFormatterProvenance::test_section_in_sarif_properties PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestSarifFormatterProvenance::test_extraction_manifest_in_sarif_properties PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_provenance_enrichment.py::TestSarifFormatterProvenance::test_no_manifest_not_in_sarif_properties PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifStructure::test_valid_json PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifStructure::test_sarif_version PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifStructure::test_schema_uri PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifStructure::test_single_run PASSED [ 51%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifStructure::test_tool_driver PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifStructure::test_invocations_present PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifRuleDescriptors::test_all_rules_present PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifRuleDescriptors::test_rule_has_required_fields PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifRuleDescriptors::test_rule_properties PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifRuleDescriptors::test_severity_mapping PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_empty_findings PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_finding_mapped_to_result PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_result_location PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_result_snippet PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_result_remediation PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_no_remediation_no_fixes PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifResults::test_multiple_findings PASSED [ 52%]
tests/unit/test_cli/test_formatters/test_sarif.py::TestSarifProperties::test_run_properties PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_run_wraps_command_and_writes_artifact PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_run_blocks_destructive_command_in_strict PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_run_enforces_org_budget_in_wrapper PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_run_blocks_missing_provenance_in_prod PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_run_blocks_when_approval_quorum_required_but_missing PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_bom_import_and_validate PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_dag_verify_reports_valid_signature PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_dag_risk_outputs_metrics PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_dag_risk_rejects_unsigned_artifact_by_default PASSED [ 52%]
tests/unit/test_cli/test_gateway_commands.py::test_dag_risk_requires_enterprise_trust_graph_capability PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_allows_benign_command PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_blocks_destructive_command_in_strict PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_scan_output_blocks_injection_in_strict PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_rejects_invalid_scope_token PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_blocks_known_malicious_reputation PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_enforces_org_budget PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_blocks_missing_provenance_in_prod PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_blocks_when_approval_missing PASSED [ 53%]
tests/unit/test_cli/test_gateway_native_commands.py::test_gateway_check_blocks_external_domain_budget PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_install_creates_hook PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_install_refuses_overwrite PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_install_force_overwrites PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_install_no_git_repo PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_install_auto_detect_git_root PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_install_no_git_root_detected PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksInstall::test_hook_script_content PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksUninstall::test_uninstall_removes_hook PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksUninstall::test_uninstall_no_hook PASSED [ 53%]
tests/unit/test_cli/test_hooks.py::TestHooksUninstall::test_uninstall_refuses_foreign_hook PASSED [ 53%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_creates_policy_file PASSED [ 53%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_default_preset PASSED [ 53%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_custom_preset PASSED [ 54%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_refuses_overwrite_without_force PASSED [ 54%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_force_overwrites PASSED [ 54%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_invalid_preset PASSED [ 54%]
tests/unit/test_cli/test_init_command.py::TestInitCommand::test_init_creates_parent_dirs PASSED [ 54%]
tests/unit/test_cli/test_keys_command.py::TestKeysGenerateCommand::test_generate_creates_keypair PASSED [ 54%]
tests/unit/test_cli/test_keys_command.py::TestKeysGenerateCommand::test_generate_shows_success_message PASSED [ 54%]
tests/unit/test_cli/test_keys_command.py::TestKeysGenerateCommand::test_generate_shows_public_key_hex PASSED [ 54%]
tests/unit/test_cli/test_keys_command.py::TestKeysGenerateCommand::test_generate_fails_if_key_exists PASSED [ 54%]
tests/unit/test_cli/test_keys_command.py::TestKeysGenerateCommand::test_generate_force_overwrites PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_http PASSED          [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_https PASSED         [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_local_path PASSED    [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_relative_path PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_github_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_gitlab_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestIsUrl::test_forge_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestNormalizeIntakeSelector::test_github_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestNormalizeIntakeSelector::test_invalid_github_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestNormalizeIntakeSelector::test_gitlab_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestNormalizeIntakeSelector::test_github_enterprise_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestNormalizeIntakeSelector::test_gitlab_enterprise_selector PASSED [ 54%]
tests/unit/test_cli/test_remote.py::TestNormalizeIntakeSelector::test_forge_selector PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_github_repo_url PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_github_repo_with_branch PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_already_archive_url PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_non_github_url PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_github_trailing_slash PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_github_enterprise_repo_url PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_gitlab_repo_url PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestNormalizeUrl::test_gitlab_tree_url PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestFetchBundle::test_fetch_tar_gz PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestFetchBundle::test_fetch_zip PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestFetchBundle::test_rejects_oversized_download PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestFetchBundle::test_rejects_unsupported_format PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestFetchBundle::test_rejects_unsafe_archive_depth PASSED [ 55%]
tests/unit/test_cli/test_remote.py::TestFetchBundle::test_fallback_archive_candidates_for_unknown_forge PASSED [ 55%]
tests/unit/test_cli/test_reputation_commands.py::test_reputation_verify_command PASSED [ 55%]
tests/unit/test_cli/test_reputation_commands.py::test_reputation_check_blocks_malicious_prod PASSED [ 55%]
tests/unit/test_cli/test_reputation_commands.py::test_reputation_submit_writes_signed_anonymized_event PASSED [ 55%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_safe_skill PASSED [ 55%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_malicious_skill PASSED [ 55%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_json_output PASSED [ 55%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_nonexistent_path PASSED [ 55%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_file_not_dir PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_verbose PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_quiet PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_scan_report_file PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanCommand::test_help_output PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestVersionCommand::test_version PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestRulesCommand::test_rules_human PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestRulesCommand::test_rules_json PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestRulesCommand::test_rules_filter_category PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestRulesCommand::test_rules_invalid_category PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanSignFlag::test_scan_with_sign PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanSignFlag::test_scan_sign_without_keys_fails PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanSignFlag::test_scan_sign_malicious_skill PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanAgentOutputMode::test_agent_output_safe_skill_passes PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanAgentOutputMode::test_agent_output_malicious_skill_fails PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanAgentOutputMode::test_agent_output_json_shows_policy PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanAgentOutputMode::test_agent_output_malicious_json_violations PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanAgentOutputMode::test_agent_output_shorthand PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanAgentOutputMode::test_invalid_mode_fails PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_explain_with_findings PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_explain_safe_skill_no_explanations PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_no_explain_flag_no_explanations PASSED [ 56%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_explain_human_output PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_explain_executive_mode_outputs_sections PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_explain_backend_alias_still_works_with_warning PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_invalid_explain_source_fails PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_invalid_llm_provider_fails PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestScanExplainFlag::test_legacy_and_new_explain_flags_conflict PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestFleetScan::test_fleet_json_output_contract PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestFleetScan::test_fleet_require_manifest_filters_bare_dirs PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestFleetScan::test_fleet_fail_on_threshold PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestFleetScan::test_fleet_malformed_bundle_isolated PASSED [ 57%]
tests/unit/test_cli/test_scan_command.py::TestFleetScan::test_invalid_explain_mode_fails PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanPolicyEnforcement::test_scan_with_policy_preset PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanPolicyEnforcement::test_scan_enforce_fails_on_violation PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanPolicyEnforcement::test_scan_enforce_passes_safe PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanPolicyEnforcement::test_scan_invalid_policy_preset PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanOutputFormats::test_scan_sarif_output PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanOutputFormats::test_scan_json_with_report_file PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanOutputFormats::test_scan_sarif_with_report_file PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanVerboseQuiet::test_scan_verbose_malicious PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanVerboseQuiet::test_scan_quiet_malicious PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanVerboseQuiet::test_scan_quiet_nonexistent_path PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanVerboseQuiet::test_scan_quiet_not_dir PASSED [ 57%]
tests/unit/test_cli/test_scan_extended.py::TestScanNoColor::test_scan_no_color PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_json_output PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_fail_on_failures_sets_exit_code PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_accepts_policy_file_path PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_org_selector_resolves_repositories PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_org_selector_resolves_remote_github_wildcard PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_org_selector_rejects_forge_wildcard PASSED [ 58%]
tests/unit/test_cli/test_simulate_command.py::test_simulate_org_requires_team_capability_when_not_in_test_mode PASSED [ 58%]
tests/unit/test_cli/test_verify_command.py::TestVerifyCommand::test_verify_valid_report PASSED [ 58%]
tests/unit/test_cli/test_verify_command.py::TestVerifyCommand::test_verify_tampered_report PASSED [ 58%]
tests/unit/test_cli/test_verify_command.py::TestVerifyCommand::test_verify_nonexistent_file PASSED [ 58%]
tests/unit/test_cli/test_verify_command.py::TestVerifyCommand::test_verify_invalid_json PASSED [ 58%]
tests/unit/test_cli/test_verify_command.py::TestVerifyCommand::test_verify_with_explicit_key PASSED [ 58%]
tests/unit/test_cli/test_verify_command.py::TestVerifyCommand::test_verify_no_attestation PASSED [ 58%]
tests/unit/test_cli/test_watch_mode.py::TestWatchModeWithoutWatchdog::test_watch_fails_without_watchdog PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_valid_free_key PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_valid_pro_key PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_valid_team_key PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_valid_enterprise_key PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_rejects_invalid_prefix PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_rejects_short_key PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_rejects_non_hex_chars PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_rejects_empty_string PASSED [ 58%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_rejects_random_string PASSED [ 59%]
tests/unit/test_config/test_license.py::TestValidateApiKey::test_valid_hex_key_with_mixed_chars PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetCurrentTier::test_defaults_to_free PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetCurrentTier::test_detects_pro_from_env PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetCurrentTier::test_detects_team_from_env PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetRateLimit::test_free_tier_limit PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetRateLimit::test_pro_tier_limit PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetRateLimit::test_team_tier_limit PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetRateLimit::test_enterprise_tier_limit PASSED [ 59%]
tests/unit/test_config/test_license.py::TestGetRateLimit::test_all_tiers_have_limits PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_get_api_key_from_env PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_get_api_key_returns_none_when_missing PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_get_api_key_from_keyring PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_get_api_key_falls_back_to_env_on_keyring_error PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_set_api_key_to_keyring PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_set_api_key_to_env_when_keyring_unavailable PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_delete_api_key PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_get_api_key_keyring_returns_none PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_set_api_key_keyring_exception_falls_back PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestSecretStore::test_delete_api_key_keyring_exception_continues PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_redacts_pro_key PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_redacts_enterprise_key PASSED [ 59%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_redacts_multiple_keys PASSED [ 60%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_preserves_non_secret_text PASSED [ 60%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_case_insensitive_redaction PASSED [ 60%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_redacts_in_log_messages PASSED [ 60%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_empty_string PASSED [ 60%]
tests/unit/test_config/test_secrets.py::TestRedactSecrets::test_partial_key_not_redacted PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPValidation::test_missing_path_param PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPValidation::test_file_not_found PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPValidation::test_not_a_file PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPValidation::test_invalid_json PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPValidation::test_missing_entries_key PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPValidation::test_valid_file PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPFetch::test_fetch_matching_rules PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPFetch::test_fetch_no_matches PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPFetch::test_fetch_empty_rules PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPFetch::test_fetch_elapsed_tracked PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPFetch::test_fetch_file_not_found_raises PASSED [ 60%]
tests/unit/test_connectors/test_file_tip.py::TestFileTIPFetch::test_connector_name_from_config PASSED [ 60%]
tests/unit/test_connectors/test_manager.py::TestFetchAll::test_single_success PASSED [ 60%]
tests/unit/test_connectors/test_manager.py::TestFetchAll::test_empty_configs PASSED [ 60%]
tests/unit/test_connectors/test_manager.py::TestFetchAll::test_disabled_connector_skipped PASSED [ 60%]
tests/unit/test_connectors/test_manager.py::TestFetchAll::test_multiple_connectors_merge PASSED [ 60%]
tests/unit/test_connectors/test_manager.py::TestFetchAll::test_elapsed_tracked PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFailOpen::test_error_connector_fail_open PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFailOpen::test_error_does_not_block_others PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFailOpen::test_config_validation_failure_fail_open PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFailOpen::test_unknown_type_fail_open PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFailOpen::test_auth_failure_reported PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFailClosed::test_error_logged_when_fail_closed PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestEnrichmentMerge::test_later_connector_overrides_earlier PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestEnrichmentMerge::test_failed_connector_does_not_clobber PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFileTIPIntegration::test_file_tip_via_manager PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestFileTIPIntegration::test_missing_file_fail_open PASSED [ 61%]
tests/unit/test_connectors/test_manager.py::TestTimeoutBehavior::test_timeout_produces_timeout_status PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorConfig::test_defaults PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorConfig::test_custom_values PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorConfig::test_timeout_bounds PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorConfig::test_timeout_valid_edge PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorResult::test_success_result PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorResult::test_error_result PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorResult::test_timeout_result PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestConnectorResult::test_all_statuses_exist PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestAggregatedConnectorResult::test_defaults PASSED [ 61%]
tests/unit/test_connectors/test_models.py::TestAggregatedConnectorResult::test_with_data PASSED [ 61%]
tests/unit/test_connectors/test_registry.py::TestRegistry::test_register_and_get PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestRegistry::test_unknown_type_raises PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestRegistry::test_registered_types PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestRegistry::test_clear_registry PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestRegistry::test_overwrite_warns PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestConnectorContract::test_abstract_methods_required PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestConnectorContract::test_dummy_satisfies_contract PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestConnectorContract::test_config_readonly PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestConnectorContract::test_failing_connector_raises PASSED [ 62%]
tests/unit/test_connectors/test_registry.py::TestConnectorContract::test_bad_config_returns_errors PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogCompleteness::test_all_rules_have_catalog_entries PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogCompleteness::test_no_stale_catalog_entries PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogDataIntegrity::test_confidence_values_in_range PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogDataIntegrity::test_first_seen_is_valid_iso_date PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogDataIntegrity::test_mitre_attack_format PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogDataIntegrity::test_tags_are_non_empty_strings PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogDataIntegrity::test_risk_factors_are_non_empty PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestCatalogDataIntegrity::test_all_entries_are_frozen_dataclass PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestSeverityDefaults::test_all_severity_levels_present PASSED [ 62%]
tests/unit/test_enricher/test_catalog.py::TestSeverityDefaults::test_fallback_confidence_in_range PASSED [ 62%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_empty_input_returns_empty PASSED [ 62%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_same_length_output PASSED [ 62%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_rule_id_alignment PASSED [ 63%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_known_rule_gets_catalog_metadata PASSED [ 63%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_unknown_rule_gets_severity_fallback PASSED [ 63%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_unknown_rule_low_severity_fallback PASSED [ 63%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_determinism PASSED [ 63%]
tests/unit/test_enricher/test_engine.py::TestEnrichFindings::test_future_fields_are_none PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_valid_creation PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_confidence_lower_bound PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_confidence_upper_bound PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_confidence_below_zero_rejected PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_confidence_above_one_rejected PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_exclude_none_omits_future_fields PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_round_trip_serialization PASSED [ 63%]
tests/unit/test_enricher/test_models.py::TestFindingEnrichment::test_defaults_for_lists PASSED [ 63%]
tests/unit/test_entitlement/test_airgap_pack.py::test_pack_expiry_fail_closed_raises PASSED [ 63%]
tests/unit/test_entitlement/test_airgap_pack.py::test_pack_expiry_with_open_grace_allows PASSED [ 63%]
tests/unit/test_entitlement/test_airgap_pack.py::test_pack_scan_consumption_persists_usage PASSED [ 63%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_get_returns_none_for_missing_key PASSED [ 63%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_put_and_get_returns_entitlement PASSED [ 63%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_get_returns_none_after_expiry PASSED [ 63%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_custom_ttl_overrides_default PASSED [ 63%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_invalidate_removes_entry PASSED [ 63%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_invalidate_returns_false_for_missing PASSED [ 64%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_clear_removes_all_entries PASSED [ 64%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_size_returns_entry_count PASSED [ 64%]
tests/unit/test_entitlement/test_cache.py::TestEntitlementCache::test_thread_safety_basic PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestValidateCustomPolicyPack::test_raises_for_non_enterprise PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestValidateCustomPolicyPack::test_passes_for_enterprise PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestGetKeyNamespace::test_returns_default_for_non_enterprise PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestGetKeyNamespace::test_returns_tier_namespace_for_enterprise PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestGetKeyNamespace::test_returns_team_namespace_with_team_id PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestAuditExporter::test_export_jsonl_empty_records PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestAuditExporter::test_export_jsonl_formats_correctly PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestAuditExporter::test_export_csv_empty_records PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise.py::TestAuditExporter::test_export_csv_formats_correctly PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestApplyEnterpriseValidationResult::test_downgrades_to_free_when_denied PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestApplyEnterpriseValidationResult::test_preserves_tier_when_allowed PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestApplyEnterpriseValidationResult::test_applies_expiry_when_provided PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestHttpEnterpriseValidationAdapter::test_validate_maps_http_payload PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestHttpEnterpriseValidationAdapter::test_validate_denied_response PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestHttpEnterpriseValidationAdapter::test_validate_http_error_propagates PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestHttpEnterpriseValidationAdapter::test_validate_timeout_propagates PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestHttpEnterpriseValidationAdapter::test_no_token_sends_no_auth_header PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestNoOpEnterpriseValidationAdapter::test_always_allows PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestBuildEnterpriseValidationAdapter::test_returns_noop_when_no_url PASSED [ 64%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestBuildEnterpriseValidationAdapter::test_returns_http_when_url_provided PASSED [ 65%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestApplyEnterpriseValidationResultNonEnterprise::test_non_enterprise_tier_passthrough PASSED [ 65%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestCheckSeatLimit::test_within_limit_passes PASSED [ 65%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestCheckSeatLimit::test_at_limit_passes PASSED [ 65%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestCheckSeatLimit::test_over_limit_raises PASSED [ 65%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestCheckSeatLimit::test_unlimited_seats_never_raises PASSED [ 65%]
tests/unit/test_entitlement/test_enterprise_adapter.py::TestCheckSeatLimit::test_error_includes_tier PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCheckCapability::test_raises_for_missing_capability PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCheckCapability::test_passes_for_present_capability PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCheckCapability::test_team_has_ci_blocking PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCheckCapability::test_enterprise_has_custom_policy PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_returns_all_when_max_is_zero PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_returns_all_when_max_is_negative PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_caps_to_max_count PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_sorts_by_severity_descending PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_sorts_by_weight_descending_for_same_severity PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_sorts_by_rule_id_ascending_for_ties PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_returns_empty_for_empty_input PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_free_tier_capped_to_five PASSED [ 65%]
tests/unit/test_entitlement/test_gates.py::TestCapFindings::test_handles_different_severity_capitalization PASSED [ 65%]
tests/unit/test_entitlement/test_mode.py::test_default_mode_is_local PASSED [ 65%]
tests/unit/test_entitlement/test_mode.py::test_valid_modes_resolve[local-local] PASSED [ 65%]
tests/unit/test_entitlement/test_mode.py::test_valid_modes_resolve[saas-saas] PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_valid_modes_resolve[private_relay-private_relay] PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_valid_modes_resolve[airgap-airgap] PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_valid_modes_resolve[  SaAs  -saas] PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_invalid_mode_raises PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_production_defaults_to_saas PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_production_blocks_local_mode PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_mode_lock_enforces_selected_mode PASSED [ 66%]
tests/unit/test_entitlement/test_mode.py::test_mode_lock_disallows_local PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_get_count_returns_zero_for_new_file PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_increment_returns_one_on_first_scan PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_increment_persists_count PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_quota_resets_on_new_day PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_check_quota_passes_when_under_limit PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_check_quota_raises_when_at_limit PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_check_quota_zero_means_unlimited PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_record_scan_increments_and_returns_count PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_reset_clears_quota PASSED [ 66%]
tests/unit/test_entitlement/test_quota.py::TestScanQuotaTracker::test_handles_corrupted_file PASSED [ 66%]
tests/unit/test_entitlement/test_resilience.py::TestFailOpenPolicy::test_returns_entitlement_on_success PASSED [ 66%]
tests/unit/test_entitlement/test_resilience.py::TestFailOpenPolicy::test_returns_free_on_exception PASSED [ 66%]
tests/unit/test_entitlement/test_resilience.py::TestFailOpenPolicy::test_returns_free_on_value_error PASSED [ 66%]
tests/unit/test_entitlement/test_resilience.py::TestResolveWithFailOpen::test_returns_result_on_success PASSED [ 67%]
tests/unit/test_entitlement/test_resilience.py::TestResolveWithFailOpen::test_returns_free_on_failure PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromTier::test_free_tier_returns_free_entitlement PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromTier::test_pro_tier_returns_pro_entitlement PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromTier::test_team_tier_returns_team_entitlement PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromTier::test_enterprise_tier_returns_enterprise_entitlement PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_none_key_returns_free PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_empty_key_returns_free PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_free_tier_key_returns_free PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_pro_tier_key_returns_pro PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_team_tier_key_returns_team PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_enterprise_tier_key_returns_enterprise PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromApiKey::test_invalid_format_returns_free PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveRuntimeEntitlement::test_local_mode_uses_api_key PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveRuntimeEntitlement::test_saas_mode_prefers_signed_payload PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveRuntimeEntitlement::test_saas_mode_requires_signed_token PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveRuntimeEntitlement::test_airgap_mode_loads_token_from_pack PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveRuntimeEntitlement::test_private_relay_requires_enterprise_tier PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveRuntimeEntitlement::test_airgap_requires_signed_token_or_pack PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveEntitlementSafe::test_returns_entitlement_on_success PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveEntitlementSafe::test_returns_free_on_failure PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_valid_pro_token PASSED [ 67%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_valid_team_token PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_source_is_signed_payload PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_subject_id_is_extracted_from_signed_payload PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_missing_subject_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_tampered_payload_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_wrong_public_key_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_expired_token_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_token_without_expiry_resolves PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_malformed_token_no_dot_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_malformed_base64_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_unknown_tier_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_unknown_capability_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_limits_from_payload PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_replay_nonce_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_future_iat_beyond_skew_raises PASSED [ 68%]
tests/unit/test_entitlement/test_resolver.py::TestResolveFromSignedPayload::test_key_rotation_accepts_key_from_public_keys_map PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_airgap_consumes_env_remaining PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_airgap_exhausted_raises PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_http_authority_allowed PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_http_authority_includes_subject_id_when_present PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_http_authority_requires_subject_id PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_saas_uses_default_authority_url_when_unset PASSED [ 68%]
tests/unit/test_entitlement/test_usage_authority.py::test_http_authority_denied_raises PASSED [ 69%]
tests/unit/test_entitlement/test_usage_authority.py::test_private_relay_rejects_public_authority_url PASSED [ 69%]
tests/unit/test_entitlement/test_usage_authority.py::test_authority_url_lock_mismatch_raises PASSED [ 69%]
tests/unit/test_entitlement/test_usage_authority.py::test_saas_requires_https_in_production PASSED [ 69%]
tests/unit/test_entitlement/test_usage_authority.py::test_http_authority_requires_signed_token PASSED [ 69%]
tests/unit/test_entitlement/test_usage_authority.py::test_airgap_pack_path_is_authoritative PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestDetectBackend::test_no_keys_returns_none PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestDetectBackend::test_anthropic_key_without_sdk_returns_none PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestDetectBackend::test_returns_none_when_no_env PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_empty_findings_returns_empty PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_template_backend_explicit PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_template_backend_executive_mode PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_template_fallback_when_no_backend PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_multiple_findings_all_explained PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_explanation_dataclass_fields PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_anthropic_backend_dispatch PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_openai_backend_dispatch PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainFindings::test_custom_backend_dispatch PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainWithAnthropic::test_success PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainWithAnthropic::test_api_error_falls_back_to_template PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainWithOpenai::test_success PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainWithOpenai::test_api_error_falls_back_to_template PASSED [ 69%]
tests/unit/test_explainer/test_engine.py::TestExplainWithOpenai::test_none_content_returns_empty_string PASSED [ 70%]
tests/unit/test_explainer/test_engine.py::TestExplainWithOpenai::test_egress_disabled_falls_back_to_template PASSED [ 70%]
tests/unit/test_explainer/test_engine.py::TestExplainWithCustom::test_missing_custom_provider_falls_back_to_template PASSED [ 70%]
tests/unit/test_explainer/test_engine.py::TestExplainWithCustom::test_azure_openai_custom_provider_success PASSED [ 70%]
tests/unit/test_explainer/test_engine.py::TestExplainWithCustom::test_groq_custom_provider_success PASSED [ 70%]
tests/unit/test_explainer/test_engine.py::TestExplainWithCustom::test_ollama_custom_provider_success PASSED [ 70%]
tests/unit/test_explainer/test_engine.py::TestExplainWithCustom::test_custom_provider_blocked_without_allowlist_falls_back PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_risk_level PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_rule_id PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_message PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_file_location PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_column_when_present PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_network_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_dynamic_code_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_credential_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_injection_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_obfuscation_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_filesystem_category_guidance PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_contains_remediation_when_present PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_no_remediation_when_absent PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_all_severity_levels PASSED [ 70%]
tests/unit/test_explainer/test_templates.py::TestTemplateExplanation::test_executive_template_sections PASSED [ 70%]
tests/unit/test_gateway/test_approval.py::test_verify_approval_file_passes_with_quorum PASSED [ 71%]
tests/unit/test_gateway/test_approval.py::test_verify_approval_file_fails_quorum PASSED [ 71%]
tests/unit/test_gateway/test_bom_gate.py::test_bom_gate_blocks_unknown_in_strict PASSED [ 71%]
tests/unit/test_gateway/test_bom_gate.py::test_bom_gate_allows_known_valid_entry PASSED [ 71%]
tests/unit/test_gateway/test_budget.py::test_budget_not_enforced_in_dev PASSED [ 71%]
tests/unit/test_gateway/test_budget.py::test_budget_blocks_when_limit_exceeded PASSED [ 71%]
tests/unit/test_gateway/test_budget.py::test_budget_scoped_per_session PASSED [ 71%]
tests/unit/test_gateway/test_budget.py::test_budget_scoped_per_org PASSED [ 71%]
tests/unit/test_gateway/test_budget.py::test_budget_blocks_when_external_domain_limit_exceeded PASSED [ 71%]
tests/unit/test_gateway/test_budget.py::test_budget_blocks_when_domain_chain_limit_exceeded PASSED [ 71%]
tests/unit/test_gateway/test_executor.py::test_build_sandboxed_command_process_passthrough PASSED [ 71%]
tests/unit/test_gateway/test_executor.py::test_build_sandboxed_command_bwrap_wraps_command PASSED [ 71%]
tests/unit/test_gateway/test_executor.py::test_build_sandboxed_command_nsjail_wraps_command PASSED [ 71%]
tests/unit/test_gateway/test_lineage.py::test_lineage_analysis_computes_depth_and_risk PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_allow_benign_dev PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_block_destructive_strict_before_entitlement PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_require_ci_capability PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_apply_allowlist PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_block_when_budget_exceeded PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_budget_scoped_by_session PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_block_on_external_domain_budget PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_runtime_prechecks_require_enterprise_budget_capability_when_budgets_enabled PASSED [ 71%]
tests/unit/test_gateway/test_runtime_engine.py::test_extract_external_domains_deduplicates_hosts PASSED [ 72%]
tests/unit/test_gateway/test_scope_and_session.py::test_scope_token_round_trip PASSED [ 72%]
tests/unit/test_gateway/test_scope_and_session.py::test_session_artifact_signature_verifies PASSED [ 72%]
tests/unit/test_gateway/test_top_guard.py::test_top_guard_detects_injection_in_strict_mode PASSED [ 72%]
tests/unit/test_gateway/test_top_guard.py::test_top_guard_passes_benign_output PASSED [ 72%]
tests/unit/test_gateway/test_top_guard.py::test_top_guard_detects_structural_injection_signal PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_hunt_capability_blocks_free_tier PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_hunt_capability_blocks_pro_tier PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_no_data_source PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_file_not_found PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_invalid_query PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_json_output PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_table_output PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_no_matches_output PASSED [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_data_dir PASSED  [ 72%]
tests/unit/test_hunt/test_cli.py::TestHuntCommand::test_quiet_mode PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestBasicQuery::test_empty_reports PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestBasicQuery::test_match_all PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestBasicQuery::test_no_findings PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestRuleFilter::test_match_rule PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestRuleFilter::test_no_match_rule PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestSeverityFilter::test_match_severity PASSED [ 72%]
tests/unit/test_hunt/test_engine.py::TestSeverityFilter::test_no_match_severity PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestCategoryFilter::test_match_category PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestCategoryFilter::test_no_match_category PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestDomainFilter::test_match_domain PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestDomainFilter::test_no_match_domain PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestIOCFilter::test_match_ioc PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestIOCFilter::test_no_match_ioc PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestIOCFilter::test_case_insensitive PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestRepoFilter::test_match_repo PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestRepoFilter::test_glob_repo PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestRepoFilter::test_no_match_repo PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestScoreFilter::test_min_score PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestScoreFilter::test_min_score_exclude PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestScoreFilter::test_max_score PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestScoreFilter::test_max_score_exclude PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestTimeWindow::test_after_filter PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestTimeWindow::test_after_exclude PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestTimeWindow::test_before_filter PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestTimeWindow::test_before_exclude PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestConfidenceFilter::test_min_confidence PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestConfidenceFilter::test_min_confidence_exclude PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestConfidenceFilter::test_no_enrichment_excluded PASSED [ 73%]
tests/unit/test_hunt/test_engine.py::TestSorting::test_sort_by_score_desc PASSED [ 74%]
tests/unit/test_hunt/test_engine.py::TestSorting::test_sort_by_severity PASSED [ 74%]
tests/unit/test_hunt/test_engine.py::TestPagination::test_limit PASSED   [ 74%]
tests/unit/test_hunt/test_engine.py::TestPagination::test_offset PASSED  [ 74%]
tests/unit/test_hunt/test_engine.py::TestPagination::test_offset_beyond_total PASSED [ 74%]
tests/unit/test_hunt/test_engine.py::TestMultipleFindings::test_multiple_findings_per_report PASSED [ 74%]
tests/unit/test_hunt/test_engine.py::TestMultipleFindings::test_filter_within_multiple PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntFilter::test_defaults PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntFilter::test_confidence_bounds PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntFilter::test_invalid_confidence PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntQuery::test_defaults PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntQuery::test_limit_bounds PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntQuery::test_valid_sort PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntMatch::test_creation PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntMatch::test_with_confidence PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntResult::test_empty_result PASSED [ 74%]
tests/unit/test_hunt/test_models.py::TestHuntResult::test_serializable PASSED [ 74%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_empty_query PASSED [ 74%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_single_rule PASSED [ 74%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_multiple_rules_comma PASSED [ 74%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_severity_filter PASSED [ 74%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_category_filter PASSED [ 74%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_domain_filter PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_repo_filter PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestBasicParsing::test_ioc_filter PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestNumericFilters::test_min_confidence PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestNumericFilters::test_max_confidence PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestNumericFilters::test_score_range PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestNumericFilters::test_invalid_float PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestNumericFilters::test_invalid_int PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestTimeFilters::test_after PASSED  [ 75%]
tests/unit/test_hunt/test_parser.py::TestTimeFilters::test_before PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestTimeFilters::test_time_window PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_sort_by_score PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_sort_by_severity PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_sort_alias_date PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_invalid_sort PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_invalid_order PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_limit_and_offset PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestSortAndPagination::test_limit_capped_at_500 PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestUnknownKey::test_unknown_raises PASSED [ 75%]
tests/unit/test_hunt/test_parser.py::TestComplexQueries::test_full_query PASSED [ 75%]
tests/unit/test_models/test_finding.py::TestFinding::test_valid_finding PASSED [ 75%]
tests/unit/test_models/test_finding.py::TestFinding::test_finding_with_all_fields PASSED [ 75%]
tests/unit/test_models/test_finding.py::TestFinding::test_finding_invalid_line_zero PASSED [ 76%]
tests/unit/test_models/test_finding.py::TestFinding::test_finding_invalid_negative_weight PASSED [ 76%]
tests/unit/test_models/test_finding.py::TestFinding::test_finding_serialization PASSED [ 76%]
tests/unit/test_models/test_finding.py::TestFinding::test_finding_respects_explicit_canonical_fields PASSED [ 76%]
tests/unit/test_models/test_report.py::TestRiskScore::test_zero_score PASSED [ 76%]
tests/unit/test_models/test_report.py::TestRiskScore::test_score_with_breakdown PASSED [ 76%]
tests/unit/test_models/test_report.py::TestRiskScore::test_negative_total_rejected PASSED [ 76%]
tests/unit/test_models/test_report.py::TestRiskScore::test_serialization_roundtrip PASSED [ 76%]
tests/unit/test_models/test_report.py::TestRiskScore::test_custom_model_version_inputs PASSED [ 76%]
tests/unit/test_models/test_report.py::TestScanReport::test_minimal_report PASSED [ 76%]
tests/unit/test_models/test_report.py::TestScanReport::test_full_report PASSED [ 76%]
tests/unit/test_orchestrator/test_approval_evidence.py::test_approval_checkpoint_pass_resumes_awaiting_job PASSED [ 76%]
tests/unit/test_orchestrator/test_approval_evidence.py::test_approval_checkpoint_missing_file_blocks_running_job PASSED [ 76%]
tests/unit/test_orchestrator/test_approval_evidence.py::test_evidence_pack_verify_passes PASSED [ 76%]
tests/unit/test_orchestrator/test_approval_evidence.py::test_evidence_pack_verify_fails_on_tamper PASSED [ 76%]
tests/unit/test_orchestrator/test_approval_evidence.py::test_governance_proof_pack_includes_required_blocks PASSED [ 76%]
tests/unit/test_orchestrator/test_engine.py::test_valid_lifecycle_transition PASSED [ 76%]
tests/unit/test_orchestrator/test_engine.py::test_invalid_lifecycle_transition_rejected PASSED [ 76%]
tests/unit/test_orchestrator/test_engine.py::test_register_attempt_fails_when_retry_budget_exceeded PASSED [ 76%]
tests/unit/test_orchestrator/test_engine.py::test_has_timed_out_true_when_elapsed_exceeds_timeout PASSED [ 76%]
tests/unit/test_orchestrator/test_engine.py::test_policy_check_allows_benign_plan_step_in_dev PASSED [ 76%]
tests/unit/test_orchestrator/test_engine.py::test_policy_check_blocks_destructive_command_in_strict_and_requests_approval PASSED [ 76%]
tests/unit/test_orchestrator/test_pipeline.py::test_vertical_slice_completes_and_writes_verified_pack PASSED [ 76%]
tests/unit/test_orchestrator/test_pipeline.py::test_vertical_slice_strict_block_without_approval_stays_awaiting PASSED [ 77%]
tests/unit/test_orchestrator/test_pipeline.py::test_vertical_slice_strict_block_with_valid_approval_resumes_and_completes PASSED [ 77%]
tests/unit/test_orchestrator/test_pipeline.py::test_vertical_slice_mandatory_write_approval_blocks_without_artifact PASSED [ 77%]
tests/unit/test_orchestrator/test_pipeline.py::test_vertical_slice_prod_filesystem_action_requires_approval_by_default PASSED [ 77%]
tests/unit/test_orchestrator/test_pipeline.py::test_vertical_slice_dev_filesystem_action_does_not_require_approval_by_default PASSED [ 77%]
tests/unit/test_orchestrator/test_triage.py::test_build_triage_artifact_is_deterministic_across_input_order PASSED [ 77%]
tests/unit/test_orchestrator/test_triage.py::test_render_triage_comment_contains_summary_blocks PASSED [ 77%]
tests/unit/test_orchestrator/test_write_path.py::test_mandatory_write_approval_blocks_without_artifact PASSED [ 77%]
tests/unit/test_orchestrator/test_write_path.py::test_mandatory_write_approval_allows_with_signed_artifact PASSED [ 77%]
tests/unit/test_orchestrator/test_write_path.py::test_mandatory_write_approval_respects_policy_block PASSED [ 77%]
tests/unit/test_packaging/test_pyproject_contract.py::test_pyproject_has_required_project_metadata PASSED [ 77%]
tests/unit/test_packaging/test_pyproject_contract.py::test_console_script_entrypoint_is_declared PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_zip_is_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_tar_gz_is_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_tgz_is_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_tar_bz2_is_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_tar_xz_is_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_bare_tar_is_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_py_is_not_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestIsArchive::test_gz_alone_is_not_archive PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestSanitizeArchiveMemberPath::test_normal_path PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestSanitizeArchiveMemberPath::test_traversal_rejected PASSED [ 77%]
tests/unit/test_parser/test_archive.py::TestSanitizeArchiveMemberPath::test_absolute_path_rejected PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestSanitizeArchiveMemberPath::test_windows_path_traversal_rejected PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestSanitizeArchiveMemberPath::test_simple_filename PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestSanitizeArchiveMemberPath::test_nested_path_allowed PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractArchiveBasic::test_extracts_python_file PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractArchiveBasic::test_extracts_multiple_text_files PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractArchiveBasic::test_skips_binary_files PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractArchiveBasic::test_skips_unsupported_extensions PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractArchiveBasic::test_provenance_fields PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestZipSlipProtection::test_traversal_member_skipped PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractionLimits::test_artifact_count_limit PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractionLimits::test_byte_limit PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractionLimits::test_depth_limit_respected PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractionLimits::test_depth_zero_skips PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractionLimits::test_size_limit PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestCorruptArchive::test_not_a_zip PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestCorruptArchive::test_missing_file PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestCorruptArchive::test_empty_zip PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestZipBombDetection::test_detects_high_compression_ratio PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_extracts_python_file PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_extracts_tar_gz PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_extracts_multiple_files PASSED [ 78%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_skips_non_text_extensions PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_tar_slip_prevented PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_not_a_tar_file PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_depth_limit_zero_skips PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestExtractTar::test_provenance_origin_type PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestNewExtensions::test_bat_extracted_from_zip PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestNewExtensions::test_cmd_extracted_from_zip PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestNewExtensions::test_fish_extracted_from_zip PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestNewExtensions::test_ksh_extracted_from_zip PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestNewExtensions::test_log_extracted_from_zip PASSED [ 79%]
tests/unit/test_parser/test_archive.py::TestNewExtensions::test_bat_extracted_from_tar PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestBundleDiscovery::test_discover_valid_dir PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestBundleDiscovery::test_discover_nonexistent_path PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestBundleDiscovery::test_discover_file_not_dir PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestBundleDiscovery::test_discover_empty_dir PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestLoadBundle::test_load_safe_skill PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestLoadBundle::test_load_node_skill PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestLoadBundle::test_load_malicious_skill PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestLoadBundle::test_load_no_manifest PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestLoadBundle::test_bundle_files_scanned_property PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestBundleHash::test_hash_deterministic PASSED [ 79%]
tests/unit/test_parser/test_bundle.py::TestBundleHash::test_hash_changes_with_content PASSED [ 79%]
tests/unit/test_parser/test_document.py::TestIsDocument::test_pdf_is_document PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestIsDocument::test_docx_is_document PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestIsDocument::test_py_is_not_document PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestIsDocument::test_zip_is_not_document PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestIsDocument::test_case_insensitive PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfNoDependency::test_skip_when_pypdf_missing PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfNoDependency::test_skip_oversized_file PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfNoDependency::test_skip_nonexistent_file PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfWithPypdf::test_extracts_text_per_page PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfWithPypdf::test_provenance_fields_set PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfWithPypdf::test_skips_empty_pages PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfWithPypdf::test_page_limit_enforced PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractPdfWithPypdf::test_handles_page_extraction_error PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractDocxNoDependency::test_skip_when_python_docx_missing PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractDocxNoDependency::test_skip_oversized_file PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractDocxWithMock::test_extracts_paragraphs PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractDocxWithMock::test_provenance_has_source_file PASSED [ 80%]
tests/unit/test_parser/test_document.py::TestExtractDocumentDispatch::test_unsupported_extension PASSED [ 80%]
tests/unit/test_parser/test_fleet.py::test_discovers_manifest_bundles_deterministically PASSED [ 80%]
tests/unit/test_parser/test_fleet.py::test_policy_skill_roots_include_non_manifest_dirs PASSED [ 80%]
tests/unit/test_parser/test_fleet.py::test_require_manifest_filters_non_manifest_dirs PASSED [ 80%]
tests/unit/test_parser/test_fleet.py::test_exclude_patterns_skip_directories PASSED [ 80%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_parse_skill_md PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_parse_package_json PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_parse_skill_json PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_parse_pyproject_toml PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_manifest_priority_skill_md_over_package_json PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_no_manifest PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_find_manifest_returns_none PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_malformed_json PASSED [ 81%]
tests/unit/test_parser/test_manifest.py::TestManifestParsing::test_missing_fields PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_no_manifest_returns_default PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_corrupted_skill_json PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_skill_md_parsing PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_skill_md_with_permissions PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_package_json_parsing PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_corrupted_package_json PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_pyproject_toml_parsing PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_pyproject_toml_minimal PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_manifest_priority_skill_md_over_skill_json PASSED [ 81%]
tests/unit/test_parser/test_manifest_extended.py::TestParseManifestEdgeCases::test_skill_json_with_permissions PASSED [ 81%]
tests/unit/test_parser/test_markdown.py::test_normalize_unicode_basic PASSED [ 81%]
tests/unit/test_parser/test_markdown.py::test_normalize_unicode_zero_width PASSED [ 81%]
tests/unit/test_parser/test_markdown.py::test_normalize_unicode_preserves_newlines PASSED [ 81%]
tests/unit/test_parser/test_markdown.py::test_detect_language_from_info PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_detect_language_with_attributes PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_headings_atx PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_headings_setext PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_find_section_for_line PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_fenced_blocks_simple PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_fenced_blocks_multiple PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_fenced_blocks_nested PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_fenced_blocks_tildes PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_fenced_blocks_no_language PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_fenced_blocks_respects_limit PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_prose_sections_no_headings PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extract_prose_sections_with_headings PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_parse_markdown_file PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_parse_markdown_file_size_limit PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_parse_markdown_file_unicode_error PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_build_extraction_manifest PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_extraction_hash_determinism PASSED [ 82%]
tests/unit/test_parser/test_markdown.py::test_line_number_accuracy PASSED [ 82%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_python PASSED [ 82%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_javascript PASSED [ 82%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_typescript PASSED [ 82%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_shell PASSED [ 82%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_bash PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_mjs PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestLanguageDetection::test_unknown PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_enumerate_python_files PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_enumerate_js_files PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_enumerate_empty_dir PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_enumerate_nonexistent_dir PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_skip_pycache PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_read_source_file PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_read_binary_file_skipped PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_read_large_file_skipped PASSED [ 83%]
tests/unit/test_parser/test_source.py::TestSourceFileExtraction::test_is_scannable PASSED [ 83%]
tests/unit/test_parser/test_source_extended.py::TestReadSourceFile::test_skips_large_file PASSED [ 83%]
tests/unit/test_parser/test_source_extended.py::TestReadSourceFile::test_skips_binary_file PASSED [ 83%]
tests/unit/test_parser/test_source_extended.py::TestReadSourceFile::test_reads_valid_file PASSED [ 83%]
tests/unit/test_parser/test_source_extended.py::TestReadSourceFile::test_handles_missing_file PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceConfig::test_defaults_are_zero PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceConfig::test_policy_has_default_confidence PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_no_enrichments_no_change PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_high_confidence_stays_violation PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_low_confidence_downgraded_to_warning PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_downgrade_makes_policy_pass PASSED [ 83%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_per_severity_threshold PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_score_violation_not_affected PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestConfidenceFiltering::test_zero_threshold_disables_filtering PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestBackwardCompatibility::test_old_policy_no_confidence_field PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestBackwardCompatibility::test_old_policy_with_enrichments_unchanged PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestBackwardCompatibility::test_result_has_empty_warnings_by_default PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestBackwardCompatibility::test_presets_have_default_confidence PASSED [ 84%]
tests/unit/test_policy/test_confidence.py::TestMultipleFindingsConfidence::test_mixed_confidence_partial_downgrade PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestScoreThreshold::test_pass_below_threshold PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestScoreThreshold::test_pass_at_threshold PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestScoreThreshold::test_fail_above_threshold PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestFindingCountThresholds::test_critical_count_pass PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestFindingCountThresholds::test_critical_count_fail PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestFindingCountThresholds::test_high_count_fail PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestFindingCountThresholds::test_medium_count_fail PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_shell_blocked PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_shell_allowed PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_eval_blocked PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_network_blocked PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_filesystem_write_blocked PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_credential_access_blocked PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_credential_access_allowed_by_default PASSED [ 84%]
tests/unit/test_policy/test_engine.py::TestPermissions::test_no_findings_no_violations PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestDomainRestrictions::test_blocked_domain PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestDomainRestrictions::test_allowed_domain_pass PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestDomainRestrictions::test_unlisted_domain_fail PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestWarnMode::test_warn_mode_always_passes PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestWarnMode::test_enforce_mode_can_fail PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestMultipleViolations::test_all_violations_reported PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestPolicyResultMetadata::test_metadata PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestApplyRuleOverrides::test_severity_override PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestApplyRuleOverrides::test_weight_override PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestApplyRuleOverrides::test_no_overrides_returns_same PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestApplyRuleOverrides::test_does_not_mutate_original PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestFilterDisabledFindings::test_filter_disabled PASSED [ 85%]
tests/unit/test_policy/test_engine.py::TestFilterDisabledFindings::test_no_disabled_returns_all PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_production PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_development PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_strict PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_custom_overrides PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_nonexistent PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_directory PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_invalid_yaml PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_invalid_version PASSED [ 85%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_non_mapping PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestLoadPolicyFile::test_load_policy_with_fleet_block PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestResolvePolicy::test_resolve_none PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestResolvePolicy::test_resolve_preset PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestResolvePolicy::test_resolve_preset_case PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestResolvePolicy::test_resolve_file_path PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestResolvePolicy::test_resolve_unknown PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestGeneratePolicyYaml::test_generate_production PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestGeneratePolicyYaml::test_generate_development PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestGeneratePolicyYaml::test_generate_unknown PASSED [ 86%]
tests/unit/test_policy/test_loader.py::TestGeneratePolicyYaml::test_generated_yaml_is_loadable PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestArtifactOriginConfigModel::test_defaults PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestArtifactOriginConfigModel::test_disabled PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestArtifactOriginConfigModel::test_severity_floor PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestArtifactOriginConfigModel::test_blocked_categories PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestArtifactOriginConfigModel::test_policy_config_has_artifact_origins PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestOriginEnabledFilter::test_finding_passes_when_origin_enabled PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestOriginEnabledFilter::test_finding_dropped_when_origin_disabled PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestOriginEnabledFilter::test_finding_without_provenance_always_kept PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestOriginEnabledFilter::test_finding_for_unlisted_origin_always_kept PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestOriginEnabledFilter::test_empty_policy_origins_passes_all PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestSeverityFloor::test_above_floor_kept PASSED [ 86%]
tests/unit/test_policy/test_origin_policy.py::TestSeverityFloor::test_at_floor_kept PASSED [ 87%]
tests/unit/test_policy/test_origin_policy.py::TestSeverityFloor::test_below_floor_dropped PASSED [ 87%]
tests/unit/test_policy/test_origin_policy.py::TestSeverityFloor::test_critical_always_passes_medium_floor PASSED [ 87%]
tests/unit/test_policy/test_origin_policy.py::TestBlockedCategories::test_finding_in_blocked_category_dropped PASSED [ 87%]
tests/unit/test_policy/test_origin_policy.py::TestBlockedCategories::test_finding_not_in_blocked_category_kept PASSED [ 87%]
tests/unit/test_policy/test_origin_policy.py::TestBlockedCategories::test_blocked_category_case_insensitive PASSED [ 87%]
tests/unit/test_policy/test_origin_policy.py::TestBlockedCategories::test_multiple_blocked_categories PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_all_presets_exist PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_all_presets_valid PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_get_preset_valid PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_get_preset_case_insensitive PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_get_preset_unknown PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_list_presets PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_development_is_permissive PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_strict_is_restrictive PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_production_defaults PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_staging_moderate PASSED [ 87%]
tests/unit/test_policy/test_presets.py::TestPresets::test_agent_output_zero_tolerance PASSED [ 87%]
tests/unit/test_policy/test_schema.py::TestThresholdConfig::test_defaults PASSED [ 87%]
tests/unit/test_policy/test_schema.py::TestThresholdConfig::test_custom_values PASSED [ 87%]
tests/unit/test_policy/test_schema.py::TestThresholdConfig::test_max_score_range PASSED [ 87%]
tests/unit/test_policy/test_schema.py::TestThresholdConfig::test_negative_finding_count PASSED [ 87%]
tests/unit/test_policy/test_schema.py::TestPermissionConfig::test_defaults PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPermissionConfig::test_all_permissive PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuleConfig::test_defaults PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuleConfig::test_disabled_rules PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuleConfig::test_severity_override_valid PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuleConfig::test_severity_override_normalized PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuleConfig::test_severity_override_invalid PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuleConfig::test_weight_overrides PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestEnforcementConfig::test_defaults PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestEnforcementConfig::test_warn_mode PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestEnforcementConfig::test_invalid_mode PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestEnforcementConfig::test_mode_normalized PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyConfig::test_minimal_valid PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyConfig::test_full_config PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyConfig::test_invalid_version PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyConfig::test_empty_name PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyConfig::test_name_too_long PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyConfig::test_name_max_length PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuntimeConfig::test_defaults PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestRuntimeConfig::test_invalid_environment PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestFleetConfig::test_defaults PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestFleetConfig::test_threshold_bounds PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyViolation::test_basic PASSED [ 88%]
tests/unit/test_policy/test_schema.py::TestPolicyViolation::test_with_related_finding PASSED [ 89%]
tests/unit/test_policy/test_schema.py::TestPolicyResult::test_passed PASSED [ 89%]
tests/unit/test_policy/test_schema.py::TestPolicyResult::test_failed_with_violations PASSED [ 89%]
tests/unit/test_quality/test_claim_ledger.py::test_claim_ledger_validator_passes_on_current_contract PASSED [ 89%]
tests/unit/test_quality/test_claim_ledger.py::test_claim_ledger_validator_rejects_legacy_json_file PASSED [ 89%]
tests/unit/test_quality/test_claim_ledger.py::test_claim_ledger_validator_rejects_duplicate_active_claim_ids PASSED [ 89%]
tests/unit/test_quality/test_deployment_profile_lock.py::test_deployment_profile_lock_is_valid PASSED [ 89%]
tests/unit/test_quality/test_dual_repo_release_contract.py::test_validate_dual_repo_release_contract_success PASSED [ 89%]
tests/unit/test_quality/test_dual_repo_release_contract.py::test_validate_dual_repo_release_contract_fails_on_sequence_and_checks PASSED [ 89%]
tests/unit/test_quality/test_governance_scope_gate.py::test_gate_passes_when_p0_incomplete_and_autonomy_deferred PASSED [ 89%]
tests/unit/test_quality/test_governance_scope_gate.py::test_gate_fails_when_deferred_task_is_active PASSED [ 89%]
tests/unit/test_quality/test_install_docs_freshness.py::test_validate_passes_on_current_repo_contract PASSED [ 89%]
tests/unit/test_quality/test_install_docs_freshness.py::test_validate_detects_version_drift PASSED [ 89%]
tests/unit/test_quality/test_install_docs_freshness.py::test_validate_detects_missing_manifest_artifacts PASSED [ 89%]
tests/unit/test_quality/test_physical_extraction_workflow.py::test_select_files_splits_public_and_private PASSED [ 89%]
tests/unit/test_quality/test_physical_extraction_workflow.py::test_select_files_respects_allow_exceptions PASSED [ 89%]
tests/unit/test_quality/test_public_export_gate.py::test_collect_candidates_respects_include_globs PASSED [ 89%]
tests/unit/test_quality/test_public_export_gate.py::test_violations_detect_denied_paths_in_scope PASSED [ 89%]
tests/unit/test_quality/test_public_export_gate.py::test_violations_respect_allow_exceptions PASSED [ 89%]
tests/unit/test_quality/test_release_manifest.py::test_generate_and_verify_release_manifest PASSED [ 89%]
tests/unit/test_quality/test_release_manifest.py::test_verify_manifest_fails_on_tampered_artifact PASSED [ 89%]
tests/unit/test_quality/test_release_manifest.py::test_verify_manifest_fails_on_tampered_signature PASSED [ 89%]
tests/unit/test_quality/test_reliability_scorecard.py::test_rule_recall_computation PASSED [ 90%]
tests/unit/test_quality/test_reliability_scorecard.py::test_enforce_fails_on_threshold_breach PASSED [ 90%]
tests/unit/test_quality/test_split_ci_parity.py::test_split_ci_parity_matrix_is_valid PASSED [ 90%]
tests/unit/test_quality/test_supabase_compat_migration.py::test_apply_migration_dry_run_keeps_database_unchanged PASSED [ 90%]
tests/unit/test_quality/test_supabase_compat_migration.py::test_apply_migration_is_idempotent_with_checkpoint PASSED [ 90%]
tests/unit/test_quality/test_supabase_compat_migration.py::test_rollback_restores_previous_values PASSED [ 90%]
tests/unit/test_quality/test_supabase_sql_contracts.py::test_rpc_sql_has_versioned_functions_and_idempotent_clauses PASSED [ 90%]
tests/unit/test_quality/test_supabase_sql_contracts.py::test_rls_sql_enables_rls_and_deny_by_default PASSED [ 90%]
tests/unit/test_quality/test_supabase_sql_contracts.py::test_rls_sql_contains_subject_and_service_role_policies PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestReputationVerdict::test_all_verdicts PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestReputationVerdict::test_verdict_from_string PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestReputationEntry::test_valid_entry PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestReputationEntry::test_confidence_bounds PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestReputationEntry::test_default_fields PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestReputationEntry::test_round_trip PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestSignedReputationData::test_empty_container PASSED [ 90%]
tests/unit/test_reputation/test_models.py::TestSignedReputationData::test_with_entries PASSED [ 90%]
tests/unit/test_reputation/test_policy.py::test_reputation_blocks_malicious_in_prod PASSED [ 90%]
tests/unit/test_reputation/test_policy.py::test_reputation_allows_unknown PASSED [ 90%]
tests/unit/test_reputation/test_policy.py::test_redact_bundle_hash_masks_middle PASSED [ 90%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_save_and_load PASSED [ 90%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_lookup_existing PASSED [ 90%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_lookup_missing PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_lookup_verdict_default PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_lookup_verdict_existing PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_file_not_found PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_tampered_data_rejected PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_load_without_verify PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_clear PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_entry_count PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_cache_path PASSED [ 91%]
tests/unit/test_reputation/test_store.py::TestReputationStore::test_duplicate_hashes_last_wins PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestSignReputationData::test_sign_fills_fields PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestSignReputationData::test_sign_preserves_entries PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestSignReputationData::test_sign_deterministic PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_valid_signature_passes PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_unsigned_data_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_tampered_entry_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_tampered_hash_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_wrong_key_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_invalid_signature_hex_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_invalid_public_key_hex_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_wrong_length_public_key_rejected PASSED [ 91%]
tests/unit/test_reputation/test_verifier.py::TestVerifyReputationData::test_multiple_entries PASSED [ 91%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_retroscan_capability_blocks_free_tier PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_retroscan_capability_blocks_pro_tier PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_no_data_source PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_file_not_found PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_invalid_trigger PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_json_output PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_table_output PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_with_data_dir PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_quiet_mode PASSED [ 92%]
tests/unit/test_retroscan/test_cli.py::TestRetroscanCommand::test_with_rule_ids PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_empty_reports PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_no_changes PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_added_finding PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_removed_finding PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_severity_changed PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_multiple_reports PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_report_without_findings PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_analyze_fn_exception_handled PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_score_delta PASSED [ 92%]
tests/unit/test_retroscan/test_engine.py::TestRetroscan::test_job_status_transitions PASSED [ 92%]
tests/unit/test_retroscan/test_models.py::TestRetroJobStatus::test_values PASSED [ 92%]
tests/unit/test_retroscan/test_models.py::TestRetroJobTrigger::test_values PASSED [ 92%]
tests/unit/test_retroscan/test_models.py::TestFindingDiff::test_minimal PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestFindingDiff::test_full PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroDiff::test_defaults PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroDiff::test_with_diffs PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroJob::test_defaults PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroJob::test_custom PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroResult::test_empty PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroResult::test_with_diffs PASSED [ 93%]
tests/unit/test_retroscan/test_models.py::TestRetroResult::test_serialization PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestCreateJob::test_basic PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestCreateJob::test_with_trigger_and_rules PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestCreateJob::test_duplicate_raises PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestGetJob::test_found PASSED   [ 93%]
tests/unit/test_retroscan/test_store.py::TestGetJob::test_not_found PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestStoreResult::test_store_and_retrieve PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestStoreResult::test_no_result PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestFindDuplicate::test_found PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestFindDuplicate::test_not_found PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestFindDuplicate::test_rule_order_independent PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestListJobs::test_empty PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestListJobs::test_all PASSED   [ 93%]
tests/unit/test_retroscan/test_store.py::TestListJobs::test_filter_by_status PASSED [ 93%]
tests/unit/test_retroscan/test_store.py::TestListJobs::test_limit PASSED [ 94%]
tests/unit/test_retroscan/test_store.py::TestMarkFailed::test_marks_failed PASSED [ 94%]
tests/unit/test_retroscan/test_store.py::TestMarkFailed::test_nonexistent PASSED [ 94%]
tests/unit/test_retroscan/test_store.py::TestClear::test_clears_all PASSED [ 94%]
tests/unit/test_rules/test_command.py::test_curl_pipe_bash PASSED        [ 94%]
tests/unit/test_rules/test_command.py::test_wget_pipe_shell PASSED       [ 94%]
tests/unit/test_rules/test_command.py::test_inline_python_exec PASSED    [ 94%]
tests/unit/test_rules/test_command.py::test_powershell_download_exec PASSED [ 94%]
tests/unit/test_rules/test_command.py::test_base64_decode_to_shell PASSED [ 94%]
tests/unit/test_rules/test_command.py::test_chained_dangerous_ops PASSED [ 94%]
tests/unit/test_rules/test_command.py::test_sudo_no_password PASSED      [ 94%]
tests/unit/test_rules/test_command.py::test_shell_history_disable PASSED [ 94%]
tests/unit/test_rules/test_command.py::test_eval_with_variable PASSED    [ 94%]
tests/unit/test_rules/test_command.py::test_netcat_reverse_shell PASSED  [ 94%]
tests/unit/test_rules/test_command.py::test_command_rules_skip_comments PASSED [ 94%]
tests/unit/test_rules/test_command.py::test_command_rules_in_markdown PASSED [ 94%]
tests/unit/test_rules/test_config.py::test_hardcoded_secret PASSED       [ 94%]
tests/unit/test_rules/test_config.py::test_insecure_defaults PASSED      [ 94%]
tests/unit/test_rules/test_config.py::test_weak_encryption PASSED        [ 94%]
tests/unit/test_rules/test_config.py::test_unrestricted_cors PASSED      [ 94%]
tests/unit/test_rules/test_config.py::test_database_public_expose PASSED [ 94%]
tests/unit/test_rules/test_config.py::test_default_credentials PASSED    [ 94%]
tests/unit/test_rules/test_config.py::test_sensitive_data_logging PASSED [ 94%]
tests/unit/test_rules/test_config.py::test_rate_limit_disabled PASSED    [ 95%]
tests/unit/test_rules/test_config.py::test_session_timeout_insecure PASSED [ 95%]
tests/unit/test_rules/test_config.py::test_unsafe_file_permissions PASSED [ 95%]
tests/unit/test_rules/test_config.py::test_config_rules_skip_comments PASSED [ 95%]
tests/unit/test_rules/test_config.py::test_config_json_format PASSED     [ 95%]
tests/unit/test_rules/test_config.py::test_config_yaml_format PASSED     [ 95%]
tests/unit/test_rules/test_prompt.py::test_dan_jailbreak_detection PASSED [ 95%]
tests/unit/test_rules/test_prompt.py::test_ignore_previous_instructions PASSED [ 95%]
tests/unit/test_rules/test_prompt.py::test_system_override PASSED        [ 95%]
tests/unit/test_rules/test_prompt.py::test_unrestricted_roleplay PASSED  [ 95%]
tests/unit/test_rules/test_prompt.py::test_token_leakage PASSED          [ 95%]
tests/unit/test_rules/test_prompt.py::test_guardrail_bypass PASSED       [ 95%]
tests/unit/test_rules/test_prompt.py::test_embedded_command PASSED       [ 95%]
tests/unit/test_rules/test_prompt.py::test_obfuscated_jailbreak PASSED   [ 95%]
tests/unit/test_rules/test_prompt.py::test_prompt_rules_skip_code_comments PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_empty_findings_score_zero PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_single_finding PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_multiple_findings PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_severity_multipliers PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_deterministic PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_category_breakdown_groups_correctly PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_score_additive PASSED [ 95%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_score_v1_defaults_match_base PASSED [ 96%]
tests/unit/test_scorer/test_engine.py::TestScoringEngine::test_score_v1_applies_deterministic_factors PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_zero_is_low PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_30_is_low PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_31_is_medium PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_60_is_medium PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_61_is_high PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_100_is_high PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_101_is_critical PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_200_is_critical PASSED [ 96%]
tests/unit/test_scorer/test_severity.py::TestSeverityClassification::test_boundary_values PASSED [ 96%]
tests/unit/test_scorer/test_weights.py::TestWeights::test_all_severities_have_multipliers PASSED [ 96%]
tests/unit/test_scorer/test_weights.py::TestWeights::test_multiplier_values_match_spec PASSED [ 96%]
tests/unit/test_scorer/test_weights.py::TestWeights::test_display_cap PASSED [ 96%]
tests/unit/test_scorer/test_weights.py::TestWeights::test_multipliers_monotonically_increasing PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_sorted_keys PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_no_whitespace PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_nested_objects_sorted PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_deterministic PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_empty_dict PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_special_characters_ascii_escaped PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestCanonicalJson::test_null_values PASSED [ 96%]
tests/unit/test_signer/test_canonical.py::TestHashCanonical::test_returns_hex_string PASSED [ 97%]
tests/unit/test_signer/test_canonical.py::TestHashCanonical::test_deterministic PASSED [ 97%]
tests/unit/test_signer/test_canonical.py::TestHashCanonical::test_different_data_different_hash PASSED [ 97%]
tests/unit/test_signer/test_canonical.py::TestHashCanonical::test_key_order_does_not_affect_hash PASSED [ 97%]
tests/unit/test_signer/test_canonical.py::TestHashCanonical::test_empty_dict PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestSignReport::test_returns_attestation_dict PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestSignReport::test_report_hash_is_sha256_hex PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestSignReport::test_signature_is_hex PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestSignReport::test_public_key_matches_generated PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestSignReport::test_excludes_attestation_field_from_hash PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestSignReport::test_raises_without_key PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReport::test_verify_valid_signed_report PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReport::test_rejects_tampered_report PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReport::test_rejects_missing_attestation PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReport::test_rejects_missing_attestation_fields PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReport::test_rejects_invalid_signature_hex PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReport::test_rejects_wrong_signature PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReportWithKey::test_verify_with_matching_key PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReportWithKey::test_rejects_wrong_public_key PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestVerifyReportWithKey::test_rejects_tampered_with_explicit_key PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestCreateSignedReport::test_adds_attestation_block PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestCreateSignedReport::test_preserves_original_fields PASSED [ 97%]
tests/unit/test_signer/test_engine.py::TestCreateSignedReport::test_roundtrip_sign_verify PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_generates_keypair_files PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_private_key_is_32_bytes PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_public_key_is_hex_encoded PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_private_key_permissions PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_raises_if_key_already_exists PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_creates_directory_if_missing PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestGenerateKeypair::test_different_calls_produce_different_keys PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestLoadSigningKey::test_loads_valid_key PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestLoadSigningKey::test_raises_if_no_key_file PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestLoadSigningKey::test_raises_if_invalid_key_size PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestLoadPublicKeyHex::test_loads_valid_public_key PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestLoadPublicKeyHex::test_raises_if_no_public_key PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestPublicKeyFromHex::test_valid_hex_key PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestPublicKeyFromHex::test_invalid_hex_string PASSED [ 98%]
tests/unit/test_signer/test_keys.py::TestPublicKeyFromHex::test_wrong_length PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestBuildSigningScope::test_excludes_attestation_key PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestBuildSigningScope::test_preserves_other_fields PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestBuildSigningScope::test_extraction_manifest_included PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestBuildSigningScope::test_no_attestation_field_preserved_as_is PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestBuildSigningScope::test_mutation_does_not_affect_original PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestCanonicalJson::test_sorted_keys PASSED [ 98%]
tests/unit/test_signer/test_signing_scope.py::TestCanonicalJson::test_no_whitespace PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestCanonicalJson::test_deterministic_with_nested_dicts PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestCanonicalJson::test_nested_dict_keys_sorted PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestHashCanonical::test_same_data_same_hash PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestHashCanonical::test_different_data_different_hash PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestHashCanonical::test_is_sha256_hex PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestHashCanonical::test_extraction_manifest_change_changes_hash PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestHashCanonical::test_provenance_in_finding_changes_hash PASSED [ 99%]
tests/unit/test_signer/test_signing_scope.py::TestHashCanonical::test_attestation_excluded_from_hash PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_exists PASSED      [ 99%]
tests/unit/test_version.py::TestVersion::test_version_semver_format PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_importable_from_package PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_is_string PASSED   [ 99%]
tests/unit/test_version.py::TestVersion::test_version_has_major_minor_patch PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_current_version_value PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[1] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[1.0] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[v1.0.0] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[1.0.0.0] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[a.b.c] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_rejects_invalid_formats[1.0.0 final] PASSED [ 99%]
tests/unit/test_version.py::TestVersion::test_version_no_whitespace PASSED [100%]

=============================== warnings summary ===============================
tests/defense/test_security_fixes_16_29_35.py: 7 warnings
tests/unit/test_api/test_alerts_api.py: 3 warnings
tests/unit/test_api/test_auth_api_keys.py: 12 warnings
tests/unit/test_api/test_auth_contract_migration_modes.py: 1 warning
tests/unit/test_api/test_auth_edges.py: 4 warnings
tests/unit/test_api/test_hunt_api.py: 6 warnings
tests/unit/test_api/test_payments_annual_billing.py: 1 warning
tests/unit/test_api/test_payments_resilience.py: 2 warnings
tests/unit/test_api/test_retroscan_api.py: 2 warnings
tests/unit/test_api/test_scan_rate_limit.py: 3 warnings
tests/unit/test_api/test_scans_api.py: 6 warnings
tests/unit/test_api/test_security_utils.py: 5 warnings
tests/unit/test_api/test_teams_api.py: 12 warnings
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/jwt/api_jwt.py:153: InsecureKeyLengthWarning: The HMAC key is 22 bytes long, which is below the minimum recommended length of 32 bytes for SHA256. See RFC 7518 Section 3.2.
    return self._jws.encode(

tests/defense/test_security_fixes_16_29_35.py: 7 warnings
tests/unit/test_api/test_alerts_api.py: 3 warnings
tests/unit/test_api/test_auth_api_keys.py: 7 warnings
tests/unit/test_api/test_auth_contract_migration_modes.py: 1 warning
tests/unit/test_api/test_auth_edges.py: 1 warning
tests/unit/test_api/test_hunt_api.py: 6 warnings
tests/unit/test_api/test_payments_annual_billing.py: 1 warning
tests/unit/test_api/test_payments_resilience.py: 2 warnings
tests/unit/test_api/test_retroscan_api.py: 2 warnings
tests/unit/test_api/test_scan_rate_limit.py: 3 warnings
tests/unit/test_api/test_scans_api.py: 6 warnings
tests/unit/test_api/test_security_utils.py: 5 warnings
tests/unit/test_api/test_teams_api.py: 12 warnings
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/jwt/api_jwt.py:371: InsecureKeyLengthWarning: The HMAC key is 22 bytes long, which is below the minimum recommended length of 32 bytes for SHA256. See RFC 7518 Section 3.2.
    decoded = self.decode_complete(

tests/defense/test_security_fixes_16_29_35.py::TestDoSProtection::test_scan_payload_size_limit_16_35[asyncio]
tests/defense/test_security_fixes_16_29_35.py::TestDoSProtection::test_verify_payload_size_limit_16_35[asyncio]
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:2227: DeprecationWarning: 'HTTP_413_REQUEST_ENTITY_TOO_LARGE' is deprecated. Use 'HTTP_413_CONTENT_TOO_LARGE' instead.
    retval = await coro

tests/unit/test_api/test_payments_annual_billing.py: 4 warnings
tests/unit/test_api/test_payments_resilience.py: 24 warnings
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/httpx/_models.py:408: DeprecationWarning: Use 'content=<...>' to upload raw bytes/text content.
    headers, stream = encode_request(

tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_wrong_secret_raises_auth_error
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/jwt/api_jwt.py:153: InsecureKeyLengthWarning: The HMAC key is 31 bytes long, which is below the minimum recommended length of 32 bytes for SHA256. See RFC 7518 Section 3.2.
    return self._jws.encode(

tests/unit/test_api/test_supabase_jwt.py::TestHS256Verification::test_wrong_secret_raises_auth_error
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/jwt/api_jwt.py:371: InsecureKeyLengthWarning: The HMAC key is 31 bytes long, which is below the minimum recommended length of 32 bytes for SHA256. See RFC 7518 Section 3.2.
    decoded = self.decode_complete(

tests/unit/test_quality/test_supabase_compat_migration.py::test_apply_migration_is_idempotent_with_checkpoint
tests/unit/test_quality/test_supabase_compat_migration.py::test_apply_migration_is_idempotent_with_checkpoint
tests/unit/test_quality/test_supabase_compat_migration.py::test_rollback_restores_previous_values
tests/unit/test_quality/test_supabase_compat_migration.py::test_rollback_restores_previous_values
tests/unit/test_quality/test_supabase_compat_migration.py::test_rollback_restores_previous_values
  /Users/spy/Documents/PY/AI/skillgate/venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py:952: DeprecationWarning: The default datetime adapter is deprecated as of Python 3.12; see the sqlite3 documentation for suggested replacement recipes
    cursor.execute(statement, parameters)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======== 2217 passed, 2 skipped, 27 deselected, 157 warnings in 58.76s =========
