Coverage report: 99%

Files Functions Classes

coverage.py v7.16.1, created at 2026-09-30 06:29 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
src/ai_jury/__init__.py (no function)   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _kill_process_group   67% 6 2 0   50% 2 1   62%
src/ai_jury/adapters.py _spawn   100% 14 0 0   75% 4 1   94%
src/ai_jury/adapters.py _review_workdir   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py _read_only_extra_args   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _write_extra_args   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _keyword_pattern   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py classify_stderr   100% 9 0 0   100% 6 0   100%
src/ai_jury/adapters.py _carries_review_substance   100% 7 0 0   100% 4 0   100%
src/ai_jury/adapters.py _is_whole_output_refusal   100% 6 0 0   100% 4 0   100%
src/ai_jury/adapters.py _is_cli_banner   100% 12 0 2   100% 6 0   100%
src/ai_jury/adapters.py no_review_reason   100% 12 0 0   100% 10 0   100%
src/ai_jury/adapters.py effort_supported   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _anthropic_budget   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _effort_uses_model_listing   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py effort_args   100% 23 0 0   100% 18 0   100%
src/ai_jury/adapters.py effort_warnings   100% 20 0 0   100% 6 0   100%
src/ai_jury/adapters.py parse_model_list   100% 31 0 0   100% 22 0   100%
src/ai_jury/adapters.py Adapter.__init__   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.name   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.available   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.build_argv   100% 0 0 1   100% 0 0   100%
src/ai_jury/adapters.py Adapter.build_write_argv   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.build_argv_for_role   100% 3 0 0   100% 2 0   100%
src/ai_jury/adapters.py Adapter._stdin_for   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter._text_from_stdout   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter._version_argv   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.effort_plan   100% 4 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.resolved_model   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.list_models   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py Adapter.detect_capabilities   100% 22 0 0   100% 4 0   100%
src/ai_jury/adapters.py Adapter.run   100% 32 0 0   100% 12 0   100%
src/ai_jury/adapters.py ClaudeAdapter._head_argv   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py ClaudeAdapter.build_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py ClaudeAdapter.build_write_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py ClaudeAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py CodexAdapter._head_argv   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py CodexAdapter.build_argv   100% 5 0 0   100% 0 0   100%
src/ai_jury/adapters.py CodexAdapter.build_write_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py CodexAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py AgyAdapter.effort_plan   100% 6 0 0   100% 2 0   100%
src/ai_jury/adapters.py AgyAdapter._cached_model_listing   100% 3 0 0   100% 2 0   100%
src/ai_jury/adapters.py AgyAdapter._head_argv   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py AgyAdapter.build_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py AgyAdapter.build_write_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py AgyAdapter.list_models   100% 9 0 0   100% 4 0   100%
src/ai_jury/adapters.py AgyAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py AgyAdapter._text_from_stdout   100% 17 0 0   90% 10 1   96%
src/ai_jury/adapters.py _http_only_opener   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py _open   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py list_local_models   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py local_model_listing   100% 20 0 0   100% 8 0   100%
src/ai_jury/adapters.py LocalAdapter.endpoint   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py LocalAdapter.completions_url   100% 4 0 0   100% 2 0   100%
src/ai_jury/adapters.py LocalAdapter.build_payload   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py LocalAdapter.parse_content   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py LocalAdapter.classify_http_status   100% 5 0 0   100% 4 0   100%
src/ai_jury/adapters.py LocalAdapter.available   100% 9 0 0   100% 0 0   100%
src/ai_jury/adapters.py LocalAdapter.list_models   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py LocalAdapter.detect_capabilities   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py LocalAdapter.run   100% 37 0 0   100% 6 0   100%
src/ai_jury/adapters.py _hosted_api_status_code   100% 5 0 0   100% 4 0   100%
src/ai_jury/adapters.py _post_json   100% 23 0 0   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter._env_var_name   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter._api_key   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter._api_url   100% 0 0 1   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter._invalid_key_reason   100% 3 0 0   100% 2 0   100%
src/ai_jury/adapters.py _HostedApiAdapter._scrub_secret   100% 4 0 0   100% 2 0   100%
src/ai_jury/adapters.py _HostedApiAdapter.available   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter.detect_capabilities   100% 9 0 0   100% 4 0   100%
src/ai_jury/adapters.py _HostedApiAdapter.build_payload   100% 0 0 1   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter._headers   100% 0 0 1   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter.parse_content   100% 0 0 1   100% 0 0   100%
src/ai_jury/adapters.py _HostedApiAdapter.run   100% 22 0 0   100% 12 0   100%
src/ai_jury/adapters.py AnthropicApiAdapter._api_url   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py AnthropicApiAdapter.build_payload   100% 8 0 0   100% 2 0   100%
src/ai_jury/adapters.py AnthropicApiAdapter._headers   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py AnthropicApiAdapter.parse_content   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py OpenAiApiAdapter._api_url   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py OpenAiApiAdapter.build_payload   100% 3 0 0   100% 0 0   100%
src/ai_jury/adapters.py OpenAiApiAdapter._headers   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py OpenAiApiAdapter.parse_content   100% 7 0 0   100% 4 0   100%
src/ai_jury/adapters.py XaiApiAdapter._api_url   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py GoogleApiAdapter._api_url   100% 3 0 0   100% 0 0   100%
src/ai_jury/adapters.py GoogleApiAdapter.build_payload   100% 3 0 0   100% 0 0   100%
src/ai_jury/adapters.py GoogleApiAdapter._headers   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py GoogleApiAdapter.parse_content   100% 11 0 0   100% 6 0   100%
src/ai_jury/adapters.py MockAdapter.available   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py MockAdapter.detect_capabilities   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py MockAdapter.run   100% 10 0 0   100% 6 0   100%
src/ai_jury/adapters.py GenericOpenAICompatibleAdapter._api_url   75% 4 1 0   50% 2 1   67%
src/ai_jury/adapters.py GenericOpenAICompatibleAdapter.build_payload   100% 3 0 0   100% 0 0   100%
src/ai_jury/adapters.py GenericOpenAICompatibleAdapter._headers   100% 4 0 0   50% 2 1   83%
src/ai_jury/adapters.py GenericOpenAICompatibleAdapter.parse_content   75% 24 6 0   60% 20 6   68%
src/ai_jury/adapters.py GenericCLIAdapter._prompt_mode   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py GenericCLIAdapter.build_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py GenericCLIAdapter.build_write_argv   100% 2 0 0   100% 0 0   100%
src/ai_jury/adapters.py GenericCLIAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py GenericCLIAdapter._argv_too_long_hint   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py GenericCLIAdapter.available   75% 4 1 0   50% 2 1   67%
src/ai_jury/adapters.py GenericCLIAdapter.detect_capabilities   100% 3 0 0   100% 2 0   100%
src/ai_jury/adapters.py GenericCLIAdapter.run   93% 28 2 0   88% 8 1   92%
src/ai_jury/adapters.py register_adapter   100% 6 0 0   100% 2 0   100%
src/ai_jury/adapters.py _registry_state   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py _restore_registry_state   100% 4 0 0   100% 2 0   100%
src/ai_jury/adapters.py make_adapter   100% 6 0 0   100% 4 0   100%
src/ai_jury/adapters.py adapter_class   100% 9 0 0   100% 6 0   100%
src/ai_jury/adapters.py (no function)   100% 238 0 6   100% 0 0   100%
src/ai_jury/ballots.py _deanchor   100% 2 0 0   100% 0 0   100%
src/ai_jury/ballots.py _marked_spans   100% 10 0 0   100% 6 0   100%
src/ai_jury/ballots.py _unmarked   100% 7 0 0   100% 4 0   100%
src/ai_jury/ballots.py _path_base   100% 2 0 0   100% 0 0   100%
src/ai_jury/ballots.py _edge_stripped   100% 5 0 0   100% 2 0   100%
src/ai_jury/ballots.py _joined_against_change   100% 13 0 0   100% 6 0   100%
src/ai_jury/ballots.py _scope_tokens   100% 9 0 0   100% 8 0   100%
src/ai_jury/ballots.py _is_name_shaped   100% 3 0 0   100% 2 0   100%
src/ai_jury/ballots.py _path_shaped   100% 3 0 0   100% 2 0   100%
src/ai_jury/ballots.py _token_resolves   100% 7 0 0   100% 4 0   100%
src/ai_jury/ballots.py resolve_stated_scope   100% 8 0 0   100% 6 0   100%
src/ai_jury/ballots.py normalize_verdict   100% 2 0 0   100% 0 0   100%
src/ai_jury/ballots.py _prose_lines   100% 9 0 0   100% 6 0   100%
src/ai_jury/ballots.py _clauses   100% 8 0 0   100% 6 0   100%
src/ai_jury/ballots.py _first_matching   100% 4 0 0   100% 4 0   100%
src/ai_jury/ballots.py _matching   100% 7 0 0   100% 6 0   100%
src/ai_jury/ballots.py _files_named   100% 6 0 0   100% 4 0   100%
src/ai_jury/ballots.py scope_is_substantive   100% 4 0 0   100% 2 0   100%
src/ai_jury/ballots.py _tick   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py _stated_line   100% 8 0 0   100% 6 0   100%
src/ai_jury/ballots.py _free_clauses   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py _claims_named   100% 6 0 0   100% 4 0   100%
src/ai_jury/ballots.py _stated_scope_sentence   100% 10 0 0   100% 6 0   100%
src/ai_jury/ballots.py describe_scope   100% 22 0 0   100% 10 0   100%
src/ai_jury/ballots.py _named_only_absent   100% 7 0 0   100% 4 0   100%
src/ai_jury/ballots.py abstention_cause   100% 9 0 0   100% 8 0   100%
src/ai_jury/ballots.py _no_scope_reason   100% 14 0 0   100% 8 0   100%
src/ai_jury/ballots.py abstention_scope   100% 2 0 0   100% 0 0   100%
src/ai_jury/ballots.py describe_testing   100% 5 0 0   100% 2 0   100%
src/ai_jury/ballots.py _spec_for   100% 4 0 0   100% 4 0   100%
src/ai_jury/ballots.py sent_model   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py requested_model   100% 8 0 0   100% 0 0   100%
src/ai_jury/ballots.py describe_model   100% 14 0 0   100% 8 0   100%
src/ai_jury/ballots.py _vendor_for   100% 4 0 0   100% 4 0   100%
src/ai_jury/ballots.py participating   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py _stance_by_reviewer   100% 2 0 0   100% 0 0   100%
src/ai_jury/ballots.py _verdict_for   100% 7 0 0   100% 6 0   100%
src/ai_jury/ballots.py chair_verdict   100% 6 0 0   100% 2 0   100%
src/ai_jury/ballots.py _abstained_because   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py _chaired_ballot_sentence   100% 5 0 0   100% 2 0   100%
src/ai_jury/ballots.py _verified_count   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py reviewer_ballots   100% 29 0 0   100% 6 0   100%
src/ai_jury/ballots.py _keel_finding   100% 2 0 0   100% 0 0   100%
src/ai_jury/ballots.py _chair_findings   100% 1 0 0   100% 0 0   100%
src/ai_jury/ballots.py _chair_role_sentence   100% 6 0 0   100% 4 0   100%
src/ai_jury/ballots.py _chair_scope   100% 11 0 0   100% 0 0   100%
src/ai_jury/ballots.py keel_reviews   100% 8 0 0   100% 2 0   100%
src/ai_jury/ballots.py (no function)   100% 87 0 0   100% 0 0   100%
src/ai_jury/benchmark.py _severity_rank   100% 3 0 0   100% 2 0   100%
src/ai_jury/benchmark.py _is_blocking   100% 2 0 0   100% 0 0   100%
src/ai_jury/benchmark.py _line_matches   100% 8 0 0   100% 4 0   100%
src/ai_jury/benchmark.py _keywords_match   100% 4 0 0   100% 2 0   100%
src/ai_jury/benchmark.py finding_matches_expected   100% 9 0 0   100% 6 0   100%
src/ai_jury/benchmark.py score_fixture   100% 31 0 0   100% 14 0   100%
src/ai_jury/benchmark.py aggregate   100% 17 0 0   75% 4 1   95%
src/ai_jury/benchmark.py load_fixture   100% 12 0 0   100% 2 0   100%
src/ai_jury/benchmark.py discover_fixture_ids   100% 4 0 0   100% 2 0   100%
src/ai_jury/benchmark.py load_fixtures   100% 1 0 0   100% 0 0   100%
src/ai_jury/benchmark.py run_offline   100% 3 0 0   100% 0 0   100%
src/ai_jury/benchmark.py live_enabled   100% 1 0 0   100% 0 0   100%
src/ai_jury/benchmark.py run_live   100% 12 0 0   100% 4 0   100%
src/ai_jury/benchmark.py _finding_to_dict   100% 1 0 0   100% 0 0   100%
src/ai_jury/benchmark.py format_table   100% 8 0 0   100% 2 0   100%
src/ai_jury/benchmark.py main   100% 7 0 0   100% 0 0   100%
src/ai_jury/benchmark.py (no function)   100% 44 0 2   100% 0 0   100%
src/ai_jury/cache.py default_cache_dir   100% 5 0 0   100% 2 0   100%
src/ai_jury/cache.py _policy_fingerprint   100% 5 0 0   100% 2 0   100%
src/ai_jury/cache.py cache_key   100% 8 0 0   100% 4 0   100%
src/ai_jury/cache.py _finding   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py _verdict   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py _agent_result   100% 3 0 0   100% 2 0   100%
src/ai_jury/cache.py _group   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py _hit   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py _change_index   100% 3 0 0   100% 2 0   100%
src/ai_jury/cache.py outcome_to_dict   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py outcome_from_dict   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py _dir_is_untrusted   57% 7 3 0   50% 2 1   56%
src/ai_jury/cache.py _hmac_key   53% 19 9 0   100% 0 0   53%
src/ai_jury/cache.py _canonical   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py _compute_mac   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py Cache.__init__   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py Cache._path   100% 1 0 0   100% 0 0   100%
src/ai_jury/cache.py Cache.load   100% 26 0 0   100% 14 0   100%
src/ai_jury/cache.py Cache.store   83% 23 4 0   100% 4 0   85%
src/ai_jury/cache.py Cache.clear   87% 15 2 0   90% 10 1   88%
src/ai_jury/cache.py (no function)   100% 46 0 0   100% 0 0   100%
src/ai_jury/ci.py resolve_fail_on   100% 11 0 0   100% 6 0   100%
src/ai_jury/ci.py _vocabulary_error   100% 1 0 0   100% 0 0   100%
src/ai_jury/ci.py fail_on_error   100% 2 0 0   100% 0 0   100%
src/ai_jury/ci.py evaluate_ci   100% 29 0 0   100% 18 0   100%
src/ai_jury/ci.py (no function)   100% 6 0 0   100% 0 0   100%
src/ai_jury/classification.py _severity_rank   100% 1 0 0   100% 0 0   100%
src/ai_jury/classification.py _resolved_findings   100% 5 0 0   100% 4 0   100%
src/ai_jury/classification.py _resolved_groups   100% 5 0 0   100% 4 0   100%
src/ai_jury/classification.py diff_lines_changed   83% 6 1 0   75% 4 1   80%
src/ai_jury/classification.py _text_blob   100% 2 0 0   100% 0 0   100%
src/ai_jury/classification.py is_security_finding   100% 4 0 0   100% 2 0   100%
src/ai_jury/classification.py _risk_level_from_stats   100% 10 0 0   100% 10 0   100%
src/ai_jury/classification.py _review_effort_from_stats   100% 16 0 0   100% 14 0   100%
src/ai_jury/classification.py _has_unresolved_groups   100% 6 0 0   100% 6 0   100%
src/ai_jury/classification.py classify   100% 24 0 0   100% 12 0   100%
src/ai_jury/classification.py label_strings   100% 6 0 0   100% 4 0   100%
src/ai_jury/classification.py summary_line   100% 1 0 0   100% 0 0   100%
src/ai_jury/classification.py (no function)   100% 25 0 0   100% 0 0   100%
src/ai_jury/cli.py _read_capped   100% 8 0 0   100% 6 0   100%
src/ai_jury/cli.py _checked_revision   100% 6 0 0   100% 4 0   100%
src/ai_jury/cli.py _git_diff   100% 11 0 0   100% 4 0   100%
src/ai_jury/cli.py _bundled_sample_diff   100% 1 0 0   100% 0 0   100%
src/ai_jury/cli.py _read_diff   100% 22 0 0   100% 14 0   100%
src/ai_jury/cli.py build_parser   100% 74 0 0   100% 0 0   100%
src/ai_jury/cli.py _run_apply   100% 67 0 0   100% 30 0   100%
src/ai_jury/cli.py _run_comment_command   100% 25 0 0   100% 8 0   100%
src/ai_jury/cli.py _default_init_agents   100% 3 0 0   100% 0 0   100%
src/ai_jury/cli.py _init_available   100% 10 0 0   100% 2 0   100%
src/ai_jury/cli.py _stdin_is_terminal   100% 1 0 0   100% 0 0   100%
src/ai_jury/cli.py _init_interactive   100% 37 0 0   100% 14 0   100%
src/ai_jury/cli.py _init_wizard   100% 63 0 0   100% 36 0   100%
src/ai_jury/cli.py _init_wizard.ask   100% 1 0 0   100% 0 0   100%
src/ai_jury/cli.py _init_wizard.choose   100% 10 0 0   100% 6 0   100%
src/ai_jury/cli.py _run_init   100% 116 0 0   100% 46 0   100%
src/ai_jury/cli.py _run_init._detected_agents   100% 1 0 0   100% 0 0   100%
src/ai_jury/cli.py _run_init._selectable_agents   75% 4 1 0   50% 2 1   67%
src/ai_jury/cli.py _run_init._resolve_preset_agents   100% 5 0 0   100% 4 0   100%
src/ai_jury/cli.py _config_read_error   100% 3 0 0   100% 0 0   100%
src/ai_jury/cli.py _config_source   100% 3 0 0   100% 2 0   100%
src/ai_jury/cli.py _render_effective_config   100% 18 0 0   100% 2 0   100%
src/ai_jury/cli.py _run_config   100% 20 0 0   100% 2 0   100%
src/ai_jury/cli.py _read_prompt   89% 18 2 0   100% 10 0   93%
src/ai_jury/cli.py _run_agent_parser   100% 21 0 0   100% 0 0   100%
src/ai_jury/cli.py _child_argv   100% 18 0 0   100% 16 0   100%
src/ai_jury/cli.py _run_run_agent   100% 122 0 3   98% 66 1   99%
src/ai_jury/cli.py _crash_document   100% 5 0 0   100% 0 0   100%
src/ai_jury/cli.py _child_recorder   100% 4 0 0   100% 0 0   100%
src/ai_jury/cli.py _child_recorder.record   100% 6 0 0   100% 0 0   100%
src/ai_jury/cli.py _detach_run_agent   100% 24 0 0   100% 6 0   100%
src/ai_jury/cli.py _spawn_detached   100% 9 0 0   50% 2 1   91%
src/ai_jury/cli.py _run_replay   100% 37 0 0   100% 16 0   100%
src/ai_jury/cli.py _is_progress_milestone   100% 1 0 0   100% 0 0   100%
src/ai_jury/cli.py _override_bound_error   100% 8 0 0   100% 6 0   100%
src/ai_jury/cli.py _maybe_add_local_fallback   100% 20 0 0   100% 8 0   100%
src/ai_jury/cli.py _force_utf8_output   100% 5 0 0   100% 4 0   100%
src/ai_jury/cli.py main   100% 379 0 0   99% 214 1   99%
src/ai_jury/cli.py main.log   100% 4 0 0   100% 4 0   100%
src/ai_jury/cli.py main.on_event   100% 10 0 0   100% 4 0   100%
src/ai_jury/cli.py main._post   100% 7 0 0   100% 0 0   100%
src/ai_jury/cli.py (no function)   100% 63 0 2   100% 0 0   100%
src/ai_jury/commands.py ParsedCommand.to_cli_args   100% 6 0 0   100% 4 0   100%
src/ai_jury/commands.py parse_comment   100% 34 0 0   100% 18 0   100%
src/ai_jury/commands.py (no function)   100% 15 0 0   100% 0 0   100%
src/ai_jury/config.py _read_toml_bounded   100% 12 0 0   100% 2 0   100%
src/ai_jury/config.py _is_relative_path_command   100% 3 0 0   100% 0 0   100%
src/ai_jury/config.py _endpoint_issues   92% 25 2 0   90% 10 1   91%
src/ai_jury/config.py _non_negative_int   100% 5 0 0   100% 0 0   100%
src/ai_jury/config.py agy_opt_in_hint   100% 5 0 0   100% 4 0   100%
src/ai_jury/config.py register_vendor   100% 3 0 0   100% 2 0   100%
src/ai_jury/config.py register_adapter_transport   100% 3 0 0   100% 2 0   100%
src/ai_jury/config.py spawns_process   100% 9 0 0   100% 6 0   100%
src/ai_jury/config.py recognised_vendors   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py normalise_vendor   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py is_recognised_vendor   100% 2 0 0   100% 0 0   100%
src/ai_jury/config.py is_commandless_vendor   100% 2 0 0   100% 0 0   100%
src/ai_jury/config.py vendor_identity   100% 4 0 0   100% 2 0   100%
src/ai_jury/config.py recognised_adapters   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py is_recognised_adapter   100% 2 0 0   100% 0 0   100%
src/ai_jury/config.py unknown_adapter_error   100% 4 0 0   100% 2 0   100%
src/ai_jury/config.py adapter_key   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py spec_adapter   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py is_valid_temperature   100% 3 0 0   100% 2 0   100%
src/ai_jury/config.py _headers_not_a_table_message   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py _headers_bad_key_message   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py _headers_coerced_value_warning   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py _agent_not_a_table_message   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py _nested_table_message   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py bound_error   100% 7 0 0   100% 4 0   100%
src/ai_jury/config.py validate_config   100% 168 0 0   100% 134 0   100%
src/ai_jury/config.py AgentSpec.__post_init__   100% 8 0 0   100% 4 0   100%
src/ai_jury/config.py AgentSpec.adapter_key   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py JuryConfig.__post_init__   100% 2 0 0   100% 0 0   100%
src/ai_jury/config.py JuryConfig.effective_max_rounds   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py JuryConfig.enabled_agents   100% 1 0 0   100% 0 0   100%
src/ai_jury/config.py default_chair   100% 4 0 0   100% 4 0   100%
src/ai_jury/config.py _ci_from_dict   100% 7 0 0   100% 4 0   100%
src/ai_jury/config.py _context_from_dict   100% 6 0 0   100% 4 0   100%
src/ai_jury/config.py _output_from_dict   100% 3 0 0   100% 2 0   100%
src/ai_jury/config.py _str_list   100% 5 0 0   100% 4 0   100%
src/ai_jury/config.py _diff_from_dict   100% 4 0 0   100% 2 0   100%
src/ai_jury/config.py _seed_from_dict   100% 7 0 0   100% 2 0   100%
src/ai_jury/config.py _opt_positive_int   100% 7 0 0   100% 2 0   100%
src/ai_jury/config.py _from_dict   100% 29 0 0   100% 14 0   100%
src/ai_jury/config.py config_hash   100% 5 0 0   100% 0 0   100%
src/ai_jury/config.py load_raw_config   100% 9 0 0   100% 6 0   100%
src/ai_jury/config.py load_config   100% 4 0 0   100% 2 0   100%
src/ai_jury/config.py (no function)   100% 158 0 0   100% 0 0   100%
src/ai_jury/configtrust.py _truthy_env   100% 1 0 0   100% 0 0   100%
src/ai_jury/configtrust.py _config_dir   100% 2 0 0   100% 0 0   100%
src/ai_jury/configtrust.py trust_store_path   100% 1 0 0   100% 0 0   100%
src/ai_jury/configtrust.py content_digest   100% 1 0 0   100% 0 0   100%
src/ai_jury/configtrust.py _entry   100% 1 0 0   100% 0 0   100%
src/ai_jury/configtrust.py is_trusted   100% 5 0 0   100% 0 0   100%
src/ai_jury/configtrust.py record_trust   100% 10 0 0   50% 2 1   92%
src/ai_jury/configtrust.py command_seats   100% 5 0 0   100% 4 0   100%
src/ai_jury/configtrust.py _discovered_path   100% 4 0 0   100% 2 0   100%
src/ai_jury/configtrust.py enforce   100% 28 0 0   100% 14 0   100%
src/ai_jury/configtrust.py (no function)   100% 18 0 0   100% 0 0   100%
src/ai_jury/consensus.py _normalize_path   100% 6 0 0   100% 4 0   100%
src/ai_jury/consensus.py _normalize_claim   100% 3 0 0   100% 0 0   100%
src/ai_jury/consensus.py _tokens   100% 1 0 0   100% 0 0   100%
src/ai_jury/consensus.py _jaccard   100% 7 0 0   100% 4 0   100%
src/ai_jury/consensus.py _same_location   100% 7 0 0   100% 6 0   100%
src/ai_jury/consensus.py _same_claim   100% 3 0 0   100% 2 0   100%
src/ai_jury/consensus.py _sort_key   100% 1 0 0   100% 0 0   100%
src/ai_jury/consensus.py _max_severity   100% 8 0 0   100% 4 0   100%
src/ai_jury/consensus.py _classify   100% 5 0 0   100% 4 0   100%
src/ai_jury/consensus.py demote_local_only_groups   100% 7 0 0   100% 8 0   100%
src/ai_jury/consensus.py group_findings   100% 23 0 0   100% 10 0   100%
src/ai_jury/consensus.py (no function)   100% 33 0 0   100% 0 0   100%
src/ai_jury/convergence.py review_convergence   100% 9 0 0   100% 6 0   100%
src/ai_jury/convergence.py _section_has_content   100% 13 0 0   100% 8 0   100%
src/ai_jury/convergence.py debate_convergence   100% 4 0 0   100% 2 0   100%
src/ai_jury/convergence.py (no function)   100% 9 0 0   100% 0 0   100%
src/ai_jury/diffprofile.py _is_doc_or_generated   100% 1 0 0   100% 0 0   100%
src/ai_jury/diffprofile.py _path_is_security_sensitive   100% 1 0 0   100% 0 0   100%
src/ai_jury/diffprofile.py profile_diff   100% 19 0 0   100% 12 0   100%
src/ai_jury/diffprofile.py depth_for   100% 5 0 0   100% 4 0   100%
src/ai_jury/diffprofile.py describe   100% 7 0 0   100% 4 0   100%
src/ai_jury/diffprofile.py (no function)   100% 23 0 0   100% 0 0   100%
src/ai_jury/doctor.py _redact_value   100% 3 0 0   100% 2 0   100%
src/ai_jury/doctor.py _detect_capabilities   100% 5 0 0   100% 0 0   100%
src/ai_jury/doctor.py _is_available   100% 4 0 0   100% 0 0   100%
src/ai_jury/doctor.py _resolved_command   75% 8 2 0   100% 2 0   80%
src/ai_jury/doctor.py _probe_models   100% 7 0 0   100% 2 0   100%
src/ai_jury/doctor.py _model_is_listed   100% 1 0 0   100% 0 0   100%
src/ai_jury/doctor.py _local_model_gap   100% 19 0 0   100% 8 0   100%
src/ai_jury/doctor.py _endpoint_for   100% 10 0 0   100% 4 0   100%
src/ai_jury/doctor.py _unavailable_transport   100% 6 0 0   100% 4 0   100%
src/ai_jury/doctor.py _unavailable_reason   100% 11 0 0   100% 8 0   100%
src/ai_jury/doctor.py _agent_entry   100% 10 0 0   100% 4 0   100%
src/ai_jury/doctor.py _config_summary   100% 1 0 0   100% 0 0   100%
src/ai_jury/doctor.py _detect_warnings   100% 26 0 0   100% 18 0   100%
src/ai_jury/doctor.py _panel_readiness   100% 11 0 0   100% 2 0   100%
src/ai_jury/doctor.py _gate_would_fail   100% 1 0 0   100% 0 0   100%
src/ai_jury/doctor.py _fallback_ready_reason   100% 8 0 0   100% 6 0   100%
src/ai_jury/doctor.py _panel_warning   100% 4 0 0   100% 2 0   100%
src/ai_jury/doctor.py _recommendations   100% 27 0 0   100% 16 0   100%
src/ai_jury/doctor.py build_diagnostics   98% 46 1 0   100% 12 0   98%
src/ai_jury/doctor.py build_diagnostics._list_once   100% 3 0 0   100% 0 0   100%
src/ai_jury/doctor.py capability_labels   100% 2 0 0   100% 0 0   100%
src/ai_jury/doctor.py _transport   100% 8 0 0   100% 6 0   100%
src/ai_jury/doctor.py doctor_report_dict   100% 22 0 0   100% 4 0   100%
src/ai_jury/doctor.py render_report   100% 81 0 0   100% 24 0   100%
src/ai_jury/doctor.py (no function)   100% 42 0 0   100% 0 0   100%
src/ai_jury/findings.py flatten_inline   100% 3 0 0   100% 2 0   100%
src/ai_jury/findings.py fence_safe   67% 3 1 0   50% 2 1   60%
src/ai_jury/findings.py strip_html_comments   100% 3 0 0   100% 2 0   100%
src/ai_jury/findings.py _normalize_severity   100% 6 0 0   100% 4 0   100%
src/ai_jury/findings.py canonical_severity   100% 3 0 0   100% 0 0   100%
src/ai_jury/findings.py _normalize_confidence   100% 5 0 0   100% 4 0   100%
src/ai_jury/findings.py Finding.__post_init__   100% 8 0 0   100% 2 0   100%
src/ai_jury/findings.py Finding.from_obj   100% 1 0 0   100% 0 0   100%
src/ai_jury/findings.py emitted_findings_block   100% 1 0 0   100% 0 0   100%
src/ai_jury/findings.py parse_findings   100% 20 0 0   100% 10 0   100%
src/ai_jury/findings.py _coerce_line   100% 6 0 0   100% 2 0   100%
src/ai_jury/findings.py _normalize_status   100% 5 0 0   100% 4 0   100%
src/ai_jury/findings.py parse_verdicts   100% 23 0 0   100% 12 0   100%
src/ai_jury/findings.py (no function)   100% 47 0 0   100% 0 0   100%
src/ai_jury/formats.py severity_to_sarif_level   100% 1 0 0   100% 0 0   100%
src/ai_jury/formats.py _finding_dict   100% 1 0 0   100% 0 0   100%
src/ai_jury/formats.py _group_dict   100% 1 0 0   100% 0 0   100%
src/ai_jury/formats.py to_json   100% 10 0 0   100% 2 0   100%
src/ai_jury/formats.py to_keel_reviews   100% 2 0 0   100% 0 0   100%
src/ai_jury/formats.py _sarif_result   100% 4 0 0   100% 2 0   100%
src/ai_jury/formats.py to_sarif   100% 7 0 0   100% 2 0   100%
src/ai_jury/formats.py (no function)   100% 19 0 0   100% 0 0   100%
src/ai_jury/github.py _gh   91% 33 3 0   100% 8 0   93%
src/ai_jury/github.py _gh._drain   100% 1 0 0   100% 0 0   100%
src/ai_jury/github.py pr_diff   100% 5 0 0   100% 2 0   100%
src/ai_jury/github.py pr_context   100% 8 0 0   100% 2 0   100%
src/ai_jury/github.py post_pr_comment   100% 5 0 0   100% 2 0   100%
src/ai_jury/github.py issue_body   100% 9 0 0   100% 2 0   100%
src/ai_jury/github.py post_issue_comment   100% 5 0 0   100% 2 0   100%
src/ai_jury/github.py pr_head_sha   100% 8 0 0   100% 2 0   100%
src/ai_jury/github.py pr_comment_bodies   100% 10 0 0   100% 2 0   100%
src/ai_jury/github.py compare_diff   100% 7 0 0   100% 2 0   100%
src/ai_jury/github.py build_label_args   100% 10 0 0   100% 6 0   100%
src/ai_jury/github.py apply_labels   100% 5 0 0   100% 2 0   100%
src/ai_jury/github.py _finding_signature   100% 4 0 0   100% 0 0   100%
src/ai_jury/github.py _sig_marker   100% 1 0 0   100% 0 0   100%
src/ai_jury/github.py _sig_from_body   100% 4 0 0   100% 2 0   100%
src/ai_jury/github.py _comment_body   100% 8 0 0   100% 2 0   100%
src/ai_jury/github.py _review_body   100% 1 0 0   100% 0 0   100%
src/ai_jury/github.py build_inline_payload   100% 8 0 0   100% 4 0   100%
src/ai_jury/github.py _resolve_repo   100% 7 0 0   100% 2 0   100%
src/ai_jury/github.py _existing_inline_keys   100% 19 0 0   100% 10 0   100%
src/ai_jury/github.py _gh_with_input   100% 14 0 0   100% 4 0   100%
src/ai_jury/github.py post_inline_comments   100% 13 0 0   100% 4 0   100%
src/ai_jury/github.py render_progress_body   100% 9 0 0   100% 6 0   100%
src/ai_jury/github.py _create_issue_comment   100% 5 0 0   100% 0 0   100%
src/ai_jury/github.py _edit_issue_comment   100% 5 0 0   100% 0 0   100%
src/ai_jury/github.py ProgressReporter.__init__   100% 4 0 0   100% 0 0   100%
src/ai_jury/github.py ProgressReporter._push   100% 5 0 0   100% 4 0   100%
src/ai_jury/github.py ProgressReporter.update   100% 2 0 0   100% 0 0   100%
src/ai_jury/github.py ProgressReporter.finish   100% 1 0 0   100% 0 0   100%
src/ai_jury/github.py (no function)   100% 44 0 0   100% 0 0   100%
src/ai_jury/hints.py _run_linter   100% 10 0 0   100% 4 0   100%
src/ai_jury/hints.py _inside   100% 15 0 2   100% 6 0   100%
src/ai_jury/hints.py collect_static_hints   100% 22 0 0   100% 12 0   100%
src/ai_jury/hints.py (no function)   100% 11 0 0   100% 0 0   100%
src/ai_jury/incremental.py reviewed_sha_marker   100% 1 0 0   100% 0 0   100%
src/ai_jury/incremental.py parse_reviewed_sha   100% 5 0 0   100% 4 0   100%
src/ai_jury/incremental.py decide_review   100% 7 0 0   100% 6 0   100%
src/ai_jury/incremental.py compare_range   100% 1 0 0   100% 0 0   100%
src/ai_jury/incremental.py scope_note   100% 2 0 0   100% 0 0   100%
src/ai_jury/incremental.py (no function)   100% 10 0 0   100% 0 0   100%
src/ai_jury/injection.py InjectionHit.location   100% 4 0 0   100% 2 0   100%
src/ai_jury/injection.py _snippet   100% 6 0 0   100% 2 0   100%
src/ai_jury/injection.py _newline_offsets   100% 8 0 0   100% 2 0   100%
src/ai_jury/injection.py scan   100% 15 0 0   100% 10 0   100%
src/ai_jury/injection.py scan.line_of   100% 1 0 0   100% 0 0   100%
src/ai_jury/injection.py scan.add   100% 4 0 0   100% 2 0   100%
src/ai_jury/injection.py scan_inputs   100% 4 0 0   100% 2 0   100%
src/ai_jury/injection.py hits_to_warnings   100% 4 0 0   100% 2 0   100%
src/ai_jury/injection.py hits_to_finding   100% 8 0 0   100% 2 0   100%
src/ai_jury/injection.py (no function)   100% 23 0 0   100% 0 0   100%
src/ai_jury/largediff.py DiffFile.size_bytes   100% 1 0 0   100% 0 0   100%
src/ai_jury/largediff.py DiffPlan.kept_paths   100% 1 0 0   100% 0 0   100%
src/ai_jury/largediff.py _strip_ab   100% 4 0 0   100% 4 0   100%
src/ai_jury/largediff.py _unquote_git_path   71% 7 2 0   100% 2 0   78%
src/ai_jury/largediff.py _path_from_marker   67% 6 2 0   50% 4 2   60%
src/ai_jury/largediff.py _path_from_git_header   86% 14 2 0   88% 8 1   86%
src/ai_jury/largediff.py split_diff   100% 41 0 0   90% 30 3   96%
src/ai_jury/largediff.py _is_binary   100% 1 0 0   100% 0 0   100%
src/ai_jury/largediff.py _matches_any   100% 9 0 0   100% 8 0   100%
src/ai_jury/largediff.py _split_file_at_hunk_boundaries   100% 21 0 0   88% 8 1   97%
src/ai_jury/largediff.py _chunk_files   100% 19 0 0   100% 10 0   100%
src/ai_jury/largediff.py plan_diff   100% 34 0 0   100% 14 0   100%
src/ai_jury/largediff.py _is_symbol_shaped   100% 1 0 0   100% 0 0   100%
src/ai_jury/largediff.py ChangeIndex.has_path   100% 7 0 0   100% 6 0   100%
src/ai_jury/largediff.py ChangeIndex.has_symbol   100% 1 0 0   100% 0 0   100%
src/ai_jury/largediff.py change_index   100% 5 0 0   100% 0 0   100%
src/ai_jury/largediff.py merge_change_indexes   100% 9 0 0   100% 4 0   100%
src/ai_jury/largediff.py (no function)   100% 54 0 0   100% 0 0   100%
src/ai_jury/metadata.py review_status   100% 5 0 0   100% 4 0   100%
src/ai_jury/metadata.py panel_accounting   100% 23 0 0   80% 10 2   94%
src/ai_jury/metadata.py distinct_vendors   100% 1 0 0   100% 0 0   100%
src/ai_jury/metadata.py resolve_min_vendors   100% 3 0 0   100% 2 0   100%
src/ai_jury/metadata.py claimed_vendors   100% 1 0 0   100% 0 0   100%
src/ai_jury/metadata.py vendor_guard_fails   100% 5 0 0   100% 4 0   100%
src/ai_jury/metadata.py collapse_reason   100% 4 0 0   100% 2 0   100%
src/ai_jury/metadata.py _agent_entry   100% 1 0 0   100% 0 0   100%
src/ai_jury/metadata.py _rounds_executed   100% 7 0 0   100% 4 0   100%
src/ai_jury/metadata.py estimate_economics   100% 23 0 0   100% 8 0   100%
src/ai_jury/metadata.py build_run_metadata   100% 17 0 0   100% 6 0   100%
src/ai_jury/metadata.py (no function)   100% 18 0 3   100% 0 0   100%
src/ai_jury/orchestrator.py RunBudget.__init__   100% 3 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py RunBudget.elapsed   100% 1 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py RunBudget.remaining   100% 3 0 0   100% 2 0   100%
src/ai_jury/orchestrator.py RunBudget.expired   100% 1 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py RunBudget.call_timeout   100% 9 0 0   100% 6 0   100%
src/ai_jury/orchestrator.py _run_with_retry   100% 10 0 0   100% 2 0   100%
src/ai_jury/orchestrator.py _order_by_agents   100% 3 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py _run_phase   100% 5 0 0   100% 2 0   100%
src/ai_jury/orchestrator.py _run_phase.task   100% 1 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py _others   100% 2 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py _anon_label   100% 7 0 0   100% 2 0   100%
src/ai_jury/orchestrator.py _anonymize_peers   100% 12 0 0   100% 4 0   100%
src/ai_jury/orchestrator.py _debate_round   100% 15 0 0   100% 6 0   100%
src/ai_jury/orchestrator.py _skip_reason   100% 8 0 0   100% 4 0   100%
src/ai_jury/orchestrator.py run_jury   100% 185 0 0   98% 84 2   99%
src/ai_jury/orchestrator.py resolve_chair   100% 14 0 0   100% 10 0   100%
src/ai_jury/orchestrator.py _format_findings_for_verify   100% 9 0 0   100% 6 0   100%
src/ai_jury/orchestrator.py _format_verdicts   100% 9 0 0   100% 6 0   100%
src/ai_jury/orchestrator.py _verify   100% 10 0 0   100% 4 0   100%
src/ai_jury/orchestrator.py _verdict_matches_group   100% 18 0 0   100% 10 0   100%
src/ai_jury/orchestrator.py _claim_sim   100% 11 0 0   100% 4 0   100%
src/ai_jury/orchestrator.py _reject_targets   100% 22 0 0   100% 14 0   100%
src/ai_jury/orchestrator.py _apply_verdicts   100% 14 0 0   100% 12 0   100%
src/ai_jury/orchestrator.py _synthesize   100% 13 0 0   100% 6 0   100%
src/ai_jury/orchestrator.py _first_sent_model   100% 5 0 0   100% 4 0   100%
src/ai_jury/orchestrator.py _merge_results_by_agent   100% 31 0 0   100% 18 0   100%
src/ai_jury/orchestrator.py _combine_chair_results   100% 11 0 0   100% 4 0   100%
src/ai_jury/orchestrator.py _merge_chunk_outcomes   100% 32 0 0   100% 12 0   100%
src/ai_jury/orchestrator.py _merged_routing   100% 7 0 0   100% 2 0   100%
src/ai_jury/orchestrator.py plan_for   100% 2 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py review_diff   100% 26 0 0   100% 12 0   100%
src/ai_jury/orchestrator.py review_diff._run   100% 1 0 0   100% 0 0   100%
src/ai_jury/orchestrator.py review_diff._finalize   100% 3 0 0   100% 2 0   100%
src/ai_jury/orchestrator.py (no function)   100% 72 0 0   100% 0 0   100%
src/ai_jury/panel.py responded   100% 1 0 0   100% 0 0   100%
src/ai_jury/panel.py ballot_seats   100% 1 0 0   100% 0 0   100%
src/ai_jury/panel.py is_review   100% 1 0 2   100% 0 0   100%
src/ai_jury/panel.py review_count   100% 1 0 0   100% 0 0   100%
src/ai_jury/panel.py panelist_ballots   100% 1 0 0   100% 0 0   100%
src/ai_jury/panel.py abstention_cause   100% 8 0 2   100% 6 0   100%
src/ai_jury/panel.py abstention_buckets   100% 5 0 0   100% 4 0   100%
src/ai_jury/panel.py bundle_records   100% 1 0 0   100% 0 0   100%
src/ai_jury/panel.py describe   100% 4 0 0   100% 2 0   100%
src/ai_jury/panel.py shortfall   100% 11 0 0   100% 4 0   100%
src/ai_jury/panel.py (no function)   100% 26 0 0   100% 0 0   100%
src/ai_jury/patches.py PatchSuggestion.location   100% 4 0 0   100% 2 0   100%
src/ai_jury/patches.py patch_suggestions   100% 10 0 0   100% 6 0   100%
src/ai_jury/patches.py render_patch_suggestions   100% 14 0 0   100% 4 0   100%
src/ai_jury/patches.py parse_patch_suggestions   100% 18 0 0   100% 4 0   100%
src/ai_jury/patches.py _patch_body   100% 1 0 0   100% 0 0   100%
src/ai_jury/patches.py _git_apply   100% 5 0 0   100% 0 0   100%
src/ai_jury/patches.py _probe_patch   100% 1 0 0   100% 0 0   100%
src/ai_jury/patches.py preview_patch_suggestion   82% 22 4 0   90% 10 1   84%
src/ai_jury/patches.py _containment_refusal   100% 26 0 0   100% 16 0   100%
src/ai_jury/patches.py _looks_like_patch   100% 8 0 0   100% 8 0   100%
src/ai_jury/patches.py _sensitive_target   100% 5 0 0   100% 4 0   100%
src/ai_jury/patches.py apply_patch_suggestion   97% 35 1 0   93% 14 1   96%
src/ai_jury/patches.py (no function)   100% 28 0 0   100% 0 0   100%
src/ai_jury/policy.py ReviewPolicy.is_empty   100% 1 0 0   100% 0 0   100%
src/ai_jury/policy.py load_policy   88% 16 2 0   75% 4 1   85%
src/ai_jury/policy.py _resolve_path   100% 10 0 0   100% 8 0   100%
src/ai_jury/policy.py _from_dict   100% 18 0 0   100% 10 0   100%
src/ai_jury/policy.py _from_dict.str_list   100% 4 0 0   100% 2 0   100%
src/ai_jury/policy.py render_policy_section   100% 18 0 0   100% 8 0   100%
src/ai_jury/policy.py render_policy_section.bullet_list   100% 6 0 0   100% 4 0   100%
src/ai_jury/policy.py (no function)   100% 26 0 0   100% 0 0   100%
src/ai_jury/privilege.py _shown_value   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _shown_flag   100% 4 0 0   100% 2 0   100%
src/ai_jury/privilege.py _shown_positions   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _disallowed_tools_at   100% 6 0 0   100% 4 0   100%
src/ai_jury/privilege.py _args_str   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _is_sandboxed   100% 15 0 0   100% 10 0   100%
src/ai_jury/privilege.py _agy_flag_name   100% 6 0 0   100% 4 0   100%
src/ai_jury/privilege.py _agy_flag_positions   100% 10 0 0   100% 4 0   100%
src/ai_jury/privilege.py _agy_bare_sandbox   100% 8 0 0   100% 6 0   100%
src/ai_jury/privilege.py _is_agy_bare_sandbox_token   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _agy_sandbox_values   100% 2 0 0   100% 0 0   100%
src/ai_jury/privilege.py _ensure_agy_sandbox   100% 6 0 0   100% 2 0   100%
src/ai_jury/privilege.py _agy_sandbox_switched_off   100% 7 0 0   100% 4 0   100%
src/ai_jury/privilege.py _agy_foreign_sandbox_tokens   100% 15 0 0   100% 10 0   100%
src/ai_jury/privilege.py _agy_sandbox_not_read   100% 11 0 0   100% 6 0   100%
src/ai_jury/privilege.py _agy_enforced_as_unknown   100% 4 0 0   100% 2 0   100%
src/ai_jury/privilege.py _codex_options   100% 2 0 0   100% 0 0   100%
src/ai_jury/privilege.py _codex_unread_risks   100% 16 0 0   100% 10 0   100%
src/ai_jury/privilege.py _is_codex   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _present   100% 4 0 0   100% 4 0   100%
src/ai_jury/privilege.py _competing_sandboxes   100% 24 0 0   100% 20 0   100%
src/ai_jury/privilege.py _claude_short_cluster   100% 10 0 0   100% 8 0   100%
src/ai_jury/privilege.py _claude_value_positions   100% 32 0 0   100% 16 0   100%
src/ai_jury/privilege.py _claude_terminator   100% 5 0 0   100% 4 0   100%
src/ai_jury/privilege.py _claude_unread_risks   100% 18 0 0   100% 8 0   100%
src/ai_jury/privilege.py _claude_options   100% 2 0 0   100% 0 0   100%
src/ai_jury/privilege.py _claude_flag_present   100% 3 0 0   100% 0 0   100%
src/ai_jury/privilege.py _ensure_claude_disallowed   100% 28 0 0   100% 10 0   100%
src/ai_jury/privilege.py _ensure_claude_disallowed._merged   100% 5 0 0   100% 4 0   100%
src/ai_jury/privilege.py _claude_tools_at   100% 11 0 0   100% 6 0   100%
src/ai_jury/privilege.py _claude_tools   100% 13 0 0   100% 4 0   100%
src/ai_jury/privilege.py _ensure_claude_locked_down   100% 8 0 0   100% 4 0   100%
src/ai_jury/privilege.py _ensure_value_sandbox   100% 4 0 0   100% 2 0   100%
src/ai_jury/privilege.py _drop_claude_disallowed   100% 21 0 0   100% 8 0   100%
src/ai_jury/privilege.py _permission_mode_at   100% 6 0 0   100% 4 0   100%
src/ai_jury/privilege.py _claude_write_args   100% 28 0 0   100% 12 0   100%
src/ai_jury/privilege.py _set_value_sandbox   100% 17 0 0   100% 6 0   100%
src/ai_jury/privilege.py _drop_bare_sandbox   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py enable_write   100% 9 0 0   100% 6 0   100%
src/ai_jury/privilege.py enforce_read_only   100% 9 0 0   100% 6 0   100%
src/ai_jury/privilege.py _claude_is_locked_down   100% 13 0 0   100% 4 0   100%
src/ai_jury/privilege.py _claude_open_surface   100% 9 0 4   100% 2 0   100%
src/ai_jury/privilege.py _claude_rejected_mode   100% 11 0 0   100% 6 0   100%
src/ai_jury/privilege.py _claude_effective_mode   100% 4 0 0   100% 0 0   100%
src/ai_jury/privilege.py _claude_mode_override   100% 10 0 0   100% 6 0   100%
src/ai_jury/privilege.py _claude_skip_overrides   100% 6 0 2   100% 0 0   100%
src/ai_jury/privilege.py _claude_mode_warning   100% 17 0 0   100% 12 0   100%
src/ai_jury/privilege.py _claude_config_options   100% 2 0 0   100% 0 0   100%
src/ai_jury/privilege.py _claude_permission_bypass   100% 9 0 0   100% 6 0   100%
src/ai_jury/privilege.py _checkout_config_warning   100% 5 0 0   100% 2 0   100%
src/ai_jury/privilege.py _checkout_only_warning   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py audit_agent   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _audit_agent   100% 87 0 2   100% 48 0   100%
src/ai_jury/privilege.py _missing_sandbox   100% 5 0 0   100% 4 0   100%
src/ai_jury/privilege.py audit_privilege   100% 4 0 0   100% 2 0   100%
src/ai_jury/privilege.py (no function)   100% 84 0 0   100% 0 0   100%
src/ai_jury/prompts.py neutralize_sentinels   100% 4 0 0   100% 2 0   100%
src/ai_jury/prompts.py for_mode   100% 3 0 0   100% 2 0   100%
src/ai_jury/prompts.py (no function)   100% 20 0 0   100% 0 0   100%
src/ai_jury/redaction.py redact   100% 20 0 0   100% 10 0   100%
src/ai_jury/redaction.py redact._sub_assign   100% 2 0 0   100% 0 0   100%
src/ai_jury/redaction.py safe_env_var_name   100% 10 0 0   100% 6 0   100%
src/ai_jury/redaction.py redact_url_userinfo   90% 20 2 0   88% 8 1   89%
src/ai_jury/redaction.py (no function)   100% 11 0 0   100% 0 0   100%
src/ai_jury/replay.py load_outcome   100% 31 0 0   100% 12 0   100%
src/ai_jury/replay.py _coerce_agent_results   100% 11 0 0   100% 12 0   100%
src/ai_jury/replay.py _coerce_one   78% 9 2 0   100% 0 0   78%
src/ai_jury/replay.py replay_events   100% 10 0 0   100% 10 0   100%
src/ai_jury/replay.py replay_into   100% 7 0 0   100% 4 0   100%
src/ai_jury/replay.py (no function)   100% 15 0 0   100% 0 0   100%
src/ai_jury/report.py _defuse_patch_syntax   100% 1 0 0   100% 0 0   100%
src/ai_jury/report.py _block   100% 1 0 0   100% 0 0   100%
src/ai_jury/report.py _seat_list   100% 7 0 0   100% 4 0   100%
src/ai_jury/report.py render_footer   100% 6 0 0   100% 2 0   100%
src/ai_jury/report.py _fail_status   100% 2 0 0   100% 0 0   100%
src/ai_jury/report.py _finding_line   100% 5 0 0   100% 2 0   100%
src/ai_jury/report.py _group_line   100% 17 0 0   100% 10 0   100%
src/ai_jury/report.py _metadata_block   100% 63 0 2   100% 32 0   100%
src/ai_jury/report.py _classification_block   100% 1 0 0   100% 0 0   100%
src/ai_jury/report.py _consensus_block   100% 13 0 0   100% 8 0   100%
src/ai_jury/report.py _vote_block   100% 7 0 0   100% 2 0   100%
src/ai_jury/report.py _verdict_headline   100% 18 0 0   100% 16 0   100%
src/ai_jury/report.py render   100% 73 0 0   100% 42 0   100%
src/ai_jury/report.py render_live_step   100% 10 0 0   100% 4 0   100%
src/ai_jury/report.py _conversation_blocks   100% 21 0 0   100% 12 0   100%
src/ai_jury/report.py _summary_blocks   81% 16 3 0   88% 8 1   83%
src/ai_jury/report.py render_transcript   100% 37 0 0   100% 18 0   100%
src/ai_jury/report.py render_sections   100% 43 0 0   100% 22 0   100%
src/ai_jury/report.py (no function)   100% 30 0 0   100% 0 0   100%
src/ai_jury/routing.py RoutingPlan.as_dict   100% 1 0 0   100% 0 0   100%
src/ai_jury/routing.py standard_plan   100% 1 0 0   100% 0 0   100%
src/ai_jury/routing.py _tier_of   100% 1 0 0   100% 0 0   100%
src/ai_jury/routing.py plan_panel   100% 35 0 0   100% 14 0   100%
src/ai_jury/routing.py plan_panel.full   100% 1 0 0   100% 0 0   100%
src/ai_jury/routing.py plan_panel.distinct   100% 1 0 0   100% 0 0   100%
src/ai_jury/routing.py escalation_effect   100% 5 0 0   100% 4 0   100%
src/ai_jury/routing.py should_escalate   100% 5 0 0   100% 2 0   100%
src/ai_jury/routing.py frontier_names   100% 2 0 0   100% 0 0   100%
src/ai_jury/routing.py describe   100% 3 0 0   100% 2 0   100%
src/ai_jury/routing.py (no function)   100% 26 0 0   100% 0 0   100%
src/ai_jury/runagent.py role_policy   100% 11 0 0   100% 8 0   100%
src/ai_jury/runagent.py parse_agent_token   100% 13 0 0   100% 8 0   100%
src/ai_jury/runagent.py builtin_spec   100% 7 0 0   100% 6 0   100%
src/ai_jury/runagent.py resolve_agent   100% 15 0 0   100% 12 0   100%
src/ai_jury/runagent.py transport_for   100% 2 0 0   100% 0 0   100%
src/ai_jury/runagent.py strip_transport   100% 5 0 0   100% 2 0   100%
src/ai_jury/runagent.py model_base   100% 11 0 0   100% 6 0   100%
src/ai_jury/runagent.py attribution   100% 5 0 0   100% 2 0   100%
src/ai_jury/runagent.py result_dict   100% 3 0 0   100% 0 0   100%
src/ai_jury/runagent.py new_run_id   100% 1 0 0   100% 0 0   100%
src/ai_jury/runagent.py check_run_id   100% 3 0 0   100% 2 0   100%
src/ai_jury/runagent.py runs_dir   100% 3 0 0   100% 0 0   100%
src/ai_jury/runagent.py run_path   100% 8 0 0   100% 4 0   100%
src/ai_jury/runagent.py state_path   100% 1 0 0   100% 0 0   100%
src/ai_jury/runagent.py output_path   100% 1 0 0   100% 0 0   100%
src/ai_jury/runagent.py write_state   100% 12 0 0   100% 0 0   100%
src/ai_jury/runagent.py read_state   100% 10 0 0   100% 2 0   100%
src/ai_jury/runagent.py _DefaultProbe.__repr__   100% 0 0 1   100% 0 0   100%
src/ai_jury/runagent.py _resolve_probe   100% 1 0 0   100% 0 0   100%
src/ai_jury/runagent.py pid_alive   100% 11 0 0   100% 2 0   100%
src/ai_jury/runagent.py list_runs   100% 14 0 0   100% 4 0   100%
src/ai_jury/runagent.py run_summary   100% 4 0 0   100% 2 0   100%
src/ai_jury/runagent.py initial_state   100% 1 0 0   100% 0 0   100%
src/ai_jury/runagent.py liveness_unknown_reason   100% 10 0 0   100% 6 0   100%
src/ai_jury/runagent.py default_wait_timeout   100% 4 0 0   100% 2 0   100%
src/ai_jury/runagent.py wait_for_run   100% 16 0 0   100% 8 0   100%
src/ai_jury/runagent.py (no function)   100% 59 0 1   100% 0 0   100%
src/ai_jury/scaffold.py _from_default   100% 4 0 0   100% 4 0   100%
src/ai_jury/scaffold.py implicit_choices   100% 1 0 0   100% 0 0   100%
src/ai_jury/scaffold.py agent_templates   100% 14 0 0   100% 4 0   100%
src/ai_jury/scaffold.py agents_needing_remote_opt_in   100% 9 0 0   100% 6 0   100%
src/ai_jury/scaffold.py pick_default_model   100% 7 0 0   100% 6 0   100%
src/ai_jury/scaffold.py zero_config_local_seat   100% 12 0 0   100% 6 0   100%
src/ai_jury/scaffold.py seat_local_agents   100% 6 0 0   100% 2 0   100%
src/ai_jury/scaffold.py build_config   100% 40 0 0   100% 32 0   100%
src/ai_jury/scaffold.py _effort_supported   100% 2 0 0   100% 0 0   100%
src/ai_jury/scaffold.py _scalar   100% 10 0 0   100% 8 0   100%
src/ai_jury/scaffold.py _render_value   100% 3 0 0   100% 2 0   100%
src/ai_jury/scaffold.py render_toml   100% 36 0 0   100% 22 0   100%
src/ai_jury/scaffold.py _agent_keys   100% 7 0 0   100% 4 0   100%
src/ai_jury/scaffold.py (no function)   100% 39 0 0   100% 0 0   100%
src/ai_jury/theater.py _vendor_sgr   100% 1 0 0   100% 0 0   100%
src/ai_jury/theater.py _banner_sgr   100% 6 0 0   100% 4 0   100%
src/ai_jury/theater.py supports_scene   100% 6 0 0   100% 2 0   100%
src/ai_jury/theater.py _unsafe_cell_char   100% 2 0 0   100% 0 0   100%
src/ai_jury/theater.py Screen.__init__   100% 2 0 0   100% 0 0   100%
src/ai_jury/theater.py Screen.clear   100% 1 0 0   100% 0 0   100%
src/ai_jury/theater.py Screen.put   100% 9 0 0   100% 8 0   100%
src/ai_jury/theater.py Screen.center   100% 1 0 0   100% 0 0   100%
src/ai_jury/theater.py Screen._row_ansi   100% 9 0 0   100% 6 0   100%
src/ai_jury/theater.py Screen.to_ansi   100% 1 0 0   100% 0 0   100%
src/ai_jury/theater.py Screen.to_plain   100% 1 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom.__init__   100% 33 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._split_seats   100% 4 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._slots   100% 5 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._seats_fit   100% 3 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._paint   100% 11 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom._title   100% 8 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._strip   100% 20 0 0   100% 10 0   100%
src/ai_jury/theater.py Courtroom._seat   100% 29 0 0   100% 16 0   100%
src/ai_jury/theater.py Courtroom._table_and_seats   100% 13 0 0   100% 6 0   100%
src/ai_jury/theater.py Courtroom._table_interior   100% 19 0 0   100% 10 0   100%
src/ai_jury/theater.py Courtroom._roster   100% 15 0 0   100% 6 0   100%
src/ai_jury/theater.py Courtroom._fit   100% 6 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom._verdict_label   100% 2 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._wrap_banner   100% 6 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._verify_row   100% 6 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom._pix_slots   100% 5 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._pixel_room   100% 23 0 0   100% 8 0   100%
src/ai_jury/theater.py Courtroom._pixel_room.rect   100% 4 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom._pixel_room.figure   100% 12 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._blit_band   100% 7 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom._pixel_overlays   100% 22 0 0   100% 16 0   100%
src/ai_jury/theater.py Courtroom._pix_label   100% 14 0 0   100% 6 0   100%
src/ai_jury/theater.py Courtroom._speaking_area   100% 14 0 0   100% 6 0   100%
src/ai_jury/theater.py Courtroom._transcript   100% 6 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._status   100% 3 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._flush   100% 6 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom._render   100% 3 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._beat   100% 2 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._frame   100% 2 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._tick_loop   100% 3 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._start_ticker   100% 5 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom._stop_ticker   100% 5 0 0   100% 4 0   100%
src/ai_jury/theater.py Courtroom.open   100% 6 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom.step   100% 15 0 0   100% 10 0   100%
src/ai_jury/theater.py Courtroom._phase_before   100% 2 0 0   100% 0 0   100%
src/ai_jury/theater.py Courtroom._speak   100% 22 0 0   100% 8 0   100%
src/ai_jury/theater.py Courtroom._verify   100% 17 0 0   100% 10 0   100%
src/ai_jury/theater.py Courtroom._synthesize   100% 5 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom.set_vote   100% 4 0 0   100% 2 0   100%
src/ai_jury/theater.py Courtroom.close   100% 9 0 0   100% 4 0   100%
src/ai_jury/theater.py _wrap   100% 9 0 0   100% 6 0   100%
src/ai_jury/theater.py _gist   100% 4 0 0   100% 4 0   100%
src/ai_jury/theater.py _verdict_headline   100% 7 0 0   100% 8 0   100%
src/ai_jury/theater.py (no function)   100% 78 0 0   100% 0 0   100%
src/ai_jury/voting.py _normalize_refusal   100% 2 0 0   100% 0 0   100%
src/ai_jury/voting.py is_abstention   100% 4 0 0   100% 2 0   100%
src/ai_jury/voting.py _severity_to_vote   100% 5 0 0   100% 4 0   100%
src/ai_jury/voting.py tally_votes   100% 24 0 0   100% 16 0   100%
src/ai_jury/voting.py (no function)   100% 28 0 0   100% 0 0   100%
Total     99% 8374 63 41   99% 3202 40   99%

No items found using the specified filter.