Repository Analysis

homeassistant-ai/ha-mcp

The Unofficial and Awesome Home Assistant MCP Server

32.3 Strong AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of homeassistant-ai/ha-mcp, a Python project with 3,976 GitHub stars. SynthScan v2.0 examined 380,662 lines of code across 869 source files, recording 10202 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 32.3 places this repository in the Strong AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

32.3
Adjusted Score
32.3
Raw Score
100%
Time Factor
2026-07-14
Last Push
4.0K
Stars
Python
Language
380.7K
Lines of Code
869
Files
10.2K
Pattern Hits
2026-07-14
Scan Date
0.15
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 130MEDIUM 1059LOW 9013

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 10202 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers7239 hits · 6246 pts
SeverityFileLineSnippetContext
LOWpackaging/mcpb/generate_manifest.py12def _get_docstring_description(node: ast.AsyncFunctionDef) -> str:CODE
LOWpackaging/mcpb/generate_manifest.py18def _extract_title_and_decorator_description(CODE
LOWhomeassistant-addon/start.py57def get_or_create_secret_path(data_dir: Path, custom_path: str = "") -> str:CODE
LOWhomeassistant-addon/start.py140def maybe_persist_secret_path(CODE
LOWhomeassistant-addon/start.py205def resolve_effective_log_level() -> int:CODE
LOWhomeassistant-addon/start.py265def maybe_auto_enable_beta_master(config: dict[str, Any]) -> None:CODE
LOWhomeassistant-addon/start.py311def cleanup_stale_migration_marker(data_dir: Path) -> None:CODE
LOWtests/uat/test_openai_agent.py762 async def test_none_when_model_not_listed(self, monkeypatch):CODE
LOWtests/uat/test_openai_agent.py771 async def test_none_when_entry_has_no_quant(self, monkeypatch):CODE
LOWtests/uat/test_openai_agent.py778 async def test_none_on_transport_error(self, monkeypatch):CODE
LOWtests/uat/test_openai_agent.py787 async def test_none_on_http_error_status(self, monkeypatch):CODE
LOWtests/uat/test_openai_agent.py811 def test_extracts_requested_and_context_tokens(self):CODE
LOWtests/uat/test_openai_agent.py817 def test_none_for_unrelated_bad_request(self):CODE
LOWtests/uat/test_openai_agent.py821 def test_marker_without_numbers_returns_none_pair(self):CODE
LOWtests/uat/test_openai_agent.py826 def test_extracts_from_sdk_wire_format(self):CODE
LOWtests/uat/test_openai_agent.py24 def test_missing_required_args_exits(self):CODE
LOWtests/uat/test_openai_agent.py49 def test_basic_tool_conversion(self):CODE
LOWtests/uat/test_openai_agent.py79 def test_tool_with_no_parameters(self):CODE
LOWtests/uat/test_openai_agent.py98 async def test_direct_text_response(self):CODE
LOWtests/uat/test_openai_agent.py125 async def test_no_think_sends_enable_thinking_false(self):CODE
LOWtests/uat/test_openai_agent.py159 async def test_no_think_default_omits_extra_body(self):CODE
LOWtests/uat/test_openai_agent.py181 async def test_no_think_warns_when_backend_still_reasons(self, caplog):CODE
LOWtests/uat/test_openai_agent.py209 async def test_no_think_silent_when_backend_honors_it(self, caplog):CODE
LOWtests/uat/test_openai_agent.py237 async def test_reasoning_tokens_captured_in_tokens_thoughts(self):CODE
LOWtests/uat/test_openai_agent.py264 async def test_tokens_thoughts_zero_when_backend_omits_details(self):CODE
LOWtests/uat/test_openai_agent.py289 async def test_no_think_warns_on_reasoning_content_without_token_detail(CODE
LOWtests/uat/test_openai_agent.py321 async def test_no_think_warns_on_inline_think_block(self, caplog):CODE
LOWtests/uat/test_openai_agent.py350 async def test_no_think_warns_only_once_across_turns(self, caplog):CODE
LOWtests/uat/test_openai_agent.py444 async def test_tool_call_failure_counted(self):CODE
LOWtests/uat/test_openai_agent.py485 async def test_malformed_tool_arguments_reported_as_error(self):CODE
LOWtests/uat/test_openai_agent.py526 async def test_max_iterations_reached(self):CODE
LOWtests/uat/test_openai_agent.py591 async def test_empty_choices_raises(self):CODE
LOWtests/uat/test_openai_agent.py629 async def test_no_think_prepends_token_and_sends_kwarg(self):CODE
LOWtests/uat/test_openai_agent.py647 async def test_default_omits_prepend_and_kwarg(self):CODE
LOWtests/uat/test_openai_agent.py670 def test_non_text_content_falls_back_to_str(self):CODE
LOWtests/uat/test_openai_agent.py680 def test_no_content_falls_back_to_str(self):CODE
LOWtests/uat/test_openai_agent.py694 async def test_returns_first_model_id(self):CODE
LOWtests/uat/test_openai_agent.py703 async def test_raises_when_no_models(self):CODE
LOWtests/uat/test_openai_agent.py845 async def test_overflow_raises_context_window_exceeded(self):CODE
LOWtests/uat/test_openai_agent.py868 async def test_unrelated_bad_request_propagates(self):CODE
LOWtests/uat/openai_agent.py500async def create_and_warm_openai_client(CODE
LOWtests/uat/stories/test_run_story_record.py74def test_tokens_thoughts_defaults_to_zero_when_absent(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py83def test_model_from_call_site_param(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py89def test_model_call_site_arg_wins_over_test_phase(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py95def test_model_from_test_phase(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py101def test_model_defaults_to_none_when_absent(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py108def test_quantization_threaded_into_record(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py114def test_quantization_defaults_to_none_when_absent(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py121def test_extract_model_reads_claude_session(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py127def test_extract_model_none_on_malformed_session(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py134def test_model_from_claude_session_fallback(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py144def test_compute_passed_incomplete_run_fails_despite_verify():CODE
LOWtests/uat/stories/test_run_story_record.py233def test_clean_record_omits_error_fields(tmp_path):CODE
LOWtests/uat/stories/test_run_story_record.py245def test_run_completed_uses_explicit_flag():CODE
LOWtests/uat/stories/test_run_story_record.py251def test_run_completed_fail_closed_on_missing_summary():CODE
LOWtests/uat/stories/test_run_story_record.py261def test_run_completed_present_summary_missing_flag_uses_exit_code():CODE
LOWtests/uat/stories/test_run_story_record.py268async def test_context_overflow_degraded_counts_still_fails(monkeypatch):CODE
LOWtests/uat/stories/test_run_story_record.py430def test_suite_exit_code_abort_is_never_success():CODE
LOWtests/uat/stories/test_run_story_record.py439def test_suite_exit_code_clean_pass():CODE
LOWtests/uat/stories/test_run_story_record.py444def test_suite_exit_code_failure_without_abort():CODE
7179 more matches not shown…
Decorative Section Separators945 hits · 3313 pts
SeverityFileLineSnippetContext
MEDIUMtests/uat/run_uat.py73# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py75# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py137# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py139# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py296# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py298# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py574# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py576# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py690# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/run_uat.py692# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py43# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py45# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py62# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py64# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py123# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py125# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py135# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/conftest.py137# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/test_run_story_record.py141# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/test_run_story_record.py143# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/test_run_story_record.py240# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/test_run_story_record.py244# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/test_run_story_record.py304# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/test_run_story_record.py309# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py91# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py93# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py100# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py102# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py284# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py286# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py328# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py347# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py349# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py656# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py658# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py170# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py172# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py624# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py626# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py709# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py711# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py909# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/run_story.py911# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py130# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py132# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py26# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py28# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py209# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py211# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py300# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py302# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py360# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py362# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py386# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/uat/stories/scripts/verify_story.py388# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/haos_image_build/build_image.py103# ┌──────────────────────┬────────────────────────────────────────────────┐COMMENT
MEDIUMtests/haos_image_build/build_image.py105# ├──────────────────────┼────────────────────────────────────────────────┤COMMENT
MEDIUMtests/haos_image_build/build_image.py119# └──────────────────────┴────────────────────────────────────────────────┘COMMENT
MEDIUMtests/haos_image_build/build_image.py258# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/haos_image_build/build_image.py260# ---------------------------------------------------------------------------COMMENT
885 more matches not shown…
Excessive Try-Catch Wrapping518 hits · 488 pts
SeverityFileLineSnippetContext
LOWAGENTS.md572except Exception as e:CODE
LOWCLAUDE.md572except Exception as e:CODE
LOWhomeassistant-addon/start.py97 except Exception as e:CODE
LOWhomeassistant-addon/start.py107 except Exception as e:CODE
LOWhomeassistant-addon/start.py226 except Exception as e:CODE
LOWhomeassistant-addon/start.py542 except Exception as e:CODE
LOWhomeassistant-addon/start.py786 except Exception as e:CODE
LOWtests/test_env_manager.py230 except Exception as e:CODE
LOWtests/test_env_manager.py260 except Exception:CODE
LOWtests/test_env_manager.py343 except Exception as e:CODE
LOWtests/uat/run_uat.py124 except Exception:CODE
LOWtests/uat/openai_agent.py160 except Exception as e: # best-effort enrichment, never fatalCODE
LOWtests/uat/openai_agent.py389 except Exception as e:CODE
LOWtests/uat/openai_agent.py545 except Exception:CODE
LOWtests/uat/openai_agent.py556 except Exception:CODE
LOWtests/uat/stories/conftest.py146 except Exception as e:CODE
LOWtests/uat/stories/conftest.py159 except Exception as e:CODE
LOWtests/uat/stories/run_story.py277 except Exception as exc:CODE
LOWtests/uat/stories/run_story.py337 except Exception:CODE
LOWtests/uat/stories/run_story.py650 except Exception:CODE
LOWtests/uat/stories/run_story.py148 except Exception:CODE
LOWtests/uat/stories/run_story.py206 except Exception as exc:CODE
LOWtests/uat/stories/run_story.py232 except Exception as exc:CODE
LOWtests/uat/stories/run_story.py504 except Exception as e:CODE
LOWtests/uat/stories/run_story.py639 except Exception:CODE
LOWtests/uat/stories/run_story.py1004 except Exception as e:CODE
LOWtests/uat/stories/run_story.py1032 except Exception as e:CODE
LOWtests/uat/stories/scripts/verify_story.py69 except Exception:CODE
LOWtests/uat/stories/scripts/verify_story.py88 except Exception:CODE
LOWtests/uat/stories/scripts/verify_story.py151 except Exception:CODE
LOWtests/uat/stories/scripts/verify_story.py231 except Exception as e:CODE
LOWtests/uat/stories/scripts/verify_story.py257 except Exception as e:CODE
LOWtests/uat/stories/scripts/verify_story.py285 except Exception as e:CODE
MEDIUMtests/uat/stories/scripts/ha_query.py200 print(f"Error: {args.agent} CLI not found", file=sys.stderr)CODE
LOWtests/uat/stories/scripts/measure_tools.py146 except Exception as e:STRING
LOWtests/haos_image_build/build_image.py402 except Exception as e:CODE
LOWtests/haos_image_build/build_image.py2009 except Exception:CODE
LOW…itial_test_state/custom_components/hacs/data_client.py56 except Exception as exception:CODE
LOW…t_state/custom_components/hacs/websocket/repository.py50 except Exception as exception: # pylint: disable=broad-exceptCODE
LOW…t_state/custom_components/hacs/websocket/repository.py266 except Exception as exception: # pylint: disable=broad-exceptCODE
LOW…t_state/custom_components/hacs/websocket/repository.py351 except Exception as exception:CODE
LOW…ate/custom_components/hacs/repositories/integration.py216 except Exception: # pylint: disable=broad-exceptCODE
LOW…test_state/custom_components/hacs/repositories/base.py1374 except Exception: # pylint: disable=broad-exceptCODE
LOWtests/src/unit/_embedded_stubs.py268 except Exception as err: # matches real HA's broad catch-and-logCODE
MEDIUMtests/src/unit/_embedded_stubs.py265def async_refresh(self) -> None:CODE
LOWtests/src/unit/test_identifier_validation_family.py874 except Exception:CODE
MEDIUMtests/src/unit/test_usage_logger.py112def writer_thread(thread_id):CODE
MEDIUMtests/src/unit/test_usage_logger.py124def reader_thread():CODE
LOWtests/src/unit/test_usage_logger.py121 except Exception as e:CODE
LOWtests/src/unit/test_usage_logger.py129 except Exception as e:CODE
LOWtests/src/e2e/conftest.py1219 except Exception as exc:CODE
LOWtests/src/e2e/conftest.py1277 except Exception as exc:CODE
LOWtests/src/e2e/conftest.py1382 except Exception as exc:CODE
LOWtests/src/e2e/conftest.py1858 except Exception as e:CODE
LOWtests/src/e2e/conftest.py2133 except Exception as e:CODE
LOWtests/src/e2e/conftest.py2323 except Exception as e:CODE
LOWtests/src/e2e/tools/test_bm25_fuzzy_search.py178 except Exception as e:CODE
LOWtests/src/e2e/tools/test_bm25_fuzzy_search.py235 except Exception as e:CODE
LOWtests/src/e2e/tools/test_search_entities.py1432 except Exception as exc: # pragma: no coverCODE
LOWtests/src/e2e/tools/test_search_entities.py1439 except Exception as exc: # pragma: no coverCODE
458 more matches not shown…
Unused Imports375 hits · 342 pts
SeverityFileLineSnippetContext
LOWpackaging/mcpb/generate_manifest.py4CODE
LOWpackaging/binary/pyinstaller_hooks/runtime_hook.py7CODE
LOWpackaging/binary/pyinstaller_hooks/runtime_hook.py15CODE
LOWtests/uat/run_uat.py18CODE
LOWtests/uat/_logging.py3CODE
LOWtests/uat/ha_wait.py8CODE
LOWtests/uat/test_openai_agent.py3CODE
LOWtests/uat/openai_agent.py15CODE
LOWtests/uat/_inprocess.py8CODE
LOWtests/uat/stories/conftest.py10CODE
LOWtests/uat/stories/test_stories.py13CODE
LOWtests/uat/stories/test_run_story_record.py3CODE
LOWtests/uat/stories/test_verify_story.py3CODE
LOWtests/uat/stories/run_story.py35CODE
LOWtests/uat/stories/scripts/verify_story.py3CODE
LOWtests/uat/stories/scripts/ha_query.py22CODE
LOWtests/uat/stories/scripts/measure_tools.py19CODE
LOWtests/haos_image_build/build_image.py16CODE
LOWtests/haos_image_build/screenshot_engine_mock/server.py24CODE
LOW…ts/initial_test_state/custom_components/hacs/update.py3CODE
LOW…itial_test_state/custom_components/hacs/coordinator.py3CODE
LOW…itial_test_state/custom_components/hacs/diagnostics.py3CODE
LOW…/initial_test_state/custom_components/hacs/frontend.py3CODE
LOW…/initial_test_state/custom_components/hacs/__init__.py7CODE
LOW…/initial_test_state/custom_components/hacs/__init__.py112CODE
LOW…ts/initial_test_state/custom_components/hacs/switch.py3CODE
LOW…s/initial_test_state/custom_components/hacs/repairs.py3CODE
LOW…itial_test_state/custom_components/hacs/data_client.py3CODE
LOW…ts/initial_test_state/custom_components/hacs/entity.py3CODE
LOWtests/initial_test_state/custom_components/hacs/base.py3CODE
LOW…itial_test_state/custom_components/hacs/config_flow.py3CODE
LOW…ustom_components/hacs/validate/integration_manifest.py1CODE
LOW…l_test_state/custom_components/hacs/validate/issues.py1CODE
LOW…test_state/custom_components/hacs/validate/archived.py1CODE
LOW…t_state/custom_components/hacs/validate/description.py1CODE
LOW…t_state/custom_components/hacs/validate/information.py1CODE
LOW…test_state/custom_components/hacs/validate/hacsjson.py1CODE
LOW…l_test_state/custom_components/hacs/validate/topics.py1CODE
LOW…l_test_state/custom_components/hacs/validate/brands.py1CODE
LOW…l_test_state/custom_components/hacs/validate/images.py1CODE
LOW…_test_state/custom_components/hacs/validate/manager.py3CODE
LOW…ial_test_state/custom_components/hacs/validate/base.py3CODE
LOW…est_state/custom_components/hacs/websocket/critical.py3CODE
LOW…est_state/custom_components/hacs/websocket/__init__.py3CODE
LOW…state/custom_components/hacs/websocket/repositories.py3CODE
LOW…t_state/custom_components/hacs/websocket/repository.py3CODE
LOW…tial_test_state/custom_components/hacs/utils/backup.py3CODE
LOW…ial_test_state/custom_components/hacs/utils/version.py3CODE
LOW…l_test_state/custom_components/hacs/utils/decorator.py3CODE
LOW…al_test_state/custom_components/hacs/utils/validate.py3CODE
LOW…test_state/custom_components/hacs/utils/file_system.py3CODE
LOW…nitial_test_state/custom_components/hacs/utils/path.py3CODE
LOW…nitial_test_state/custom_components/hacs/utils/json.py3CODE
LOW…itial_test_state/custom_components/hacs/utils/regex.py3CODE
LOW…ial_test_state/custom_components/hacs/utils/filters.py3CODE
LOW…nitial_test_state/custom_components/hacs/utils/data.py3CODE
LOW…st_state/custom_components/hacs/utils/queue_manager.py3CODE
LOW…est_state/custom_components/hacs/repositories/theme.py3CODE
LOW…_state/custom_components/hacs/repositories/__init__.py3CODE
LOW…ate/custom_components/hacs/repositories/integration.py3CODE
315 more matches not shown…
Cross-Language Confusion61 hits · 318 pts
SeverityFileLineSnippetContext
HIGHtests/haos_image_build/build_image.py1665 # the config_entries/disable WS command (disabled_by=null).COMMENT
HIGHtests/lab-setup/test_setup_script.py14 assert 'git -C "$SETUP_HOME/ha-mcp" pull --ff-only || true' not in contentCODE
HIGHtests/src/conftest.py8 cd tests && uv run pytest src/unit/ -n2STRING
HIGHtests/src/conftest.py9 cd tests && uv run pytest src/e2e/ -n2 --dist loadscopeSTRING
HIGHtests/src/unit/test_helper_list_registry_join.py112 """When the registry entry has no custom name (name is null), the currentSTRING
HIGHtests/src/unit/test_anti_fouc_behavior.py168 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_anti_fouc_behavior.py246 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_anti_fouc_behavior.py295 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_server_prefs_seed.py55 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_server_prefs_seed.py63 value: {{ getAttribute: (name) => name === 'data-prefs' ? serverPrefsJson : null }},CODE
HIGHtests/src/unit/test_server_prefs_seed.py83 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_server_prefs_seed.py90 value: { getAttribute: (name) => name === 'data-prefs' ? '__HA_MCP_THEME_PREFS__' : null },CODE
HIGHtests/src/unit/test_server_prefs_seed.py105 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_server_prefs_seed.py111 value: { getAttribute: (name) => name === 'data-prefs' ? 'not valid json {{{' : null },CODE
HIGHtests/src/unit/test_server_prefs_seed.py130 getItem: (k) => _storage[k] || null,CODE
HIGHtests/src/unit/test_server_prefs_seed.py137 value: {{ getAttribute: (name) => name === 'data-prefs' ? serverPrefsJson : null }},CODE
HIGHtests/src/unit/test_graceful_shutdown.py372 """Stdin should not be available when char device but not tty (like /dev/null)."""STRING
HIGHtests/src/unit/test_astro_setup_js_behavior.py492 document.body.dataset.configCode = (codeEl && codeEl.textContent) || '';CODE
HIGHtests/src/unit/test_astro_setup_js_behavior.py494 (instructionsEl && instructionsEl.innerHTML || '').lengthCODE
HIGHtests/src/unit/test_settings_ui_js_behavior.py88 # returns null) and the behavioural tests find an empty body.COMMENT
HIGHtests/src/unit/test_settings_ui_js_behavior.py3874 !!notice && notice.classList.contains('show'));CODE
HIGHtests/src/unit/test_settings_ui_js_behavior.py4020 + `dismiss=${!!(t && t.querySelector('.ha-toast-dismiss'))}`);CODE
HIGHtests/src/unit/test_settings_ui_js_behavior.py4058 + `dismiss=${!!(t && t.querySelector('.ha-toast-dismiss'))}`);CODE
HIGHtests/src/unit/test_settings_ui_js_behavior.py4348 if (document.activeElement && document.activeElement.blur) {CODE
HIGHtests/src/unit/test_settings_ui_js_behavior.py4416 const checkedBefore = !!(before && before.checked);CODE
HIGHtests/src/unit/test_settings_ui_js_behavior.py4421 document.body.setAttribute('data-after', String(!!(after && after.checked)));CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py109 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py161 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py218 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py264 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py324 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py423 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py523 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py588 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py665 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py671 let _mqlListener = null;CODE
HIGHtests/src/unit/test_theme_toggle_behavior.py742 getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null,CODE
HIGHtests/src/unit/test_util_helpers.py752 instead of ``{"data": null}``, which would be indistinguishable from aSTRING
HIGHtests/src/unit/test_e2e_wait_helpers.py59 wrapper = _mcp_result('{"data": null}')CODE
HIGHtests/src/unit/test_websocket_client.py419 emits ``{"id": N, "type": "result", "success": true, "result": null}``.STRING
HIGHtests/src/e2e/workflows/convenience/test_backup.py5 export HAMCP_ENV_FILE=tests/.env.test && uv run pytest tests/src/e2e/workflows/convenience/test_backup.py -vSTRING
HIGHtests/src/e2e/workflows/convenience/test_backup.py8 cd tests && docker compose up -dSTRING
HIGHcustom_components/ha_mcp_tools/ui_panel.py535 if (window.parent === window) return null;CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py537 const auth = root && root.hass && root.hass.auth;CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py538 if (!auth) return null;CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py539 if (auth.expired && typeof auth.refreshAccessToken === "function") {{CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py544 return null;CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py547 return auth.accessToken || (auth.data && auth.data.access_token) || null;CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py547 return auth.accessToken || (auth.data && auth.data.access_token) || null;CODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py549 return null; // cross-origin parent: not embedded in the HA frontendCODE
HIGHcustom_components/ha_mcp_tools/ui_panel.py493let timer = null;CODE
HIGHsrc/ha_mcp/read_only.py376 unparseable string, a non-dict JSON value (list/scalar/null), orSTRING
HIGHsrc/ha_mcp/__main__.py194 When Docker runs without the -i flag, stdin is connected to /dev/null,CODE
HIGHsrc/ha_mcp/tools/util_helpers.py1754 # ``{"data": null}`` with a successful zero-payload fetch.COMMENT
HIGHsrc/ha_mcp/tools/util_helpers.py1906 a segment can't be resolved (missing key, descent into non-dict / null,STRING
HIGHsrc/ha_mcp/tools/tools_entities.py1507 'Use null value to clear: {"automation": null}. 'CODE
HIGHsrc/ha_mcp/tools/tools_entities.py1779 aliases and the device_class override come back as defaults ([]/null).STRING
HIGHsrc/ha_mcp/tools/tools_entities.py1798 - enabled: Boolean shorthand (True if disabled_by is null)STRING
HIGHsrc/ha_mcp/tools/tools_entities.py1798 - enabled: Boolean shorthand (True if disabled_by is null)STRING
HIGHsrc/ha_mcp/tools/tools_entities.py1799 - hidden: Boolean shorthand (True if hidden_by is not null)STRING
1 more matches not shown…
Modern Structural Boilerplate226 hits · 228 pts
SeverityFileLineSnippetContext
LOWtests/test_env_manager.py34logger = logging.getLogger(__name__)CODE
LOWtests/uat/stories/conftest.py36logger = logging.getLogger(__name__)CODE
LOWtests/uat/stories/test_stories.py25logger = logging.getLogger(__name__)CODE
LOW…ts/initial_test_state/custom_components/hacs/update.py148 def _update_download_progress(self, data: dict) -> None:CODE
LOW…ts/initial_test_state/custom_components/hacs/update.py155 def _update_in_progress(self, progress: int | bool) -> None:CODE
LOW…ts/initial_test_state/custom_components/hacs/entity.py68 def _update_and_write_state(self, _: Any) -> None:CODE
LOWtests/initial_test_state/custom_components/hacs/base.py136 def update_from_dict(self, data: dict) -> None:CODE
LOWtests/initial_test_state/custom_components/hacs/base.py388 def set_stage(self, stage: HacsStage | None) -> None:CODE
LOWtests/initial_test_state/custom_components/hacs/base.py765 def set_active_categories(self) -> None:CODE
LOWtests/initial_test_state/custom_components/hacs/base.py994 async def update_repository(repository: HacsRepository) -> None:CODE
LOWtests/initial_test_state/custom_components/hacs/base.py1010 async def update_coordinators() -> None:CODE
LOW…nitial_test_state/custom_components/hacs/utils/json.py5__all__ = ["json_loads"]CODE
LOW…est_state/custom_components/hacs/repositories/theme.py113 def update_filenames(self) -> None:CODE
LOW…st_state/custom_components/hacs/repositories/plugin.py111 def update_filenames(self) -> None:CODE
LOW…st_state/custom_components/hacs/repositories/plugin.py205 async def update_dashboard_resources(self) -> None:CODE
LOW…e/custom_components/hacs/repositories/python_script.py105 def update_filenames(self) -> None:CODE
LOW…test_state/custom_components/hacs/repositories/base.py194 def update_data(self, data: dict, action: bool = False) -> None:CODE
LOW…test_state/custom_components/hacs/repositories/base.py256 def update_data(self, data: dict) -> None:CODE
LOW…test_state/custom_components/hacs/repositories/base.py467 async def update_repository(self, ignore_issues=False, force=False) -> None:CODE
LOW…test_state/custom_components/hacs/repositories/base.py1018 def update_filenames(self) -> None:CODE
LOWtests/src/unit/_embedded_stubs.py354 def set_cookie(self, name: str, value: str, **attrs: Any) -> None:CODE
LOWtests/src/unit/test_ha_search_component_routing.py117def _setup_visibility_disabled(tmp_path: Any, monkeypatch: Any) -> None:CODE
LOWtests/src/unit/test_ha_overview_component_routing.py148def _setup_visibility_disabled(tmp_path: Any, monkeypatch: Any) -> None:CODE
LOWtests/src/unit/test_wait_helpers.py374 def set_unsubscribe_failure(self, exc: Exception | None) -> None:CODE
LOWtests/src/e2e/conftest.py91logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/conftest.py511def _setup_config_permissions(config_path: Path) -> None:CODE
LOWtests/src/e2e/tools/test_radio_management.py35logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_deep_search_exact_match.py17logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_bm25_fuzzy_search.py18logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_skills_resources.py19logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_search_entities.py16logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_create_custom_tool.py24logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_dev_mode_tools.py26logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_deep_search_bulk_fetch.py24logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_deep_search.py12logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_logbook.py13logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_tools_knx.py20logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_tools_energy.py18logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/tools/test_ha_call_event.py14logger = logging.getLogger(__name__)CODE
LOW…s/src/e2e/haos_only/test_dashboard_screenshot_addon.py202async def _set_options(mcp_client: Any, slug: str, options: dict[str, Any]) -> None:CODE
LOWtests/src/e2e/haos_only/test_manage_addon_modes.py63logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/haos_only/test_webhook_proxy_addon.py164async def _set_options(mcp_client: Any, slug: str, options: dict[str, Any]) -> None:CODE
LOWtests/src/e2e/basic/test_connection.py11logger = logging.getLogger(__name__)CODE
LOW…/src/e2e/workflows/webhook_proxy/test_webhook_proxy.py23logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/scenes/test_lifecycle.py28logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py23logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/device_control/test_lights.py24logger = logging.getLogger(__name__)CODE
LOW…/e2e/workflows/device_control/test_operation_status.py14logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/calendar/test_calendar.py28logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_service.py14logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_templates.py14logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_assist_pipeline.py9logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_bulk.py17logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_state.py14logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_history.py16logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/core/test_get_states.py14logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/zones/test_lifecycle.py23logger = logging.getLogger(__name__)CODE
LOW…sts/src/e2e/workflows/config/test_config_entry_flow.py19logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/config/test_label_crud.py16logger = logging.getLogger(__name__)CODE
LOWtests/src/e2e/workflows/config/test_ws_event_waiter.py30logger = logging.getLogger(__name__)CODE
166 more matches not shown…
Cross-File Repetition42 hits · 210 pts
SeverityFileLineSnippetContext
HIGHtests/src/unit/test_alias_fetch_chunking.py0create smartsearchtools with mocked global settings.STRING
HIGHtests/src/unit/test_deep_search_tier3_parallel.py0create smartsearchtools with mocked global settings.STRING
HIGHtests/src/unit/test_performance_parallelization.py0create smartsearchtools with mocked global settings.STRING
HIGHtests/src/unit/test_smart_search_flow_helpers.py0construct smartsearchtools without loading global settings.STRING
HIGHtests/src/unit/test_smart_search_scene_phase25.py0construct smartsearchtools without loading global settings.STRING
HIGH…/src/unit/test_deep_search_helper_dashboard_partial.py0construct smartsearchtools without loading global settings.STRING
HIGHtests/src/unit/test_deep_search_helper_rename_1794.py0construct smartsearchtools without loading global settings.STRING
HIGHtests/src/unit/test_radio_management.py0register tools onto a mock mcp and return {tool_name: bound_method}.STRING
HIGHtests/src/unit/test_radio_thread.py0register tools onto a mock mcp and return {tool_name: bound_method}.STRING
HIGHtests/src/unit/test_radio_zwave.py0register tools onto a mock mcp and return {tool_name: bound_method}.STRING
HIGHtests/src/unit/test_radio_zigbee.py0register tools onto a mock mcp and return {tool_name: bound_method}.STRING
HIGHtests/src/unit/test_helper_param_rejection.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_helper_registry_id_validation.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_action_and_collision.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_helper_update_persistence.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_helper_field_persistence.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_flow_name_injection.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_action_discriminator.py0register helper config tools and return the captured tool functions.STRING
HIGHtests/src/unit/test_yaml_themes.py0minimal hass mock that runs executor jobs synchronously.STRING
HIGHtests/src/unit/test_yaml_whole_file_replace.py0minimal hass mock that runs executor jobs synchronously.STRING
HIGHtests/src/unit/test_yaml_edit_untouched_content.py0minimal hass mock that runs executor jobs synchronously.STRING
HIGHtests/src/unit/test_yaml_dashboards.py0minimal hass mock that runs executor jobs synchronously.STRING
HIGH…/unit/test_ha_config_list_helpers_component_routing.py0a non-unknown command error → legacy path and a warnings[] entry.STRING
HIGHtests/src/unit/test_ha_search_component_routing.py0a non-unknown command error → legacy path and a warnings[] entry.STRING
HIGHtests/src/unit/test_ha_get_zone_component_routing.py0a non-unknown command error → legacy path and a warnings[] entry.STRING
HIGHtests/src/unit/test_ha_overview_component_routing.py0a non-unknown command error → legacy path and a warnings[] entry.STRING
HIGHtests/src/e2e/conftest.py0parse a streamable-http mcp response (json body or sse) to a json-rpc dict.STRING
HIGHtests/src/e2e/haos_only/test_embedded_server_haos.py0parse a streamable-http mcp response (json body or sse) to a json-rpc dict.STRING
HIGH…sts/src/e2e/workflows/embedded/test_embedded_server.py0parse a streamable-http mcp response (json body or sse) to a json-rpc dict.STRING
HIGH…/src/e2e/workflows/dashboards/test_python_transform.py0test that python_transform is mutually exclusive with config.STRING
HIGH…sts/src/e2e/workflows/scripts/test_python_transform.py0test that python_transform is mutually exclusive with config.STRING
HIGH…/src/e2e/workflows/automation/test_python_transform.py0test that python_transform is mutually exclusive with config.STRING
HIGHcustom_components/ha_mcp_tools/mcp_webhook.py0absolute url of the protected webhook resource under ``base_url``.STRING
HIGH…sistant-addon-webhook-proxy-dev/mcp_proxy_dev/oauth.py0absolute url of the protected webhook resource under ``base_url``.STRING
HIGHhomeassistant-addon-webhook-proxy/mcp_proxy/oauth.py0absolute url of the protected webhook resource under ``base_url``.STRING
HIGHcustom_components/ha_mcp_tools/mcp_webhook.py0issuer / authorization-server url under ``base_url``.STRING
HIGH…sistant-addon-webhook-proxy-dev/mcp_proxy_dev/oauth.py0issuer / authorization-server url under ``base_url``.STRING
HIGHhomeassistant-addon-webhook-proxy/mcp_proxy/oauth.py0issuer / authorization-server url under ``base_url``.STRING
HIGHhomeassistant-addon-webhook-proxy-dev/start.py0write ``data`` to ``path`` with 0600, atomically and race-free. writes to a sibling temp file created 0600 (the mode is STRING
HIGH…sistant-addon-webhook-proxy-dev/mcp_proxy_dev/oauth.py0write ``data`` to ``path`` with 0600, atomically and race-free. writes to a sibling temp file created 0600 (the mode is STRING
HIGHhomeassistant-addon-webhook-proxy/start.py0write ``data`` to ``path`` with 0600, atomically and race-free. writes to a sibling temp file created 0600 (the mode is STRING
HIGHhomeassistant-addon-webhook-proxy/mcp_proxy/oauth.py0write ``data`` to ``path`` with 0600, atomically and race-free. writes to a sibling temp file created 0600 (the mode is STRING
Self-Referential Comments65 hits · 190 pts
SeverityFileLineSnippetContext
MEDIUM…s/uat/stories/catalog/s02_automation_motion_light.yaml18 # Create an input_boolean to simulate a motion sensorCOMMENT
MEDIUM…ories/catalog/s07_automation_update_add_condition.yaml18 # Create the automation to be modifiedCOMMENT
MEDIUM…ories/catalog/s07_automation_update_add_condition.yaml34 # Create a presence indicatorCOMMENT
MEDIUMtests/addon/test_webhook_proxy.py327 # Create the package object first so submodules have a parent with __path__.COMMENT
MEDIUMtests/src/unit/test_oauth.py376 # Create a stateless refresh token (as exchange_authorization_code would)COMMENT
MEDIUMtests/src/unit/test_oauth.py1297 # Create a cached clientCOMMENT
MEDIUMtests/src/unit/test_graceful_shutdown.py73 # Create a mock eventCOMMENT
MEDIUMtests/src/unit/test_graceful_shutdown.py225 # Create a mock MCP that runs foreverCOMMENT
MEDIUMtests/src/unit/policy/test_approval_queue.py275 # Create a second entry — forces eviction of 'a' (only one pending)COMMENT
MEDIUMtests/src/e2e/test_entity_visibility.py141 # Create a label and assign it to the probe so the entity-registry entryCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search_exact_match.py25 # Create an automation with a distinctive entity referenceCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search_exact_match.py141 # Create a dashboard with a distinctive entity referenceCOMMENT
MEDIUMtests/src/e2e/tools/test_bm25_fuzzy_search.py106 # Create an automation with terms that are non-adjacentCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search.py46 # Create the automationCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search.py116 # Create a test script with distinctive contentCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search.py128 # Create the scriptCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search.py203 # Create a test input_select helper with distinctive optionsCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search.py209 # Create the helperCOMMENT
MEDIUMtests/src/e2e/workflows/calendar/test_calendar.py214 # Create an event for tomorrowCOMMENT
MEDIUMtests/src/e2e/workflows/core/test_service.py194 # Create a test automation firstCOMMENT
MEDIUMtests/src/e2e/workflows/core/test_service.py373 # Create a test input_booleanCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_label_crud.py271 # Create a test labelCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_label_crud.py361 # Create a test labelCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_label_crud.py402 # Create a test labelCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_label_crud.py443 # Create a test labelCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_helper_crud.py1829 # Create a dedicated areaCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_helper_crud.py1893 # Create a dedicated labelCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_helper_crud.py1964 # Create a dedicated areaCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_helper_crud.py2254 # Create a dedicated area + labelCOMMENT
MEDIUM…/e2e/workflows/auto_backup/test_capture_and_restore.py228 # Create an automation to snapshot. We do NOT edit it — theCOMMENT
MEDIUMtests/src/e2e/workflows/labels/test_label_operations.py49 # Create the test labelCOMMENT
MEDIUMtests/src/e2e/workflows/labels/test_label_operations.py341 # Create a test labelCOMMENT
MEDIUMtests/src/e2e/workflows/filesystem/test_yaml_config.py626 # Create a file with a list valueCOMMENT
MEDIUMtests/src/e2e/workflows/filesystem/test_yaml_config.py931 # Create a file with !secret tag under 'template' keyCOMMENT
MEDIUMtests/src/e2e/workflows/filesystem/test_yaml_config.py1157 # Create the theme file.COMMENT
MEDIUMtests/src/e2e/workflows/filesystem/test_yaml_config.py1330 # Create the key — no prior value, so capture is skipped.COMMENT
MEDIUM…s/src/e2e/workflows/filesystem/test_file_operations.py642 # Create a file to deleteCOMMENT
MEDIUMtests/src/e2e/workflows/groups/test_verification.py69 # Create a group firstCOMMENT
MEDIUM…/workflows/integrations/test_integration_management.py94 # Create a temporary light group helperCOMMENT
MEDIUMtests/src/e2e/workflows/system/test_system_tools.py825 # Create a test notificationCOMMENT
MEDIUMtests/src/e2e/workflows/dashboards/test_resources.py310 # Create a resource firstCOMMENT
MEDIUM…sts/src/e2e/workflows/registry/test_voice_assistant.py96 # Create a test entity firstCOMMENT
MEDIUM…sts/src/e2e/workflows/registry/test_voice_assistant.py145 # Create a test entityCOMMENT
MEDIUM…sts/src/e2e/workflows/registry/test_voice_assistant.py202 # Create a test entityCOMMENT
MEDIUMtests/src/e2e/workflows/automation/test_lifecycle.py912 # Create the automation - THIS IS THE KEY TESTCOMMENT
MEDIUM…/src/e2e/workflows/automation/test_python_transform.py578 # Create a categoryCOMMENT
MEDIUMtests/src/e2e/workflows/convenience/test_backup.py264 # Create a backup (which internally retrieves config/password)COMMENT
MEDIUM…2e/workflows/categories/test_config_tool_categories.py28 # Create a category firstCOMMENT
MEDIUM…2e/workflows/categories/test_config_tool_categories.py87 # Create a category firstCOMMENT
MEDIUM…2e/workflows/categories/test_config_tool_categories.py145 # Create a categoryCOMMENT
MEDIUM…2e/workflows/categories/test_config_tool_categories.py254 # Create a categoryCOMMENT
MEDIUM…2e/workflows/categories/test_config_tool_categories.py317 # Create a categoryCOMMENT
MEDIUM…2e/workflows/categories/test_config_tool_categories.py361 # Create a category for helpersCOMMENT
MEDIUM…sts/src/e2e/workflows/categories/test_category_crud.py235 # Create a test categoryCOMMENT
MEDIUM…sts/src/e2e/workflows/categories/test_category_crud.py281 # Create a test categoryCOMMENT
MEDIUMtests/src/e2e/workflows/entities/test_entity_remove.py19 # Create a temporary input_boolean to removeCOMMENT
MEDIUM…s/src/e2e/workflows/entities/test_entity_management.py41 # Create a test areaCOMMENT
MEDIUM…s/src/e2e/workflows/entities/test_entity_management.py349 # Create a test areaCOMMENT
MEDIUMsite/src/data/tools.json553 "description": "Create a new event in a calendar.\n\nCreates a one-off event via the calendar.create_event service, CODE
MEDIUMsite/src/data/tools.json1388 "description": "Write a file to allowed directories in the Home Assistant config.\n\nCreates or updates files in resCODE
5 more matches not shown…
Over-Commented Block233 hits · 188 pts
SeverityFileLineSnippetContext
LOWdocker-compose.screenshot.yml1# Example: dashboard-screenshot engine sidecar for Docker / Container installsCOMMENT
LOWdocker-compose.screenshot.yml41 container_name: ha-mcp-screenshotCOMMENT
LOWdocker-compose.yml21 - HOMEASSISTANT_URL=http://homeassistant:8123COMMENT
LOWhomeassistant-addon/config.yaml21# homeassistant-addon-dev/config.yaml.COMMENT
LOWhomeassistant-addon/start.py241 # Per-key sub-gates of enable_yaml_config_editing. Kept in lockstepCOMMENT
LOWhomeassistant-addon/start.py581 ).lower()COMMENT
LOWhomeassistant-addon/start.py681 )COMMENT
LOWhomeassistant-addon/start.py761 # the basicConfig above could only hardcode INFO. Without this, theCOMMENT
LOWtests/pytest.ini61 not_on_embedded: skip on the embedded backend (E2E_BACKEND=embedded) — provably redundant with the lane's own in-proCOMMENT
LOWtests/uat/stories/run_story.py481 # A request timed out, but the backend may well be alive: a slow orCOMMENT
LOWtests/haos_image_build/requirements.txt1# Build-script dependencies. Installed in CI by the haos-e2e-tests andCOMMENT
LOWtests/haos_image_build/build_image.py101#COMMENT
LOWtests/haos_image_build/build_image.py121# Dropped vs the original #1281 set: Frigate (~2 GB) and Zigbee2MQTT (~220COMMENT
LOWtests/haos_image_build/build_image.py141 Addon(repo=None, name="Matter Server"),COMMENT
LOWtests/haos_image_build/build_image.py181# inaddon HAOS E2E tier (#1349 item 7). The dev addon's config.yaml lives atCOMMENT
LOWtests/haos_image_build/build_image.py201# ``tests/src/e2e/haos_only/test_embedded_server_haos.py`` fixture enables it viaCOMMENT
LOWtests/haos_image_build/build_image.py221# embedded-server test times out, rather than silently installing wrong code.COMMENT
LOWtests/haos_image_build/build_image.py241# repeatedly broke the bake under floating Supervisor versions, and realCOMMENT
LOWtests/haos_image_build/build_image.py801# hassio-addons/addon-node-red/node-red/config.yaml) but ships noCOMMENT
LOWtests/haos_image_build/build_image.py821 # ``ha_manage_addon``'s proxy mode to work against thisCOMMENT
LOWtests/haos_image_build/build_image.py881 # - ``options`` is a FULL-REPLACE field; the value must satisfyCOMMENT
LOWtests/haos_image_build/build_image.py1581 time.sleep(10.0)COMMENT
LOWtests/haos_image_build/build_image.py1961# Entry pointCOMMENT
LOWtests/initial_test_state/configuration.yaml41 step: 1COMMENT
LOWtests/addon/test_webhook_proxy.py3061COMMENT
LOWtests/src/haos_runtime.py81HAOS_IMAGE_ENV = "HAOS_TEST_IMAGE_PATH"COMMENT
LOWtests/src/haos_runtime.py101HA_MCP_SERVER_DOMAIN = "ha_mcp_tools"COMMENT
LOWtests/src/haos_runtime.py341 }COMMENT
LOWtests/src/haos_runtime.py441 LOG.info("Shifted recorder timestamps by %+.0fs", offset)COMMENT
LOWtests/src/haos_runtime.py1281 last_err = eCOMMENT
LOWtests/src/haos_runtime.py1881COMMENT
LOWtests/src/unit/test_backup_manager.py1421 # ``unchanged`` must be False under ``entity_missing``: the emptyCOMMENT
LOWtests/src/unit/test_settings_ui_js_behavior.py81 "policy-save-global-btn",COMMENT
LOWtests/src/unit/test_embedded_setup.py1301 # resolves ``from a.b.c import x`` through the immediate parentCOMMENT
LOWtests/src/unit/test_helper_classifier.py161 "error_str,expected_code",COMMENT
LOWtests/src/unit/test_advanced_settings_coverage.py181# and unreachable for add-on users. That is exactly how the threeCOMMENT
LOW…/unit/test_fields_projection_docstring_completeness.py41# ``fields=`` Annotated[..., Field(description=...)] textCOMMENT
LOWtests/src/unit/test_webhook_proxy_sync.py181 assert lines[lines.index("stage: experimental") - 1].startswith("url:")COMMENT
LOWtests/src/unit/test_webhook_proxy_sync.py281 tmp_path / src.addon_dir,COMMENT
LOWtests/src/unit/test_context_injection.py661 # Sequential mode attempts dispatch (0) + per-op (1) + completion (2) = 3 emits.COMMENT
LOWtests/src/unit/test_wait_helpers.py321 mock_client,COMMENT
LOWtests/src/unit/test_identifier_validation_family.py681 # Control: when ``list_only=True`` and ``url_path`` is omitted,COMMENT
LOWtests/src/unit/test_identifier_validation_family.py701 # Positive proof: at least one WS message was attempted (theCOMMENT
LOWtests/src/unit/test_identifier_validation_family.py781 # service call and surface as a misleading HA service-call failure.COMMENT
LOWtests/src/e2e/conftest.py101_READINESS_TIMINGS: list[dict[str, Any]] = []COMMENT
LOWtests/src/e2e/conftest.py121_EMBEDDED_WEBHOOK_ID = "mcp_e2e_embedded_0123456789abcdef"COMMENT
LOWtests/src/e2e/conftest.py221 del configCOMMENT
LOWtests/src/e2e/conftest.py281 # it joins the skip; those tests keep full coverage on the container lane.COMMENT
LOWtests/src/e2e/conftest.py301 # would double-enable the entry and race the session backend, so they skipCOMMENT
LOWtests/src/e2e/conftest.py561COMMENT
LOWtests/src/e2e/conftest.py601 # exists then but its contents are partial. On the success path theCOMMENT
LOWtests/src/e2e/conftest.py1521 # image path unchanged.COMMENT
LOWtests/src/e2e/conftest.py1541 # enables the entry. Best-effort — a failure only affects that one test.COMMENT
LOWtests/src/e2e/conftest.py1621 # 200 but state was 'unknown'".COMMENT
LOWtests/src/e2e/conftest.py1681 # defence against race conditions on slow CI runners.COMMENT
LOWtests/src/e2e/conftest.py1801 ),COMMENT
LOWtests/src/e2e/conftest.py1921COMMENT
LOWtests/src/e2e/conftest.py1981 # observed on PR #1268 ARM E2E (2026-05-12) where ``ruamel.yaml``COMMENT
LOWtests/src/e2e/conftest.py2061 logger.info("🗑️ Removed .HA_RESTORE file from config")COMMENT
LOWtests/src/e2e/conftest.py2081 # ``SUN_WAIT = 5`` is the residual tight poll:COMMENT
173 more matches not shown…
Deep Nesting210 hits · 173 pts
SeverityFileLineSnippetContext
LOWpackaging/mcpb/generate_manifest.py18CODE
LOWhomeassistant-addon/start.py57CODE
LOWtests/test_env_manager.py282CODE
LOWtests/test_env_manager.py145CODE
LOWtests/uat/run_uat.py483CODE
LOWtests/uat/ha_wait.py24CODE
LOWtests/uat/openai_agent.py137CODE
LOWtests/uat/openai_agent.py216CODE
LOWtests/uat/stories/run_story.py173CODE
LOWtests/uat/stories/run_story.py213CODE
LOWtests/uat/stories/run_story.py245CODE
LOWtests/uat/stories/run_story.py912CODE
LOWtests/haos_image_build/build_image.py327CODE
LOWtests/initial_test_state/custom_components/hacs/base.py430CODE
LOWtests/initial_test_state/custom_components/hacs/base.py523CODE
LOWtests/initial_test_state/custom_components/hacs/base.py838CODE
LOWtests/initial_test_state/custom_components/hacs/base.py433CODE
LOW…t_state/custom_components/hacs/validate/information.py21CODE
LOW…ial_test_state/custom_components/hacs/utils/filters.py8CODE
LOW…nitial_test_state/custom_components/hacs/utils/data.py156CODE
LOW…st_state/custom_components/hacs/repositories/plugin.py111CODE
LOW…test_state/custom_components/hacs/repositories/base.py194CODE
LOW…test_state/custom_components/hacs/repositories/base.py360CODE
LOW…test_state/custom_components/hacs/repositories/base.py410CODE
LOW…test_state/custom_components/hacs/repositories/base.py657CODE
LOW…test_state/custom_components/hacs/repositories/base.py781CODE
LOW…test_state/custom_components/hacs/repositories/base.py1046CODE
LOW…test_state/custom_components/hacs/repositories/base.py1171CODE
LOW…test_state/custom_components/hacs/repositories/base.py684CODE
LOWtests/src/haos_runtime.py288CODE
LOWtests/src/haos_runtime.py1245CODE
LOWtests/src/haos_runtime.py1389CODE
LOWtests/src/haos_runtime.py1408CODE
LOWtests/src/haos_runtime.py1643CODE
LOWtests/src/unit/test_read_only.py746CODE
LOWtests/src/unit/test_read_only.py762CODE
LOWtests/src/unit/test_settings_ui_handler_selection.py84CODE
LOWtests/src/unit/test_settings_ui_js_behavior.py110CODE
LOWtests/src/unit/test_server_bridge_strip.py19CODE
LOWtests/src/unit/test_server_bridge_strip.py65CODE
LOWtests/src/unit/test_advanced_settings_coverage.py229CODE
LOW…/unit/test_fields_projection_docstring_completeness.py234CODE
LOW…/unit/test_fields_projection_docstring_completeness.py274CODE
LOW…/unit/test_fields_projection_docstring_completeness.py351CODE
LOW…/unit/test_fields_projection_docstring_completeness.py367CODE
LOW…/unit/test_fields_projection_docstring_completeness.py610CODE
LOWtests/src/unit/test_skill_content_wiring.py282CODE
LOWtests/src/unit/test_skill_content_wiring.py306CODE
LOWtests/src/e2e/conftest.py413CODE
LOWtests/src/e2e/conftest.py533CODE
LOWtests/src/e2e/conftest.py884CODE
LOWtests/src/e2e/conftest.py1074CODE
LOWtests/src/e2e/conftest.py1173CODE
LOWtests/src/e2e/conftest.py1504CODE
LOWtests/src/e2e/conftest.py2578CODE
LOWtests/src/e2e/run_tests.py13CODE
LOW…s/src/e2e/haos_only/test_dashboard_screenshot_addon.py97CODE
LOWtests/src/e2e/haos_only/test_manage_addon_modes.py309CODE
LOWtests/src/e2e/haos_only/test_addon_debug_log_level.py152CODE
LOWtests/src/e2e/haos_only/test_addon_debug_log_level.py203CODE
150 more matches not shown…
Structural Annotation Overuse79 hits · 140 pts
SeverityFileLineSnippetContext
LOWtests/src/unit/test_oauth.py752 # Step 5: Verify access token contains only ha_token (no ha_url - SSRF fix)COMMENT
LOWtests/src/unit/test_oauth.py758 # Step 6: Use stateless refresh token to get new access tokenCOMMENT
LOWtests/src/unit/test_oauth.py772 # Step 7: Verify refreshed access token is valid and carries HA credentialsCOMMENT
LOWtests/src/unit/test_oauth.py779 # Step 8: Verify chained refresh also worksCOMMENT
LOWtests/src/unit/test_oauth.py682 # Step 1: Client registrationCOMMENT
LOWtests/src/unit/test_oauth.py696 # Step 2: Authorization requestCOMMENT
LOWtests/src/unit/test_oauth.py716 # Step 3: Simulate consent form submissionCOMMENT
LOWtests/src/unit/test_oauth.py740 # Step 4: Exchange auth code for tokensCOMMENT
LOWtests/src/unit/test_flow_multistep.py355 # Step 1: the user stepCOMMENT
LOWtests/src/unit/test_flow_multistep.py363 # Step 2: the state_characteristic step — MUST receive its key,COMMENT
LOWtests/src/e2e/tools/test_create_custom_tool.py1053 # Step 1: save a tool we'll then delete.COMMENT
LOWtests/src/e2e/tools/test_create_custom_tool.py1065 # Step 2: delete it from inside the sandbox.COMMENT
LOWtests/src/e2e/tools/test_create_custom_tool.py1086 # Step 3: confirm running it now fails (entry is gone).COMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py350 # Step 1: List automation blueprintsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py360 # Step 2: List script blueprintsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py370 # Step 3: If blueprints exist, explore oneCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py436 # Step 1: List available blueprintsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py451 # Step 2: Get blueprint details to understand required inputsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py460 # Step 3: Create automation from blueprint (no trigger/action fields)COMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py508 # Step 4: Wait for automation to be registered, then verify no trigger/action fieldsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py516 # Step 5: Clean upCOMMENT
LOWtests/src/e2e/workflows/system/test_system_tools.py716 # Step 1: Check configuration (folded into ha_get_system_health)COMMENT
LOWtests/src/e2e/workflows/system/test_system_tools.py728 # Step 2: Reload automationsCOMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1174 # Step 2: Get blueprint details to understand required inputsCOMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1183 # Step 3: Create script from blueprint (no sequence field)COMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1229 # Step 4: Wait for script to be registered, then verify no sequence fieldCOMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py373 # Step 1: Discover light services (use full detail to see fields)COMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py383 # Step 2: Find a light entity to test withCOMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py400 # Step 3: Use discovered service to control lightCOMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py410 # Step 4: Call discovered serviceCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md31## Step 0: Triage (Diff Analysis + Custom Story Design)COMMENT
LOW.claude/skills/bat-story-eval/SKILL.md108## Step 1: Run Baseline VersionCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md163## Step 2: Run Target VersionCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md178## Step 3: White-Box AnalysisCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md211## Step 4: Score & CompareCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md255## Step 5: Update JSONLCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md264## Step 6: ReportCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md321## Step 7: Investigate OutliersCOMMENT
LOW.claude/skills/bat-story-eval/SKILL.md335## Step 8: Tool Description SizeCOMMENT
LOW…kills/bat-story-eval/references/regression-protocol.md29## Step 1: Re-Run (Flakiness Check)COMMENT
LOW…kills/bat-story-eval/references/regression-protocol.md45## Step 2: Control Run (Baseline Version)COMMENT
LOW…kills/bat-story-eval/references/regression-protocol.md62## Step 3: Cross-Agent CheckCOMMENT
LOW…kills/bat-story-eval/references/regression-protocol.md92## Step 4: DiagnoseCOMMENT
LOW…kills/bat-story-eval/references/regression-protocol.md133## Step 5: ReportCOMMENT
LOW.claude/skills/my-pr-checker/SKILL.md12## Step 1: Full PR AssessmentCOMMENT
LOW.claude/skills/my-pr-checker/SKILL.md34## Step 2: Triage CommentsCOMMENT
LOW.claude/skills/my-pr-checker/SKILL.md42## Step 3: Fix Code IssuesCOMMENT
LOW.claude/skills/my-pr-checker/SKILL.md59## Step 4: Resolve Each Thread (both steps required)COMMENT
LOW.claude/skills/my-pr-checker/SKILL.md80## Step 5: Wait and Re-checkCOMMENT
LOW.claude/skills/my-pr-checker/SKILL.md91## Step 6: Final ReportCOMMENT
LOW.claude/skills/issue-analysis/SKILL.md15## Step 1: Fetch Issue DetailsCOMMENT
LOW.claude/skills/issue-analysis/SKILL.md26## Step 2: Research Phase (before drawing conclusions)COMMENT
LOW.claude/skills/issue-analysis/SKILL.md33## Step 3: Assess Other Open Issues (for priority context)COMMENT
LOW.claude/skills/issue-analysis/SKILL.md39## Step 4: Determine LabelsCOMMENT
LOW.claude/skills/issue-analysis/SKILL.md51## Step 5: Draft Analysis for UserCOMMENT
LOW.claude/skills/issue-analysis/SKILL.md57## Step 6: Apply Labels and Post CommentCOMMENT
LOWdocs/macOS-uv-guide.md7## Step 1: Create a Claude AccountCOMMENT
LOWdocs/macOS-uv-guide.md11## Step 2: Run the InstallerCOMMENT
LOWdocs/macOS-uv-guide.md60## Step 3: Install or Restart Claude DesktopCOMMENT
LOWdocs/macOS-uv-guide.md66## Step 4: Test ItCOMMENT
19 more matches not shown…
Docstring Block Structure27 hits · 135 pts
SeverityFileLineSnippetContext
HIGHtests/src/e2e/workflows/device_control/test_lights.py28Validate and return entity state data. Args: state_data: Parsed MCP result from ha_get_state entitySTRING
HIGHtests/src/e2e/utilities/wait_helpers.py344 Poll an MCP tool until the result satisfies a predicate. Useful when an entity was just created and needs timeSTRING
HIGHtests/src/e2e/utilities/wait_helpers.py584Subscribe → sample-after-subscribe → wait-for-event pattern, test-side. Mirrors :func:`ha_mcp.tools.util_helpers._wSTRING
HIGHsrc/ha_mcp/tools/backup.py152 Retrieve default backup password from Home Assistant configuration. Args: ws_client: Connected WebSockSTRING
HIGHsrc/ha_mcp/tools/device_control.py70 Universal smart device control with async verification. This tool provides intelligent device control STRING
HIGHsrc/ha_mcp/tools/util_helpers.py107 Parse flexibly JSON string or return existing dict/list. Args: param: JSON string, dict, list, or NoneSTRING
HIGHsrc/ha_mcp/tools/tools_utility.py1257 Evaluate Jinja2 templates using Home Assistant's template engine. This tool allows testing and debuggiSTRING
HIGHsrc/ha_mcp/tools/helpers.py89Reject ``None``, empty, or whitespace-only identifier values. Surfaces a structured ``VALIDATION_INVALID_PARAMETER`STRING
HIGHsrc/ha_mcp/tools/helpers.py409 Convert an exception to a structured error response. This function maps common exception types to appropriate STRING
HIGHsrc/ha_mcp/tools/smart_search/_entities.py39 Search entities with fuzzy matching and typo tolerance. Args: query: Search query (can be STRING
HIGHsrc/ha_mcp/utils/python_sandbox.py340 Execute a validated Python expression in a restricted environment. The expression runs with ``variables`` avaiSTRING
HIGHsrc/ha_mcp/utils/python_sandbox.py410 Execute validated Python expression against a ``config`` dict. Thin wrapper around :func:`safe_execute_expressSTRING
HIGHsrc/ha_mcp/client/supervisor_client.py37Construct an ``httpx.AsyncClient`` pre-configured for the Supervisor REST API. Args: timeout: Per-request tSTRING
HIGHsrc/ha_mcp/client/rest_client.py282 Make authenticated request to Home Assistant API and parse JSON body. Args: method: HTTP mSTRING
HIGHsrc/ha_mcp/client/rest_client.py336 Set entity state. Args: entity_id: Entity ID state: New state value STRING
HIGHsrc/ha_mcp/client/rest_client.py895 Convert entity_id to unique_id if needed, or return unique_id as-is. Args: identifier: EitSTRING
HIGHsrc/ha_mcp/client/rest_client.py931 Get automation configuration by unique_id or entity_id. Args: identifier: Either automatioSTRING
HIGHsrc/ha_mcp/client/rest_client.py962 Create new automation or update existing one. Args: config: Automation configuration dictiSTRING
HIGHsrc/ha_mcp/client/rest_client.py1089 Delete automation configuration by entity_id or unique_id. Args: identifier: Either automaSTRING
HIGHsrc/ha_mcp/client/rest_client.py1145 Start a config entry flow. Args: handler: Integration domain (e.g., "template", "group") STRING
HIGHsrc/ha_mcp/client/rest_client.py1168 Submit data for a config flow step. Args: flow_id: Flow ID from start_config_flow or previSTRING
HIGHsrc/ha_mcp/client/rest_client.py1187 Abort an in-progress config entry flow. Args: flow_id: Flow ID to abort Returns: STRING
HIGHsrc/ha_mcp/client/rest_client.py1203 Start an options flow for a config entry. The options flow allows configuring an existing integration STRING
HIGHsrc/ha_mcp/client/rest_client.py1229 Submit data for an options flow step. Args: flow_id: Flow ID from start_options_flow or prSTRING
HIGHsrc/ha_mcp/client/rest_client.py1250 Abort an in-progress options flow without saving changes. Args: flow_id: Flow ID to abort STRING
HIGHsrc/ha_mcp/client/rest_client.py1337 Get config entry details. Note: Home Assistant doesn't have a direct REST API endpoint for individual STRING
HIGHsrc/ha_mcp/client/rest_client.py1375Delete a config entry via REST API. The WebSocket command ``config_entries/delete`` is not supported by STRING
Redundant / Tautological Comments60 hits · 90 pts
SeverityFileLineSnippetContext
LOWhomeassistant-addon/start.py84 # Check if we have a stored secret pathCOMMENT
LOWtests/src/unit/_js_harness.py436 # Check if this is a data-purpose script and incorporate thatCOMMENT
LOWtests/src/e2e/conftest.py644 # Check if HACS is installed and frontend is missing or invalid.COMMENT
LOWtests/src/e2e/conftest.py2119 # Check if container is actually runningCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py482 # Check if it was our validation or HA's validation that failedCOMMENT
LOWtests/src/e2e/workflows/device_control/test_lights.py40 # Check if this is a successful response with entity dataCOMMENT
LOWtests/src/e2e/workflows/core/test_history.py527 # Check if requested types are in responseCOMMENT
LOWtests/src/e2e/workflows/config/test_label_crud.py281 # Assign label to entityCOMMENT
LOWtests/src/e2e/workflows/config/test_helper_crud.py1098 # Check if 'data' key exists (not 'success' key which doesn't exist in parse_mcp_result)COMMENT
LOWtests/src/e2e/workflows/config/test_helper_crud.py1117 # Check if 'data' key exists (not 'success' key which doesn't exist in parse_mcp_result)COMMENT
LOW…s/src/e2e/workflows/filesystem/test_file_operations.py154 # Check if we got the "not installed" errorCOMMENT
LOW…s/src/e2e/workflows/filesystem/test_file_operations.py594 # Write file with nested directoriesCOMMENT
LOW…s/src/e2e/workflows/filesystem/test_file_operations.py920 # Check if the ha_mcp_tools service is actually availableCOMMENT
LOWtests/src/e2e/workflows/todo/test_lifecycle.py577 # Check if any todo entities foundCOMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1203 # Check if it was our validation or HA's validation that failedCOMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py324 if state_data.get("success"): # Check if state is accessibleCODE
LOWtests/src/e2e/workflows/automation/test_helpers.py54 # Check if we have valid entity dataCOMMENT
LOWtests/src/e2e/workflows/automation/test_helpers.py1145 # Check if our test helper is in the resultsCOMMENT
LOWtests/src/e2e/workflows/convenience/test_backup.py52 # Check if backup password is configuredCOMMENT
LOWtests/src/e2e/workflows/convenience/test_backup.py124 # Check if backup password is configuredCOMMENT
LOWtests/src/e2e/workflows/convenience/test_backup.py282 # Check if error is about missing passwordCOMMENT
LOW…sts/src/e2e/workflows/categories/test_category_crud.py247 # Assign category to entityCOMMENT
LOW…s/src/e2e/workflows/entities/test_entity_management.py52 # Assign entity to areaCOMMENT
LOW…s/src/e2e/workflows/entities/test_entity_management.py96 # Assign entity to area firstCOMMENT
LOWtests/src/e2e/error_handling/test_network_errors.py355 # Check if partial success is reportedCOMMENT
LOWtests/src/e2e/utilities/wait_helpers.py170 # Check if 'data' key exists (not 'success' key which doesn't exist in parse_mcp_result)COMMENT
LOWtests/src/e2e/utilities/assertions.py39 # Check if this is an error response (isError=true from ToolError)COMMENT
LOWtests/src/e2e/utilities/cleanup.py242 # Check if entity ID or name contains test patternsCOMMENT
LOWcustom_components/ha_mcp_tools/__init__.py927 # Check if it's one of the explicitly allowed files in config rootCOMMENT
LOWcustom_components/ha_mcp_tools/__init__.py931 # Check if path starts with an allowed directoryCOMMENT
LOWscripts/install.sh250# Check if config file exists and handle accordinglyCOMMENT
LOWscripts/install.sh258 # Check if ha-mcp is already configuredCOMMENT
LOW.github/workflows/_build-and-release.yml187 # Check if release exists and is draftCOMMENT
LOW.github/workflows/pr-validate-hotfix.yml39 # Check if stable tag existsCOMMENT
LOW.github/workflows/pr-validate-hotfix.yml60 # Check if there are commits on master that are NOT in stable but ARE in the hotfixCOMMENT
LOW.github/workflows/pr-validate-hotfix.yml72 # Check if merge base is at or before stableCOMMENT
LOW.github/workflows/pr-validate-hotfix.yml78 # Check if stable is ancestor of merge base (hotfix branched after stable)COMMENT
LOWsite/src/data/tools.json3346 "description": "Evaluate Jinja2 templates using Home Assistant's template engine.\n\nThis tool allows testing and deCODE
LOWhomeassistant-addon-webhook-proxy-dev/start.py947 # Check if integration already loaded (user restarted fast)COMMENT
LOWhomeassistant-addon-webhook-proxy/start.py947 # Check if integration already loaded (user restarted fast)COMMENT
LOWsrc/ha_mcp/__main__.py741 # Check if stdin is available (fails in Docker without -i flag)COMMENT
LOWsrc/ha_mcp/__main__.py197 # Check if stdin is closedSTRING
LOWsrc/ha_mcp/tools/tools_yaml_config.py461 # Check if custom component is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_traces.py476 # Check if enabled (state is 'on' for automations, 'off' is disabled)COMMENT
LOWsrc/ha_mcp/tools/tools_traces.py486 # Check if tracing is stored - only for automationsCOMMENT
LOWsrc/ha_mcp/tools/tools_filesystem.py435 # Check if custom component is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_filesystem.py553 # Check if custom component is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_filesystem.py692 # Check if custom component is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_filesystem.py816 # Check if custom component is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_updates.py389 # Check if rate limitedCOMMENT
LOWsrc/ha_mcp/tools/tools_updates.py451 # Check if rate limitedCOMMENT
LOWsrc/ha_mcp/tools/tools_config_dashboards.py1749 # Check if request failed (after potential retry)COMMENT
LOWsrc/ha_mcp/tools/tools_hacs.py324 # Check if HACS is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_hacs.py388 # Check if HACS is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_hacs.py468 # Check if HACS is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_hacs.py518 # Check if HACS is availableCOMMENT
LOWsrc/ha_mcp/tools/tools_utility.py1309 {{ is_state('light.living_room', 'on') }} # Check if entity has specific stateSTRING
LOWsrc/ha_mcp/tools/tools_service.py331 # Check if this is a timeout - for service calls, timeouts typicallyCOMMENT
LOWsrc/ha_mcp/auth/provider.py595 # Check if authorization request is expired (5 minutes)COMMENT
LOWsrc/ha_mcp/utils/operation_manager.py134 # Check if operation has timed outCOMMENT
Verbosity Indicators38 hits · 72 pts
SeverityFileLineSnippetContext
LOWtests/src/unit/test_oauth.py752 # Step 5: Verify access token contains only ha_token (no ha_url - SSRF fix)COMMENT
LOWtests/src/unit/test_oauth.py758 # Step 6: Use stateless refresh token to get new access tokenCOMMENT
LOWtests/src/unit/test_oauth.py772 # Step 7: Verify refreshed access token is valid and carries HA credentialsCOMMENT
LOWtests/src/unit/test_oauth.py779 # Step 8: Verify chained refresh also worksCOMMENT
LOWtests/src/unit/test_oauth.py682 # Step 1: Client registrationCOMMENT
LOWtests/src/unit/test_oauth.py696 # Step 2: Authorization requestCOMMENT
LOWtests/src/unit/test_oauth.py716 # Step 3: Simulate consent form submissionCOMMENT
LOWtests/src/unit/test_oauth.py740 # Step 4: Exchange auth code for tokensCOMMENT
LOWtests/src/unit/test_flow_multistep.py355 # Step 1: the user stepCOMMENT
LOWtests/src/unit/test_flow_multistep.py363 # Step 2: the state_characteristic step — MUST receive its key,COMMENT
LOWtests/src/e2e/tools/test_create_custom_tool.py1053 # Step 1: save a tool we'll then delete.COMMENT
LOWtests/src/e2e/tools/test_create_custom_tool.py1065 # Step 2: delete it from inside the sandbox.COMMENT
LOWtests/src/e2e/tools/test_create_custom_tool.py1086 # Step 3: confirm running it now fails (entry is gone).COMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py350 # Step 1: List automation blueprintsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py360 # Step 2: List script blueprintsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py370 # Step 3: If blueprints exist, explore oneCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py436 # Step 1: List available blueprintsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py451 # Step 2: Get blueprint details to understand required inputsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py460 # Step 3: Create automation from blueprint (no trigger/action fields)COMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py508 # Step 4: Wait for automation to be registered, then verify no trigger/action fieldsCOMMENT
LOWtests/src/e2e/workflows/blueprints/test_blueprints.py516 # Step 5: Clean upCOMMENT
LOWtests/src/e2e/workflows/system/test_system_tools.py716 # Step 1: Check configuration (folded into ha_get_system_health)COMMENT
LOWtests/src/e2e/workflows/system/test_system_tools.py728 # Step 2: Reload automationsCOMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1174 # Step 2: Get blueprint details to understand required inputsCOMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1183 # Step 3: Create script from blueprint (no sequence field)COMMENT
LOWtests/src/e2e/workflows/scripts/test_lifecycle.py1229 # Step 4: Wait for script to be registered, then verify no sequence fieldCOMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py373 # Step 1: Discover light services (use full detail to see fields)COMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py383 # Step 2: Find a light entity to test withCOMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py400 # Step 3: Use discovered service to control lightCOMMENT
LOWtests/src/e2e/workflows/services/test_list_services.py410 # Step 4: Call discovered serviceCOMMENT
LOWscripts/install.sh89# Step 1: Check/install uvCOMMENT
LOWscripts/install.sh200 # Step 3: Pre-download dependenciesCOMMENT
LOWscripts/install.sh239# Step 2: Configure Claude DesktopCOMMENT
LOWscripts/install.sh372# Step 3: Pre-download dependenciesCOMMENT
LOWsrc/ha_mcp/tools/tools_integrations.py1856 # Step 2: collect sub-entity IDs for the wait phaseCOMMENT
LOWsrc/ha_mcp/tools/tools_integrations.py1862 # Step 3: delete the config entryCOMMENT
LOWsrc/ha_mcp/tools/tools_integrations.py1746 # Step 1: resolve target → entry_id (typed reason on failure)COMMENT
LOWsrc/ha_mcp/tools/tools_integrations.py1912 # Step 4: wait for all sub-entities to be removed in parallelCOMMENT
AI Slop Vocabulary27 hits · 66 pts
SeverityFileLineSnippetContext
MEDIUMpyproject.toml139 "ASYNC", # async best practicesCODE
MEDIUMpyproject.toml141 "LOG", # logging best practicesCODE
MEDIUMtests/haos_image_build/build_image.py186# The secret_path option must be set deterministically so the test harnessCOMMENT
MEDIUMtests/src/unit/_js_harness.py27# Path to the harness — repo-relative, resolved once at import time.COMMENT
MEDIUMtests/src/unit/_js_harness.py168 # degrade to U+FFFD and surface in the harness's own error reporting.COMMENT
MEDIUMtests/src/unit/test_server_prefs_seed.py71 # the harness result, but we can infer correctness by re-running theSTRING
MEDIUMtests/src/unit/test_triage_prompt_budget.py141 # min() rather than the first match so a future reorder of the harnessCOMMENT
MEDIUMtests/src/unit/test_tools_utility_supervisor_logs.py248 # module attribute) is robust to either `import httpx` or a futureCOMMENT
MEDIUMtests/src/unit/test_build_skill_content.py115 assert result == {"SKILL.md": "# best practices\n"}CODE
MEDIUMtests/src/unit/test_build_skill_content.py49 (skill / "SKILL.md").write_text("# best practices\n")CODE
MEDIUMtests/src/unit/test_settings_ui_js_behavior.py454 // assertion below — querying via JS is more robust thanCOMMENT
MEDIUMtests/src/unit/test_settings_ui_js_behavior.py485 # flipped one. The harness's `responses: [...]` shape advancesSTRING
MEDIUMtests/src/unit/test_settings_ui_js_behavior.py2340 # The harness serialises window globals into result.dom — pickSTRING
MEDIUMtests/src/unit/test_helper_schema_inline.py511 """The high-leverage simple-helper validation gates insideSTRING
MEDIUMtests/src/e2e/tools/test_radio_management.py68 # robust to exactly where they land.COMMENT
MEDIUMtests/src/e2e/tools/test_search_entities.py1709 # penalty → 80. Asserting ``< 100`` keeps the test robust to smallCOMMENT
MEDIUMtests/src/e2e/tools/test_deep_search_bulk_fetch.py120 # failing setup — keeps the fixture robust if the WS path dropsCOMMENT
MEDIUM…/e2e/workflows/auto_backup/test_capture_and_restore.py515 # ``replace`` ops on a path ending in ``/alias`` to stay robustCOMMENT
MEDIUMtests/src/e2e/workflows/filesystem/test_yaml_config.py1437 # robust whether the read fails because the file is missing orCOMMENT
MEDIUMtests/src/e2e/workflows/system/test_system_tools.py783 # Log comprehensive overviewCOMMENT
MEDIUMtests/src/e2e/workflows/automation/test_lifecycle.py131 # Extract automation entity ID with robust error handlingCOMMENT
MEDIUMcustom_components/ha_mcp_tools/ui_panel.py471# harness for every surface); coverage = the node --check syntax test plus theCOMMENT
MEDIUMscripts/bake_pagination_seed.py38HOST_PORT = 32788 # off the dev-harness 32769 to avoid clashesCODE
MEDIUM.github/workflows/pr.yml285 # (harness in tests/js/) — they spawn `node tests/js/harness.mjs`COMMENT
MEDIUMsrc/ha_mcp/settings_ui/__init__.py99# esbuild/jsdom JS harness (tests/js/harness.mjs) -- `const DEFAULT_PINNED =COMMENT
MEDIUMsrc/ha_mcp/tools/tools_bug_report.py527 # Broad by design — the bug-report path must stay robust whatever theCOMMENT
MEDIUMsrc/ha_mcp/utils/fuzzy_search.py465 """Calculate a comprehensive fuzzy score for an entity name/domain.STRING
Modern AI Meta-Vocabulary17 hits · 46 pts
SeverityFileLineSnippetContext
MEDIUMtests/src/unit/test_settings_ui_js_behavior.py122 # Full modal scaffold (mirrors settings.html) so the focus-trapCOMMENT
MEDIUMtests/src/unit/test_e2e_wait_helpers.py3The test-side migration in #1382 added a WS-event-driven path to threeSTRING
MEDIUMtests/src/unit/test_tools_bug_report.py1688 # what biases agents and invites hallucinations).COMMENT
MEDIUMtests/src/unit/test_tools_bug_report.py1696 # hallucination bait we removed.COMMENT
MEDIUMtests/src/unit/test_tools_bug_report.py1518 # hallucination-bait we removed.COMMENT
MEDIUMtests/src/e2e/haos_only/test_integration_setup.py59# substantial new test scaffolding; for now the integration-setupCOMMENT
MEDIUMtests/src/e2e/workflows/config/test_ws_event_waiter.py2E2E regression coverage for #1152 — WS-event-driven entity-registration wait.STRING
MEDIUMtests/src/e2e/workflows/config/test_ws_event_waiter.py46 """Regression coverage for the #1152 WS-event-driven waiter."""STRING
MEDIUMtests/src/e2e/utilities/wait_helpers.py255 # event-driven re-samples against the right baseline.COMMENT
MEDIUMtests/src/e2e/utilities/wait_helpers.py426 PR #1382 for the broader event-driven-wait migration.STRING
MEDIUMtests/src/e2e/utilities/wait_helpers.py941 # the sample-after-subscribe pattern the other event-driven waitersCOMMENT
MEDIUMsrc/ha_mcp/config.py905# Bounds added purely as UI/POST guardrails (no Field constraint):COMMENT
MEDIUMsrc/ha_mcp/tools/util_helpers.py731# --- WS-event-driven wait helpers (#1152) -----------------------------------COMMENT
MEDIUMsrc/ha_mcp/tools/util_helpers.py742# The new pattern is WS-event-driven with a REST sample after subscribe and aCOMMENT
MEDIUMsrc/ha_mcp/tools/tools_hacs.py729# dominant cost in the HAOS E2E suite per #1515); 10 s still leaves event-drivenCOMMENT
MEDIUMsrc/ha_mcp/tools/tools_hacs.py819 # we subscribed successfully but the event-driven pathCOMMENT
MEDIUMsrc/ha_mcp/tools/tools_utility.py444 # the LLM context window during debugging workflows.COMMENT
AI Structural Patterns34 hits · 28 pts
SeverityFileLineSnippetContext
LOWtests/uat/stories/run_story.py350CODE
LOWtests/src/unit/test_config_get_component_routing.py88CODE
LOWtests/src/unit/_js_harness.py114CODE
LOWtests/src/unit/test_component_ws_search.py129CODE
LOWtests/src/unit/test_component_ws_search.py315CODE
LOWsrc/ha_mcp/tools/tools_config_helpers.py4033CODE
LOWsrc/ha_mcp/tools/tools_energy.py379CODE
LOWsrc/ha_mcp/tools/tools_history.py136CODE
LOWsrc/ha_mcp/tools/backup.py1060CODE
LOWsrc/ha_mcp/tools/tools_search.py1379CODE
LOWsrc/ha_mcp/tools/tools_search.py1854CODE
LOWsrc/ha_mcp/tools/tools_search.py2613CODE
LOWsrc/ha_mcp/tools/tools_search.py3143CODE
LOWsrc/ha_mcp/tools/tools_traces.py48CODE
LOWsrc/ha_mcp/tools/tools_registry.py625CODE
LOWsrc/ha_mcp/tools/tools_config_automations.py459CODE
LOWsrc/ha_mcp/tools/tools_system.py513CODE
LOWsrc/ha_mcp/tools/tools_dashboard_screenshot.py108CODE
LOWsrc/ha_mcp/tools/tools_config_dashboards.py1268CODE
LOWsrc/ha_mcp/tools/tools_config_dashboards.py1822CODE
LOWsrc/ha_mcp/tools/tools_voice_assistant.py378CODE
LOWsrc/ha_mcp/tools/tools_utility.py407CODE
LOWsrc/ha_mcp/tools/tools_utility.py1175CODE
LOWsrc/ha_mcp/tools/tools_integrations.py301CODE
LOWsrc/ha_mcp/tools/tools_addons.py909CODE
LOWsrc/ha_mcp/tools/tools_addons.py1491CODE
LOWsrc/ha_mcp/tools/tools_addons.py2670CODE
LOWsrc/ha_mcp/tools/tools_entities.py1409CODE
LOWsrc/ha_mcp/tools/smart_search/_deep.py33CODE
LOWsrc/ha_mcp/tools/smart_search/_deep.py953CODE
LOWsrc/ha_mcp/tools/smart_search/_deep.py1039CODE
LOWsrc/ha_mcp/tools/smart_search/_overview.py19CODE
LOWsrc/ha_mcp/dashboard_screenshot/capture.py776CODE
LOWsrc/ha_mcp/transforms/categorized_search.py203CODE
Example Usage Blocks2 hits · 3 pts
SeverityFileLineSnippetContext
LOWdocker-compose.screenshot.yml52# Usage:COMMENT
LOWdocker-compose.yml31# Usage:COMMENT
Fake / Example Data3 hits · 2 pts
SeverityFileLineSnippetContext
LOWtests/src/unit/test_config.py389 monkeypatch.setenv("SUPERVISOR_TOKEN", "fake-token-for-test")CODE
LOWtests/src/unit/test_config.py426 monkeypatch.setenv("SUPERVISOR_TOKEN", "fake-token-for-test")CODE
LOWsrc/ha_mcp/tools/tools_bug_report.py1444- Email addresses -> Replace with "user@example.com"CODE
Overly Generic Function Names1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/src/unit/test_python_sandbox.py330 expr = "def helper():\n return 1"CODE