This report presents the forensic synthetic code analysis of andrewyng/openworker, a Python project with 11,856 GitHub stars. SynthScan v2.0 examined 103,194 lines of code across 417 source files, recording 1630 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 16.6 places this repository in the Moderate 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).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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 1630 distinct pattern matches across 13 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 |
|---|---|---|---|---|
| LOW | tests/test_model_errors.py | 12 | def test_new_flagships_in_matrix_with_labels(): | CODE |
| LOW | tests/test_model_errors.py | 26 | def test_flagships_are_the_defaults(): | CODE |
| LOW | tests/test_model_errors.py | 33 | def test_no_access_errors_are_translated(): | CODE |
| LOW | tests/test_model_errors.py | 51 | def test_quota_errors_are_translated(): | CODE |
| LOW | tests/test_model_errors.py | 67 | def test_unrelated_errors_pass_through_raw(): | CODE |
| LOW | tests/test_hubspot_portals.py | 48 | def test_legacy_private_app_default_migrates_to_one_portal(secrets): | CODE |
| LOW | tests/test_hubspot_portals.py | 65 | def test_managed_portals_list_with_access_and_sandbox(secrets): | CODE |
| LOW | tests/test_hubspot_portals.py | 81 | def test_default_repoints_on_disconnect(secrets): | CODE |
| LOW | tests/test_hubspot_portals.py | 113 | def test_tools_pick_the_requested_portal_by_id_or_name(secrets, monkeypatch): | CODE |
| LOW | tests/test_hubspot_portals.py | 136 | def test_hidden_fields_stripped_from_search_and_get(secrets, monkeypatch): | CODE |
| LOW | tests/test_hubspot_portals.py | 167 | def test_no_delete_tool_exists(secrets): | CODE |
| LOW | tests/test_hubspot_portals.py | 179 | def test_write_tools_carry_portal_and_no_stripping_needed(secrets, monkeypatch): | CODE |
| LOW | tests/test_hubspot_portals.py | 203 | def test_managed_callback_lands_in_portal_profile(client): | CODE |
| LOW | tests/test_hubspot_portals.py | 238 | def test_portal_routes_default_and_disconnect(client, monkeypatch): | CODE |
| LOW⚡ | tests/test_todo_tool.py | 18 | def test_schema_param_is_todos_not_items(): | CODE |
| LOW⚡ | tests/test_todo_tool.py | 25 | def test_todos_key_writes_the_list(): | CODE |
| LOW⚡ | tests/test_todo_tool.py | 31 | def test_legacy_items_key_still_executes(): | CODE |
| LOW | tests/test_engine_stop.py | 68 | def test_stop_mid_stream_keeps_partial_text(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 118 | def test_provider_error_mid_stream_keeps_partial_text(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 159 | def test_retry_reruns_failed_turn_without_new_user_message(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 181 | def test_retry_is_noop_unless_tail_is_error_notice(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 199 | def test_stop_while_awaiting_approval(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 231 | def test_stop_skips_remaining_tool_calls(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 268 | def test_interrupt_hook_fires(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 301 | def test_reasoning_streams_persists_and_never_reaches_providers(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 323 | def test_stop_during_thinking_keeps_partial_reasoning(tmp_path): | CODE |
| LOW | tests/test_engine_stop.py | 358 | def test_retry_survives_model_switches(tmp_path): | CODE |
| LOW | tests/test_web_search.py | 40 | def test_tool_returns_results(): | CODE |
| LOW | tests/test_web_search.py | 52 | def test_tool_clamps_max_results(): | CODE |
| LOW | tests/test_web_search.py | 60 | def test_tool_reports_search_errors(): | CODE |
| LOW⚡ | tests/test_web_search.py | 71 | def test_build_provider_default_is_keyless_duckduckgo(): | CODE |
| LOW⚡ | tests/test_web_search.py | 77 | def test_build_provider_third_party_requires_key(): | CODE |
| LOW⚡ | tests/test_web_search.py | 84 | def test_tool_surfaces_missing_key_error(tmp_path): | CODE |
| LOW⚡ | tests/test_web_search.py | 93 | def test_resolve_provider_from_secretstore(tmp_path): | CODE |
| LOW | tests/test_web_search.py | 128 | def test_engine_registers_web_search(tmp_path): | CODE |
| LOW | tests/test_compaction_smoke.py | 52 | def test_long_session_survives_repeated_compaction(tmp_path): | CODE |
| LOW | tests/test_automation_create.py | 19 | def test_create_automation_success(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_automation_create.py | 39 | def test_create_automation_invalid_cron(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_automation_create.py | 53 | def test_create_automation_missing_instructions(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_automation_create.py | 67 | def test_create_automation_requires_schedule(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_connectors_allowlist.py | 47 | def test_connectors_carry_allowlist_and_recent(tmp_path): | CODE |
| LOW | tests/test_connectors_allowlist.py | 78 | def test_allow_then_disallow_mutates_list(tmp_path): | CODE |
| LOW | tests/test_connectors_allowlist.py | 95 | def test_recent_absent_when_no_gateway(tmp_path): | CODE |
| LOW | tests/test_engine.py | 92 | def test_tool_turn_order_and_execution(tmp_path): | CODE |
| LOW | tests/test_engine.py | 117 | def test_write_requires_approval_then_approved(tmp_path): | CODE |
| LOW | tests/test_engine.py | 134 | def test_denied_tool_yields_error_and_continues(tmp_path): | CODE |
| LOW | tests/test_engine.py | 168 | def test_interrupt_between_iterations(tmp_path): | CODE |
| LOW | tests/test_engine.py | 189 | def test_steering_injects_next_turn(tmp_path): | CODE |
| LOW | tests/test_engine.py | 227 | def test_low_risk_tool_calls_run_concurrently(tmp_path): | CODE |
| LOW | tests/test_engine.py | 262 | def test_non_low_risk_tool_calls_stay_sequential(tmp_path): | CODE |
| LOW | tests/test_engine.py | 305 | def test_streaming_emits_deltas(tmp_path): | CODE |
| LOW | tests/test_engine.py | 336 | def test_outbound_adapts_pdf_for_non_pdf_models(tmp_path): | CODE |
| LOW | tests/test_engine.py | 352 | def test_outbound_keeps_pdf_for_native_models(tmp_path): | CODE |
| LOW | tests/test_engine.py | 367 | def test_provider_extras_persist_on_message_and_survive_outbound(tmp_path): | CODE |
| LOW | tests/test_engine.py | 386 | def test_switch_model_appends_notice_only_midsession(tmp_path): | CODE |
| LOW | tests/test_engine.py | 402 | def test_switch_model_warns_when_images_meet_text_only_model(tmp_path): | CODE |
| LOW | tests/test_engine.py | 422 | def test_outbound_replaces_images_for_non_vision_models(tmp_path): | CODE |
| LOW | tests/test_persona_loading.py | 35 | def test_consent_summary_lists_capabilities(): | STRING |
| LOW | tests/test_persona_loading.py | 44 | def test_install_from_dir_lands_disabled_pending_consent(tmp_path): | STRING |
| LOW | tests/test_persona_loading.py | 60 | def test_installed_persona_persists_across_restart(tmp_path): | STRING |
| 937 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/make_update_manifest.py | 27 | CODE | |
| LOW | tests/test_hubspot_portals.py | 9 | CODE | |
| LOW | tests/test_engine_stop.py | 6 | CODE | |
| LOW | tests/test_web_search.py | 7 | CODE | |
| LOW | tests/test_automation_create.py | 7 | CODE | |
| LOW | tests/test_engine.py | 3 | CODE | |
| LOW | tests/test_persona_loading.py | 3 | CODE | |
| LOW | tests/test_risk_overrides.py | 3 | CODE | |
| LOW | tests/test_risk_overrides.py | 8 | CODE | |
| LOW | tests/conftest.py | 9 | CODE | |
| LOW | tests/test_skills_api.py | 8 | CODE | |
| LOW | tests/test_skills_api.py | 14 | CODE | |
| LOW | tests/test_slack_approval_owners.py | 3 | CODE | |
| LOW | tests/test_catalog.py | 8 | CODE | |
| LOW | tests/test_connector_registry.py | 8 | CODE | |
| LOW | tests/test_ui_refresh_e2e.py | 23 | CODE | |
| LOW | tests/test_standing_approvals.py | 8 | CODE | |
| LOW | tests/test_standing_approvals.py | 13 | CODE | |
| LOW | tests/test_inbox.py | 3 | CODE | |
| LOW | tests/test_providers.py | 3 | CODE | |
| LOW | tests/test_message_source.py | 12 | CODE | |
| LOW | tests/test_gemini_provider.py | 5 | CODE | |
| LOW | tests/test_mcp_connectors.py | 8 | CODE | |
| LOW | tests/test_pdf_support.py | 3 | CODE | |
| LOW | tests/test_slack_workspaces.py | 9 | CODE | |
| LOW | tests/test_gateway_inbox_reply.py | 7 | CODE | |
| LOW | tests/test_autotitle.py | 8 | CODE | |
| LOW | tests/test_session_persona.py | 7 | CODE | |
| LOW | tests/test_fake_slack.py | 8 | CODE | |
| LOW | tests/test_gmail_accounts.py | 10 | CODE | |
| LOW | tests/test_anthropic_provider.py | 5 | CODE | |
| LOW | tests/test_subscriptions.py | 5 | CODE | |
| LOW | tests/test_subagent.py | 3 | CODE | |
| LOW | tests/test_accounts.py | 6 | CODE | |
| LOW | tests/test_tools_permissions.py | 3 | CODE | |
| LOW | tests/test_tools_permissions.py | 10 | CODE | |
| LOW | tests/test_slack_relay.py | 5 | CODE | |
| LOW | tests/test_slack_relay.py | 14 | CODE | |
| LOW | tests/test_skills_sessions.py | 8 | CODE | |
| LOW | tests/test_skills_sessions.py | 15 | CODE | |
| LOW | tests/test_bedrock_provider.py | 3 | CODE | |
| LOW | tests/test_vertex_provider.py | 3 | CODE | |
| LOW | tests/test_automation.py | 7 | CODE | |
| LOW | tests/test_message_timestamps.py | 7 | CODE | |
| LOW | tests/test_persona_registry.py | 3 | CODE | |
| LOW | tests/test_inbox_routing.py | 3 | CODE | |
| LOW | tests/test_server.py | 3 | CODE | |
| LOW | tests/test_multiroot.py | 7 | CODE | |
| LOW | tests/test_multiroot.py | 17 | CODE | |
| LOW | tests/test_multiroot.py | 17 | CODE | |
| LOW | tests/test_config.py | 3 | CODE | |
| LOW | tests/test_config.py | 5 | CODE | |
| LOW | tests/test_anthropic_caching.py | 8 | CODE | |
| LOW | tests/test_email_tools.py | 3 | CODE | |
| LOW | tests/test_email_tools.py | 7 | CODE | |
| LOW | tests/test_team_allowlist.py | 9 | CODE | |
| LOW | tests/test_cloud_server.py | 4 | CODE | |
| LOW | tests/test_code_tools.py | 7 | CODE | |
| LOW | tests/test_code_tools.py | 12 | CODE | |
| LOW | tests/test_cloud.py | 9 | CODE | |
| 280 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | coworker/pdf_support.py | 76 | except Exception: | CODE |
| LOW | coworker/pdf_support.py | 95 | except Exception: | CODE |
| LOW | coworker/pdf_support.py | 98 | except Exception as exc: | CODE |
| LOW | coworker/pdf_support.py | 124 | except Exception: | CODE |
| LOW | coworker/pdf_support.py | 193 | except Exception: | CODE |
| LOW | coworker/cloud.py | 682 | except Exception as exc: # malformed manifest: surface, don't crash | CODE |
| LOW | coworker/engine.py | 140 | except Exception: | CODE |
| LOW | coworker/engine.py | 218 | except Exception: | CODE |
| LOW | coworker/engine.py | 306 | except Exception: | CODE |
| LOW | coworker/engine.py | 363 | except Exception as exc: # provider failure | CODE |
| LOW | coworker/engine.py | 495 | except Exception: | CODE |
| LOW | coworker/engine.py | 520 | except Exception: | CODE |
| LOW | coworker/engine.py | 558 | except Exception as exc: # surfaced to the awaiting consumer | CODE |
| LOW | coworker/engine.py | 786 | except Exception as exc: | CODE |
| LOW | coworker/engine.py | 848 | except Exception: | CODE |
| MEDIUM | coworker/engine.py | 548 | def produce(): | CODE |
| LOW | coworker/agent.py | 126 | except Exception: | CODE |
| LOW | coworker/interactions.py | 38 | except Exception: | CODE |
| LOW | coworker/connectors/integration_tools.py | 347 | except Exception as exc: | CODE |
| LOW | coworker/connectors/integration_tools.py | 378 | except Exception: | CODE |
| LOW | coworker/connectors/slack_directory.py | 146 | except Exception as exc: | CODE |
| LOW | coworker/connectors/slack_directory.py | 186 | except Exception as exc: | CODE |
| LOW | coworker/connectors/gateway.py | 117 | except Exception: | CODE |
| LOW | coworker/connectors/gateway.py | 130 | except Exception: | CODE |
| LOW | coworker/connectors/gateway.py | 140 | except Exception: | CODE |
| LOW | coworker/connectors/gateway.py | 181 | except Exception: # bad token / network — skip, don't break the server | CODE |
| LOW | coworker/connectors/gateway.py | 189 | except Exception: | CODE |
| LOW | coworker/connectors/tools.py | 316 | except Exception as exc: | CODE |
| LOW | coworker/connectors/relay_client.py | 118 | except Exception as exc: | CODE |
| LOW | coworker/connectors/relay_client.py | 134 | except Exception: | CODE |
| LOW | coworker/connectors/relay_client.py | 142 | except Exception: | CODE |
| LOW | coworker/connectors/relay_client.py | 167 | except Exception as exc: | CODE |
| LOW | coworker/connectors/relay_client.py | 177 | except Exception: | CODE |
| LOW | coworker/connectors/relay_client.py | 379 | except Exception: | CODE |
| LOW | coworker/connectors/relay_client.py | 417 | except Exception: | CODE |
| LOW | coworker/connectors/relay_client.py | 529 | except Exception: | CODE |
| MEDIUM | coworker/connectors/relay_client.py | 153 | def _reconnect(self) -> None: | CODE |
| LOW | coworker/connectors/github_relay.py | 172 | except Exception as exc: | CODE |
| LOW | coworker/connectors/senders.py | 49 | except Exception as exc: # network / decode | CODE |
| LOW | coworker/connectors/senders.py | 79 | except Exception as exc: | CODE |
| LOW | coworker/connectors/senders.py | 134 | except Exception as exc: | CODE |
| LOW | coworker/connectors/senders.py | 207 | except Exception as exc: # network / decode | CODE |
| LOW | coworker/connectors/descriptors.py | 105 | except Exception as exc: | CODE |
| LOW | coworker/connectors/descriptors.py | 131 | except Exception as exc: | CODE |
| LOW | coworker/connectors/descriptors.py | 154 | except Exception as exc: | CODE |
| LOW | coworker/connectors/descriptors.py | 165 | except Exception: | CODE |
| LOW | coworker/connectors/attribution.py | 43 | except Exception: | CODE |
| LOW | coworker/connectors/browser_automation.py | 105 | except Exception as exc: | CODE |
| LOW | coworker/connectors/browser_automation.py | 136 | except Exception as exc: | CODE |
| LOW | coworker/connectors/browser_automation.py | 155 | except Exception as exc: | CODE |
| LOW | coworker/connectors/browser_automation.py | 194 | except Exception as exc: | CODE |
| LOW | coworker/connectors/browser_automation.py | 209 | except Exception as exc: | CODE |
| LOW | coworker/connectors/browser_automation.py | 243 | except Exception: | CODE |
| LOW | coworker/connectors/browser_automation.py | 257 | except Exception: | CODE |
| LOW | coworker/connectors/browser_automation.py | 264 | except Exception as exc: | CODE |
| MEDIUM | coworker/connectors/email_tools.py | 386 | def _logout(imap) -> None: | CODE |
| LOW⚡ | coworker/connectors/email_tools.py | 662 | except Exception as exc: | CODE |
| LOW⚡ | coworker/connectors/email_tools.py | 666 | except Exception as exc: | CODE |
| LOW⚡ | coworker/connectors/email_tools.py | 671 | except Exception: | CODE |
| LOW⚡ | coworker/connectors/email_tools.py | 827 | except Exception: | CODE |
| 86 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_ui_refresh_e2e.py | 92 | CODE | |
| LOW | tests/test_email_tools.py | 49 | CODE | |
| LOW | coworker/pdf_support.py | 102 | CODE | |
| LOW | coworker/pdf_support.py | 106 | CODE | |
| LOW | coworker/config.py | 105 | CODE | |
| LOW | coworker/audit.py | 123 | CODE | |
| LOW | coworker/subscriptions.py | 141 | CODE | |
| LOW | coworker/attachments.py | 31 | CODE | |
| LOW | coworker/attachments.py | 81 | CODE | |
| LOW | coworker/engine.py | 288 | CODE | |
| LOW | coworker/engine.py | 314 | CODE | |
| LOW | coworker/engine.py | 673 | CODE | |
| LOW | coworker/compaction.py | 269 | CODE | |
| LOW | coworker/compaction.py | 337 | CODE | |
| LOW | coworker/conversations.py | 134 | CODE | |
| LOW | coworker/conversations.py | 168 | CODE | |
| LOW | coworker/roots.py | 33 | CODE | |
| LOW | coworker/connectors/integration_tools.py | 308 | CODE | |
| LOW | coworker/connectors/relay_client.py | 128 | CODE | |
| LOW | coworker/connectors/email_tools.py | 355 | CODE | |
| LOW | coworker/connectors/email_tools.py | 392 | CODE | |
| LOW | coworker/connectors/email_tools.py | 421 | CODE | |
| LOW | coworker/connectors/email_tools.py | 532 | CODE | |
| LOW | coworker/tools/files.py | 50 | CODE | |
| LOW | coworker/tools/files.py | 53 | CODE | |
| LOW | coworker/tools/search.py | 167 | CODE | |
| LOW | coworker/tui/app.py | 173 | CODE | |
| LOW | coworker/tui/app.py | 203 | CODE | |
| LOW | coworker/providers/openai_responses.py | 80 | CODE | |
| LOW | coworker/providers/openai_responses.py | 126 | CODE | |
| LOW | coworker/providers/openai_responses.py | 236 | CODE | |
| LOW | coworker/providers/openai_responses.py | 372 | CODE | |
| LOW | coworker/providers/registry.py | 798 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 120 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 164 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 353 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 400 | CODE | |
| LOW | coworker/providers/openai_provider.py | 408 | CODE | |
| LOW | coworker/providers/openai_provider.py | 479 | CODE | |
| LOW | coworker/providers/openai_provider.py | 211 | CODE | |
| LOW | coworker/providers/anthropic_provider.py | 207 | CODE | |
| LOW | coworker/providers/anthropic_provider.py | 236 | CODE | |
| LOW | coworker/providers/anthropic_provider.py | 457 | CODE | |
| LOW | coworker/providers/anthropic_provider.py | 523 | CODE | |
| LOW | coworker/providers/gemini_provider.py | 138 | CODE | |
| LOW | coworker/providers/gemini_provider.py | 183 | CODE | |
| LOW | coworker/providers/gemini_provider.py | 275 | CODE | |
| LOW | coworker/server/app.py | 167 | CODE | |
| LOW | coworker/server/app.py | 444 | CODE | |
| LOW | coworker/server/app.py | 1138 | CODE | |
| LOW | coworker/server/app.py | 1538 | CODE | |
| LOW | coworker/server/manager.py | 978 | CODE | |
| LOW | coworker/server/manager.py | 1228 | CODE | |
| LOW | coworker/server/manager.py | 1391 | CODE | |
| LOW | coworker/server/manager.py | 2270 | CODE | |
| LOW | coworker/server/manager.py | 2939 | CODE | |
| LOW | coworker/server/manager.py | 3577 | CODE | |
| LOW | coworker/mcp/client.py | 88 | CODE | |
| LOW | coworker/skills/base.py | 64 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_permissions_risk.py | 106 | "git status && rm -rf ~", # chaining | CODE |
| HIGH⚡ | tests/test_permissions_risk.py | 109 | "git status || curl evil", # or-chain | CODE |
| HIGH | coworker/connectors/browser_automation.py | 277 | return style && style.visibility !== 'hidden' && style.display !== 'none' && rect.width > 0 && rect.height > 0; | CODE |
| HIGH | coworker/connectors/browser_automation.py | 280 | if (el.labels && el.labels.length) return Array.from(el.labels).map(l => l.innerText.trim()).filter(Boolean).join(' | CODE |
| HIGH | coworker/connectors/browser_automation.py | 298 | text: (el.innerText || el.value || '').trim().slice(0, 200), | CODE |
| HIGH | coworker/server/app.py | 65 | return 8 # numbers, booleans, null, separators | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | coworker/pdf_support.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | coworker/overrides.py | 70 | def set_rule(self, pattern: str, risk: RiskClass | str) -> None: | CODE |
| LOW | coworker/inbox_routing.py | 85 | def set_persona_default(self, persona_id: str, inbox_name: str) -> None: | CODE |
| LOW | coworker/inbox_routing.py | 90 | def set_session_override(self, session_id: str, inbox_name: str) -> None: | CODE |
| LOW | coworker/conversations.py | 257 | def set_extra_roots(self, session_id: str, extra_roots: list[dict]) -> None: | CODE |
| LOW | coworker/connectors/gateway.py | 62 | def set_handler(self, handler: MessageHandler) -> None: | CODE |
| LOW | coworker/connectors/github_relay.py | 97 | def set_install(self, installation_id: str, info: dict[str, Any]) -> None: | CODE |
| LOW | coworker/connectors/__init__.py | 41 | __all__ = [ | CODE |
| LOW | coworker/connectors/base.py | 151 | def set_message_handler(self, handler: MessageHandler) -> None: | CODE |
| LOW | coworker/connectors/base.py | 154 | def set_interaction_handler(self, handler: InteractionHandler) -> None: | CODE |
| LOW | coworker/connectors/adapters.py | 386 | async def update_message(self, chat_id: str, message_id: str, text: str) -> None: | CODE |
| LOW | coworker/tools/__init__.py | 3 | __all__ = ["ToolRegistry", "ToolSpec"] | CODE |
| LOW | coworker/memory/__init__.py | 5 | __all__ = [ | CODE |
| LOW | coworker/tui/__init__.py | 3 | __all__ = ["CoworkerApp"] | CODE |
| LOW | coworker/web/__init__.py | 17 | __all__ = [ | CODE |
| LOW | coworker/providers/__init__.py | 28 | __all__ = [ | CODE |
| LOW | coworker/agents/__init__.py | 8 | __all__ = [ | CODE |
| LOW | coworker/server/__init__.py | 4 | __all__ = ["create_app", "SessionManager"] | CODE |
| LOW | coworker/mcp/__init__.py | 19 | __all__ = [ | CODE |
| LOW | coworker/mcp/oauth.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | coworker/mcp/oauth.py | 75 | async def set_tokens(self, tokens: OAuthToken) -> None: | CODE |
| LOW⚡ | coworker/mcp/oauth.py | 87 | async def set_client_info(self, info: OAuthClientInformationFull) -> None: | CODE |
| LOW | coworker/personas/registry.py | 295 | def set_enabled(self, persona_id: str, enabled: bool) -> None: | CODE |
| LOW | coworker/personas/registry.py | 306 | def set_surfaced(self, persona_id: str, surfaced: bool) -> None: | CODE |
| LOW | coworker/personas/registry.py | 312 | def set_default(self, persona_id: str) -> None: | CODE |
| LOW | coworker/personas/registry.py | 411 | def set_registry(registry: PersonaRegistry) -> None: | CODE |
| LOW | coworker/personas/__init__.py | 14 | __all__ = [ | CODE |
| LOW | coworker/testing/fake_slack/__init__.py | 10 | __all__ = ["FakeSlack"] | CODE |
| LOW | coworker/skills/store.py | 265 | def set_enabled(self, name: str, enabled: bool) -> None: | CODE |
| LOW | coworker/skills/__init__.py | 10 | __all__ = [ | CODE |
| LOW | coworker/automation/__init__.py | 10 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_message_source.py | 0 | inbound delivery is gated on the connector being connected (§4.3). tests used to pass by riding the developer's real sla | STRING |
| HIGH | tests/test_subscriptions.py | 0 | inbound delivery is gated on the connector being connected (§4.3). tests used to pass by riding the developer's real sla | STRING |
| HIGH | tests/test_dm_routing.py | 0 | inbound delivery is gated on the connector being connected (§4.3). tests used to pass by riding the developer's real sla | STRING |
| HIGH | coworker/connectors/accounts.py | 0 | the default account email: the stored pointer if it still exists, else the first connected account, else "". | STRING |
| HIGH | coworker/connectors/gmail_accounts.py | 0 | the default account email: the stored pointer if it still exists, else the first connected account, else "". | STRING |
| HIGH | coworker/connectors/gcal_accounts.py | 0 | the default account email: the stored pointer if it still exists, else the first connected account, else "". | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 42 | # aiohttp is slack-bolt's Socket Mode transport at runtime (and the FakeSlack test harness | COMMENT |
| MEDIUM | coworker/connectors/adapters.py | 170 | # slack_sdk's own reconnect stays on in production (seamless on Slack's graceful cycling); | COMMENT |
| MEDIUM | coworker/connectors/adapters.py | 194 | # Base-URL override so tests (and the FakeSlack harness) can redirect every Web API | COMMENT |
| MEDIUM | surfaces/gui/src/api.ts | 692 | // bounded per-persona cards. Defaults to "flat" (absent → flat) so the GUI is robust to an older | COMMENT |
| MEDIUM | surfaces/gui/src/api.ts | 706 | // and attach-time thresholds. Optional so the GUI is robust to an older backend. | COMMENT |
| MEDIUM | surfaces/gui/src/api.ts | 712 | // Optional so the GUI is robust to an older backend. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_hubspot_portals.py | 217 | "account": "Acme Inc", | CODE |
| LOW | tests/test_hubspot_portals.py | 230 | "name": "Acme Inc", | CODE |
| LOW | coworker/connectors/descriptors.py | 32 | "placeholder": self.placeholder, | CODE |
| LOW | coworker/connectors/browser_automation.py | 297 | placeholder: el.getAttribute('placeholder') || '', | CODE |
| LOW | coworker/providers/registry.py | 65 | "placeholder": self.placeholder, | CODE |
| LOW | ui-mocks/voice-input-settings.html | 119 | <div class="placeholder">Ask OpenCoworker anything…</div> | CODE |
| LOW | surfaces/gui/e2e/fixtures.ts | 504 | { hub_id: "111", name: "Acme Inc", sandbox: false }, | CODE |
| LOW | surfaces/gui/e2e/provider-keys.spec.ts | 41 | await expect(page.getByTestId("set-field-api_key")).toHaveAttribute("placeholder", "••••••••"); | CODE |
| LOW | surfaces/gui/e2e/provider-keys.spec.ts | 53 | await expect(page.getByTestId("set-field-api_key")).toHaveAttribute("placeholder", "••••••••"); | CODE |
| LOW | surfaces/gui/e2e/onboarding.spec.ts | 81 | await expect(page.getByTestId("ob-field-api_key")).toHaveAttribute("placeholder", "••••••••"); | CODE |
| LOW | surfaces/gui/e2e/hubspot-page.spec.ts | 35 | await expect(page.getByTestId("connector-hubspot")).toContainText("Acme Inc", { | CODE |
| LOW | surfaces/gui/e2e/hubspot-page.spec.ts | 61 | await expect(page.getByTestId("connector-hubspot")).toContainText("Acme Inc", { timeout: 10_000 }); | CODE |
| LOW | surfaces/gui/e2e/hubspot-page.spec.ts | 84 | await expect(page.getByTestId("connector-hubspot")).toContainText("Acme Inc", { timeout: 10_000 }); | CODE |
| LOW | surfaces/gui/e2e/chat.spec.ts | 68 | "reply OK. " + "lorem ipsum dolor sit amet consectetur ".repeat(60) + tail; // ~2.4k chars | CODE |
| LOW | surfaces/gui/e2e/chat.spec.ts | 68 | "reply OK. " + "lorem ipsum dolor sit amet consectetur ".repeat(60) + tail; // ~2.4k chars | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/build_dmg.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/build_dmg.sh | 21 | # `tauri build` signs the .app + the bundled sidecar with it. Left unset → UNSIGNED (first launch | COMMENT |
| LOW | packaging/build_dmg.sh | 81 | # stale onefile binary from pre-onedir builds. | COMMENT |
| LOW | coworker/compaction.py | 21 | # Trigger: min(threshold_pct × context_window, cap_tokens). The cap exists so 1M-context | COMMENT |
| LOW | coworker/connectors/descriptors.py | 61 | # Registry metadata (UI-Refresh §1): the connector's brand color (hex; fallback gray) and a | COMMENT |
| LOW | coworker/connectors/descriptors.py | 81 | # Manual token paste ALWAYS remains available — signed out or in — managed | COMMENT |
| LOW | coworker/providers/openai_provider.py | 321 | COMMENT | |
| LOW | .github/workflows/release.yml | 1 | # Desktop release builds — macOS (.dmg, arm64 + Intel) and Windows (.msi + NSIS .exe). | COMMENT |
| LOW | surfaces/gui/src-tauri/src/lib.rs | 1 | //! OpenWorker desktop shell. | COMMENT |
| LOW | surfaces/gui/src/App.tsx | 781 | } | COMMENT |
| LOW | surfaces/gui/src/streamGate.ts | 1 | // §33 refinement #3 (owner, 2026-07-14 — v2's gate only covered turn START; mid-turn | COMMENT |
| LOW | surfaces/gui/src/paths.ts | 1 | // Last path segment, for displaying a workspace/root as its folder name. Splits on both | COMMENT |
| LOW | surfaces/gui/src/connectors/registry.tsx | 1 | // Connector logo registry — maps a stable `logo` id (from a connector's API descriptor) to the | COMMENT |
| LOW | surfaces/gui/src/components/ConnectorMessageCard.tsx | 1 | // ConnectorMessageCard — renders a connector-delivered inbound message (§3.3) as a structured card: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | coworker/compaction.py | 177 | # -- mechanical extraction (no LLM — zero hallucination risk) ----------------- | COMMENT |
| MEDIUM | coworker/server/app.py | 1450 | # Auto-compaction overrides (OPE-27): threshold % of the context window, the | COMMENT |
| MEDIUM | coworker/server/manager.py | 1839 | # {full id → context window in tokens}, verified matrix entries only — | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | coworker/engine.py | 54 | CODE | |
| LOW | coworker/agent.py | 141 | CODE | |
| LOW | coworker/inbox.py | 116 | CODE | |
| LOW | coworker/connectors/email_tools.py | 421 | CODE | |
| LOW | coworker/providers/vertex_provider.py | 76 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 473 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | coworker/automation/scheduler.py | 91 | async def run_task(self, task: ScheduledTask, *, trigger: str) -> Optional[TaskRun]: | CODE |