Convert Claude Code or Codex into the most intelligent Deep Research Agent. Collect, search, and synthesize web research into a persistent, searchable wiki that builds on itself. Hosted API + MCP: hyperresearch.ai
This report summarizes scanner evidence for jordan-gibbs/hyperresearch, a Python project with 3,831 GitHub stars. SynthScan examined 55,912 lines of code across 244 source files, recording 1667 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 45.5 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1159 finding(s).
Are imports declared and package/API names verified? 205 finding(s).
Are wrappers, guards, and repeated structures necessary? 1340 finding(s).
Which changes need focused human review? 1667 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1667 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_web/test_crawl4ai_stealth.py | 23 | def test_make_crawler_uses_undetected_adapter() -> None: | CODE |
| LOW | tests/test_web/test_crawl4ai_stealth.py | 32 | def test_browser_manager_marked_undetected() -> None: | CODE |
| LOW | tests/test_web/test_crawl4ai_stealth.py | 43 | def test_undetected_wiring_survives_profile_path() -> None: | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 52 | def test_pre_becomes_fenced_block(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 57 | def test_inline_code_becomes_backtick_span(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 61 | def test_no_wiki_links_survive_the_note_strip(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 67 | def test_code_indentation_survives(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 72 | def test_fence_outgrows_backticks_inside_code(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 78 | def test_odd_backtick_fence_inside_pre_does_not_leak(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 87 | def test_inline_code_holding_double_backticks_does_not_leak(self): | CODE |
| LOW⚡ | tests/test_web/test_builtin_fences.py | 93 | def test_title_and_noise_removal_unchanged(self): | CODE |
| LOW | tests/test_web/test_builtin_fences.py | 143 | def test_fetch_html_lane_preserves_code(served): | CODE |
| LOW | tests/test_web/test_builtin_fences.py | 154 | def test_fetch_after_pdf_lane_decline_preserves_code_and_reason(served): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 73 | def test_check_url_allows_public_ip_literals(url): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 77 | def test_check_url_dns_resolved_private_rejected(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 86 | def test_check_url_dns_resolved_mixed_any_private_rejected(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 97 | def test_check_url_dns_failure_raises(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 151 | def test_check_url_uppercase_http_scheme_is_normalized_then_ip_gated(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 159 | def test_check_url_uppercase_disallowed_scheme_still_rejected(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 171 | def test_safe_get_refuses_private_ip_without_network(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 178 | def test_safe_get_refuses_file_scheme(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 183 | def test_safe_get_requires_positive_max_bytes(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 277 | def test_check_url_rejects_cgnat_range(url): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 285 | def test_check_url_allows_cgnat_neighbors(url): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 350 | def test_allowlist_cidr_admits_private_address(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 356 | def test_allowlist_cidr_is_not_a_blanket_waiver(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 364 | def test_allowlist_bare_ip_entry_admits_exactly_one_host(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 370 | def test_allowlist_hostname_admits_by_name_case_insensitively(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 376 | def test_allowlist_hostname_is_exact_not_a_suffix_match(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 387 | def test_allowlist_does_not_bypass_the_scheme_gate(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 392 | def test_allowlist_malformed_cidr_is_a_loud_error(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 400 | def test_safe_get_redirect_to_allowlisted_private_host_is_followed(): | CODE |
| LOW⚡ | tests/test_web/test_safe_http.py | 420 | def test_allowlist_entry_with_port_is_a_loud_error(entry): | CODE |
| LOW | tests/test_web/test_safe_http.py | 33 | def test_check_url_rejects_non_http_schemes(url): | CODE |
| LOW | tests/test_web/test_safe_http.py | 38 | def test_check_url_rejects_no_hostname(): | CODE |
| LOW | tests/test_web/test_safe_http.py | 60 | def test_check_url_rejects_private_and_loopback_ips(url): | CODE |
| LOW | tests/test_web/test_safe_http.py | 119 | def test_check_url_rejects_parse_only_loopback_bypasses(url): | CODE |
| LOW | tests/test_web/test_safe_http.py | 138 | def test_check_url_rejects_resolver_dependent_loopback_bypasses(url): | CODE |
| LOW | tests/test_web/test_safe_http.py | 204 | def test_redirect_to_private_address_is_refused(): | CODE |
| LOW | tests/test_web/test_safe_http.py | 214 | def test_relative_redirect_is_resolved_and_followed(): | CODE |
| LOW | tests/test_web/test_safe_http.py | 225 | def test_too_many_redirects_refused(): | CODE |
| LOW | tests/test_web/test_safe_http.py | 233 | def test_declared_content_length_over_cap_refused(): | CODE |
| LOW | tests/test_web/test_safe_http.py | 244 | def test_streamed_body_over_cap_refused(): | CODE |
| LOW | tests/test_web/test_exa_provider.py | 52 | def test_provider_registered_via_factory(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 64 | def test_missing_api_key_raises(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 71 | def test_integration_header_set(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 83 | def test_search_returns_web_results(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 105 | def test_search_passes_num_results_and_contents(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 124 | def test_content_falls_back_to_highlights(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 141 | def test_content_falls_back_to_summary(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 157 | def test_content_handles_all_fields_missing(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 173 | def test_fetch_uses_get_contents(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 192 | def test_fetch_raises_when_no_results(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 205 | def test_unknown_provider_lists_exa_in_error(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_exa_provider.py | 211 | def test_provider_disabled_when_module_missing(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_web/test_tavily_provider.py | 39 | def test_provider_registered_via_factory(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_web/test_tavily_provider.py | 49 | def test_missing_api_key_raises(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/test_web/test_tavily_provider.py | 59 | def test_search_maps_results_to_webresult(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_tavily_provider.py | 76 | def test_search_passes_configured_options(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_web/test_tavily_provider.py | 98 | def test_fetch_uses_extract_and_raw_content(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| 967 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | codex_bench/harness.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | codex_bench/harness.py | 58 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | codex_bench/harness.py | 784 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | codex_bench/harness.py | 786 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 240 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 242 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 318 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 320 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 388 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 390 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 510 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 512 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 634 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 636 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 872 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 874 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | codex_bench/harness.py | 117 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | codex_bench/harness.py | 119 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 108 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 166 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 168 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 188 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 192 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 270 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 273 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 290 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 293 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 345 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 347 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 414 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_safe_http.py | 416 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_web/test_safe_http.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_web/test_safe_http.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_web/test_safe_http.py | 318 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_web/test_safe_http.py | 323 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_final_url_recheck.py | 103 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_final_url_recheck.py | 105 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_final_url_recheck.py | 138 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_final_url_recheck.py | 140 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_final_url_recheck.py | 165 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_final_url_recheck.py | 167 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_crawl4ai_tls.py | 56 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_crawl4ai_tls.py | 58 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_crawl4ai_tls.py | 78 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_crawl4ai_tls.py | 80 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_crawl4ai_tls.py | 148 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_web/test_crawl4ai_tls.py | 150 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_web/test_builtin_cert_refusal.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_web/test_builtin_cert_refusal.py | 73 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli/test_install_codex.py | 153 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli/test_install_codex.py | 155 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_cli/test_note_ops.py | 100 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_cli/test_note_ops.py | 105 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli/test_lint.py | 893 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli/test_lint.py | 895 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli/test_lint.py | 953 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli/test_lint.py | 955 | # --------------------------------------------------------------------------- | COMMENT |
| 149 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_scholar/test_core_provider.py | 161 | # journals[0].title is null, so the publisher is the venue. | COMMENT |
| HIGH⚡ | tests/test_scholar/test_core_provider.py | 252 | '{"results": null}', | CODE |
| HIGH⚡ | tests/test_scholar/test_core_provider.py | 254 | '{"results": [null, 3, "x", []]}', | CODE |
| HIGH | tests/test_scholar/test_core_provider.py | 5 | entry whose title is null, a null `documentType` with the real classification | STRING |
| HIGH⚡ | tests/test_scholar/test_clinicaltrials.py | 206 | pytest.param('{"studies": null}', id="null-studies"), | CODE |
| HIGH⚡ | tests/test_scholar/test_fred.py | 247 | pytest.param('{"seriess": null}', id="null-seriess"), | CODE |
| HIGH⚡ | tests/test_scholar/test_doab.py | 285 | # The un-expanded shape: name null, metadata absent. Unusable but must | COMMENT |
| HIGH⚡ | tests/test_scholar/test_edgar.py | 265 | pytest.param('{"hits": null}', id="null-hits"), | CODE |
| HIGH⚡ | tests/test_scholar/test_edgar.py | 266 | pytest.param('{"hits": {"hits": null}}', id="null-inner-hits"), | CODE |
| HIGH⚡ | tests/test_scholar/test_edgar.py | 267 | pytest.param('{"hits": {"hits": [1, "two", null]}}', id="junk-rows"), | CODE |
| HIGH | src/hyperresearch/core/hooks.py | 3570 | let dir = process.env.CLAUDE_PROJECT_DIR || process.cwd(); | CODE |
| HIGH | src/hyperresearch/core/hooks.py | 3574 | if (parent === dir) return null; | CODE |
| HIGH | src/hyperresearch/serve/server.py | 175 | var hoverNode = null, searchTerm = ''; | CODE |
| HIGH | src/hyperresearch/serve/server.py | 221 | if (si === undefined || ti === undefined) return; | CODE |
| HIGH | src/hyperresearch/serve/server.py | 221 | if (si === undefined || ti === undefined) return; | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 256 | if (si === undefined || ti === undefined) return; | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 256 | if (si === undefined || ti === undefined) return; | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 258 | var highlight = hoverNode && (s.id === hoverNode.id || t.id === hoverNode.id); | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 268 | var isHover = hoverNode && n.id === hoverNode.id; | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 269 | var isConnected = hoverNode && n.connected && n.connected.has(hoverNode.id); | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 270 | var isSearch = sl && n.title.toLowerCase().includes(sl); | CODE |
| HIGH⚡ | src/hyperresearch/serve/server.py | 278 | if ((isHover || isSearch) && scale > 0.1) { | CODE |
| HIGH | src/hyperresearch/serve/server.py | 296 | if (si !== undefined && ti !== undefined) { | CODE |
| HIGH | src/hyperresearch/serve/server.py | 296 | if (si !== undefined && ti !== undefined) { | CODE |
| HIGH | src/hyperresearch/serve/server.py | 323 | hoverNode = null; | CODE |
| HIGH | src/hyperresearch/scholar/providers/core_oa.py | 245 | `journals` is often `[{"title": null, "identifiers": []}]` — present but | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | codex_bench/harness.py | 27 | CODE | |
| LOW | tests/conftest.py | 3 | CODE | |
| LOW | tests/test_web/test_crawl4ai_stealth.py | 9 | CODE | |
| LOW | tests/test_web/test_safe_http.py | 3 | CODE | |
| LOW | tests/test_web/test_exa_provider.py | 3 | CODE | |
| LOW | tests/test_web/test_tavily_provider.py | 8 | CODE | |
| LOW | tests/test_web/test_fetch_many_gate.py | 11 | CODE | |
| LOW | tests/test_web/test_fetch_settings.py | 3 | CODE | |
| LOW | tests/test_web/test_crawl4ai_running_loop.py | 11 | CODE | |
| LOW | tests/test_web/test_final_url_recheck.py | 10 | CODE | |
| LOW | tests/test_web/test_pdf_diagnostics.py | 14 | CODE | |
| LOW | tests/test_web/test_fetch_many_fallback.py | 4 | CODE | |
| LOW | tests/test_web/test_builtin_pdf_lane.py | 14 | CODE | |
| LOW | tests/test_web/test_crawl4ai_tls.py | 11 | CODE | |
| LOW | tests/test_web/test_builtin_cert_refusal.py | 17 | CODE | |
| LOW | tests/test_web/test_junk_detection.py | 14 | CODE | |
| LOW | tests/test_web/test_serply_provider.py | 3 | CODE | |
| LOW | tests/test_web/test_parallel_provider.py | 8 | CODE | |
| LOW | tests/test_cli/test_install_profile.py | 3 | CODE | |
| LOW | tests/test_cli/test_orphan_dedup_call_sites.py | 15 | CODE | |
| LOW | tests/test_cli/test_install_codex.py | 3 | CODE | |
| LOW | tests/test_cli/test_vault_tag.py | 3 | CODE | |
| LOW | tests/test_cli/test_note_ops.py | 3 | CODE | |
| LOW | tests/test_cli/test_oa_fetch.py | 9 | CODE | |
| LOW | tests/test_cli/test_archive.py | 3 | CODE | |
| LOW | tests/test_cli/test_commands.py | 3 | CODE | |
| LOW | tests/test_cli/test_fetch_batch.py | 4 | CODE | |
| LOW | tests/test_cli/test_lint.py | 3 | CODE | |
| LOW | tests/test_cli/test_install_browser.py | 10 | CODE | |
| LOW | tests/test_mcp/test_update_note.py | 3 | CODE | |
| LOW | tests/test_core/test_oa_core_resolver.py | 8 | CODE | |
| LOW | tests/test_core/test_prompt_golden.py | 115 | CODE | |
| LOW | tests/test_core/test_claims_and_embed.py | 3 | CODE | |
| LOW | tests/test_core/test_packaging.py | 3 | CODE | |
| LOW | tests/test_core/test_scholar_enrichment.py | 3 | CODE | |
| LOW | tests/test_core/test_codex_install.py | 3 | CODE | |
| LOW | tests/test_core/test_fetcher_orphan_dedup.py | 5 | CODE | |
| LOW | tests/test_core/test_source_ranking.py | 3 | CODE | |
| LOW | tests/test_core/test_oa_recovery.py | 3 | CODE | |
| LOW | tests/test_core/test_run_tag_validation.py | 11 | CODE | |
| LOW | tests/test_core/test_levers.py | 8 | CODE | |
| LOW | tests/test_core/test_hooks.py | 3 | CODE | |
| LOW | tests/test_core/test_codex_skill_templates.py | 9 | CODE | |
| LOW | tests/test_core/test_profiles.py | 3 | CODE | |
| LOW | tests/test_core/test_escalation.py | 3 | CODE | |
| LOW | tests/test_core/test_render.py | 3 | CODE | |
| LOW | tests/test_core/test_config_sections.py | 3 | CODE | |
| LOW | tests/test_core/test_dissertation_profile.py | 3 | CODE | |
| LOW | tests/test_core/test_runs.py | 3 | CODE | |
| LOW | tests/test_core/test_untrusted.py | 3 | CODE | |
| LOW | tests/test_core/test_verification.py | 3 | CODE | |
| LOW | tests/test_scholar/test_dedup.py | 7 | CODE | |
| LOW | tests/test_scholar/test_repec.py | 10 | CODE | |
| LOW | tests/test_scholar/test_core_provider.py | 10 | CODE | |
| LOW | tests/test_scholar/test_clinicaltrials.py | 9 | CODE | |
| LOW | tests/test_scholar/test_fred.py | 10 | CODE | |
| LOW | tests/test_scholar/test_crossref.py | 9 | CODE | |
| LOW | tests/test_scholar/test_cli.py | 9 | CODE | |
| LOW | tests/test_scholar/test_doab.py | 13 | CODE | |
| LOW | tests/test_scholar/test_edgar.py | 10 | CODE | |
| 108 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/hyperresearch/core/sync.py | 109 | except sqlite3.OperationalError: | CODE |
| HIGH | src/hyperresearch/core/sync.py | 282 | except Exception: | CODE |
| HIGH | src/hyperresearch/core/hooks.py | 3803 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | src/hyperresearch/core/scholar.py | 258 | except json.JSONDecodeError: | CODE |
| HIGH | src/hyperresearch/core/claims.py | 382 | except json.JSONDecodeError: | CODE |
| HIGH | src/hyperresearch/core/migrations.py | 50 | except sqlite3.OperationalError: | CODE |
| HIGH | src/hyperresearch/core/migrations.py | 119 | except sqlite3.OperationalError: | CODE |
| HIGH | src/hyperresearch/web/safe_http.py | 124 | except ValueError: | CODE |
| HIGH | src/hyperresearch/web/crawl4ai_provider.py | 43 | except Exception: | CODE |
| HIGH | src/hyperresearch/web/crawl4ai_provider.py | 443 | except Exception: | CODE |
| HIGH | src/hyperresearch/web/crawl4ai_provider.py | 572 | except Exception: | CODE |
| HIGH | src/hyperresearch/web/builtin.py | 267 | except ImportError: | CODE |
| HIGH | src/hyperresearch/cli/fetch.py | 571 | except OSError: | CODE |
| HIGH | src/hyperresearch/cli/fetch.py | 582 | except OSError: | CODE |
| HIGH | src/hyperresearch/cli/repair.py | 140 | except Exception: | CODE |
| HIGH | src/hyperresearch/cli/repair.py | 178 | except Exception: | CODE |
| HIGH | src/hyperresearch/cli/repair.py | 197 | except Exception: | CODE |
| HIGH | src/hyperresearch/cli/__init__.py | 30 | except Exception: | CODE |
| HIGH | src/hyperresearch/cli/install.py | 355 | except Exception: | CODE |
| HIGH | src/hyperresearch/cli/note.py | 690 | except Exception: | CODE |
| HIGH | src/hyperresearch/cli/lint.py | 1267 | except (json.JSONDecodeError, OSError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | codex_bench/harness.py | 796 | except Exception: | CODE |
| LOW | codex_bench/harness.py | 139 | except Exception as e: | CODE |
| LOW | codex_bench/harness.py | 200 | except Exception: | CODE |
| LOW | codex_bench/harness.py | 656 | except Exception as e: | CODE |
| LOW | tests/test_web/test_fetch_many_gate.py | 38 | except Exception as exc: | CODE |
| MEDIUM | tests/test_web/test_fetch_many_gate.py | 35 | def target() -> None: | CODE |
| LOW | tests/test_web/test_final_url_recheck.py | 36 | except Exception as exc: | CODE |
| MEDIUM | tests/test_web/test_final_url_recheck.py | 33 | def target() -> None: | CODE |
| LOW | tests/test_web/test_fetch_many_fallback.py | 34 | except Exception as exc: | CODE |
| MEDIUM | tests/test_web/test_fetch_many_fallback.py | 31 | def target() -> None: | CODE |
| LOW | tests/test_web/test_crawl4ai_tls.py | 45 | except Exception as exc: | CODE |
| MEDIUM | tests/test_web/test_crawl4ai_tls.py | 42 | def target() -> None: | CODE |
| LOW⚡ | src/hyperresearch/core/sync.py | 184 | except Exception as e: | CODE |
| LOW⚡ | src/hyperresearch/core/sync.py | 192 | except Exception as e: | CODE |
| LOW⚡ | src/hyperresearch/core/sync.py | 200 | except Exception as e: | CODE |
| LOW | src/hyperresearch/core/sync.py | 212 | except Exception: | CODE |
| LOW | src/hyperresearch/core/sync.py | 282 | except Exception: | CODE |
| LOW | src/hyperresearch/core/hooks.py | 4301 | except Exception: | CODE |
| LOW | src/hyperresearch/core/oa.py | 435 | except Exception: | CODE |
| LOW | src/hyperresearch/core/oa.py | 542 | except Exception: | CODE |
| LOW | src/hyperresearch/core/oa.py | 775 | except Exception: | CODE |
| LOW | src/hyperresearch/core/oa.py | 805 | except Exception: | CODE |
| LOW | src/hyperresearch/core/embed.py | 92 | except Exception as e: | CODE |
| LOW | src/hyperresearch/core/scholar.py | 218 | except Exception: | CODE |
| LOW | src/hyperresearch/core/scholar.py | 237 | except Exception: | CODE |
| LOW | src/hyperresearch/core/runs.py | 638 | except Exception as exc: | CODE |
| LOW | src/hyperresearch/core/profiles.py | 496 | except Exception as exc: | CODE |
| LOW | src/hyperresearch/web/pdf.py | 118 | except Exception as exc: | CODE |
| LOW | src/hyperresearch/web/pdf.py | 176 | except Exception as e: | CODE |
| LOW | src/hyperresearch/web/pdf.py | 191 | except Exception as e: | CODE |
| LOW | src/hyperresearch/web/pdf.py | 269 | except Exception as e: | CODE |
| LOW | src/hyperresearch/web/crawl4ai_provider.py | 43 | except Exception: | CODE |
| LOW | src/hyperresearch/web/crawl4ai_provider.py | 443 | except Exception: | CODE |
| LOW | src/hyperresearch/web/crawl4ai_provider.py | 572 | except Exception: | CODE |
| LOW | src/hyperresearch/web/builtin.py | 217 | except Exception as exc: | CODE |
| LOW | src/hyperresearch/mcp/server.py | 321 | except Exception as e: | CODE |
| LOW | src/hyperresearch/cli/fetch.py | 349 | except Exception as e: | CODE |
| LOW | src/hyperresearch/cli/fetch.py | 673 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/fetch.py | 796 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/repair.py | 72 | except Exception as exc: | CODE |
| LOW | src/hyperresearch/cli/repair.py | 140 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/repair.py | 178 | except Exception: | STRING |
| LOW | src/hyperresearch/cli/repair.py | 197 | except Exception: | STRING |
| LOW | src/hyperresearch/cli/scholar_cmd.py | 99 | except Exception as exc: | CODE |
| LOW⚡ | src/hyperresearch/cli/research.py | 129 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/batch.py | 66 | except Exception as e: | CODE |
| LOW | src/hyperresearch/cli/__init__.py | 30 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/setup.py | 272 | except Exception as e: | STRING |
| LOW | src/hyperresearch/cli/setup.py | 305 | except Exception: | STRING |
| MEDIUM | src/hyperresearch/cli/setup.py | 278 | def _check_crawl4ai() -> bool: | CODE |
| LOW | src/hyperresearch/cli/run_cmd.py | 102 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/run_cmd.py | 258 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/install.py | 355 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/watch.py | 78 | except Exception as e: | CODE |
| LOW | src/hyperresearch/cli/note.py | 690 | except Exception: | CODE |
| LOW | src/hyperresearch/cli/fetch_batch.py | 111 | except Exception as exc: | CODE |
| LOW | src/hyperresearch/cli/fetch_batch.py | 121 | except Exception as e: | CODE |
| LOW | src/hyperresearch/cli/lint.py | 132 | except Exception: | CODE |
| LOW | src/hyperresearch/scholar/registry.py | 48 | except Exception: | CODE |
| LOW | src/hyperresearch/scholar/base.py | 203 | except Exception: | CODE |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 16 | - **A run tag is a slug (#116).** `Vault.run_dir()` joined the tag onto `research/runs/` unchecked, and pathlib replaces | CODE |
| MEDIUM | tests/test_cli/test_lint.py | 54 | # Output should contain no scaffold-prompt issues | COMMENT |
| MEDIUM | tests/test_cli/test_lint.py | 126 | # A vault with no scaffold-tagged notes should produce no issues for this rule. | COMMENT |
| MEDIUM | tests/test_cli/test_lint.py | 971 | # Scaffold artifact so the scaffold check passes | COMMENT |
| MEDIUM⚡ | tests/test_core/test_hooks.py | 311 | # Opus: semantic rewrites of scaffold vocabulary + hedge-language | COMMENT |
| MEDIUM⚡ | tests/test_core/test_hooks.py | 316 | # scaffold-only section list must be injected | COMMENT |
| MEDIUM | example-reports/rl-exploration-trajectory-planning.md | 222 | ### 5.6. What transfers, and what is RL-specific scaffolding | COMMENT |
| MEDIUM | src/hyperresearch/core/sync.py | 77 | # Files at the research/ root (e.g. research/scaffold.md, | COMMENT |
| MEDIUM | src/hyperresearch/core/hooks.py | 101 | # NOTE: `## Core tension` is intentionally omitted. The scaffold uses it as a | COMMENT |
| MEDIUM | src/hyperresearch/core/hooks.py | 1644 | ### 1b. Inline scaffold vocabulary strip (reader-facing prose) | COMMENT |
| MEDIUM | src/hyperresearch/cli/lint.py | 445 | # scaffold-prompt (verbatim prompt gospel rule) | COMMENT |
| MEDIUM | src/hyperresearch/cli/lint.py | 508 | # workflow (scaffold + comparisons + extract artifacts exist) | COMMENT |
| MEDIUM | src/hyperresearch/cli/lint.py | 577 | # Enforce the gospel rule: every scaffold-tagged note must open with | COMMENT |
| MEDIUM | src/hyperresearch/cli/lint.py | 583 | # scaffold (audit, draft, comparisons) loses its anchor. | COMMENT |
| MEDIUM⚡ | src/hyperresearch/cli/lint.py | 719 | # but still enforce scaffold-leak hygiene (always wrong regardless | STRING |
| MEDIUM⚡ | src/hyperresearch/cli/lint.py | 1542 | # - research/scaffold.md (Layer 0 planning document) | STRING |
| MEDIUM⚡ | src/hyperresearch/cli/lint.py | 1548 | # The single-pass /research protocol also produces a scaffold note but | STRING |
| MEDIUM⚡ | src/hyperresearch/cli/lint.py | 1549 | # has no loci/interim/comparisons artifacts. This rule checks scaffold | STRING |
| MEDIUM | src/hyperresearch/cli/lint.py | 675 | # (modulo line-ending normalization only). This turns the scaffold | STRING |
| MEDIUM | src/hyperresearch/cli/lint.py | 1574 | # A scaffold note or scaffold.md file satisfies the scaffold | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_graph/test_links.py | 0 | select n.id, n.path from notes n where n.type not in ('index', 'raw') and n.id not in (select distinct target_id from li | STRING |
| HIGH | src/hyperresearch/cli/repair.py | 0 | select n.id, n.path from notes n where n.type not in ('index', 'raw') and n.id not in (select distinct target_id from li | STRING |
| HIGH | src/hyperresearch/cli/watch.py | 0 | select n.id, n.path from notes n where n.type not in ('index', 'raw') and n.id not in (select distinct target_id from li | STRING |
| HIGH | src/hyperresearch/cli/main.py | 0 | select n.id, n.path from notes n where n.type not in ('index', 'raw') and n.id not in (select distinct target_id from li | STRING |
| HIGH | src/hyperresearch/cli/lint.py | 0 | select n.id, n.path from notes n where n.type not in ('index', 'raw') and n.id not in (select distinct target_id from li | STRING |
| HIGH | src/hyperresearch/cli/fetch.py | 0 | insert or ignore into sources (url, note_id, domain, fetched_at, provider, content_hash) values (?, ?, ?, ?, ?, ?) | STRING |
| HIGH | src/hyperresearch/cli/research.py | 0 | insert or ignore into sources (url, note_id, domain, fetched_at, provider, content_hash) values (?, ?, ?, ?, ?, ?) | STRING |
| HIGH | src/hyperresearch/cli/escalation_cmd.py | 0 | insert or ignore into sources (url, note_id, domain, fetched_at, provider, content_hash) values (?, ?, ?, ?, ?, ?) | STRING |
| HIGH | src/hyperresearch/cli/fetch_batch.py | 0 | insert or ignore into sources (url, note_id, domain, fetched_at, provider, content_hash) values (?, ?, ?, ?, ?, ?) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | codex_bench/harness.py | 650 | CODE | |
| LOW | codex_bench/harness.py | 441 | CODE | |
| LOW | codex_bench/harness.py | 466 | CODE | |
| LOW | src/hyperresearch/core/sync.py | 70 | CODE | |
| LOW | src/hyperresearch/core/sync.py | 134 | CODE | |
| LOW | src/hyperresearch/core/hooks.py | 3791 | CODE | |
| LOW | src/hyperresearch/core/hooks.py | 4234 | CODE | |
| LOW | src/hyperresearch/core/oa.py | 570 | CODE | |
| LOW | src/hyperresearch/core/oa.py | 753 | CODE | |
| LOW | src/hyperresearch/core/oa.py | 605 | CODE | |
| LOW | src/hyperresearch/core/similarity.py | 49 | CODE | |
| LOW | src/hyperresearch/core/scholar.py | 241 | CODE | |
| LOW | src/hyperresearch/core/claims.py | 342 | CODE | |
| LOW | src/hyperresearch/core/citecheck.py | 43 | CODE | |
| LOW | src/hyperresearch/core/citecheck.py | 78 | CODE | |
| LOW | src/hyperresearch/core/citecheck.py | 114 | CODE | |
| LOW | src/hyperresearch/core/runs.py | 482 | CODE | |
| LOW | src/hyperresearch/web/safe_http.py | 212 | CODE | |
| LOW | src/hyperresearch/web/crawl4ai_provider.py | 462 | CODE | |
| LOW | src/hyperresearch/cli/fetch.py | 203 | CODE | |
| LOW | src/hyperresearch/cli/repair.py | 13 | CODE | |
| LOW | src/hyperresearch/cli/research.py | 17 | CODE | |
| LOW | src/hyperresearch/cli/batch.py | 76 | CODE | |
| LOW | src/hyperresearch/cli/search.py | 11 | CODE | |
| LOW | src/hyperresearch/cli/install.py | 18 | CODE | |
| LOW | src/hyperresearch/cli/watch.py | 12 | CODE | |
| LOW | src/hyperresearch/cli/watch.py | 45 | CODE | |
| LOW | src/hyperresearch/cli/note.py | 160 | CODE | |
| LOW | src/hyperresearch/cli/note.py | 632 | CODE | |
| LOW | src/hyperresearch/cli/fetch_batch.py | 16 | CODE | |
| LOW | src/hyperresearch/cli/lint.py | 236 | CODE | |
| LOW | src/hyperresearch/search/fts.py | 31 | CODE | |
| LOW | src/hyperresearch/search/fts.py | 66 | CODE | |
| LOW | src/hyperresearch/serve/server.py | 365 | CODE | |
| LOW | src/hyperresearch/scholar/dedup.py | 143 | CODE | |
| LOW | src/hyperresearch/scholar/providers/crossref.py | 145 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/hyperresearch/cli/repair.py | 35 | # Step 1: Force sync — rebuild DB from all files | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 51 | # Step 2: Stub broken links | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 87 | # Step 3: Enrich — auto-tag and auto-summarize | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 153 | # Step 4: Promote notes | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 210 | # Step 4: Rebuild indexes | STRING |
| LOW | src/hyperresearch/cli/repair.py | 239 | # Step 5: Update agent docs | STRING |
| LOW | src/hyperresearch/cli/research.py | 51 | # Step 1: Search | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 85 | # Step 2: Fetch and save each result | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 101 | # Step 3: Follow links (depth > 0) | COMMENT |
| LOW⚡ | src/hyperresearch/cli/research.py | 133 | # Step 4: Sync to index everything | COMMENT |
| LOW⚡ | src/hyperresearch/cli/research.py | 138 | # Step 5: Generate synthesis note (map-of-content) | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 180 | # Step 6: Holistic auto-linking across all new notes | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 194 | # Step 7: Surface hub notes | COMMENT |
| LOW | src/hyperresearch/cli/install.py | 216 | # Step 1: Init vault (skip if already exists) | COMMENT |
| LOW | src/hyperresearch/cli/install.py | 231 | # Step 2: Resolve the hyperresearch executable path | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 245 | # Step 3: Always re-inject the platform's docs file (CLAUDE.md / | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 249 | # Step 4: Install the platform's hook + skills + subagents (rendered | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 255 | # Step 3: Auto-configure crawl4ai if installed | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 258 | # Step 5: Report | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/hyperresearch/cli/repair.py | 35 | # Step 1: Force sync — rebuild DB from all files | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 51 | # Step 2: Stub broken links | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 87 | # Step 3: Enrich — auto-tag and auto-summarize | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 153 | # Step 4: Promote notes | COMMENT |
| LOW | src/hyperresearch/cli/repair.py | 210 | # Step 4: Rebuild indexes | STRING |
| LOW | src/hyperresearch/cli/repair.py | 239 | # Step 5: Update agent docs | STRING |
| LOW | src/hyperresearch/cli/research.py | 51 | # Step 1: Search | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 85 | # Step 2: Fetch and save each result | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 101 | # Step 3: Follow links (depth > 0) | COMMENT |
| LOW⚡ | src/hyperresearch/cli/research.py | 133 | # Step 4: Sync to index everything | COMMENT |
| LOW⚡ | src/hyperresearch/cli/research.py | 138 | # Step 5: Generate synthesis note (map-of-content) | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 180 | # Step 6: Holistic auto-linking across all new notes | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 194 | # Step 7: Surface hub notes | COMMENT |
| LOW | src/hyperresearch/cli/install.py | 216 | # Step 1: Init vault (skip if already exists) | COMMENT |
| LOW | src/hyperresearch/cli/install.py | 231 | # Step 2: Resolve the hyperresearch executable path | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 245 | # Step 3: Always re-inject the platform's docs file (CLAUDE.md / | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 249 | # Step 4: Install the platform's hook + skills + subagents (rendered | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 255 | # Step 3: Auto-configure crawl4ai if installed | COMMENT |
| LOW⚡ | src/hyperresearch/cli/install.py | 258 | # Step 5: Report | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | codex_bench/harness.py | 52 | # Prompt. Mirrors bench/harness.py's PIPELINE_RESEARCH_PROMPT (the Claude | COMMENT |
| MEDIUM | codex_bench/harness.py | 294 | # into the run vault, as bench/harness.py does. The install above was | COMMENT |
| MEDIUM | codex_bench/harness.py | 856 | # Records without an adherence block predate this harness (April 2026). | COMMENT |
| MEDIUM | codex_bench/harness.py | 94 | # Same packaging contract bench/harness.py writes. Step 1 reads it and lets | STRING |
| MEDIUM⚡ | tests/test_core/test_hooks.py | 319 | # paragraph already supports with evidence. Highest-leverage polish cut. | COMMENT |
| MEDIUM | tests/test_core/test_hooks.py | 266 | # required_section_headings. This is the highest-leverage InstF lever. | COMMENT |
| MEDIUM⚡ | src/hyperresearch/cli/lint.py | 711 | # The rule activates when either signals a wrapped harness context: | STRING |
| MEDIUM⚡ | src/hyperresearch/cli/lint.py | 713 | # - research/wrapper_contract.json exists (harness declared packaging) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_web/test_exa_provider.py | 14 | CODE | |
| LOW | src/hyperresearch/core/templates.py | 209 | CODE | |
| LOW | src/hyperresearch/core/note.py | 85 | CODE | |
| LOW | src/hyperresearch/mcp/server.py | 33 | CODE | |
| LOW | src/hyperresearch/cli/fetch.py | 203 | CODE | |
| LOW | src/hyperresearch/cli/research.py | 17 | CODE | |
| LOW | src/hyperresearch/cli/search.py | 11 | CODE | |
| LOW | src/hyperresearch/cli/note.py | 16 | CODE | |
| LOW | src/hyperresearch/cli/note.py | 292 | CODE | |
| LOW | src/hyperresearch/cli/note.py | 425 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/hyperresearch/core/config.py | 21 | # on; set false only for cert-broken sites you explicitly trust. The | COMMENT |
| LOW | src/hyperresearch/core/patterns.py | 1 | """Shared regex patterns for wiki-link parsing.""" | COMMENT |
| LOW | src/hyperresearch/core/patterns.py | 21 | # candidate fail at its first extra bracket, so scanning is linear. A target | COMMENT |
| LOW | src/hyperresearch/core/patterns.py | 41 | # would run it to the end, but a prose line that happens to start with ``` | COMMENT |
| LOW | src/hyperresearch/core/patterns.py | 181 | # [[table1]], [[figure-4b]], [[eq:7]], [[scheme-3]]. These are cross- | COMMENT |
| LOW | src/hyperresearch/core/profiles.py | 181 | # word (the built-ins keep the two in lockstep — a gear that raises its | COMMENT |
| LOW | src/hyperresearch/cli/lint.py | 301 | issues.append({ | COMMENT |
| LOW | src/hyperresearch/cli/lint.py | 821 | "Final report is leaking scaffold-only sections into " | COMMENT |
| LOW | src/hyperresearch/cli/lint.py | 941 | # Under that pattern, 30-50% of sources should carry breadcrumbs. | COMMENT |
| LOW | src/hyperresearch/cli/lint.py | 1241 | ), | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_cli/test_commands.py | 217 | # Create a note with a broken link | COMMENT |
| MEDIUM | tests/test_cli/test_lint.py | 454 | # Create a raw file whose stem doesn't match any note. | COMMENT |
| MEDIUM | src/hyperresearch/core/vault.py | 163 | # Create the one visible directory | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/hyperresearch/core/enrich.py | 30 | # Check if tag (or hyphenated parts) appear in body | COMMENT |
| LOW | src/hyperresearch/core/linker.py | 110 | # Check if there's already a ## Related section | COMMENT |
| LOW | src/hyperresearch/core/fetcher.py | 76 | # Check if URL already fetched (an orphaned row — note deleted — is not a duplicate) | COMMENT |
| LOW | src/hyperresearch/cli/fetch.py | 247 | # Check if URL already fetched (an orphaned row — note deleted — is not a duplicate, | COMMENT |
| LOW | src/hyperresearch/cli/research.py | 113 | # Check if already in DB (an orphaned row — note deleted — is not a duplicate) | COMMENT |
| LOW | src/hyperresearch/cli/install.py | 340 | # Check if the browser is already installed -- against the stack the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/hyperresearch/web/serply_provider.py | 9 | export SERPLY_API_KEY="your-api-key" # https://serply.io | STRING |
| HIGH | src/hyperresearch/web/tavily_provider.py | 7 | export TAVILY_API_KEY="tvly-your-api-key" # https://app.tavily.com | STRING |
| HIGH | src/hyperresearch/web/exa_provider.py | 8 | export EXA_API_KEY="your-api-key" # https://dashboard.exa.ai/api-keys | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/hyperresearch/web/pdf.py | 274 | # Why the PDF lane last declined each URL, keyed by the URL as requested. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_web/test_exa_provider.py | 22 | author: str | None = "Jane Doe", | CODE |
| LOW | tests/test_web/test_exa_provider.py | 101 | assert results[0].metadata["author"] == "Jane Doe" | CODE |
| LOW | tests/test_cli/test_oa_fetch.py | 84 | 'contact_email = ""', 'contact_email = "tester@example.org"' | CODE |
| LOW⚡ | tests/test_core/test_oa_recovery.py | 684 | '[scholar]\ncontact_email = "me@example.org"\noa_min_full_text_chars = 2000\n', | CODE |
| LOW⚡ | tests/test_core/test_oa_recovery.py | 688 | assert cfg.scholar.contact_email == "me@example.org" | CODE |
| LOW⚡ | tests/test_scholar/test_crossref.py | 334 | monkeypatch.setenv("HYPERRESEARCH_CONTACT_EMAIL", "someone@example.org") | CODE |
| LOW | tests/test_scholar/test_edgar.py | 20 | CONTACT = "research@example.org" | CODE |
| LOW⚡ | tests/test_scholar/test_openalex.py | 318 | monkeypatch.setenv("HYPERRESEARCH_CONTACT_EMAIL", "someone@example.org") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/hyperresearch/cli/batch.py | 76 | def _update_file_frontmatter(vault_root: Path, rel_path: str, updates: dict) -> None: | CODE |
| LOW | src/hyperresearch/scholar/__init__.py | 11 | __all__ = ["Paper", "ProviderError", "SearchProvider", "normalize_doi", "title_key"] | CODE |
| LOW | src/hyperresearch/scholar/dedup.py | 23 | __all__ = ["merge_papers"] | CODE |