Hermes WebUI: The best way to use Hermes Agent from the web or from your phone!
This report presents the forensic synthetic code analysis of nesquena/hermes-webui, a Python project with 17,844 GitHub stars. SynthScan v2.0 examined 541,955 lines of code across 1562 source files, recording 22771 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 76.4 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).
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.
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.
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.
The scanner identified 22771 distinct pattern matches across 17 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_real_steer.py | 567 | appendChild(child){{this.children.push(child);}}, | CODE |
| HIGH⚡ | tests/test_real_steer.py | 570 | querySelector(sel){{return null;}}, | CODE |
| HIGH⚡ | tests/test_real_steer.py | 575 | getElementById(id){{return id==='msgInner'?inner:null;}}, | CODE |
| HIGH⚡ | tests/test_real_steer.py | 582 | function showToast(key){{if(globalThis.__toasts)globalThis.__toasts.push(key);}} | CODE |
| HIGH⚡ | tests/test_real_steer.py | 586 | function _clearComposerDraft(sid,text,files){{if(globalThis.__draftClears)globalThis.__draftClears.push({{si | CODE |
| HIGH⚡ | tests/test_real_steer.py | 595 | let sendInput = null; | CODE |
| HIGH⚡ | tests/test_real_steer.py | 596 | let sendOptions = null; | CODE |
| HIGH⚡ | tests/test_real_steer.py | 597 | let apiPayload = null; | CODE |
| HIGH⚡ | tests/test_real_steer.py | 607 | globalThis.clearInflightState = sid => clearInflightCalls.push(sid); | CODE |
| HIGH⚡ | tests/test_real_steer.py | 706 | globalThis.clearInflightState = sid => clearInflightCalls.push(sid); | CODE |
| HIGH⚡ | tests/test_real_steer.py | 708 | globalThis.queueSessionMessage = (sid, payload) => queued.push({{sid, payload}}); | CODE |
| HIGH⚡ | tests/test_real_steer.py | 709 | globalThis.updateQueueBadge = sid => queueBadges.push(sid); | CODE |
| HIGH⚡ | tests/test_real_steer.py | 942 | _uploadPendingFilesUpdateProgress('A', null); | CODE |
| HIGH⚡ | tests/test_real_steer.py | 945 | assert.strictEqual(barWrap.dataset.uploadSessionId, undefined); | CODE |
| HIGH | tests/test_real_steer.py | 337 | assert "const ownerSid=(typeof S!=='undefined'&&S.session&&S.session.session_id)||null;" in body | CODE |
| HIGH | tests/test_real_steer.py | 398 | let apiPayload = null; | CODE |
| HIGH | tests/test_real_steer.py | 399 | let indicatorText = null; | CODE |
| HIGH | tests/test_real_steer.py | 447 | let apiPayload = null; | CODE |
| HIGH | tests/test_real_steer.py | 448 | let indicatorText = null; | CODE |
| HIGH | tests/test_real_steer.py | 495 | let uploadOptions = null; | CODE |
| HIGH | tests/test_real_steer.py | 496 | let apiPayload = null; | CODE |
| HIGH | tests/test_real_steer.py | 507 | function _clearComposerDraft(sid,text,files){{draftClears.push({{sid,text,files}});}} | CODE |
| HIGH | tests/test_real_steer.py | 620 | assert.strictEqual(S.activeStreamId, null); | CODE |
| HIGH | tests/test_real_steer.py | 621 | assert.strictEqual(S.session.active_stream_id, null); | CODE |
| HIGH | tests/test_real_steer.py | 643 | let apiPayload = null; | CODE |
| HIGH | tests/test_real_steer.py | 653 | globalThis.clearInflightState = sid => clearInflightCalls.push(sid); | CODE |
| HIGH | tests/test_real_steer.py | 695 | let apiPayload = null; | CODE |
| HIGH | tests/test_real_steer.py | 774 | globalThis.clearInflightState = sid => clearInflightCalls.push(sid); | CODE |
| HIGH | tests/test_real_steer.py | 808 | globalThis.clearInflightState = sid => clearInflightCalls.push(sid); | CODE |
| HIGH | tests/test_real_steer.py | 918 | return null; | CODE |
| HIGH | tests/test_real_steer.py | 930 | assert.strictEqual(barWrap.dataset.uploadSessionId, undefined); | CODE |
| HIGH | tests/test_real_steer.py | 881 | assert "_uploadPendingFilesUpdateProgress(sessionId,null)" in upload_body | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 104 | : null; | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 110 | this.children.push(child); | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 113 | querySelector: () => null, | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 147 | _store: Object.create(null), | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 149 | return Object.prototype.hasOwnProperty.call(this._store, k) ? this._store[k] : null; | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 157 | querySelector: () => null, | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 161 | global.$ = (id) => registry[id] || null; | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 171 | apiCalls.push({ url: String(url), method: (opts.method || 'GET').toUpperCase(), body: opts.body || '' }); | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 214 | if (forceNoRestore) global._dashboardLastNonNeverMode = null; | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 223 | chipText: chip && chip.textContent, | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 224 | chipAriaChecked: chip && chip.getAttribute('aria-checked'), | STRING |
| HIGH⚡ | tests/test_sidebar_tab_visibility.py | 225 | chipIsOff: chip && chip.classList.contains('chip-off'), | STRING |
| HIGH | tests/test_sidebar_tab_visibility.py | 43 | let inString = null; | STRING |
| HIGH | tests/test_sidebar_tab_visibility.py | 64 | inString = null; | STRING |
| HIGH | tests/test_sidebar_tab_visibility.py | 134 | const registry = Object.create(null); | STRING |
| HIGH | tests/test_sidebar_tab_visibility.py | 183 | const normalized = _normalizeDashboardEnabledMode(saved && saved.enabled); | STRING |
| HIGH⚡ | tests/test_6728_cron_running_sidebar.py | 60 | let str = null; | CODE |
| HIGH⚡ | tests/test_6728_cron_running_sidebar.py | 65 | while (depth > 0 && i < src.length) { | CODE |
| HIGH⚡ | tests/test_6728_cron_running_sidebar.py | 72 | if (c === str) str = null; | CODE |
| HIGH | tests/test_6728_cron_running_sidebar.py | 118 | function _markSessionCompletionUnread(sid, messageCount, meta) { markCount += 1; markedSids.push(sid); } | CODE |
| HIGH | tests/test_6728_cron_running_sidebar.py | 123 | let S = { session: null, busy: false }; | CODE |
| HIGH | tests/test_issue3635_profile_chip_active.py | 75 | assert "(S.session && S.session.profile) || S.activeProfile" not in body, ( | CODE |
| HIGH | tests/test_issue4749_steer_reason_and_recovery.py | 82 | return (typeof LOCALES !== 'undefined' && LOCALES.en && LOCALES.en[key]) | CODE |
| HIGH | tests/test_issue4749_steer_reason_and_recovery.py | 106 | const n = _steerFailureMessageKey(null); | CODE |
| HIGH | tests/test_issue4749_steer_reason_and_recovery.py | 111 | const u = _steerFailureMessageKey(undefined); | CODE |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 175 | appendChild(c) { this.children.push(c); }, | CODE |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 180 | return null; | CODE |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 187 | inner.querySelector = (sel) => null; // no existing recovery bar | CODE |
| 3307 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bootstrap.py | 99 | def ensure_supported_platform() -> None: | CODE |
| LOW | bootstrap.py | 115 | def _agent_dir_from_hermes_cli() -> Path | None: | CODE |
| LOW | bootstrap.py | 252 | def _python_can_run_webui_and_agent(python_exe: str, agent_dir: Path | None = None) -> bool: | CODE |
| LOW | bootstrap.py | 275 | def ensure_python_has_webui_deps(python_exe: str, agent_dir: Path | None = None) -> str: | CODE |
| LOW | bootstrap.py | 524 | def _is_real_supervisor_value(name: str, value: str) -> bool: | CODE |
| LOW⚡ | server.py | 194 | def _drain_request_input_nonblocking(self, request) -> None: | CODE |
| LOW⚡ | server.py | 247 | def _reject_overflow_request_worker(self, request) -> None: | CODE |
| LOW | server.py | 68 | def _blocked_create_connection(address, *a, **kw): | CODE |
| LOW | server.py | 528 | def _abort_if_already_serving(host: str, port: int) -> None: | CODE |
| LOW | tests/test_session_events_http_integration.py | 61 | def test_session_events_bus_subscribe_unsubscribe_balance(): | CODE |
| LOW | tests/test_session_events_http_integration.py | 82 | def test_session_events_sse_endpoint_handshake_succeeds(cleanup_test_sessions): | CODE |
| LOW | tests/test_session_events_http_integration.py | 149 | def test_session_events_sse_endpoint_survives_rapid_disconnect(): | CODE |
| LOW | tests/test_session_events_http_integration.py | 182 | def test_session_events_handler_uses_disconnect_safe_errors_tuple(): | CODE |
| LOW⚡ | tests/test_issues_907_908_909_model_dropdown.py | 97 | def test_get_label_for_model_helper_exists(self): | CODE |
| LOW⚡ | tests/test_issues_907_908_909_model_dropdown.py | 103 | def test_label_helper_capitalizes_bare_id(self): | CODE |
| LOW⚡ | tests/test_issues_907_908_909_model_dropdown.py | 112 | def test_label_helper_uses_catalog_when_available(self): | CODE |
| LOW | tests/test_issues_907_908_909_model_dropdown.py | 124 | def test_label_helper_strips_at_prefix_for_lookup(self): | CODE |
| LOW | tests/test_issues_907_908_909_model_dropdown.py | 137 | def test_config_uses_label_helper_not_raw_split(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 295 | def test_cmd_steer_calls_endpoint(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 302 | def test_try_steer_calls_endpoint(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 309 | def test_try_steer_handles_fallback_without_cancelling(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 319 | def test_send_busy_steer_uses_try_steer(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 326 | def test_try_steer_uploads_pending_files_without_clearing_until_accepted(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 969 | def test_cmd_steer_delivered_in_all_locales(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 975 | def test_steer_leftover_queued_in_all_locales(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 988 | def test_leftover_drain_call_in_streaming(self): | CODE |
| LOW⚡ | tests/test_real_steer.py | 998 | def test_leftover_drain_runs_before_done_event(self): | CODE |
| LOW | tests/test_real_steer.py | 104 | def test_accepts_when_agent_cached_and_running(self, _clear_caches): | CODE |
| LOW | tests/test_real_steer.py | 138 | def test_gateway_owned_stream_without_cached_agent_queues_fallback(self, _clear_caches): | CODE |
| LOW | tests/test_real_steer.py | 162 | def test_agent_lacks_steer_method(self, _clear_caches): | CODE |
| LOW | tests/test_real_steer.py | 266 | def test_empty_text_after_strip(self, _clear_caches): | CODE |
| LOW | tests/test_real_steer.py | 347 | def test_file_steer_does_not_read_live_session_after_upload_await(self): | CODE |
| LOW | tests/test_real_steer.py | 362 | def test_file_steer_upload_status_and_indicator_are_owner_scoped(self): | CODE |
| LOW | tests/test_real_steer.py | 378 | def test_file_steer_indicator_omits_attachment_tool_note(self): | CODE |
| LOW | tests/test_real_steer.py | 761 | async function runLateDeadFallbackDoesNotClearNewStream(){{ | CODE |
| LOW⚡ | tests/test_real_steer.py | 843 | def test_send_busy_steer_accepts_file_only_input(self): | STRING |
| LOW⚡ | tests/test_real_steer.py | 852 | def test_upload_pending_files_can_preserve_staged_files_for_steer(self): | STRING |
| LOW⚡ | tests/test_real_steer.py | 862 | def test_upload_pending_files_progress_bar_is_session_scoped(self): | STRING |
| LOW⚡ | tests/test_real_steer.py | 950 | def test_pending_steer_leftover_listener(self): | STRING |
| LOW | tests/test_real_steer.py | 427 | def test_attachment_only_steer_indicator_uses_file_label(self): | STRING |
| LOW | tests/test_real_steer.py | 475 | def test_file_steer_targets_captured_session_when_user_switches_mid_upload(self): | STRING |
| LOW | tests/test_real_steer.py | 540 | def test_dead_steer_fallback_clears_busy_state_and_recovery_sends_normally(self): | STRING |
| LOW | tests/test_real_steer.py | 885 | def test_upload_progress_bar_hides_on_switch_and_reappears_on_owner_return(self): | STRING |
| LOW⚡ | tests/test_issue4842_cli_sessions_streaming_freeze.py | 30 | def test_freeze_marker_none_when_idle(monkeypatch): | CODE |
| LOW⚡ | tests/test_issue4842_cli_sessions_streaming_freeze.py | 35 | def test_freeze_marker_stable_for_same_streams(monkeypatch): | CODE |
| LOW⚡ | tests/test_issue4842_cli_sessions_streaming_freeze.py | 45 | def test_freeze_marker_changes_when_stream_set_changes(monkeypatch): | CODE |
| LOW⚡ | tests/test_issue4842_cli_sessions_streaming_freeze.py | 55 | def test_cache_key_stable_across_message_writes_while_streaming(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_issue4842_cli_sessions_streaming_freeze.py | 91 | def test_streaming_ttl_wider_than_idle(monkeypatch): | CODE |
| LOW | tests/test_issue4842_cli_sessions_streaming_freeze.py | 102 | def test_structural_change_listener_clears_cli_cache(monkeypatch): | CODE |
| LOW | tests/test_issue697_mcp_tool_inventory.py | 34 | def test_endpoint_returns_sanitized_registered_mcp_tools(self, mock_home, mock_cfg, mock_runtime): | CODE |
| LOW | tests/test_issue697_mcp_tool_inventory.py | 83 | def test_schema_summary_uses_parameter_names_types_required_and_descriptions_only(self): | CODE |
| LOW | tests/test_issue697_mcp_tool_inventory.py | 97 | def test_tool_summary_rejects_non_dict_schema_and_redacts_description(self): | CODE |
| LOW | tests/test_issue697_mcp_tool_inventory.py | 109 | def test_system_settings_contains_searchable_global_mcp_tool_section(self): | CODE |
| LOW | tests/test_issue697_mcp_tool_inventory.py | 116 | def test_panels_js_loads_tools_and_filters_name_server_description(self): | CODE |
| LOW | tests/test_turn_journal_callsite.py | 4 | def test_chat_start_appends_submitted_turn_journal_before_worker_thread_start(): | CODE |
| LOW | tests/test_turn_journal_callsite.py | 15 | def test_chat_start_writes_turn_journal_after_session_lock_and_handles_failure(): | CODE |
| LOW | tests/test_subagent_parent_in_import_window.py | 49 | def test_evicted_subagent_parent_is_kept_in_window(tmp_path): | CODE |
| LOW | tests/test_subagent_parent_in_import_window.py | 64 | def test_unrelated_older_subagent_row_stays_excluded(tmp_path): | CODE |
| LOW | tests/test_subagent_parent_in_import_window.py | 74 | def test_webui_parent_is_not_force_imported(tmp_path): | CODE |
| LOW | tests/test_subagent_parent_in_import_window.py | 85 | def test_recovered_parent_is_returned_beyond_limit(tmp_path): | CODE |
| 14584 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | mcp_server.py | 41 | # ── Ensure the repo root is on sys.path so api.* imports work ───────────── | COMMENT |
| MEDIUM⚡ | mcp_server.py | 46 | # ── CLI: optional --profile override ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | mcp_server.py | 53 | # ── Import webui canonical modules (after path setup) ───────────────────── | COMMENT |
| MEDIUM⚡ | mcp_server.py | 195 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | mcp_server.py | 197 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | mcp_server.py | 388 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | mcp_server.py | 390 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 66 | # ── API auth state ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | mcp_server.py | 79 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 81 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 120 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 122 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 248 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 250 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 450 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 452 | # ═════════════════════════════════════════════════════════════════════════== | COMMENT |
| MEDIUM | mcp_server.py | 467 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | mcp_server.py | 469 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_issues_907_908_909_model_dropdown.py | 10 | # ── #907: Normalized dedup in _addLiveModelsToSelect ───────────────────────── | COMMENT |
| MEDIUM | tests/test_issues_907_908_909_model_dropdown.py | 66 | # ── #908: window._defaultModel updated on settings save ───────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_issues_907_908_909_model_dropdown.py | 92 | # ── #909: Injected default model label quality ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_real_steer.py | 960 | # ── i18n keys ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_real_steer.py | 982 | # ── Leftover SSE delivery: streaming.py emits pending_steer_leftover ───── | COMMENT |
| MEDIUM | tests/test_real_steer.py | 99 | # ── Backend: the /api/chat/steer endpoint ───────────────────────────────── | COMMENT |
| MEDIUM | tests/test_real_steer.py | 273 | # ── Routing ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_real_steer.py | 284 | # ── Frontend: cmdSteer + busy-mode steer use the new endpoint ──────────── | COMMENT |
| MEDIUM⚡ | tests/test_workspace_blocked_roots_macos.py | 36 | # ── Blocked-roots set includes both literal and resolved forms ────────────── | COMMENT |
| MEDIUM⚡ | tests/test_workspace_blocked_roots_macos.py | 55 | # ── /etc is rejected on both Linux and macOS ──────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_workspace_blocked_roots_macos.py | 76 | # ── /var is selectively blocked (system parts) but tmp carve-outs work ────── | COMMENT |
| MEDIUM⚡ | tests/test_workspace_blocked_roots_macos.py | 111 | # ── Carve-out invariants ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_workspace_blocked_roots_macos.py | 130 | # ── Other roots: literal == resolved on both platforms ───────────────────── | COMMENT |
| MEDIUM | tests/test_workspace_blocked_roots_macos.py | 155 | # ── New macOS-specific blocked roots: /System and /Library ────────────────── | COMMENT |
| MEDIUM | tests/test_v050255_opus_followups.py | 37 | # ── 1: rollback checkpoint id validation ───────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_v050255_opus_followups.py | 94 | # ── 2: redact_session_data settings.json read-once optimization ────────────── | COMMENT |
| MEDIUM | tests/test_v050255_opus_followups.py | 164 | # ── 3: voice mode session-id capture ───────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_v050255_opus_followups.py | 205 | # ── 4: rollback _inspect_checkpoint except tuple ───────────────────────────── | COMMENT |
| MEDIUM | tests/test_extension_sidecar_proxy.py | 1016 | # ── token-v1 proxy auth (§9.1/§9.2) ───────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_issue2565_reasoning_accumulation.py | 27 | # ── Issue 1: live reasoning segment reset at turn boundaries ───────────────── | COMMENT |
| MEDIUM⚡ | tests/test_issue2565_reasoning_accumulation.py | 90 | # ── Issue 2: reasoning metadata renders as Worklog Thinking Card ───────────── | COMMENT |
| MEDIUM⚡ | tests/test_issue2565_reasoning_accumulation.py | 130 | # ── Cross-cutting: done event still has the persist-on-done guard ──────────── | COMMENT |
| MEDIUM | tests/test_resolve_model_provider_free_suffix.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_resolve_model_provider_free_suffix.py | 25 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_resolve_model_provider_free_suffix.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_resolve_model_provider_free_suffix.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_resolve_model_provider_free_suffix.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_resolve_model_provider_free_suffix.py | 133 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 132 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 134 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 486 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 488 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 536 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 538 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_issue569_579.py | 18 | # ── #569: docker UID/GID auto-detect ───────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_issue569_579.py | 120 | # ── #579: topbar message count already filters tool messages ────────────────── | COMMENT |
| MEDIUM | tests/test_issue4765_sessions_lru_eviction.py | 112 | # ─────────────────────────── config knob ──────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_issue4765_sessions_lru_eviction.py | 153 | # ─────────────────────────── invariant 1: eviction ────────────────────────── | COMMENT |
| MEDIUM | tests/test_issue4765_sessions_lru_eviction.py | 180 | # ────────────────────── invariant 2: never evict active ────────────────────── | COMMENT |
| MEDIUM | tests/test_issue4765_sessions_lru_eviction.py | 259 | # ───────────────── invariant 3: lazy reload + invariant 4: no data loss ────── | COMMENT |
| MEDIUM⚡ | tests/test_media_message_snapshots.py | 198 | # ── resolve_media_ref / media_capture_allowed ────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_media_message_snapshots.py | 603 | # ── display-metadata persistence (state.db ↔ sidecar merge) ──────────────── | COMMENT |
| 1598 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bootstrap.py | 66 | except Exception as exc: | CODE |
| LOW | bootstrap.py | 396 | except Exception: | CODE |
| LOW | bootstrap.py | 463 | except Exception as exc: | CODE |
| LOW | bootstrap.py | 705 | except Exception as exc: | CODE |
| MEDIUM | server.py | 68 | def _blocked_create_connection(address, *a, **kw): | CODE |
| MEDIUM | server.py | 188 | def _close_request_quietly(self, request) -> None: | CODE |
| MEDIUM | server.py | 247 | def _reject_overflow_request_worker(self, request) -> None: | CODE |
| MEDIUM | server.py | 273 | def process_request_thread(self, request, client_address): | CODE |
| MEDIUM | server.py | 637 | def _start_watcher_safe(): | CODE |
| LOW⚡ | server.py | 191 | except Exception: | CODE |
| LOW⚡ | server.py | 203 | except Exception: | CODE |
| LOW⚡ | server.py | 243 | except Exception: | CODE |
| LOW⚡ | server.py | 254 | except Exception: | CODE |
| LOW⚡ | server.py | 256 | except Exception: | CODE |
| LOW⚡ | server.py | 640 | except Exception as e: | CODE |
| LOW⚡ | server.py | 648 | except Exception as e: | CODE |
| LOW⚡ | server.py | 655 | except Exception as e: | CODE |
| LOW⚡ | server.py | 662 | except Exception as e: | CODE |
| LOW⚡ | server.py | 668 | except Exception as e: | CODE |
| LOW⚡ | server.py | 731 | except Exception: | CODE |
| LOW⚡ | server.py | 736 | except Exception: | CODE |
| LOW⚡ | server.py | 741 | except Exception: | CODE |
| LOW⚡ | server.py | 746 | except Exception: | CODE |
| LOW | server.py | 177 | except Exception: | CODE |
| LOW | server.py | 227 | except Exception: | CODE |
| LOW | server.py | 268 | except Exception: | CODE |
| LOW | server.py | 343 | except Exception: | CODE |
| LOW | server.py | 354 | except Exception: | CODE |
| LOW | server.py | 359 | except Exception: | CODE |
| LOW | server.py | 388 | except Exception: | CODE |
| LOW | server.py | 394 | except Exception: | CODE |
| LOW | server.py | 416 | except Exception: | CODE |
| LOW | server.py | 422 | except Exception: | CODE |
| LOW | server.py | 456 | except Exception as exc: | CODE |
| LOW | server.py | 466 | except Exception as exc: | CODE |
| LOW | server.py | 481 | except Exception: | CODE |
| LOW | server.py | 514 | except Exception: | CODE |
| LOW | server.py | 582 | except Exception as exc: | CODE |
| LOW | server.py | 684 | except Exception as e: | CODE |
| LOW | ctl.sh | 757 | except Exception: | CODE |
| LOW⚡ | mcp_server.py | 191 | except Exception as e: | CODE |
| LOW⚡ | mcp_server.py | 378 | except Exception: | CODE |
| LOW | mcp_server.py | 101 | except Exception: | CODE |
| LOW | mcp_server.py | 164 | except Exception: | CODE |
| LOW | tests/test_session_events_http_integration.py | 121 | except Exception: | CODE |
| LOW | tests/test_issue4749_steer_reason_and_recovery.py | 280 | except Exception: | CODE |
| LOW | tests/test_issue2931_edge_tts_endpoint.py | 41 | except Exception: | CODE |
| MEDIUM | tests/test_issue2931_edge_tts_endpoint.py | 38 | def payload(self): | CODE |
| MEDIUM | tests/test_issue765_streaming_persistence.py | 303 | def _save_worker(): | CODE |
| LOW | tests/test_issue765_streaming_persistence.py | 140 | except Exception: | CODE |
| LOW | tests/test_issue765_streaming_persistence.py | 306 | except Exception as e: | CODE |
| LOW | tests/test_issue765_streaming_persistence.py | 577 | except Exception: | CODE |
| LOW | tests/test_issue765_streaming_persistence.py | 580 | except Exception as e: | CODE |
| LOW | tests/test_issue765_streaming_persistence.py | 715 | except Exception: | CODE |
| LOW | tests/test_issue765_streaming_persistence.py | 718 | except Exception as e: | CODE |
| LOW⚡ | tests/test_terminal_fd_leak.py | 78 | except Exception: | CODE |
| LOW | tests/test_session_action_menu_focus.py | 129 | except Exception: # pragma: no cover - dependency missing path | CODE |
| LOW | tests/test_session_action_menu_focus.py | 161 | except Exception: # pragma: no cover - dependency missing path | CODE |
| MEDIUM | tests/test_session_action_menu_focus.py | 126 | def test_session_action_menu_focus_lifecycle_in_browser(): | CODE |
| MEDIUM | tests/test_session_action_menu_focus.py | 158 | def test_session_action_menu_returns_to_prior_focus_for_nonfocusable_opener_in_b | CODE |
| 1234 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bootstrap.py | 4 | CODE | |
| LOW | mcp_server.py | 54 | CODE | |
| LOW | mcp_server.py | 55 | CODE | |
| LOW | mcp_server.py | 55 | CODE | |
| LOW | mcp_server.py | 55 | CODE | |
| LOW | mcp_server.py | 59 | CODE | |
| LOW | tests/test_real_steer.py | 20 | CODE | |
| LOW | tests/test_v050255_opus_followups.py | 27 | CODE | |
| LOW | tests/test_v050255_opus_followups.py | 29 | CODE | |
| LOW | tests/test_issue5532_clear_truncation_watermark.py | 28 | CODE | |
| LOW | tests/test_issue4891_detail_header_visibility.py | 16 | CODE | |
| LOW | tests/test_issue1257_llm_wiki_status.py | 1 | CODE | |
| LOW | tests/test_issue569_579.py | 11 | CODE | |
| LOW | tests/test_visible_video_preload.py | 3 | CODE | |
| LOW | tests/test_run_journal_seq_cache.py | 11 | CODE | |
| LOW | tests/test_media_message_snapshots.py | 16 | CODE | |
| LOW | tests/test_issue3987_imported_session_titles.py | 3 | CODE | |
| LOW | tests/test_issue5270_cli_webui_continuity.py | 1 | CODE | |
| LOW | tests/test_sprint49.py | 13 | CODE | |
| LOW | tests/test_update_checker.py | 11 | CODE | |
| LOW | tests/test_update_checker.py | 12 | CODE | |
| LOW | tests/test_update_checker.py | 13 | CODE | |
| LOW | tests/test_update_checker.py | 15 | CODE | |
| LOW | tests/test_approval_sse.py | 14 | CODE | |
| LOW | tests/test_cli_session_tool_metadata.py | 3 | CODE | |
| LOW | tests/test_issue3260_self_hosted_providers_settings.py | 3 | CODE | |
| LOW | tests/test_wakeup_model_resolve_hang.py | 30 | CODE | |
| LOW | tests/test_agent_runtime_revision_guard.py | 3 | CODE | |
| LOW | tests/test_sprint40_ui_polish.py | 8 | CODE | |
| LOW | tests/test_sprint40_ui_polish.py | 10 | CODE | |
| LOW | tests/test_sprint40_ui_polish.py | 13 | CODE | |
| LOW | tests/test_metadata_save_wipe_1558.py | 21 | CODE | |
| LOW | tests/test_metadata_save_wipe_1558.py | 22 | CODE | |
| LOW | tests/test_empty_session_no_disk_write.py | 22 | CODE | |
| LOW | tests/test_empty_session_no_disk_write.py | 27 | CODE | |
| LOW | tests/test_bg_task_complete_focus_drop.py | 22 | CODE | |
| LOW | tests/test_issue1240_generic_cli_catalog_sync.py | 8 | CODE | |
| LOW | tests/test_issue1095_pasted_images.py | 8 | CODE | |
| LOW | tests/test_lineage_display_cache.py | 13 | CODE | |
| LOW | tests/test_anchor_fallback_ownership.py | 9 | CODE | |
| LOW | tests/test_cancelled_turn_status.py | 7 | CODE | |
| LOW | tests/test_session_channel_option_x.py | 12 | CODE | |
| LOW | tests/test_clarify_sse.py | 12 | CODE | |
| LOW | tests/test_partial_bloat_fix.py | 19 | CODE | |
| LOW | tests/test_issue3929_error_preserves_partial.py | 3 | CODE | |
| LOW | tests/test_claude_code_session_import.py | 1 | CODE | |
| LOW | tests/test_docker_docs_and_readonly.py | 20 | CODE | |
| LOW | tests/test_stable_assistant_turn_anchor_phase0.py | 6 | CODE | |
| LOW | tests/test_issue6209_data_image_renderer.py | 8 | CODE | |
| LOW | tests/test_transcript_scroll_invariant.py | 33 | CODE | |
| LOW | tests/test_gateway_status_agent_health.py | 14 | CODE | |
| LOW | tests/test_issue798.py | 20 | CODE | |
| LOW | tests/test_recovered_journal_context.py | 9 | CODE | |
| LOW | …sts/test_checkpoint_skips_redundant_sidecar_rewrite.py | 17 | CODE | |
| LOW | tests/test_issue4877_fresh_blank_boot_workspace_bind.py | 3 | CODE | |
| LOW | tests/test_sprint9.py | 5 | CODE | |
| LOW | tests/test_anchor_prose_incremental_finalize.py | 3 | CODE | |
| LOW | tests/test_native_image_attachments.py | 10 | CODE | |
| LOW | tests/test_native_image_attachments.py | 14 | CODE | |
| LOW | tests/test_bg_task_drain_loop_backoff.py | 16 | CODE | |
| 570 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bootstrap.py | 26 | CODE | |
| LOW | bootstrap.py | 275 | CODE | |
| LOW | bootstrap.py | 400 | CODE | |
| LOW | bootstrap.py | 560 | CODE | |
| LOW | server.py | 141 | CODE | |
| LOW | mcp_server.py | 321 | CODE | |
| LOW | tests/test_session_events_http_integration.py | 25 | CODE | |
| LOW | tests/test_session_events_http_integration.py | 82 | CODE | |
| LOW | tests/test_issue5637_mobile_scroll_clamp_jumpback.py | 35 | CODE | |
| LOW | tests/test_issue5637_mobile_scroll_clamp_jumpback.py | 52 | CODE | |
| LOW | tests/test_issue3635_profile_chip_active.py | 29 | CODE | |
| LOW | tests/test_issue3635_profile_chip_active.py | 98 | CODE | |
| LOW | tests/test_issue3599_inline_thinking_extraction.py | 15 | CODE | |
| LOW | tests/test_issue4891_detail_header_visibility.py | 24 | CODE | |
| LOW | tests/test_issue4749_steer_reason_and_recovery.py | 268 | CODE | |
| LOW | tests/test_issue1431_toolsets_chip_responsive.py | 141 | CODE | |
| LOW | tests/test_issue3250_upward_scroll_intent_window.py | 15 | CODE | |
| LOW | tests/test_issue1731_upward_scroll_unpins.py | 22 | CODE | |
| LOW | tests/test_issue765_streaming_persistence.py | 521 | CODE | |
| LOW | tests/test_issue765_streaming_persistence.py | 663 | CODE | |
| LOW | tests/test_issue765_streaming_persistence.py | 564 | CODE | |
| LOW | tests/test_issue765_streaming_persistence.py | 702 | CODE | |
| LOW | tests/test_korean_locale.py | 18 | CODE | |
| LOW | tests/test_issue3571_saved_prompts.py | 18 | CODE | |
| LOW | tests/test_large_text_paste_attachment.py | 22 | CODE | |
| LOW | tests/test_session_unread_dot_on_visit.py | 139 | CODE | |
| LOW | tests/test_bg_task_complete_focus_drop.py | 51 | CODE | |
| LOW | tests/test_issue6080_model_picker_reparent.py | 33 | CODE | |
| LOW | tests/test_anchor_fallback_ownership.py | 127 | CODE | |
| LOW | tests/test_anchor_fallback_ownership.py | 191 | CODE | |
| LOW | tests/test_session_channel_option_x.py | 23 | CODE | |
| LOW | tests/test_session_channel_option_x.py | 230 | CODE | |
| LOW | tests/test_session_channel_option_x.py | 259 | CODE | |
| LOW | tests/test_language_precedence.py | 42 | CODE | |
| LOW | tests/test_language_precedence.py | 109 | CODE | |
| LOW | tests/test_tars_scroll_reset_regressions.py | 8 | CODE | |
| LOW | tests/test_issue5514_composer_grow_scroll_pin.py | 44 | CODE | |
| LOW | tests/test_issue6067_artifact_paths.py | 35 | CODE | |
| LOW | tests/test_issue6067_artifact_paths.py | 116 | CODE | |
| LOW | tests/test_issue4598_composer_control_visibility.py | 69 | CODE | |
| LOW | tests/conftest.py | 353 | CODE | |
| LOW | tests/conftest.py | 704 | CODE | |
| LOW | tests/conftest.py | 787 | CODE | |
| LOW | tests/test_issue4877_fresh_blank_boot_workspace_bind.py | 20 | CODE | |
| LOW | tests/test_issue1690_scroll_completion.py | 9 | CODE | |
| LOW | tests/test_issue1690_scroll_completion.py | 23 | CODE | |
| LOW | tests/test_profile_switch_ux.py | 20 | CODE | |
| LOW | tests/test_profile_switch_ux.py | 85 | CODE | |
| LOW | tests/test_pr1355_sse_handler_no_deadlock.py | 28 | CODE | |
| LOW | tests/test_pr1355_sse_handler_no_deadlock.py | 40 | CODE | |
| LOW | tests/test_issue_edit_regenerate_absolute_keep_count.py | 10 | CODE | |
| LOW | tests/test_issue6419_pending_user_reconnect_order.py | 20 | CODE | |
| LOW | tests/test_issue1202_oauth_provider_status.py | 171 | CODE | |
| LOW | tests/test_4676_project_new_session_shortcuts.py | 21 | CODE | |
| LOW | tests/test_issue4985_orphaned_webui_zero_message.py | 81 | CODE | |
| LOW | tests/test_api_timeout.py | 23 | CODE | |
| LOW | tests/test_issue3820_chat_activity_display_mode.py | 1012 | CODE | |
| LOW | tests/test_issue3100_profile_toolsets_affordance.py | 11 | CODE | |
| LOW | tests/test_issue3762_importable_rows_schema_guard.py | 20 | CODE | |
| LOW | tests/test_session_sidebar_relative_time.py | 12 | CODE | |
| 473 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_6728_cron_running_sidebar.py | 0 | function extractfunc(name) { const re = new regexp('function\\s+' + name + '\\s*\\('); const start = src.search(re); if | STRING |
| HIGH | …s/test_issue5638_user_row_intrinsic_height_collapse.py | 0 | function extractfunc(name) { const re = new regexp('function\\s+' + name + '\\s*\\('); const start = src.search(re); if | STRING |
| HIGH | …test_issue5744_nonvirtual_userrow_collapse_jumpback.py | 0 | function extractfunc(name) { const re = new regexp('function\\s+' + name + '\\s*\\('); const start = src.search(re); if | STRING |
| HIGH | tests/test_issue5637_stale_anchor_guard.py | 0 | function extractfunc(name) { const re = new regexp('function\\s+' + name + '\\s*\\('); const start = src.search(re); if | STRING |
| HIGH | tests/test_issue1154_fenced_code_leak.py | 0 | const fs = require('fs'); const src = fs.readfilesync(process.argv[2], 'utf8'); global.window = {}; global.document = { | STRING |
| HIGH | tests/test_issue1618_yaml_json_diff_newline_preserve.py | 0 | const fs = require('fs'); const src = fs.readfilesync(process.argv[2], 'utf8'); global.window = {}; global.document = { | STRING |
| HIGH | tests/test_issue1446_glued_heading_lift.py | 0 | const fs = require('fs'); const src = fs.readfilesync(process.argv[2], 'utf8'); global.window = {}; global.document = { | STRING |
| HIGH | tests/test_issue2881_workspace_chat_links.py | 0 | const fs = require('fs'); const src = fs.readfilesync(process.argv[2], 'utf8'); global.window = {}; global.document = { | STRING |
| HIGH | tests/test_issue2428_table_pipe_protection.py | 0 | const fs = require('fs'); const src = fs.readfilesync(process.argv[2], 'utf8'); global.window = {}; global.document = { | STRING |
| HIGH | tests/test_issue5379_cron_project_optin.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_session_lineage_report.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue3930_source_filter_pushdown.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue3506_memory_and_watcher.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue3585_cron_session_overflow.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_acp_session_sidebar_visibility.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue4842_cron_projection_perf.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue3586_cli_session_source_label.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue2628_cli_sessions_perf.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue1013_handoff_dock.py | 0 | create table sessions ( id text primary key, source text, session_source text, title text, model text, started_at real n | STRING |
| HIGH | tests/test_issue5379_cron_project_optin.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_issue4385_cron_archive_reappears.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_issue3762_importable_rows_schema_guard.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_issue5455_listing_readonly_connection.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_issue3172_cron_session_limit.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_session_discoverability_repair.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_cron_session_title.py | 0 | create table sessions ( id text primary key, title text, model text, message_count integer, started_at real, source text | STRING |
| HIGH | tests/test_issue3929_error_preserves_partial.py | 0 | redirect session_dir / session_index_file to an isolated temp dir. | STRING |
| HIGH | tests/test_issue1361_cancel_data_loss.py | 0 | redirect session_dir / session_index_file to an isolated temp dir. | STRING |
| HIGH | tests/test_issue1298_cancel_and_activity.py | 0 | redirect session_dir / session_index_file to an isolated temp dir. | STRING |
| HIGH | tests/test_issue1094_provider_bugs.py | 0 | stub hermes_cli so tests are deterministic and offline. | STRING |
| HIGH | tests/test_provider_management.py | 0 | stub hermes_cli so tests are deterministic and offline. | STRING |
| HIGH | tests/test_issue1500_lmstudio_env_var_alignment.py | 0 | stub hermes_cli so tests are deterministic and offline. | STRING |
| HIGH | tests/test_custom_provider_dict_models.py | 0 | stub hermes_cli so tests are deterministic and offline. | STRING |
| HIGH | tests/test_custom_providers_in_panel.py | 0 | stub hermes_cli so tests are deterministic and offline. | STRING |
| HIGH | tests/test_issue_neuralwatt_env_key.py | 0 | force get_available_models() down its explicit env-var fallback path. | STRING |
| HIGH | tests/test_issue2025_xiaomi_env_key.py | 0 | force get_available_models() down its explicit env-var fallback path. | STRING |
| HIGH | tests/test_issue2720_bedrock_model_picker.py | 0 | force get_available_models() down its explicit env-var fallback path. | STRING |
| HIGH | tests/test_gateway_sync.py | 0 | create table sessions ( id text primary key, source text, model text, message_count integer default 0, started_at real, | STRING |
| HIGH | tests/test_issue1611_session_profile_filtering.py | 0 | create table sessions ( id text primary key, source text, model text, message_count integer default 0, started_at real, | STRING |
| HIGH | tests/test_issue3506_memory_and_watcher.py | 0 | create table sessions ( id text primary key, source text, model text, message_count integer default 0, started_at real, | STRING |
| HIGH | tests/test_file_manager_external_session.py | 0 | create table sessions ( id text primary key, source text, model text, message_count integer default 0, started_at real, | STRING |
| HIGH | tests/test_issue2057_worktree_lifecycle.py | 0 | create table sessions ( id text primary key, source text, model text, message_count integer default 0, started_at real, | STRING |
| HIGH | tests/test_issue3930_source_filter_pushdown.py | 0 | insert into sessions (id, source, session_source, title, model, started_at, message_count, parent_session_id, ended_at, | STRING |
| HIGH | tests/test_issue3585_cron_session_overflow.py | 0 | insert into sessions (id, source, session_source, title, model, started_at, message_count, parent_session_id, ended_at, | STRING |
| HIGH | tests/test_acp_session_sidebar_visibility.py | 0 | insert into sessions (id, source, session_source, title, model, started_at, message_count, parent_session_id, ended_at, | STRING |
| HIGH | tests/test_issue3586_cli_session_source_label.py | 0 | insert into sessions (id, source, session_source, title, model, started_at, message_count, parent_session_id, ended_at, | STRING |
| HIGH | tests/test_issue2628_cli_sessions_perf.py | 0 | insert into sessions (id, source, session_source, title, model, started_at, message_count, parent_session_id, ended_at, | STRING |
| HIGH | tests/test_issue6220_id_linked_tool_anchor_hydration.py | 0 | function extractfunc(name){ const start = src.indexof('function ' + name); if(start === -1) throw new error(name + ' not | STRING |
| HIGH | tests/test_issue3820_chat_activity_display_mode.py | 0 | function extractfunc(name){ const start = src.indexof('function ' + name); if(start === -1) throw new error(name + ' not | STRING |
| HIGH | tests/test_live_to_final_anchor_visible_order.py | 0 | function extractfunc(name){ const start = src.indexof('function ' + name); if(start === -1) throw new error(name + ' not | STRING |
| HIGH | tests/test_jump_to_answer_scroll_settle.py | 0 | const src = {js!r}; function extractfunc(name) {{ const re = new regexp('function\\\\s+' + name + '\\\\s*\\\\('); const | STRING |
| HIGH | tests/test_issue500_session_list_virtualization.py | 0 | const src = {js!r}; function extractfunc(name) {{ const re = new regexp('function\\\\s+' + name + '\\\\s*\\\\('); const | STRING |
| HIGH | tests/test_issue4346_vscroll_footer_jitter.py | 0 | const src = {js!r}; function extractfunc(name) {{ const re = new regexp('function\\\\s+' + name + '\\\\s*\\\\('); const | STRING |
| HIGH | tests/test_issue500_message_list_virtualization.py | 0 | const src = {js!r}; function extractfunc(name) {{ const re = new regexp('function\\\\s+' + name + '\\\\s*\\\\('); const | STRING |
| HIGH | tests/test_issue644.py | 0 | invalidate the models ttl cache before and after every test in this file. | STRING |
| HIGH | tests/test_opencode_providers.py | 0 | invalidate the models ttl cache before and after every test in this file. | STRING |
| HIGH | tests/test_minimax_provider.py | 0 | invalidate the models ttl cache before and after every test in this file. | STRING |
| HIGH | tests/test_custom_provider_display_name.py | 0 | invalidate the models ttl cache before and after every test in this file. | STRING |
| HIGH | tests/test_turkish_locale.py | 0 | json-style double escapes (\\\\u2026) render literal backslash-u in the ui. | STRING |
| HIGH | tests/test_polish_locale.py | 0 | json-style double escapes (\\\\u2026) render literal backslash-u in the ui. | STRING |
| 16 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bootstrap.py | 501 | # - INVOCATION_ID systemd (set on every service activation) | COMMENT |
| LOW | requirements.txt | 1 | # Hermes Web UI -- minimal Python dependencies | COMMENT |
| LOW | pyproject.toml | 61 | "static", | COMMENT |
| LOW | pyproject.toml | 81 | # prevention value lives. | COMMENT |
| LOW | docker-compose.three-container.yml | 1 | # Three-container Docker Compose: Hermes Agent + Dashboard + WebUI | COMMENT |
| LOW | docker-compose.three-container.yml | 21 | # | COMMENT |
| LOW | docker-compose.three-container.yml | 61 | # Gateway API server (port 8642). The WebUI's Tasks/cron health probe | COMMENT |
| LOW | docker-compose.three-container.yml | 121 | container_name: hermes-webui | COMMENT |
| LOW | docker-compose.three-container.yml | 141 | environment: | COMMENT |
| LOW | docker-compose.three-container.yml | 161 | # NOTE: When using bind-mount volumes shared across containers, ALL containers | COMMENT |
| LOW | docker-compose.three-container.yml | 181 | COMMENT | |
| LOW | docker-compose.yml | 1 | # Hermes WebUI — single-container Docker Compose | COMMENT |
| LOW | docker-compose.yml | 21 | volumes: | COMMENT |
| LOW | docker-compose.yml | 41 | # Where to store sessions, workspaces, and other state (default: ~/.hermes/webui) | COMMENT |
| LOW | docker_init.bash | 61 | # identity the operator chose explicitly — including the legitimate value 1024, | COMMENT |
| LOW | docker_init.bash | 201 | export "$key=$value" | COMMENT |
| LOW | docker_init.bash | 441 | if [ -w "$_agent_src" ]; then | COMMENT |
| LOW | docker_init.bash | 461 | # imports resolve through it at runtime. Placing it alongside the venv gives | COMMENT |
| LOW | ctl.sh | 521 | COMMENT | |
| LOW | docker-compose.two-container.yml | 1 | # Two-container Docker Compose: Hermes Agent + Hermes WebUI | COMMENT |
| LOW | docker-compose.two-container.yml | 21 | # → see https://github.com/sunnysktsang/hermes-suite for an all-in-one image | COMMENT |
| LOW | docker-compose.two-container.yml | 61 | # Expose agent source so the WebUI can install dependencies from it | COMMENT |
| LOW | docker-compose.two-container.yml | 101 | - hermes-home:/home/hermeswebui/.hermes | COMMENT |
| LOW | docker-compose.two-container.yml | 121 | # Match your host user's UID/GID for correct file permissions. | COMMENT |
| LOW | docker-compose.two-container.yml | 141 | # - HERMES_HOME_MODE=0640 | COMMENT |
| LOW | start.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | start.sh | 21 | # requires a password — better than exiting non-zero with `sudo: a password | COMMENT |
| LOW | start.sh | 61 | exit 1 | COMMENT |
| LOW | start.sh | 121 | *) _hermes_probe_host="${_hermes_host}" ;; | COMMENT |
| LOW | tests/test_resolve_model_provider_free_suffix.py | 121 | # The PR #1762 fix for #1744 skipped the rsplit-fallback when the provider | COMMENT |
| LOW | tests/test_issue765_streaming_persistence.py | 741 | assert data["active_stream_id"] is None, ( | COMMENT |
| LOW | tests/test_media_message_snapshots.py | 761 | # Transparent segments: original _getCachedRender line is preserved (source | COMMENT |
| LOW | tests/test_session_channel_option_x.py | 521 | COMMENT | |
| LOW | tests/test_session_channel_option_x.py | 621 | with bp.SESSION_CHANNELS_LOCK: | COMMENT |
| LOW | tests/test_session_channel_option_x.py | 841 | assert '"event_id"' in fn_src or "'event_id'" in fn_src, ( | COMMENT |
| LOW | tests/test_session_channel_option_x.py | 861 | # EventSource was ever created — the session stream stayed dead until the user | COMMENT |
| LOW | tests/test_session_channel_option_x.py | 901 | # Bug: loadSession() tears down the live per-session SSE unconditionally at the | COMMENT |
| LOW | tests/test_docker_docs_and_readonly.py | 161 | # `uv pip install "$_agent_src[all]"` invokes setuptools' egg_info build step, | COMMENT |
| LOW | tests/test_issue5514_composer_grow_scroll_pin.py | 481 | # Behavioral (node vm) — the autoResize() round-trip clamp-and-restore (#5514) | COMMENT |
| LOW | tests/test_issue5514_composer_grow_scroll_pin.py | 561 | def test_steady_state_keystroke_does_not_strand_pinned_reader(): | COMMENT |
| LOW | tests/conftest.py | 121 | # Test state must NEVER live inside the real Hermes home (~/.hermes or any | COMMENT |
| LOW | tests/conftest.py | 181 | # tests that read/write config.yaml stay inside the isolated test home. | COMMENT |
| LOW | tests/conftest.py | 281 | # setting an active profile then resolves the LEAKED profile — e.g. | COMMENT |
| LOW | tests/conftest.py | 421 | config.option.verbose = verbose | COMMENT |
| LOW | tests/conftest.py | 441 | COMMENT | |
| LOW | tests/conftest.py | 461 | # test's lifetime, and the no-op only kicks in after teardown for daemon | COMMENT |
| LOW | tests/conftest.py | 481 | # This module-level monkey-patch wraps socket.create_connection so any | COMMENT |
| LOW | tests/conftest.py | 961 | # can read them without importing conftest (avoids circular imports). | COMMENT |
| LOW | tests/conftest.py | 1001 | for _k in list(env): | COMMENT |
| LOW | tests/conftest.py | 1141 | try: | COMMENT |
| LOW | tests/conftest.py | 1161 | # test_sprint10 crons) and the "Failed to load OpenAI Codex models from | COMMENT |
| LOW | tests/test_custom_provider_prefix_collisions.py | 1 | import sys | COMMENT |
| LOW | tests/test_issue2518_active_provider_fallback.py | 161 | ], | COMMENT |
| LOW | tests/test_issue2518_active_provider_fallback.py | 181 | # consulting the catalog — silently re-pointing the session at the wrong | COMMENT |
| LOW | tests/test_mcp_server.py | 21 | # CI and the local test runner install the compatible dependency; minimal | COMMENT |
| LOW | tests/test_mcp_server.py | 61 | # api.models (STATE_DIR, SESSION_DIR, PROJECTS_FILE, …) so the MCP server | COMMENT |
| LOW | tests/test_mcp_server.py | 201 | # Sibling tests (test_profile_path_security.py) deletes api.profiles from | COMMENT |
| LOW | tests/test_issue4985_orphaned_webui_zero_message.py | 641 | # | COMMENT |
| LOW | tests/test_issue4985_orphaned_webui_zero_message.py | 761 | # ``prune_session_from_index`` for the genuinely-surviving orphan shape | COMMENT |
| LOW | tests/test_issue4985_orphaned_webui_zero_message.py | 1281 | "A titled row with active_stream_id set and empty state.db.messages " | COMMENT |
| 271 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bootstrap.py | 623 | # Mirror the robust pattern from api/updates._schedule_restart: | COMMENT |
| MEDIUM | server.py | 720 | # Not on the main thread (e.g. embedded/test harness); skip handler. | COMMENT |
| LOW | ctl.sh | 127 | # into the shell environment (including those just set by repo .env) are | COMMENT |
| MEDIUM | tests/test_issue5532_clear_truncation_watermark.py | 40 | """Point the session store at an isolated tmp dir (mirror #2914 harness).""" | STRING |
| MEDIUM | tests/test_media_message_snapshots.py | 766 | # scene render chain is exercised by harness-extracted tests that would | COMMENT |
| MEDIUM⚡ | tests/test_issue5514_composer_grow_scroll_pin.py | 487 | # harness leaves the reader stranded; with the preserve-scrollTop fix it does not. | COMMENT |
| MEDIUM | tests/conftest.py | 929 | # Stale servers from QA harness runs or prior test sessions cause | COMMENT |
| MEDIUM | tests/test_7027_state_dir_uid_probe.py | 133 | # ── behavioural harness ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_runtime_adapter_seam.py | 557 | assert "#### Slice 4c: Feature-flagged runner backend and restart/reattach harness" in rfc | CODE |
| MEDIUM | tests/test_runtime_adapter_seam.py | 589 | assert "#### Slice 4e: Default-off runner chat-start route-selection harness" in rfc | CODE |
| MEDIUM | tests/test_runtime_adapter_seam.py | 626 | assert "#### Slice 4g: Supervised local runner process harness gate" in rfc | CODE |
| LOW | tests/test_session_sidebar_cache.py | 615 | # text-file state.db (a real sqlite connect would just return None here). | COMMENT |
| MEDIUM⚡ | tests/test_5428_stale_client_recovery.py | 62 | # Node-backed behavioral harness | COMMENT |
| MEDIUM⚡ | …test_6808_appearance_bootstrap_no_fabricated_choice.py | 110 | # The harness must have actually run the bootstrap: it always paints. | STRING |
| MEDIUM⚡ | …ts/test_issue1567_nous_picker_capacity_and_symmetry.py | 578 | # robust against minor refactors of surrounding code. | COMMENT |
| MEDIUM | tests/test_issue4856_android_scroll_regression.py | 142 | # ── #4970 low-delta wheel intent: behavioral node-harness ──────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_issue4856_android_scroll_regression.py | 177 | Mirrors the #4295 harness shape but injects the #4970 helpers so we can | STRING |
| MEDIUM | tests/test_issue4856_android_scroll_regression.py | 676 | # ── Behavioral harness: execute the REAL _fixMobileScrollJank against a mock | STRING |
| MEDIUM | tests/test_pinned_tail_midstream_jitter.py | 209 | # The call is typeof-guarded so a standalone renderMessages() node harness (which does | STRING |
| MEDIUM | tests/test_blank_live_turn_preserve_guard.py | 182 | """#6948 browser-lifecycle equivalent in the node harness: the full | STRING |
| MEDIUM⚡ | tests/test_issue5364_skills_stats_thundering_herd.py | 37 | # Import harness (mirrors tests/test_issue4783_profile_skills_mtime_cache.py) | COMMENT |
| MEDIUM⚡ | tests/test_issue4662_profile_switch_skeleton_static.py | 155 | # window. Anchoring on the next function def keeps the assertion robust. | COMMENT |
| MEDIUM⚡ | tests/test_extension_theme_registration.py | 113 | # ── Layer 2: behavioral (Node harness drives the real functions) ───────────── | COMMENT |
| MEDIUM | tests/test_issue3162_ensure_messages_loaded.py | 23 | # Balancing braces from the opening `{` is robust to any in-function growth. | COMMENT |
| MEDIUM | tests/test_issue1574_cron_profile_lock.py | 299 | # Use fork only for the outer test harness so this pytest module does not | COMMENT |
| MEDIUM | tests/test_optionz_liveview_perf.py | 589 | # jump). Reproduced deterministically with the controlled Playwright harness in | COMMENT |
| MEDIUM⚡ | tests/test_issue2024_env_lock_skill_imports.py | 108 | # Simple string check is sufficient and more robust than AST for | COMMENT |
| LOW | tests/test_model_resolver.py | 1530 | # which would overwrite the in-memory cfg we just set up. | COMMENT |
| MEDIUM⚡ | tests/test_v050260_docker_invariants.py | 126 | # ── 4: docs/docker.md comprehensive guide ────────────────────────────────── | COMMENT |
| MEDIUM⚡ | api/crash_visibility.py | 102 | # Absolutely nothing a diagnostic writer may raise should propagate. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_issue3957_profile_providers_models.py | 736 | # Create a config.yaml with a custom provider that has key_env | COMMENT |
| MEDIUM⚡ | tests/test_issue1094_provider_bugs.py | 210 | # Create a fake config.yaml with a provider key | COMMENT |
| MEDIUM | tests/test_issue570_permission.py | 24 | # Create the file then make the parent unreadable so .exists() raises PermissionError | COMMENT |
| MEDIUM | tests/test_gateway_sync.py | 2579 | # Create a WebUI session with a known ID | COMMENT |
| MEDIUM | tests/test_bootstrap_foreground.py | 510 | # Create a non-executable file at the python path | COMMENT |
| MEDIUM | tests/test_v050257_opus_followups.py | 185 | # Create a fake session file | COMMENT |
| MEDIUM | tests/test_symlink_cycle_detection.py | 184 | # Create a symlink inside target that points back to workspace | COMMENT |
| MEDIUM | tests/test_session_sidecar_repair.py | 529 | # Create an agent lock | COMMENT |
| MEDIUM | tests/test_sprint14.py | 39 | # Create a file first | COMMENT |
| MEDIUM | tests/test_issue893_cancel_preserves_partial.py | 87 | # Create a session and a fake running stream | COMMENT |
| MEDIUM | tests/test_workspace_upload.py | 650 | # Create a zip with a malicious member path | COMMENT |
| MEDIUM⚡ | tests/test_sprint11.py | 87 | # Create a session with a custom model string | COMMENT |
| MEDIUM | tests/test_issue2698_isolated_hermes_home.py | 130 | # Create a few test profiles | COMMENT |
| MEDIUM⚡ | tests/test_regressions.py | 323 | # Create a session with a title so it shows in the list | COMMENT |
| MEDIUM⚡ | tests/test_session_index.py | 1496 | # Create a valid index file so the incremental path is attempted | COMMENT |
| MEDIUM | tests/test_session_index.py | 309 | # Create a new session C not in the index | COMMENT |
| MEDIUM | tests/test_media_inline.py | 1033 | # Create a session so we can use /api/file/raw | COMMENT |
| MEDIUM⚡ | tests/test_issue1195_session_profile_routing.py | 43 | # Create an existing profile directory | COMMENT |
| MEDIUM | scripts/lib/health_probe.sh | 23 | # This file is safe to `source` (defines functions only) and is also runnable | COMMENT |
| MEDIUM | .github/workflows/native-windows-startup.yml | 38 | # Create the WebUI venv. start.ps1 prefers $AgentDir\venv if it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_issue3831_watermark_clear.py | 136 | # --- The guardrails: the fix must NOT regress #2914/#3102 --------------------- | COMMENT |
| MEDIUM | tests/test_pr1341_context_window_persistence.py | 33 | # Find the post-merge save block — anchored on the unique reasoning trace | COMMENT |
| MEDIUM | tests/test_tool_limit_terminal_state.py | 760 | # Synthetic scaffolding turn was still dropped, even after fallback injection. | COMMENT |
| MEDIUM | tests/test_issue5334_verification_stop_leak.py | 105 | # No leftover synthetic scaffolding rows. | COMMENT |
| MEDIUM | tests/test_1003_preferences_autosave.py | 86 | # We use a context window around the dom_id to find the listener. | COMMENT |
| MEDIUM | docs/rfcs/stable-assistant-turn-anchors.md | 804 | ### Phase 1: Internal anchor scaffold | COMMENT |
| MEDIUM | …cs/architecture/stable-assistant-turn-anchor-phase0.md | 15 | - The #3962 Phase 0 scaffold shipped through #3977 / v0.51.359: inventory the | CODE |
| MEDIUM | api/config.py | 8928 | # agent token stream), an OOM risk with many tabs × long agentic turns. This | COMMENT |
| MEDIUM | api/config.py | 9163 | STREAM_REASONING_TEXT: dict = {} # stream_id -> reasoning trace accumulated during streaming (#1361 §A) | CODE |
| MEDIUM | api/streaming.py | 1628 | # Structured markers the Hermes Agent stamps on synthetic scaffolding turns that | COMMENT |
| MEDIUM | api/streaming.py | 2170 | # synthetic-scaffolding flag convention already used elsewhere (#5334). | COMMENT |
| MEDIUM | api/streaming.py | 3687 | # Guard against chain-of-thought leakage, meta-reasoning, and trivial echo. | COMMENT |
| MEDIUM | api/streaming.py | 3869 | # agentic first-turn plans that are legitimate title candidates. | COMMENT |
| MEDIUM | api/streaming.py | 6776 | # Drop Hermes Agent internal verify-loop scaffolding (synthetic "premature | COMMENT |
| MEDIUM | api/streaming.py | 11595 | # Persist reasoning trace in the session so it survives reload. | COMMENT |
| MEDIUM | api/streaming.py | 11606 | # (before tool calls) each receive their own reasoning trace rather | COMMENT |
| MEDIUM | api/streaming.py | 11672 | # Persist context window data on the session so the context-ring | COMMENT |
| MEDIUM | api/streaming.py | 11674 | # s.save() for the same reason as the reasoning trace above. | COMMENT |
| MEDIUM | api/streaming.py | 12060 | # Include context window data from the agent's compressor for the UI indicator. | COMMENT |
| MEDIUM | api/streaming.py | 12122 | # resolve the model's context window from metadata so the UI indicator | COMMENT |
| MEDIUM | api/streaming.py | 12187 | # (reasoning trace already attached + saved above, before s.save()) | COMMENT |
| MEDIUM | api/streaming.py | 13207 | # Capture reasoning trace and live tool calls (#1361 §A + §B) | COMMENT |
| MEDIUM | api/streaming.py | 13319 | # #1361: Also persist reasoning trace and live tool calls that were | COMMENT |
| MEDIUM | api/streaming.py | 8743 | STREAM_REASONING_TEXT[stream_id] = '' # start accumulating reasoning trace (#1361 §A) | CODE |
| MEDIUM | api/streaming.py | 12823 | STREAM_REASONING_TEXT.pop(stream_id, None) # Clean up reasoning trace (#1361 §A) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_issue2914_truncation_watermark.py | 356 | # Step 4: Undo — removes "light speed" | COMMENT |
| LOW⚡ | tests/test_issue2914_truncation_watermark.py | 365 | # Step 5: New turn — agent context should NOT include "triangle" | COMMENT |
| LOW | tests/test_issue2914_truncation_watermark.py | 281 | # Step 1: Initial message "triangle" | COMMENT |
| LOW | tests/test_issue2914_truncation_watermark.py | 301 | # Step 2: Edit "triangle" → "square" (new timestamp 200) | COMMENT |
| LOW | tests/test_issue2914_truncation_watermark.py | 330 | # Step 3: New message "light speed" | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 165 | # Step 1: streaming.py registers the notify callback | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 170 | # Step 2: check_all_command_guards fires the callback and queues an entry | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 187 | # Step 3: user responds via /api/approval/respond → resolve_gateway_approval | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 191 | # Step 4: agent thread is unblocked with the correct choice | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 97 | # Step 1: Truncate (edit) — keep 2 messages (first exchange) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 104 | # Step 2: Send new message "square" — checkpoint advances watermark | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 134 | # Step 1: Truncate (edit) — keep 2 messages (first exchange) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 138 | # Step 2: Send new message "square" | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 145 | # Step 3: Simulate state.db containing both original and edited messages | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 155 | # Step 4: Reload from disk (simulates session switch → switch back) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 164 | # Step 5: Merge sidecar + state.db (what GET /api/session does) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 202 | # Step 1: Truncate (edit) — keep 2 messages | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 206 | # Step 2: Send edited message | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 211 | # Step 3: Simulate assistant reply | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 215 | # Step 4: Send second new turn | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 221 | # Step 5: Simulate state.db with all messages | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 233 | # Step 6: Reload from disk | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 241 | # Step 7: Merge | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 277 | # Step 1: Retry — truncates to before "second" | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 283 | # Step 2: Send new message | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 310 | # Step 1: Undo — removes "second" and "reply2" | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 316 | # Step 2: Send new message | COMMENT |
| LOW⚡ | tests/test_issue1633_models_cache_version_stamp.py | 369 | # Step 4: cache rejected → caller will rebuild from live provider data | COMMENT |
| LOW | tests/test_issue1633_models_cache_version_stamp.py | 351 | # Step 1: v0.50.281 writes cache | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_issue2914_truncation_watermark.py | 356 | # Step 4: Undo — removes "light speed" | COMMENT |
| LOW⚡ | tests/test_issue2914_truncation_watermark.py | 365 | # Step 5: New turn — agent context should NOT include "triangle" | COMMENT |
| LOW | tests/test_issue2914_truncation_watermark.py | 281 | # Step 1: Initial message "triangle" | COMMENT |
| LOW | tests/test_issue2914_truncation_watermark.py | 301 | # Step 2: Edit "triangle" → "square" (new timestamp 200) | COMMENT |
| LOW | tests/test_issue2914_truncation_watermark.py | 330 | # Step 3: New message "light speed" | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 165 | # Step 1: streaming.py registers the notify callback | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 170 | # Step 2: check_all_command_guards fires the callback and queues an entry | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 187 | # Step 3: user responds via /api/approval/respond → resolve_gateway_approval | COMMENT |
| LOW⚡ | tests/test_approval_unblock.py | 191 | # Step 4: agent thread is unblocked with the correct choice | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 97 | # Step 1: Truncate (edit) — keep 2 messages (first exchange) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 104 | # Step 2: Send new message "square" — checkpoint advances watermark | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 134 | # Step 1: Truncate (edit) — keep 2 messages (first exchange) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 138 | # Step 2: Send new message "square" | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 145 | # Step 3: Simulate state.db containing both original and edited messages | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 155 | # Step 4: Reload from disk (simulates session switch → switch back) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 164 | # Step 5: Merge sidecar + state.db (what GET /api/session does) | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 202 | # Step 1: Truncate (edit) — keep 2 messages | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 206 | # Step 2: Send edited message | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 211 | # Step 3: Simulate assistant reply | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 215 | # Step 4: Send second new turn | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 221 | # Step 5: Simulate state.db with all messages | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 233 | # Step 6: Reload from disk | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 241 | # Step 7: Merge | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 277 | # Step 1: Retry — truncates to before "second" | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 283 | # Step 2: Send new message | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 310 | # Step 1: Undo — removes "second" and "reply2" | COMMENT |
| LOW⚡ | tests/test_watermark_advance_after_edit.py | 316 | # Step 2: Send new message | COMMENT |
| LOW⚡ | tests/test_issue1633_models_cache_version_stamp.py | 369 | # Step 4: cache rejected → caller will rebuild from live provider data | COMMENT |
| LOW | tests/test_issue1633_models_cache_version_stamp.py | 351 | # Step 1: v0.50.281 writes cache | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server.py | 100 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | tests/test_auth_password_hash_cache.py | 65 | def _set_env_pw(self, pw: str) -> None: | CODE |
| LOW | tests/test_auth_password_hash_cache.py | 178 | def _set_env_pw(self, pw: str) -> None: | CODE |
| LOW | api/plugins.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/auth.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/auth.py | 1237 | def set_auth_cookie(handler, cookie_value) -> None: | CODE |
| LOW | api/process_event_utils.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/session_lifecycle.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/config.py | 93 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/config.py | 9468 | def update_active_run(stream_id: str, **metadata) -> None: | CODE |
| LOW | api/plugin_providers.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/models.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/terminal.py | 39 | def _set_nonblocking(fd: int) -> None: | CODE |
| LOW | api/terminal.py | 386 | def _set_size(term: TerminalSession, rows: int, cols: int) -> None: | CODE |
| LOW | api/goals.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/agent_sessions.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/onboarding.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/updates.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/background_process.py | 61 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/metering.py | 100 | def set_pending_started_at(self, stream_id: str, pending_started_at) -> None: | CODE |
| LOW | api/background.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/auth_oidc.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/skill_usage.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/gateway_chat.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/rollback.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/session_ops.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/session_events.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/todo_state.py | 53 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/route_approvals.py | 132 | def set_session_yolo_enabled(session_key: str, enabled: bool) -> None: | CODE |
| LOW | api/providers.py | 59 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/session_recovery.py | 46 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/workspace_git.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/crash_visibility.py | 50 | __all__ = [ | CODE |
| LOW | api/gateway_watcher.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | api/workspace.py | 467 | def set_last_workspace(path: str) -> None: | CODE |
| LOW | api/workspace.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/streaming.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/helpers.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/gateway_restart.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/commands.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | api/profiles.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/profiles.py | 483 | def set_request_profile(name: str) -> None: | CODE |
| LOW | api/shares.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/state_sync.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/oauth.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/oauth.py | 657 | def _set_flow_status(flow_id: str, status: str, **fields: Any) -> None: | CODE |
| LOW | api/worktrees.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/dashboard_probe.py | 17 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_issue3957_profile_providers_models.py | 606 | return "fake_token" | CODE |
| LOW | tests/test_issue3957_profile_providers_models.py | 659 | return "fake_token" | CODE |
| LOW⚡ | tests/test_auth_sessions.py | 39 | auth._sessions["fake_token"] = time.time() - 100 | CODE |
| LOW⚡ | tests/test_auth_sessions.py | 49 | auth.verify_session("fake_token.fake_sig") | CODE |
| LOW⚡ | tests/test_auth_sessions.py | 54 | self.assertNotIn("fake_token", auth._sessions) | CODE |
| LOW⚡ | tests/_layout_helpers.py | 290 | var RAW_ATTRS = ["title", "aria-label", "placeholder"] | CODE |
| LOW | tests/test_issue3825_oidc_auth.py | 307 | "allow_values": ["user@example.com"], | CODE |
| LOW | tests/test_issue3825_oidc_auth.py | 404 | "allow_values": ["user@example.com"], | CODE |
| LOW | tests/test_issue2271_keyless_custom_provider.py | 18 | assert api_key == "dummy-key" | CODE |
| LOW | tests/test_issue2271_keyless_custom_provider.py | 54 | assert api_key == "dummy-key" | CODE |
| LOW | tests/test_sprint46.py | 73 | "api_key": "fake-key", | CODE |
| LOW | tests/test_sprint46.py | 98 | "api_key": "fake-key", | CODE |
| LOW | tests/test_mobile_scroll_jank.html | 166 | addMessage(role,`Message ${i+1}: `+'Lorem ipsum dolor sit amet consectetur adipiscing elit. '.repeat(3)); | CODE |
| LOW | tests/test_mobile_scroll_jank.html | 166 | addMessage(role,`Message ${i+1}: `+'Lorem ipsum dolor sit amet consectetur adipiscing elit. '.repeat(3)); | CODE |
| LOW | tests/test_login_locale_parity.py | 221 | "placeholder", | CODE |
| LOW | tests/test_issue4836_manual_compression_recovery.py | 61 | "api_key": "fake-key", | CODE |
| LOW | tests/test_issue4836_manual_compression_recovery.py | 86 | "api_key": "fake-key", | CODE |
| LOW | tests/test_issue5331_index_only_ghost_cleanup.py | 144 | routes.SESSIONS["sess-mem"] = "placeholder" | CODE |
| LOW | tests/test_issue5331_index_only_ghost_cleanup.py | 168 | routes.SESSIONS["sess-3"] = "placeholder" | CODE |
| LOW⚡ | tests/test_compression_phantom_barrier.py | 242 | assert before["placeholder"] == "Type a message — it will queue and send after compression" | STRING |
| LOW⚡ | tests/test_compression_phantom_barrier.py | 251 | "placeholder": "Original placeholder", | STRING |
| LOW | tests/test_update_banner_fixes.py | 1696 | 'api_key': 'fake-key', | CODE |
| LOW | tests/test_issue540_workspace_office_documents.py | 323 | preview_office_document("budget.xlsx", b"placeholder") | CODE |
| LOW | tests/test_issue540_workspace_office_documents.py | 406 | preview = preview_office_document("budget.xlsx", b"placeholder") | CODE |
| LOW | api/streaming.py | 250 | _KEYLESS_CUSTOM_API_KEY = "dummy-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_auto_compression_terminal_failure.py | 58 | CODE | |
| LOW | tests/test_auto_compression_terminal_failure.py | 356 | CODE | |
| LOW | tests/test_gateway_sync.py | 123 | CODE | |
| LOW | tests/test_gateway_sync.py | 167 | CODE | |
| LOW | tests/test_sprint42.py | 196 | CODE | |
| LOW | tests/test_sprint42.py | 289 | CODE | |
| LOW | tests/test_sprint42.py | 592 | CODE | |
| LOW | tests/test_sprint42.py | 954 | CODE | |
| LOW | tests/test_issue3895_opencode_go_model_picker.py | 114 | CODE | |
| LOW | tests/test_issue1857_usage_overwrite.py | 80 | CODE | |
| LOW | tests/test_issue_progress_echo_dedupe.py | 76 | CODE | |
| LOW | tests/test_issue_progress_echo_dedupe.py | 244 | CODE | |
| LOW | tests/test_issue_progress_echo_dedupe.py | 426 | CODE | |
| LOW | tests/test_issue4251_wakeup_model_picker_race.py | 54 | CODE | |
| LOW | tests/test_tool_limit_terminal_state.py | 18 | CODE | |
| LOW | tests/test_issue5637_stale_anchor_guard.py | 356 | CODE | |
| LOW | api/models.py | 1195 | CODE | |
| LOW | api/runtime_adapter.py | 314 | CODE | |
| LOW | api/workspace_git.py | 194 | CODE | |
| LOW | api/route_session_list_cache.py | 185 | CODE | |
| LOW | api/state_sync.py | 135 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_onboarding_mvp.py | 18 | # Check if pyyaml is available — onboarding setup tests need it on the server | COMMENT |
| LOW | tests/test_sprint42.py | 727 | # Check if this try imports hermes_state | COMMENT |
| LOW | tests/test_issue1139_password_remote.py | 75 | # Check if pane has any input fields (not just buttons) | COMMENT |
| LOW | tests/test_sprint15.py | 137 | # Assign session to project | COMMENT |
| LOW | tests/test_session_batch_select.py | 190 | # Check if the key exists in the locale block | COMMENT |
| LOW⚡ | api/config.py | 885 | # Check if session store is empty | COMMENT |
| LOW⚡ | api/config.py | 895 | # Check if SESSION_INDEX_FILE is absent, empty, or contains only {}|[]|null | COMMENT |
| LOW | api/config.py | 7540 | # Check if user has configured models in config.yaml — | COMMENT |
| LOW | api/providers.py | 2602 | # Check if actually authenticated via hermes_cli. | COMMENT |
| LOW⚡ | api/streaming.py | 10473 | # Check if cancel was requested during agent initialization | COMMENT |
| LOW | api/streaming.py | 3648 | # Check if contains any function_calls/DSML marker (case-insensitive) | COMMENT |