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 16,020 GitHub stars. SynthScan v2.0 examined 479,754 lines of code across 1420 source files, recording 19898 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 73.2 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 19898 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_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 |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 189 | getElementById(id) { return id === 'msgInner' ? inner : null; }, | CODE |
| HIGH | tests/test_issue4749_steer_reason_and_recovery.py | 201 | return (LOCALES.en && LOCALES.en[key]) ? key : 'steer_fail_unknown'; | CODE |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 242 | if (!lbl || lbl.className !== 'steer-recovery-label') { | CODE |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 246 | if (!retry || retry.className !== 'steer-recovery-retry') { | CODE |
| HIGH⚡ | tests/test_issue4749_steer_reason_and_recovery.py | 250 | if (!dismiss || dismiss.className !== 'steer-recovery-dismiss') { | CODE |
| 2516 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 | 195 | def _drain_request_input_nonblocking(self, request) -> None: | CODE |
| LOW⚡ | server.py | 248 | def _reject_overflow_request_worker(self, request) -> None: | CODE |
| LOW | server.py | 69 | def _blocked_create_connection(address, *a, **kw): | CODE |
| LOW | server.py | 529 | 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_workspace_blocked_roots_macos.py | 40 | def test_etc_literal_in_blocked_roots(self): | CODE |
| LOW⚡ | tests/test_workspace_blocked_roots_macos.py | 43 | def test_etc_resolved_in_blocked_roots(self): | CODE |
| LOW⚡ | tests/test_workspace_blocked_roots_macos.py | 50 | def test_var_literal_and_resolved_in_blocked_roots(self): | CODE |
| LOW⚡ | tests/test_workspace_blocked_roots_macos.py | 59 | def test_etc_resolved_form_blocked(self): | CODE |
| 12873 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 | 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_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 | 189 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 191 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_issue5339_restart_stale_user_dedup.py | 241 | # --------------------------------------------------------------------------- | 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 | 129 | # ─────────────────────────── invariant 1: eviction ────────────────────────── | COMMENT |
| MEDIUM | tests/test_issue4765_sessions_lru_eviction.py | 156 | # ────────────────────── invariant 2: never evict active ────────────────────── | COMMENT |
| MEDIUM | tests/test_issue4765_sessions_lru_eviction.py | 235 | # ───────────────── invariant 3: lazy reload + invariant 4: no data loss ────── | COMMENT |
| MEDIUM⚡ | tests/test_terminal_fd_leak.py | 82 | # ── Leak 1: reader loop retires the session on shell exit ──────────────────── | COMMENT |
| MEDIUM | tests/test_terminal_fd_leak.py | 115 | # ── Leak 2: _MAX_TERMINALS cap evicts the least-recently-active terminal ────── | COMMENT |
| MEDIUM | tests/test_terminal_fd_leak.py | 203 | # ── F2: cap eviction is identity-guarded ───────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_security_redaction.py | 47 | # ── HTTP helpers ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_security_redaction.py | 82 | # ── helpers.py unit tests (import-level, no test_server needed) ─────────────────── | COMMENT |
| 1511 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 | 69 | def _blocked_create_connection(address, *a, **kw): | CODE |
| MEDIUM | server.py | 189 | def _close_request_quietly(self, request) -> None: | CODE |
| MEDIUM | server.py | 248 | def _reject_overflow_request_worker(self, request) -> None: | CODE |
| MEDIUM | server.py | 274 | def process_request_thread(self, request, client_address): | CODE |
| MEDIUM | server.py | 636 | def _start_watcher_safe(): | CODE |
| LOW⚡ | server.py | 192 | except Exception: | CODE |
| LOW⚡ | server.py | 204 | except Exception: | CODE |
| LOW⚡ | server.py | 244 | except Exception: | CODE |
| LOW⚡ | server.py | 255 | except Exception: | CODE |
| LOW⚡ | server.py | 257 | except Exception: | CODE |
| LOW⚡ | server.py | 639 | except Exception as e: | CODE |
| LOW⚡ | server.py | 647 | except Exception as e: | CODE |
| LOW⚡ | server.py | 654 | except Exception as e: | CODE |
| LOW⚡ | server.py | 661 | except Exception as e: | CODE |
| LOW⚡ | server.py | 667 | except Exception as e: | CODE |
| LOW⚡ | server.py | 730 | except Exception: | CODE |
| LOW⚡ | server.py | 735 | except Exception: | CODE |
| LOW⚡ | server.py | 740 | except Exception: | CODE |
| LOW⚡ | server.py | 745 | except Exception: | CODE |
| LOW | server.py | 178 | except Exception: | CODE |
| LOW | server.py | 228 | except Exception: | CODE |
| LOW | server.py | 269 | except Exception: | CODE |
| LOW | server.py | 344 | except Exception: | CODE |
| LOW | server.py | 355 | except Exception: | CODE |
| LOW | server.py | 360 | except Exception: | CODE |
| LOW | server.py | 389 | except Exception: | CODE |
| LOW | server.py | 395 | except Exception: | CODE |
| LOW | server.py | 417 | except Exception: | CODE |
| LOW | server.py | 423 | except Exception: | CODE |
| LOW | server.py | 457 | except Exception as exc: | CODE |
| LOW | server.py | 467 | except Exception as exc: | CODE |
| LOW | server.py | 482 | except Exception: | CODE |
| LOW | server.py | 515 | except Exception: | CODE |
| LOW | server.py | 581 | except Exception as exc: | CODE |
| LOW | server.py | 683 | except Exception as e: | CODE |
| LOW | ctl.sh | 523 | 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 |
| 1095 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_run_journal_seq_cache.py | 11 | 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_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_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_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 | tests/test_issue4877_fresh_blank_boot_workspace_bind.py | 3 | CODE | |
| LOW | tests/test_sprint9.py | 5 | 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 | |
| LOW | tests/test_smd_media_in_stream.py | 31 | CODE | |
| LOW | tests/test_session_lineage_full_transcript.py | 3 | CODE | |
| LOW | tests/test_issue513_wsl_autostart.py | 1 | CODE | |
| LOW | tests/test_gateway_approval_legacy_path.py | 6 | CODE | |
| LOW | tests/test_pr1355_sse_handler_no_deadlock.py | 16 | CODE | |
| LOW | tests/test_issue_neuralwatt_env_key.py | 7 | CODE | |
| LOW | tests/test_v050254_opus_followups.py | 9 | CODE | |
| 507 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 | 142 | 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 | 15 | 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_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_issue4598_composer_control_visibility.py | 69 | CODE | |
| LOW | tests/conftest.py | 316 | CODE | |
| LOW | tests/conftest.py | 667 | CODE | |
| LOW | tests/conftest.py | 750 | 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_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 | 22 | CODE | |
| LOW | tests/test_issue3820_chat_activity_display_mode.py | 977 | 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 | |
| LOW | tests/test_issue4490_presession_toolsets.py | 20 | CODE | |
| LOW | …sts/test_issue5924_post_failure_recovery_model_pick.py | 33 | CODE | |
| LOW | tests/test_terminal_linux_lifecycle.py | 23 | CODE | |
| LOW | tests/test_smooth_text_fade.py | 21 | CODE | |
| LOW | tests/test_4737_first_tab_model_catalog_refresh.py | 225 | CODE | |
| 398 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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_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 | …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_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 |
| HIGH | tests/test_czech_locale.py | 0 | json-style double escapes (\\\\u2026) render literal backslash-u in the ui. | STRING |
| HIGH | tests/test_sprint3.py | 0 | create a session and register it with the cleanup fixture. | STRING |
| HIGH | tests/test_sprint2.py | 0 | create a session and register it with the cleanup fixture. | STRING |
| HIGH | tests/test_sprint1.py | 0 | create a session and register it with the cleanup fixture. | STRING |
| HIGH | tests/test_workspace_upload.py | 0 | create a session and register it with the cleanup fixture. | STRING |
| HIGH | tests/test_sprint5.py | 0 | create a session and register it with the cleanup fixture. | STRING |
| HIGH | tests/test_sprint4.py | 0 | create a session and register it with the cleanup fixture. | 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 |
| 1 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 | 1 | # Hermes WebUI — Python tooling config. | COMMENT |
| LOW | pyproject.toml | 21 | extend-exclude = [ | COMMENT |
| LOW | pyproject.toml | 41 | # raise-without-from (B904), loop-variable capture in closures (B023), | COMMENT |
| LOW | docker-compose.three-container.yml | 1 | # Three-container Docker Compose: Hermes Agent + Dashboard + WebUI | COMMENT |
| LOW | docker-compose.three-container.yml | 21 | # → keep this file but switch to NAMED VOLUMES (the default) instead of bind mounts | COMMENT |
| LOW | docker-compose.three-container.yml | 41 | ports: | COMMENT |
| LOW | docker-compose.three-container.yml | 101 | container_name: hermes-webui | COMMENT |
| LOW | docker-compose.three-container.yml | 121 | environment: | COMMENT |
| LOW | docker-compose.three-container.yml | 141 | # Optional: set a password for remote access | COMMENT |
| LOW | docker-compose.three-container.yml | 161 | # `/opt/hermes` on first `up`, and Docker reuses the volume verbatim on | 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 | 181 | fi | COMMENT |
| LOW | docker_init.bash | 421 | echo "!! Path: $_agent_src" | 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 | # ${HOME} is used rather than `~` so the default resolves the same way | COMMENT |
| LOW | docker-compose.two-container.yml | 121 | # - HERMES_WEBUI_PASSWORD=your-secret-password | COMMENT |
| LOW | docker-compose.two-container.yml | 141 | # later runs — even after `docker pull` of a newer agent image. After | 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_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 | 181 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | tests/test_issue5514_composer_grow_scroll_pin.py | 261 | # a keystroke with NO net height change. Pre-fix (net-growth gate) this left | COMMENT |
| LOW | tests/conftest.py | 121 | # HERMES_HOME), or anywhere near production profiles/files/server. Earlier this | COMMENT |
| LOW | tests/conftest.py | 241 | # in place and never restores it. In a sequential run the next test usually | COMMENT |
| LOW | tests/conftest.py | 381 | try: | COMMENT |
| LOW | tests/conftest.py | 401 | # Setting this here instead of in a fixture so it lands BEFORE any test-file | COMMENT |
| LOW | tests/conftest.py | 421 | # | COMMENT |
| LOW | tests/conftest.py | 441 | # regression like the one PR #1970 introduced where a new code path bypassed | COMMENT |
| LOW | tests/conftest.py | 901 | # Expose TEST_STATE_DIR to the test process itself so that tests which write | COMMENT |
| LOW | tests/conftest.py | 961 | "HERMES_WEBUI_WORKSPACE_GIT_DESTRUCTIVE": "1", | COMMENT |
| LOW | tests/conftest.py | 1081 | from api.config import invalidate_models_cache | COMMENT |
| LOW | tests/conftest.py | 1101 | # hermes_cli" TLS-test failure — all pass in isolation, all fail only after one | 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 | 41 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| LOW | tests/test_mcp_server.py | 181 | _SAVED_CONSTANTS["captured"] = True | 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 |
| LOW | tests/test_issue4985_orphaned_webui_zero_message.py | 1561 | COMMENT | |
| LOW | tests/test_issue4985_orphaned_webui_zero_message.py | 1801 | f"{len(on_disk['ids'])}" | COMMENT |
| LOW | tests/test_1560_password_env_var_no_op.py | 21 | import io | COMMENT |
| LOW | tests/test_raw_audio_upload.py | 181 | # Regression: server-STT transcription is async (~1s round-trip). During | COMMENT |
| LOW | tests/test_updates.py | 1081 | # ── apply_force_update lock cleanup tests ──────────────────────────────────── | COMMENT |
| 288 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 | 719 | # 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_issue5514_composer_grow_scroll_pin.py | 186 | # harness leaves the reader stranded; with the preserve-scrollTop fix it does not. | COMMENT |
| MEDIUM | tests/conftest.py | 874 | # Stale servers from QA harness runs or prior test sessions cause | 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⚡ | …ts/test_issue1567_nous_picker_capacity_and_symmetry.py | 573 | # 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_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_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 | 998 | # 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 | static/ui.js | 982 | // test is more robust than a matchMedia('(hover:hover) and (pointer:fine)') | COMMENT |
| MEDIUM | static/ui.js | 5740 | // typeof guard keeps the #4295 node harness (no _scrollbarDragActive | COMMENT |
| MEDIUM | static/ui.js | 5809 | // then preserving scrollTop is seamless only if there is runway left for | 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_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 | 326 | # 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 | 776 | ### Phase 1: Internal anchor scaffold | COMMENT |
| MEDIUM | …cs/architecture/stable-assistant-turn-anchor-phase0.md | 11 | - The #3962 Phase 0 scaffold shipped through #3977 / v0.51.359: inventory the | CODE |
| MEDIUM | static/assistant_turn_anchors.js | 1 | // Stable Assistant Turn Anchors scaffold (#3926). | COMMENT |
| MEDIUM | api/config.py | 8590 | STREAM_REASONING_TEXT: dict = {} # stream_id -> reasoning trace accumulated during streaming (#1361 §A) | CODE |
| MEDIUM | api/streaming.py | 1338 | # Structured markers the Hermes Agent stamps on synthetic scaffolding turns that | COMMENT |
| MEDIUM | api/streaming.py | 1425 | # synthetic-scaffolding flag convention already used elsewhere (#5334). | COMMENT |
| MEDIUM | api/streaming.py | 2547 | # Guard against chain-of-thought leakage and meta-reasoning patterns. | COMMENT |
| MEDIUM | api/streaming.py | 2699 | # agentic first-turn plans that are legitimate title candidates. | COMMENT |
| MEDIUM | api/streaming.py | 5301 | # Drop Hermes Agent internal verify-loop scaffolding (synthetic "premature | COMMENT |
| MEDIUM | api/streaming.py | 9319 | # Persist reasoning trace in the session so it survives reload. | COMMENT |
| MEDIUM | api/streaming.py | 9330 | # (before tool calls) each receive their own reasoning trace rather | COMMENT |
| MEDIUM | api/streaming.py | 9389 | # Persist context window data on the session so the context-ring | COMMENT |
| MEDIUM | api/streaming.py | 9391 | # s.save() for the same reason as the reasoning trace above. | COMMENT |
| MEDIUM | api/streaming.py | 9775 | # Include context window data from the agent's compressor for the UI indicator. | COMMENT |
| MEDIUM | api/streaming.py | 9837 | # resolve the model's context window from metadata so the UI indicator | COMMENT |
| MEDIUM | api/streaming.py | 9902 | # (reasoning trace already attached + saved above, before s.save()) | COMMENT |
| MEDIUM | api/streaming.py | 10769 | # Capture reasoning trace and live tool calls (#1361 §A + §B) | COMMENT |
| MEDIUM | api/streaming.py | 10882 | # #1361: Also persist reasoning trace and live tool calls that were | COMMENT |
| MEDIUM | api/streaming.py | 6679 | STREAM_REASONING_TEXT[stream_id] = '' # start accumulating reasoning trace (#1361 §A) | CODE |
| MEDIUM | api/streaming.py | 10420 | STREAM_REASONING_TEXT.pop(stream_id, None) # Clean up reasoning trace (#1361 §A) | CODE |
| 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 | 2546 | # 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 | 469 | # 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 | 313 | # 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_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 |
|---|---|---|---|---|
| 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 | 101 | 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 | 1212 | def set_auth_cookie(handler, cookie_value) -> None: | CODE |
| LOW | api/session_lifecycle.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/config.py | 92 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/config.py | 8792 | 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 | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/terminal.py | 38 | def _set_nonblocking(fd: int) -> None: | CODE |
| LOW | api/terminal.py | 311 | 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 | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/updates.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/background_process.py | 51 | 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 | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/rollback.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/session_ops.py | 16 | 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/providers.py | 57 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/session_recovery.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/workspace_git.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/crash_visibility.py | 50 | __all__ = [ | CODE |
| LOW | api/gateway_watcher.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | api/workspace.py | 451 | def set_last_workspace(path: str) -> None: | CODE |
| LOW | api/workspace.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/streaming.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/helpers.py | 13 | 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 | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | api/profiles.py | 416 | def set_request_profile(name: str) -> None: | CODE |
| LOW | api/shares.py | 29 | 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 | 654 | def _set_flow_status(flow_id: str, status: str, **fields: Any) -> None: | CODE |
| LOW | api/worktrees.py | 13 | 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 | 256 | 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_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 | 141 | _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 | 186 | CODE | |
| LOW | tests/test_sprint42.py | 279 | CODE | |
| LOW | tests/test_sprint42.py | 475 | CODE | |
| LOW | tests/test_sprint42.py | 838 | 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 | api/models.py | 1107 | CODE | |
| LOW | api/runtime_adapter.py | 314 | CODE | |
| LOW | api/workspace_git.py | 208 | CODE | |
| LOW | api/route_session_list_cache.py | 119 | 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 | 611 | # 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 | 864 | # Check if session store is empty | COMMENT |
| LOW⚡ | api/config.py | 874 | # Check if SESSION_INDEX_FILE is absent, empty, or contains only {}|[]|null | COMMENT |
| LOW | api/config.py | 7082 | # Check if user has configured models in config.yaml — | COMMENT |
| LOW | api/providers.py | 2499 | # Check if actually authenticated via hermes_cli. | COMMENT |
| LOW⚡ | api/streaming.py | 8378 | # Check if cancel was requested during agent initialization | COMMENT |
| LOW | api/streaming.py | 2508 | # Check if contains any function_calls/DSML marker (case-insensitive) | COMMENT |