This report summarizes scanner evidence for andrewyng/openworker, a Python project with 18,489 GitHub stars. SynthScan examined 237,951 lines of code across 860 source files, recording 4043 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 21.1 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2819 finding(s).
Are imports declared and package/API names verified? 641 finding(s).
Are wrappers, guards, and repeated structures necessary? 3159 finding(s).
Which changes need focused human review? 4043 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 4043 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_run_cli.py | 237 | def test_an_unknown_key_asks_again_and_a_closed_terminal_is_a_no() -> None: | CODE |
| LOW⚡ | tests/test_run_cli.py | 245 | def test_a_file_write_card_shows_its_arguments_and_the_reason() -> None: | CODE |
| LOW⚡ | tests/test_run_cli.py | 254 | def test_the_network_card_offers_this_run_only() -> None: | CODE |
| LOW⚡ | tests/test_run_cli.py | 542 | def test_the_root_cause_is_the_bottom_of_the_chain() -> None: | CODE |
| LOW⚡ | tests/test_run_cli.py | 571 | def test_the_retry_line_says_why_the_model_call_failed(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 68 | def test_a_run_is_saved_under_the_state_folder_by_workspace_path(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 85 | def test_the_workspace_folder_name_is_the_path_with_dashes() -> None: | CODE |
| LOW | tests/test_run_cli.py | 91 | def test_this_computers_settings_are_read_and_not_changed(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 106 | def test_a_run_has_the_connectors_this_computer_has_connected(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 124 | def test_two_runs_in_one_workspace_are_two_sessions(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 134 | def test_the_default_mode_asks_and_with_no_terminal_the_card_is_refused(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 145 | def test_with_no_terminal_a_question_is_answered_by_rule(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 187 | def test_allowed_sites_come_from_the_flag_and_the_file(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 197 | def test_allow_site_says_so_when_no_list_holds_the_run(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 226 | def test_a_command_card_offers_once_this_session_and_no() -> None: | CODE |
| LOW | tests/test_run_cli.py | 278 | def test_a_question_takes_a_number_or_typed_text() -> None: | CODE |
| LOW | tests/test_run_cli.py | 293 | def test_grouped_questions_are_asked_in_turn_and_keyed_by_header() -> None: | CODE |
| LOW | tests/test_run_cli.py | 308 | def test_a_folder_request_is_asked_and_yes_gives_the_folder(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 350 | def test_a_tool_install_is_asked_and_yes_installs_the_pinned_build(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_run_cli.py | 369 | def test_with_auto_answer_the_cards_still_reach_the_person() -> None: | CODE |
| LOW | tests/test_run_cli.py | 425 | def test_at_a_terminal_the_approval_is_asked_and_yes_runs_the_call(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 434 | def test_at_a_terminal_no_refuses_the_call(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 448 | def test_at_a_terminal_a_question_is_asked_there(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 462 | def test_auto_answer_at_a_terminal_answers_the_question_and_still_asks_the_approval(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 475 | def test_ctrl_c_at_a_prompt_ends_the_run_and_leaves_the_record(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 516 | def test_at_a_terminal_a_folder_request_is_asked_and_the_folder_can_then_be_written(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 527 | def test_with_auto_answer_a_folder_request_is_declined_by_rule(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_run_cli.py | 594 | def test_a_stop_signal_ends_the_run_during_the_wait_between_retries(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 38 | def test_claim_self_assigns_an_open_item(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 45 | def test_second_claim_loses_cleanly(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 52 | def test_claim_requires_open_and_unassigned(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 64 | def test_lead_only_policy_blocks_worker_claims(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 74 | def test_policy_defaults_open_and_validates(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 82 | def test_claim_feeds_the_lead_subscription(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 92 | def test_lead_assigns_are_not_subscription_news(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 99 | def test_claim_feeds_journal_grants_like_assignment(store): | CODE |
| LOW⚡ | tests/test_team_open_surface.py | 106 | def test_workers_see_the_claimable_pool(store): | CODE |
| LOW | tests/test_team_open_surface.py | 130 | def test_local_dialect_binds_identity(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 137 | def test_local_dialect_full_worker_loop(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 185 | def test_board_api_requires_a_token(api): | CODE |
| LOW | tests/test_team_open_surface.py | 192 | def test_status_over_http_is_owned_and_never_kicks_a_wake(api, monkeypatch): | CODE |
| LOW | tests/test_team_open_surface.py | 209 | def test_board_api_rejects_the_sidecar_token_as_a_board_token(api): | CODE |
| LOW | tests/test_team_open_surface.py | 218 | def test_token_binds_identity_and_store_enforces_authority(api): | CODE |
| LOW | tests/test_team_open_surface.py | 269 | def test_board_item_reads_hide_foreign_worker_items(api): | CODE |
| LOW | tests/test_team_open_surface.py | 374 | def test_board_item_reads_return_not_found_for_missing_items(api): | CODE |
| LOW | tests/test_team_open_surface.py | 392 | def test_board_item_create_hides_missing_and_foreign_parents(api): | CODE |
| LOW | tests/test_team_open_surface.py | 429 | def test_remote_dialect_round_trip(api): | CODE |
| LOW | tests/test_team_open_surface.py | 483 | def test_pending_and_consume_over_the_wire(api): | CODE |
| LOW | tests/test_team_open_surface.py | 516 | def test_attachment_store_is_content_addressed(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 529 | def test_attachment_store_validates(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 541 | def test_attach_over_the_wire_and_fetch(api): | CODE |
| LOW | tests/test_team_open_surface.py | 586 | def test_board_attachment_read_hides_foreign_worker_reference(api): | CODE |
| LOW | tests/test_team_open_surface.py | 640 | def test_board_attachment_read_requires_token(api): | CODE |
| LOW | tests/test_team_open_surface.py | 652 | def test_board_attachment_read_rejects_malformed_name(api): | CODE |
| LOW | tests/test_team_open_surface.py | 668 | def test_board_attachment_read_hides_unreferenced_blob(api): | CODE |
| LOW | tests/test_team_open_surface.py | 687 | def test_board_attachment_read_hides_missing_referenced_blob(api): | CODE |
| LOW | tests/test_team_open_surface.py | 722 | def test_local_attachment_read_tracks_worker_visibility(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 753 | def test_local_attachment_read_allows_a_visible_deduplicated_reference(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 783 | def test_local_attachment_read_rejects_forged_comment_and_transition_refs(tmp_path): | CODE |
| LOW | tests/test_team_open_surface.py | 815 | def test_legacy_attachment_refs_are_grandfathered_across_rebuild(tmp_path): | CODE |
| 2504 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_durable_resume.py | 51 | except asyncio.CancelledError: | CODE |
| HIGH | tests/test_providers.py | 233 | except RuntimeError: | CODE |
| HIGH | tests/test_skills_store.py | 127 | except ValueError: | CODE |
| HIGH | coworker/catalog.py | 96 | except (AttributeError, TypeError): | CODE |
| HIGH | coworker/sessions.py | 79 | except (TypeError, ValueError): | CODE |
| HIGH | coworker/audit.py | 79 | except sqlite3.OperationalError: | CODE |
| HIGH | coworker/audit.py | 147 | except Exception: | CODE |
| HIGH | coworker/cloud.py | 670 | except httpx.HTTPError: | CODE |
| HIGH | coworker/cloud.py | 735 | except ValueError: | CODE |
| HIGH | coworker/cloud.py | 764 | except httpx.HTTPError: | CODE |
| HIGH | coworker/cloud.py | 784 | except httpx.HTTPError: | CODE |
| HIGH | coworker/cloud.py | 829 | except httpx.HTTPError: | CODE |
| HIGH | coworker/statelock.py | 115 | except OSError: | CODE |
| HIGH | coworker/statelock.py | 62 | except OSError: | CODE |
| HIGH | coworker/subscriptions.py | 187 | except OSError: | CODE |
| HIGH | coworker/subscriptions.py | 160 | except (OSError, ValueError, AttributeError): | CODE |
| HIGH | coworker/engine.py | 1460 | except Exception: | CODE |
| HIGH | coworker/engine.py | 2146 | except Exception: | CODE |
| HIGH | coworker/engine.py | 2160 | except Exception: | CODE |
| HIGH | coworker/engine.py | 343 | except Exception: | CODE |
| HIGH | coworker/engine.py | 1262 | except Exception: # noqa: BLE001 - a broken getter must not open a card nobody sees | CODE |
| HIGH | coworker/engine.py | 1493 | except Exception: | CODE |
| HIGH | coworker/engine.py | 1539 | except Exception: | CODE |
| HIGH | coworker/engine.py | 1028 | except OSError: | CODE |
| HIGH | coworker/secrets.py | 117 | except OSError: | CODE |
| HIGH | coworker/secrets.py | 93 | except OSError: | CODE |
| HIGH | coworker/secrets.py | 200 | except OSError: | CODE |
| HIGH | coworker/secrets.py | 132 | except OSError: | CODE |
| HIGH | coworker/secrets.py | 183 | except (OSError, ImportError): | CODE |
| HIGH | coworker/mentions.py | 75 | except OSError: | CODE |
| HIGH | coworker/interactions.py | 39 | except Exception: | CODE |
| HIGH | coworker/projects.py | 179 | except Exception: | CODE |
| HIGH | coworker/projects.py | 208 | except Exception: | CODE |
| HIGH | coworker/projects.py | 223 | except Exception: | CODE |
| HIGH | coworker/projects.py | 229 | except Exception: | CODE |
| HIGH | coworker/conversations.py | 121 | except sqlite3.OperationalError: | CODE |
| HIGH | coworker/connectors/integration_tools.py | 378 | except Exception: | CODE |
| HIGH | coworker/connectors/machine_poll.py | 74 | except asyncio.TimeoutError: | CODE |
| HIGH | coworker/connectors/machine_poll.py | 161 | except Exception: | CODE |
| HIGH | coworker/connectors/relay_client.py | 191 | except Exception: | CODE |
| HIGH | coworker/connectors/relay_client.py | 553 | except Exception: | CODE |
| HIGH | coworker/connectors/senders.py | 40 | except ValueError: | CODE |
| HIGH | coworker/connectors/email_tools.py | 389 | except Exception: | CODE |
| HIGH | coworker/connectors/email_tools.py | 671 | except Exception: | CODE |
| HIGH | coworker/connectors/email_tools.py | 827 | except Exception: | CODE |
| HIGH | coworker/connectors/email_tools.py | 838 | except Exception: | CODE |
| HIGH | coworker/connectors/email_tools.py | 412 | except Exception: | CODE |
| HIGH | coworker/connectors/adapters.py | 371 | except Exception: | CODE |
| HIGH | coworker/connectors/parked.py | 66 | except OSError: | CODE |
| HIGH | coworker/memory/tools.py | 61 | except Exception: | CODE |
| HIGH | coworker/web/fetch.py | 73 | except Exception: | CODE |
| HIGH | coworker/providers/openai_responses.py | 450 | except Exception: | CODE |
| HIGH | coworker/providers/openrouter_auth.py | 143 | except (ValueError, UnicodeError, asyncio.TimeoutError): | CODE |
| HIGH | coworker/providers/openrouter_auth.py | 153 | except ConnectionError: | CODE |
| HIGH | coworker/providers/local_machine.py | 72 | except (AttributeError, ValueError, OSError): | CODE |
| HIGH | coworker/providers/codex_auth.py | 377 | except Exception: | CODE |
| HIGH | coworker/providers/router.py | 44 | except Exception: | CODE |
| HIGH | coworker/server/run.py | 124 | except Exception: | CODE |
| HIGH | coworker/server/run.py | 58 | except PermissionError: | CODE |
| HIGH | coworker/server/app.py | 3439 | except WebSocketDisconnect: | CODE |
| 136 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/make_update_manifest.py | 27 | CODE | |
| LOW | tests/test_run_cli.py | 7 | CODE | |
| LOW | tests/test_hubspot_portals.py | 9 | CODE | |
| LOW | tests/test_sandbox_windows.py | 9 | CODE | |
| LOW | tests/test_engine_stop.py | 6 | CODE | |
| LOW | tests/test_web_search.py | 7 | CODE | |
| LOW | tests/test_toolchain.py | 7 | CODE | |
| LOW | tests/test_session_usage.py | 5 | CODE | |
| LOW | tests/test_openshell_inside.py | 5 | CODE | |
| LOW | tests/test_sandbox_openshell.py | 8 | CODE | |
| LOW | tests/test_provenance.py | 7 | CODE | |
| LOW | tests/test_provenance.py | 10 | 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_matrix_current_models.py | 10 | CODE | |
| LOW | tests/test_risk_overrides.py | 9 | CODE | |
| LOW | tests/test_risk_overrides.py | 16 | 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_network_access.py | 9 | CODE | |
| LOW | tests/test_network_access.py | 14 | CODE | |
| LOW | tests/test_team_live_gaps.py | 4 | CODE | |
| LOW | tests/test_compaction_transcript.py | 5 | CODE | |
| LOW | tests/test_compaction_transcript.py | 8 | CODE | |
| LOW | tests/test_openai_provider.py | 8 | CODE | |
| LOW | tests/test_shell_non_utf8_output.py | 9 | CODE | |
| LOW | tests/test_openrouter_auth.py | 3 | CODE | |
| LOW | tests/test_slack_approval_owners.py | 3 | CODE | |
| LOW | tests/test_shadow_eval.py | 9 | 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_worker_connectors.py | 7 | CODE | |
| LOW | tests/test_standing_approvals.py | 8 | CODE | |
| LOW | tests/test_standing_approvals.py | 13 | CODE | |
| LOW | tests/test_reviewer_persona.py | 6 | 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_sandbox_seatbelt.py | 8 | CODE | |
| LOW | tests/test_readonly_scoping.py | 9 | CODE | |
| LOW | tests/test_readonly_scoping.py | 11 | CODE | |
| LOW | tests/test_gemini_provider.py | 5 | CODE | |
| LOW | tests/test_sandbox_lifetime.py | 4 | CODE | |
| LOW | tests/test_tool_request.py | 7 | CODE | |
| LOW | tests/test_audit_export.py | 3 | CODE | |
| LOW | tests/test_mcp_connectors.py | 8 | CODE | |
| LOW | tests/test_dangerous_mode.py | 10 | CODE | |
| LOW | tests/test_pdf_support.py | 3 | CODE | |
| LOW | tests/test_slack_workspaces.py | 9 | CODE | |
| LOW | tests/test_headless_run.py | 8 | CODE | |
| LOW | tests/test_sandbox_selection.py | 4 | CODE | |
| LOW | tests/test_local_server.py | 5 | CODE | |
| LOW | tests/test_local_server.py | 12 | 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 | |
| 531 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_run_cli.py | 550 | except Exception as low: | CODE |
| LOW⚡ | tests/test_run_cli.py | 552 | except Exception as mid: | CODE |
| LOW⚡ | tests/test_run_cli.py | 554 | except Exception as top: | CODE |
| LOW⚡ | tests/test_run_cli.py | 560 | except Exception as low: | CODE |
| LOW⚡ | tests/test_run_cli.py | 562 | except Exception as top: | CODE |
| LOW | tests/test_sandbox_tools.py | 75 | except Exception as exc: | CODE |
| 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/audit.py | 147 | except Exception: | CODE |
| LOW | coworker/cloud.py | 852 | except Exception as exc: # malformed manifest: surface, don't crash | CODE |
| MEDIUM | coworker/engine.py | 1059 | def produce(): | CODE |
| MEDIUM | coworker/engine.py | 1330 | def _review_inputs(self) -> tuple[str, list[dict[str, Any]], dict]: | CODE |
| MEDIUM | coworker/engine.py | 1518 | def _shadow() -> None: | CODE |
| LOW | coworker/engine.py | 343 | except Exception: | CODE |
| LOW | coworker/engine.py | 475 | except Exception: | CODE |
| LOW | coworker/engine.py | 546 | except Exception as exc: | CODE |
| LOW | coworker/engine.py | 630 | except Exception: | CODE |
| LOW | coworker/engine.py | 691 | except Exception as exc: # provider failure | CODE |
| LOW | coworker/engine.py | 983 | except Exception: | CODE |
| LOW | coworker/engine.py | 1008 | except Exception: | CODE |
| LOW | coworker/engine.py | 1069 | except Exception as exc: # surfaced to the awaiting consumer | CODE |
| LOW | coworker/engine.py | 1252 | except Exception: # noqa: BLE001 - a broken getter must read as attended | CODE |
| LOW | coworker/engine.py | 1262 | except Exception: # noqa: BLE001 - a broken getter must not open a card nobody sees | CODE |
| LOW | coworker/engine.py | 1335 | except Exception: | CODE |
| LOW | coworker/engine.py | 1460 | except Exception: | CODE |
| LOW | coworker/engine.py | 1493 | except Exception: | CODE |
| LOW | coworker/engine.py | 1539 | except Exception: | CODE |
| LOW | coworker/engine.py | 2010 | except Exception as exc: | CODE |
| LOW | coworker/engine.py | 2146 | except Exception: | CODE |
| LOW | coworker/engine.py | 2160 | except Exception: | CODE |
| LOW | coworker/engine.py | 2425 | except Exception as exc: # noqa: BLE001 - the agent must hear why | CODE |
| LOW | coworker/engine.py | 2518 | except Exception: # noqa: BLE001 - evidence is a help, never a reason to fail the card | CODE |
| LOW | coworker/reviewer.py | 417 | except Exception as exc: | CODE |
| LOW | coworker/agent.py | 197 | except Exception: | CODE |
| LOW | coworker/agent.py | 772 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | coworker/permissions.py | 780 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | coworker/permissions.py | 843 | except Exception: # noqa: BLE001 - an unknown provider reads as "not allowed" | CODE |
| LOW | coworker/interactions.py | 39 | except Exception: | CODE |
| LOW | coworker/projects.py | 179 | except Exception: | CODE |
| LOW | coworker/projects.py | 208 | except Exception: | CODE |
| LOW | coworker/projects.py | 223 | except Exception: | CODE |
| LOW | coworker/projects.py | 229 | except Exception: | CODE |
| LOW | coworker/connectors/chat_tools.py | 201 | except Exception as exc: # noqa: BLE001 — surfaced to the model as a tool error | 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 | 122 | except Exception: | CODE |
| LOW | coworker/connectors/gateway.py | 135 | except Exception: | CODE |
| LOW | coworker/connectors/gateway.py | 145 | except Exception: | CODE |
| LOW | coworker/connectors/gateway.py | 186 | except Exception: # bad token / network — skip, don't break the server | CODE |
| LOW | coworker/connectors/gateway.py | 194 | except Exception: | CODE |
| LOW | coworker/connectors/machine_poll.py | 149 | except Exception as exc: | CODE |
| LOW | coworker/connectors/machine_poll.py | 161 | except Exception: | CODE |
| LOW | coworker/connectors/tools.py | 324 | except Exception as exc: | CODE |
| LOW | coworker/connectors/relay_client.py | 119 | except Exception as exc: | CODE |
| LOW | coworker/connectors/relay_client.py | 132 | except Exception: | CODE |
| 267 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_sandbox_openshell.py | 397 | assert ex.run("cat hello.txt && cd /tmp && export KEEP=yes")["exit_code"] == 0 | CODE |
| HIGH | tests/test_sandbox_openshell.py | 429 | ex.run("cd /tmp && export KEEP=yes") | CODE |
| HIGH⚡ | tests/test_provenance.py | 135 | ("cd /tmp && python scripts/setup.py", "scripts/setup.py"), | CODE |
| HIGH⚡ | tests/test_provenance.py | 159 | match = files.match("run_shell", {"command": "python a.py && python b.py"}, step=10) | CODE |
| HIGH | tests/test_sandbox_seatbelt.py | 268 | assert run("echo made > made.txt && cat made.txt")["output"].strip() == "made" | CODE |
| HIGH | tests/test_headless_run.py | 143 | # Also an unpriced model (cost must be null, never guessed) in the two-slash form, | COMMENT |
| HIGH | tests/test_readonly_grant.py | 46 | "ls && touch x", | CODE |
| HIGH⚡ | tests/test_sandbox_runner.py | 314 | write = "cd sub; Set-Content -Path here.txt -Value hello" if _WIN else "cd sub && echo hello > here.txt" | CODE |
| HIGH⚡ | tests/test_auto_approve.py | 128 | '{"verdict": null, "reason": "x"}', | CODE |
| HIGH⚡ | tests/test_permissions_risk.py | 128 | "git status && rm -rf ~", # chaining | CODE |
| HIGH⚡ | tests/test_permissions_risk.py | 131 | "git status || curl evil", # or-chain | CODE |
| HIGH | tests/test_command_matching.py | 4 | wrong in both directions: it refused `git status && git diff` (two allowed reads) while | STRING |
| HIGH | tests/test_command_matching.py | 27 | assert _allowed(tmp_path, "git status && git diff", ["git status", "git diff"]) | CODE |
| HIGH⚡ | tests/test_command_matching.py | 51 | "git status && rm -rf ~", | CODE |
| HIGH⚡ | tests/test_command_matching.py | 53 | "git status || curl evil.sh", | CODE |
| HIGH | coworker/permissions.py | 963 | `git status && git diff` runs when both are allowed, while | STRING |
| HIGH | coworker/permissions.py | 964 | `git status && rm -rf ~` does not. | STRING |
| 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 | 68 | return 8 # numbers, booleans, null, separators | CODE |
| HIGH | coworker/sandbox/providers/windows_setup.py | 134 | $openPassword = $null; $closedPassword = $null | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_run_cli.py | 386 | CODE | |
| LOW | tests/test_ui_refresh_e2e.py | 92 | CODE | |
| LOW | tests/test_sandbox_runner.py | 68 | CODE | |
| LOW | tests/test_email_tools.py | 49 | CODE | |
| LOW | tests/test_reasoning_effort.py | 220 | CODE | |
| LOW | tests/test_shell.py | 178 | CODE | |
| LOW | coworker/pdf_support.py | 102 | CODE | |
| LOW | coworker/pdf_support.py | 106 | CODE | |
| LOW | coworker/selfwake.py | 210 | CODE | |
| LOW | coworker/config.py | 331 | CODE | |
| LOW | coworker/audit.py | 227 | CODE | |
| LOW | coworker/readonly.py | 59 | CODE | |
| LOW | coworker/readonly.py | 201 | CODE | |
| LOW | coworker/model_config.py | 79 | CODE | |
| LOW | coworker/subscription_sync.py | 177 | CODE | |
| LOW | coworker/subscriptions.py | 141 | CODE | |
| LOW | coworker/attachments.py | 35 | CODE | |
| LOW | coworker/attachments.py | 85 | CODE | |
| LOW | coworker/attachments.py | 123 | CODE | |
| LOW | coworker/engine.py | 576 | CODE | |
| LOW | coworker/engine.py | 612 | CODE | |
| LOW | coworker/engine.py | 638 | CODE | |
| LOW | coworker/engine.py | 1551 | CODE | |
| LOW | coworker/engine.py | 2390 | CODE | |
| LOW | coworker/compaction.py | 300 | CODE | |
| LOW | coworker/compaction.py | 424 | CODE | |
| LOW | coworker/permissions.py | 427 | CODE | |
| LOW | coworker/toolchain.py | 235 | CODE | |
| LOW | coworker/provenance.py | 172 | CODE | |
| LOW | coworker/conversations.py | 160 | CODE | |
| LOW | coworker/conversations.py | 279 | CODE | |
| LOW | coworker/conversations.py | 313 | CODE | |
| LOW | coworker/roots.py | 33 | CODE | |
| LOW | coworker/roots.py | 61 | CODE | |
| LOW | coworker/connectors/integration_tools.py | 308 | 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/ask.py | 277 | CODE | |
| LOW | coworker/tui/app.py | 179 | CODE | |
| LOW | coworker/tui/app.py | 209 | CODE | |
| LOW | coworker/providers/ollama_context.py | 346 | CODE | |
| LOW | coworker/providers/openai_responses.py | 82 | CODE | |
| LOW | coworker/providers/openai_responses.py | 128 | CODE | |
| LOW | coworker/providers/openai_responses.py | 256 | CODE | |
| LOW | coworker/providers/openai_responses.py | 403 | CODE | |
| LOW | coworker/providers/registry.py | 1038 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 124 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 168 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 357 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 404 | CODE | |
| LOW | coworker/providers/openai_provider.py | 612 | CODE | |
| LOW | coworker/providers/openai_provider.py | 683 | CODE | |
| LOW | coworker/providers/openai_provider.py | 346 | CODE | |
| LOW | coworker/providers/openrouter_auth.py | 118 | CODE | |
| LOW | coworker/providers/local_server.py | 91 | CODE | |
| LOW | coworker/providers/local_machine.py | 175 | CODE | |
| LOW | coworker/providers/model_controls.py | 136 | CODE | |
| LOW | coworker/providers/anthropic_provider.py | 255 | CODE | |
| 73 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/build_macos_cli.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/install.sh | 1 | #!/bin/sh | COMMENT |
| LOW | packaging/build_linux.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packaging/setup_dev_env.sh | 1 | #!/usr/bin/env bash | COMMENT |
| 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 | fi | COMMENT |
| LOW | packaging/openshell/providers/openworker-openai.yaml | 1 | # OpenShell provider profile: OpenWorker calling OpenAI models. | COMMENT |
| LOW | packaging/openshell/providers/openworker-anthropic.yaml | 1 | # OpenShell provider profile: OpenWorker calling Anthropic models. | COMMENT |
| LOW | coworker/sessions.py | 41 | # Persisted so a reloaded session keeps its compacted outbound view. | COMMENT |
| LOW | coworker/config.py | 41 | mode: str = "interactive" | COMMENT |
| LOW | coworker/config.py | 61 | # at min(80% of the model's window, this cap); the built-in cap is 250,000, which on a | COMMENT |
| LOW | coworker/config.py | 81 | # that judges would-be approval cards in Mode.AUTO_APPROVE. Off by default; user-global | COMMENT |
| LOW | coworker/config.py | 101 | cloud_client_id: str = "g1l4Q1lhYWmyS03qPSf4KEJGrgq02Qam" | COMMENT |
| LOW | coworker/config.py | 121 | sandbox_provider: Optional[str] = None | COMMENT |
| LOW | coworker/engine.py | 181 | # Returns an ephemeral `<system-context>` block appended to the LAST user message at | COMMENT |
| LOW | coworker/engine.py | 201 | self.team_approver = team_approver | COMMENT |
| LOW | coworker/engine.py | 221 | # getter returning "attended" / "inbox" / "auto"; None reads as attended. In "auto" | COMMENT |
| LOW | coworker/engine.py | 241 | # the owner-hit 2026-08-24 was a 2-denial cumulative trip silently downgrading a | COMMENT |
| LOW | coworker/engine.py | 261 | self.reviewer_shadow = False | COMMENT |
| LOW | coworker/engine.py | 281 | # PERMISSION_REQUIRED payload — e.g. web_search's live provider name, so the card | COMMENT |
| LOW | coworker/engine.py | 381 | # -- main loop -------------------------------------------------------------- | COMMENT |
| LOW | coworker/engine.py | 2841 | ) | COMMENT |
| LOW | coworker/engine.py | 2901 | "role": "assistant", | COMMENT |
| LOW | coworker/agent.py | 241 | # Twentieth pass: the project key memory loads/saves under. Defaults to the | COMMENT |
| LOW | coworker/agent.py | 301 | # The session's directories. Explicit `roots` (orphan Cowork: scratch + added folders) wins; | COMMENT |
| LOW | coworker/agent.py | 561 | # Per-session effective menu (SKILLS-SPEC §3). The manager passes a CALLABLE so | COMMENT |
| LOW | coworker/agent.py | 621 | COMMENT | |
| LOW | coworker/agent.py | 821 | "If required for your assignment, comment on the item and transition it to blocked, " | COMMENT |
| LOW | coworker/compaction.py | 21 | # Trigger: min(threshold_pct × context_window, cap_tokens). The cap exists so 1M-context | COMMENT |
| LOW | coworker/permissions.py | 261 | # folders, files that run later such as git hooks / CI configs, and authority that | COMMENT |
| LOW | coworker/permissions.py | 301 | class Decision: | COMMENT |
| LOW | coworker/permissions.py | 361 | # (the session is not sandboxed, or its network setting is "Allow everything"). A list, | COMMENT |
| LOW | coworker/permissions.py | 381 | site_open_errors: dict[str, str] = field(default_factory=dict) | COMMENT |
| LOW | coworker/risk.py | 21 | WRITE_LOCAL = "write_local" # mutates the workspace — path-scoped + mode-gated | 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/tools/ask.py | 21 | COMMENT | |
| LOW | coworker/providers/matrix.py | 281 | # GLM 5.3 via OpenRouter (openrouter.ai/api/v1/models/z-ai/glm-5.3/endpoints, read | COMMENT |
| LOW | coworker/providers/openai_provider.py | 221 | base_url: Optional[str] = None, | COMMENT |
| LOW | coworker/providers/anthropic_provider.py | 61 | # with the default cap, so above the ceiling the request carries an explicit timeout sized | COMMENT |
| LOW | coworker/providers/base.py | 61 | raw: Any = field(default=None, repr=False, compare=False) | COMMENT |
| LOW | coworker/agents/base.py | 41 | # read-only explorer fan-out. scheduling: scheduled tasks + self-wake. messaging: | COMMENT |
| LOW | coworker/server/app.py | 2941 | COMMENT | |
| LOW | coworker/server/manager.py | 2301 | # Removing a server must not leave its connection running until the next | COMMENT |
| LOW | coworker/server/manager.py | 8181 | # sleeping (a self-wake is pending) / idle — a count-less dot that never bubbles. | COMMENT |
| LOW | coworker/personas/manifest.py | 81 | # `all` sentinel, reserved for built-in general personas. Coarser grants leaked | COMMENT |
| LOW | coworker/headless/runner.py | 221 | # re-enters the conversation with a nudge, up to ~18 minutes in total. Permanent errors | COMMENT |
| LOW | docs/config.example.toml | 1 | # coworker config — copy to one of: | COMMENT |
| LOW | docs/config.example.toml | 41 | # sandbox_network_profile = "allowlist" | COMMENT |
| LOW | docs/config.example.toml | 61 | # [[sandbox_toolchains]] | COMMENT |
| LOW | .github/workflows/release.yml | 1 | # Desktop release builds — macOS (.dmg, arm64 + Intel) and Windows (.msi + NSIS .exe) — and | COMMENT |
| LOW | .github/workflows/image.yml | 1 | # The OpenWorker CLI image (packaging/openshell/Dockerfile), published to GitHub's container | COMMENT |
| LOW | surfaces/gui/src-tauri/src/lib.rs | 1 | //! OpenWorker desktop shell. | COMMENT |
| LOW | surfaces/gui/src-tauri/src/lib.rs | 101 | /// — so every tool the user installed via Homebrew/nvm/pyenv/asdf is invisible to the agent: | COMMENT |
| LOW | surfaces/gui/src-tauri/src/lib.rs | 201 | /// Windows GUI apps inherit the user's full environment already. | COMMENT |
| LOW | surfaces/gui/src/routes.ts | 1 | // Hash deep links, v1 (owner-ruled 2026-08-30: hash-based; the full routing | COMMENT |
| LOW | surfaces/gui/src/App.tsx | 261 | // The server refused to build this session (its sandbox cannot be used) and closed the | COMMENT |
| LOW | surfaces/gui/src/itemsFromMessages.ts | 1 | // Maps the raw transcript from GET /v1/sessions/{id}/messages into the GUI's `Item[]` model. | 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 |
| 14 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | coworker/pdf_support.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | coworker/selfwake.py | 194 | def set_stopped(self, session_id: str, stopped: bool) -> None: | CODE |
| LOW | coworker/overrides.py | 109 | def set_rule(self, pattern: str, risk: RiskClass | str) -> None: | CODE |
| LOW | coworker/overrides.py | 144 | def set_trust(self, pattern: str) -> None: | CODE |
| LOW | coworker/engine.py | 69 | logger = logging.getLogger(__name__) | CODE |
| LOW | coworker/inbox_routing.py | 82 | def set_persona_default(self, persona_id: str, inbox_name: str) -> None: | CODE |
| LOW | coworker/inbox_routing.py | 87 | def set_session_override(self, session_id: str, inbox_name: str) -> None: | CODE |
| LOW | coworker/mentions.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | coworker/conversations.py | 431 | def set_spawn(self, session_id: str, spawn: dict) -> None: | CODE |
| LOW | coworker/conversations.py | 441 | def set_team(self, session_id: str, team: dict) -> None: | CODE |
| LOW | coworker/conversations.py | 461 | def set_bindings(self, session_id: str, bindings: dict) -> None: | CODE |
| LOW | coworker/conversations.py | 472 | def set_extra_roots(self, session_id: str, extra_roots: list[dict]) -> None: | CODE |
| LOW | coworker/connectors/gateway.py | 67 | def set_handler(self, handler: MessageHandler) -> None: | CODE |
| LOW | coworker/connectors/github_relay.py | 106 | 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 | 165 | def set_message_handler(self, handler: MessageHandler) -> None: | CODE |
| LOW | coworker/connectors/base.py | 168 | def set_interaction_handler(self, handler: InteractionHandler) -> None: | CODE |
| LOW | coworker/connectors/adapters.py | 394 | 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 | 14 | __all__ = [ | CODE |
| LOW | coworker/tui/__init__.py | 3 | __all__ = ["CoworkerApp"] | CODE |
| LOW | coworker/web/__init__.py | 17 | __all__ = [ | CODE |
| LOW | coworker/providers/__init__.py | 29 | __all__ = [ | CODE |
| LOW | coworker/providers/codex_auth.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | coworker/providers/anthropic_provider.py | 66 | logger = logging.getLogger(__name__) | 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 | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | coworker/mcp/oauth.py | 98 | async def set_tokens(self, tokens: OAuthToken) -> None: | CODE |
| LOW | coworker/mcp/oauth.py | 115 | async def set_client_info(self, info: OAuthClientInformationFull) -> None: | CODE |
| LOW | coworker/personas/registry.py | 351 | def set_enabled(self, persona_id: str, enabled: bool) -> None: | CODE |
| LOW | coworker/personas/registry.py | 362 | def set_surfaced(self, persona_id: str, surfaced: bool) -> None: | CODE |
| LOW | coworker/personas/registry.py | 368 | def set_default(self, persona_id: str) -> None: | CODE |
| LOW | coworker/personas/registry.py | 566 | 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/sandbox/setup_job.py | 50 | def _set_row(self, key: str, **changes: Any) -> None: | CODE |
| LOW | coworker/teams/store.py | 454 | def _set_cursor(self, key: str, seq: int) -> None: | CODE |
| LOW | coworker/teams/registry.py | 117 | def set_paused(self, team_id: str, paused: bool) -> None: | CODE |
| LOW | coworker/teams/__init__.py | 18 | __all__ = [ | 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 |
| LOW | coworker/remote/registry.py | 241 | def set_seal_pubkey(self, machine_id: str, seal_pubkey: str) -> None: | CODE |
| LOW | coworker/remote/stores.py | 53 | def set_seal_pubkey(self, machine_id: str, seal_pubkey: str) -> None: ... | CODE |
| LOW | coworker/remote/stores.py | 109 | def update_grant(self, device_code: str, **fields: Any) -> None: ... | CODE |
| LOW | coworker/remote/stores.py | 183 | def update_grant(self, device_code: str, **fields: Any) -> None: | CODE |
| LOW | coworker/remote/audit_export.py | 244 | def set_policy(self, policy: ExportPolicy) -> None: | 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 |
| HIGH | coworker/sandbox/providers/seatbelt.py | 0 | tests only: what a sandbox restart looks like from the client's side. | STRING |
| HIGH | coworker/sandbox/providers/runner_local.py | 0 | tests only: what a sandbox restart looks like from the client's side. | STRING |
| HIGH | coworker/sandbox/providers/windows.py | 0 | tests only: what a sandbox restart looks like from the client's side. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 50 | # aiohttp is slack-bolt's Socket Mode transport at runtime (and the FakeSlack test harness | COMMENT |
| MEDIUM⚡ | tests/test_shadow_eval.py | 355 | # if the harness passes one. Tag and field must agree in both directions, so a row | COMMENT |
| MEDIUM | tests/test_shadow_eval.py | 168 | # -- harness scoring (scripts/eval_reviewer.py) ---------------------------------- | COMMENT |
| MEDIUM | tests/test_shadow_eval.py | 189 | # claims to test (the trap that hid until the harness was wired for it). | COMMENT |
| MEDIUM⚡ | tests/test_worker_connectors.py | 550 | # The harness must resolve a real original action before allowing a proxy. | COMMENT |
| MEDIUM | tests/test_headless_run.py | 380 | # A harness whose output contract lives outside the workspace (CyberGym: /output). | COMMENT |
| MEDIUM | tests/test_remote_home.py | 168 | # -- loopback harness ---------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_shell.py | 195 | # (robust to a one-tick gap between chunks). Bounded and cheap — | COMMENT |
| MEDIUM | coworker/connectors/adapters.py | 178 | # slack_sdk's own reconnect stays on in production (seamless on Slack's graceful cycling); | COMMENT |
| MEDIUM | coworker/connectors/adapters.py | 202 | # Base-URL override so tests (and the FakeSlack harness) can redirect every Web API | COMMENT |
| MEDIUM | surfaces/gui/src/api.ts | 1188 | // bounded per-persona cards. Defaults to "flat" (absent → flat) so the GUI is robust to an older | COMMENT |
| MEDIUM | surfaces/gui/src/api.ts | 1209 | // and attach-time thresholds. Optional so the GUI is robust to an older backend. | COMMENT |
| MEDIUM | surfaces/gui/src/api.ts | 1215 | // 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⚡ | tests/test_codex_provider.py | 156 | assert result == {"ok": True, "account": "user@example.com"} | CODE |
| LOW⚡ | tests/test_codex_provider.py | 164 | assert profile["account_email"] == "user@example.com" | CODE |
| LOW⚡ | tests/test_codex_provider.py | 448 | assert result == {"ok": True, "account": "user@example.com"} | CODE |
| LOW | tests/test_codex_provider.py | 51 | def _id_token(email: str = "user@example.com", account: str = "acct_1") -> str: | CODE |
| LOW | tests/test_codex_provider.py | 136 | "id_token": _id_token("user@example.com"), | CODE |
| LOW | tests/test_codex_provider.py | 544 | return {"ok": True, "account": "user@example.com"} | 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/scripts/export-scenario.py | 47 | text = EMAIL.sub("user@example.com", text) | CODE |
| LOW | surfaces/gui/e2e/fixtures.ts | 564 | { 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 |
| LOW | surfaces/gui/src/locales/zh.json | 147 | "placeholder": "问问同事…", | CODE |
| LOW | surfaces/gui/src/locales/zh.json | 725 | "placeholder": "搜索会话", | CODE |
| LOW | surfaces/gui/src/locales/zh.json | 798 | "placeholder": "registry.npmjs.org", | CODE |
| LOW | surfaces/gui/src/locales/en.json | 149 | "placeholder": "Ask the coworker…", | CODE |
| LOW | surfaces/gui/src/locales/en.json | 736 | "placeholder": "Search chats", | CODE |
| LOW | surfaces/gui/src/locales/en.json | 810 | "placeholder": "registry.npmjs.org", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_autotitle.py | 156 | # agentic turn left the session titled by its first message for the whole run. The | COMMENT |
| MEDIUM | coworker/cloud.py | 554 | # guardrails (pacing, uniform 401s, failure auto-suspend) apply. | COMMENT |
| MEDIUM | coworker/engine.py | 36 | # downgraded long agentic turns to hand-approval after one over-strict pair). | COMMENT |
| MEDIUM | coworker/engine.py | 242 | # long agentic turn to hand-approval for everything after one over-strict pair. | COMMENT |
| MEDIUM | coworker/compaction.py | 208 | # -- mechanical extraction (no LLM — zero hallucination risk) ----------------- | COMMENT |
| MEDIUM⚡ | coworker/server/app.py | 2577 | # Auto-compaction overrides (OPE-27): threshold % of the context window, the | COMMENT |
| MEDIUM | coworker/server/app.py | 3115 | # a long agentic turn (owner catch 2026-08-24). | COMMENT |
| MEDIUM | coworker/server/manager.py | 375 | # catch 2026-08-24 — waiting for an agentic turn to COMPLETE left sessions | COMMENT |
| MEDIUM | coworker/server/manager.py | 4759 | # {full id → context window in tokens}, verified matrix entries only — | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | surfaces/gui/src/gallery/states.contract.json | 10372 | "note": "Two workers for issue #3, as requested: nia implements the api/ + web/ fix, checks independently prov | CODE |
| HIGH | surfaces/gui/src/gallery/states.contract.json | 12219 | "note": "Two workers for issue #3, as requested: nia implements the api/ + web/ fix, checks independently pr | CODE |
| HIGH | surfaces/gui/src/gallery/states/team-request.ts | 210 | note: "Two workers for issue #3, as requested: nia implements the api/ + web/ fix, checks independently proves the | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_configured_spawn.py | 17 | CODE | |
| LOW | coworker/engine.py | 125 | CODE | |
| LOW | coworker/agent.py | 224 | CODE | |
| LOW | coworker/inbox.py | 137 | CODE | |
| LOW | coworker/inbox.py | 215 | CODE | |
| LOW | coworker/connectors/email_tools.py | 421 | CODE | |
| LOW | coworker/tui/app.py | 81 | CODE | |
| LOW | coworker/providers/vertex_provider.py | 76 | CODE | |
| LOW | coworker/providers/bedrock_provider.py | 477 | CODE | |
| LOW | coworker/server/manager.py | 786 | CODE | |
| LOW | coworker/sandbox/workspace.py | 363 | CODE | |
| LOW | coworker/remote/acceptor.py | 193 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | coworker/server/manager.py | 8510 | # "I've updated what I remember" and Undo restores this text. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_conversations_repair.py | 21 | # ── helpers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_conversations_repair.py | 41 | # ── tests ──────────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_model_config.py | 119 | def handle_request(self, request): | CODE |
| LOW | tests/test_ollama_context.py | 96 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |
| LOW | coworker/providers/ollama_context.py | 153 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |
| LOW⚡ | coworker/automation/scheduler.py | 103 | async def run_task(self, task: ScheduledTask, *, trigger: str) -> Optional[TaskRun]: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | surfaces/gui/e2e/ask-upgrades.spec.ts | 125 | // Step 1: "Chart style · 1 of 2 · Distribution ›" — and no free-text row (allow_text: false). | COMMENT |
| LOW | surfaces/gui/src/components/models/PickModelDialog.tsx | 85 | // Step 2: the models the chosen provider offers. Also read when the dialog opens on | COMMENT |
| LOW | surfaces/gui/src/components/models/PickModelDialog.tsx | 107 | // Step 3: the settings in force for the chosen model. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_base_dir.py | 66 | # Creating a new folder outside is refused before anything is made. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | surfaces/gui/src/components/models/PickModelDialog.tsx | 85 | // Step 2: the models the chosen provider offers. Also read when the dialog opens on | COMMENT |
| LOW | surfaces/gui/src/components/models/PickModelDialog.tsx | 107 | // Step 3: the settings in force for the chosen model. | COMMENT |