Coverage report: 99%

Files Functions Classes

coverage.py v7.15.2, created at 2026-07-26 23:18 +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   50% 8 4 0   50% 2 1   50%
src/ai_jury/adapters.py _spawn   100% 12 0 0   50% 2 1   93%
src/ai_jury/adapters.py _read_only_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 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._stdin_for   100% 2 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.detect_capabilities   100% 22 0 0   100% 4 0   100%
src/ai_jury/adapters.py Adapter.run   100% 25 0 0   100% 8 0   100%
src/ai_jury/adapters.py ClaudeAdapter.build_argv   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py ClaudeAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py CodexAdapter.build_argv   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py CodexAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
src/ai_jury/adapters.py AgyAdapter.build_argv   100% 5 0 0   100% 2 0   100%
src/ai_jury/adapters.py AgyAdapter._stdin_for   100% 1 0 0   100% 0 0   100%
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% 16 0 0   100% 4 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% 10 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% 33 0 0   100% 4 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._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% 18 0 0   100% 10 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% 1 0 0   100% 0 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% 1 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 GoogleApiAdapter._api_url   100% 3 0 0   100% 0 0   100%
src/ai_jury/adapters.py GoogleApiAdapter.build_payload   100% 1 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 make_adapter   100% 6 0 0   100% 4 0   100%
src/ai_jury/adapters.py (no function)   100% 136 0 6   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% 3 0 0   100% 0 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 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% 44 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% 3 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   75% 8 2 0   67% 6 2   71%
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   88% 8 1 0   83% 6 1   86%
src/ai_jury/cli.py _read_diff   100% 10 0 0   100% 8 0   100%
src/ai_jury/cli.py build_parser   100% 63 0 0   100% 0 0   100%
src/ai_jury/cli.py _run_comment_command   100% 25 0 0   100% 8 0   100%
src/ai_jury/cli.py _init_available   100% 11 0 0   100% 2 0   100%
src/ai_jury/cli.py _init_interactive   100% 35 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% 85 0 0   100% 28 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._resolve_preset_agents   100% 5 0 0   100% 4 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% 17 0 0   100% 2 0   100%
src/ai_jury/cli.py _run_config   100% 17 0 0   100% 2 0   100%
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 _maybe_add_local_fallback   100% 17 0 0   100% 6 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% 274 0 0   99% 160 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 (no function)   100% 39 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% 2 0 0   100% 0 0   100%
src/ai_jury/config.py _endpoint_issues   100% 22 0 0   88% 8 1   97%
src/ai_jury/config.py validate_config   100% 102 0 0   100% 78 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 _ci_from_dict   100% 5 0 0   100% 2 0   100%
src/ai_jury/config.py _context_from_dict   100% 4 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% 2 0 0   100% 0 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% 6 0 0   100% 2 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% 86 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% 32 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 _agent_entry   100% 2 0 0   100% 0 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% 20 0 0   100% 14 0   100%
src/ai_jury/doctor.py _recommendations   100% 15 0 0   100% 8 0   100%
src/ai_jury/doctor.py build_diagnostics   96% 23 1 0   100% 6 0   97%
src/ai_jury/doctor.py render_report   100% 59 0 0   94% 18 1   99%
src/ai_jury/doctor.py (no function)   100% 21 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 _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 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% 44 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% 9 0 0   100% 2 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% 18 0 0   100% 0 0   100%
src/ai_jury/github.py _gh   90% 30 3 0   100% 8 0   92%
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% 8 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% 12 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% 43 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   93% 43 3 0   81% 32 6   88%
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 _chunk_files   100% 13 0 0   100% 6 0   100%
src/ai_jury/largediff.py plan_diff   100% 34 0 0   100% 14 0   100%
src/ai_jury/largediff.py (no function)   100% 39 0 0   100% 0 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 build_run_metadata   100% 16 0 0   100% 6 0   100%
src/ai_jury/metadata.py (no function)   100% 7 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% 9 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 run_jury   100% 150 0 0   97% 68 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 _merge_results_by_agent   100% 29 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% 31 0 0   100% 12 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% 64 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 (no function)   100% 14 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 _args_str   100% 1 0 0   100% 0 0   100%
src/ai_jury/privilege.py _is_sandboxed   95% 19 1 0   93% 14 1   94%
src/ai_jury/privilege.py _ensure_claude_disallowed   100% 22 0 0   100% 8 0   100%
src/ai_jury/privilege.py _ensure_claude_disallowed._merged   100% 5 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 enforce_read_only   100% 10 0 0   100% 6 0   100%
src/ai_jury/privilege.py _claude_is_locked_down   100% 6 0 0   100% 4 0   100%
src/ai_jury/privilege.py audit_agent   100% 21 0 0   100% 12 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% 12 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 redact_url_userinfo   90% 20 2 0   88% 8 1   89%
src/ai_jury/redaction.py (no function)   100% 7 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% 14 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 _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% 33 0 0   100% 14 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% 40 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   100% 16 0 0   100% 8 0   100%
src/ai_jury/report.py render_transcript   100% 37 0 0   100% 16 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% 23 0 0   100% 0 0   100%
src/ai_jury/scaffold.py _from_default   100% 4 0 0   100% 4 0   100%
src/ai_jury/scaffold.py agent_templates   100% 10 0 0   100% 4 0   100%
src/ai_jury/scaffold.py pick_default_model   100% 7 0 0   100% 6 0   100%
src/ai_jury/scaffold.py build_config   100% 38 0 0   100% 30 0   100%
src/ai_jury/scaffold.py _scalar   100% 8 0 0   100% 6 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% 29 0 0   100% 20 0   100%
src/ai_jury/scaffold.py (no function)   100% 17 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% 76 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% 5007 48 18   99% 1888 26   99%

No items found using the specified filter.