This report summarizes scanner evidence for anthropics/claude-agent-sdk-python, a Python project with 8,247 GitHub stars. SynthScan examined 52,715 lines of code across 149 source files, recording 1697 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 42.1 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1153 finding(s).
Are imports declared and package/API names verified? 204 finding(s).
Are wrappers, guards, and repeated structures necessary? 1369 finding(s).
Which changes need focused human review? 1697 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 1697 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_task_compat.py | 10 | def test_spawn_and_wait_asyncio(self): | CODE |
| LOW⚡ | tests/test_task_compat.py | 104 | def test_cancelled_waiter_asyncio(self): | CODE |
| LOW⚡ | tests/test_task_compat.py | 107 | def test_cancelled_waiter_trio(self): | CODE |
| LOW⚡ | tests/test_task_compat.py | 112 | def test_done_callback_asyncio(self): | CODE |
| LOW | tests/test_task_compat.py | 143 | def test_exception_propagates_via_wait_asyncio(self): | CODE |
| LOW | tests/test_task_compat.py | 154 | def test_exception_propagates_via_wait_trio(self): | CODE |
| LOW | tests/test_task_compat.py | 165 | def test_unhandled_exception_logged_under_trio(self, caplog): | CODE |
| LOW⚡ | tests/test_task_compat.py | 223 | def test_contextvar_propagates_asyncio(self): | CODE |
| LOW⚡ | tests/test_task_compat.py | 226 | def test_contextvar_propagates_trio(self): | CODE |
| LOW⚡ | tests/test_task_compat.py | 231 | def test_cancel_from_different_task_trio(self): | CODE |
| LOW | tests/test_changelog.py | 12 | def test_changelog_starts_with_header(self): | CODE |
| LOW | tests/test_changelog.py | 18 | def test_changelog_has_valid_version_format(self): | CODE |
| LOW | tests/test_changelog.py | 34 | def test_changelog_has_bullet_points(self): | CODE |
| LOW | tests/test_changelog.py | 63 | def test_changelog_versions_in_descending_order(self): | CODE |
| LOW | tests/test_changelog.py | 79 | def test_changelog_no_empty_bullet_points(self): | CODE |
| LOW | tests/test_streaming_client.py | 48 | async def control_protocol_generator(): | CODE |
| LOW | tests/test_streaming_client.py | 110 | def _create_mock_transport_with_control_responses(): | CODE |
| LOW | tests/test_streaming_client.py | 130 | async def control_protocol_generator(): | CODE |
| LOW | tests/test_streaming_client.py | 162 | async def test_auto_connect_with_context_manager(self): | CODE |
| LOW | tests/test_streaming_client.py | 180 | async def test_manual_connect_disconnect(self): | CODE |
| LOW | tests/test_streaming_client.py | 202 | async def test_connect_with_string_prompt(self): | CODE |
| LOW | tests/test_streaming_client.py | 227 | async def test_forward_subagent_text_sent_in_initialize(self): | CODE |
| LOW | tests/test_streaming_client.py | 256 | async def test_connect_with_async_iterable(self): | CODE |
| LOW | tests/test_streaming_client.py | 314 | async def test_send_message_with_session_id(self): | CODE |
| LOW | tests/test_streaming_client.py | 341 | async def test_send_message_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 522 | async def test_interrupt_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 530 | async def test_reconnect_mcp_server(self): | CODE |
| LOW | tests/test_streaming_client.py | 562 | async def test_reconnect_mcp_server_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 603 | async def test_toggle_mcp_server_enabled_true(self): | CODE |
| LOW | tests/test_streaming_client.py | 634 | async def test_toggle_mcp_server_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 673 | async def test_stop_task_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 742 | async def control_protocol_generator(): | CODE |
| LOW | tests/test_streaming_client.py | 815 | async def test_get_mcp_status_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 870 | async def control_protocol_generator(): | CODE |
| LOW | tests/test_streaming_client.py | 921 | async def test_get_context_usage_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 952 | async def test_concurrent_send_receive(self): | CODE |
| LOW | tests/test_streaming_client.py | 1032 | async def test_query_with_async_iterable(self): | CODE |
| LOW | tests/test_streaming_client.py | 1134 | async def test_receive_messages_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 1143 | async def test_receive_response_not_connected(self): | CODE |
| LOW | tests/test_streaming_client.py | 1173 | async def test_disconnect_without_connect(self): | CODE |
| LOW | tests/test_streaming_client.py | 1181 | async def test_context_manager_with_exception(self): | CODE |
| LOW | tests/test_streaming_client.py | 1198 | async def test_receive_response_list_comprehension(self): | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 137 | async def test_append_part_name_format_and_sortable() -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 242 | async def test_load_null_when_empty(s3_client: Any) -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 248 | async def test_load_sorts_and_concatenates() -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 328 | async def test_load_skips_malformed_lines() -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 344 | async def test_list_sessions_extracts_mtime() -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 381 | async def test_delete_batch_deletes_parts() -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 452 | async def test_list_subkeys_extracts_unique_subpaths() -> None: | CODE |
| LOW⚡ | tests/test_example_s3_session_store.py | 488 | async def test_prefix_normalization(raw_prefix: str) -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 115 | async def test_conformance_with_options_dataclass(s3_client: Any) -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 163 | async def test_append_two_instances_distinct_part_names() -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 178 | async def test_append_jsonl_serialization() -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 190 | async def test_append_same_ms_preserves_order(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 213 | async def test_append_empty_is_noop() -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 223 | async def test_append_includes_subpath() -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 294 | async def test_load_excludes_subpath_parts() -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 361 | async def test_list_sessions_ignores_subagent_parts() -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 399 | async def test_delete_subpath_direct_only(s3_client: Any) -> None: | CODE |
| LOW | tests/test_example_s3_session_store.py | 415 | async def test_delete_cascades_without_subpath(s3_client: Any) -> None: | CODE |
| 966 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 131 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 133 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 236 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 238 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 338 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 340 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 375 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 377 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 446 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 448 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 481 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_example_s3_session_store.py | 483 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 50 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 52 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 96 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 98 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 509 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 511 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 579 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_example_s3_session_store.py | 581 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 68 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 114 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 116 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 267 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 269 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 465 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 467 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 599 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_mutations.py | 601 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_session_mutations.py | 25 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_session_mutations.py | 27 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_session_mutations.py | 534 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_session_mutations.py | 536 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 126 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 128 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 247 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 249 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 1145 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 1147 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 1611 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 1613 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 640 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 642 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 675 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 677 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 1499 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 1501 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 1636 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 1638 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 1729 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_sessions.py | 1731 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_store_conformance.py | 27 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_store_conformance.py | 29 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_store_conformance.py | 138 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_session_store_conformance.py | 140 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_mcp_large_output.py | 96 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_mcp_large_output.py | 98 | # --------------------------------------------------------------------------- | COMMENT |
| 164 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_streaming_client.py | 73 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 150 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 99 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 309 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 336 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 381 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 447 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 517 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 557 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 598 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 629 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 668 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 772 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 900 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 986 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_streaming_client.py | 1232 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | tests/test_option_warnings.py | 336 | except (json.JSONDecodeError, KeyError, AttributeError): | CODE |
| HIGH | src/claude_agent_sdk/_internal/session_resume.py | 449 | except (json.JSONDecodeError, ValueError): | CODE |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 182 | except OSError: | CODE |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 497 | except ValueError: | CODE |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 1154 | except OSError: | CODE |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 1733 | except NotImplementedError: | CODE |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 1581 | except ValueError: | CODE |
| HIGH | src/claude_agent_sdk/_internal/session_mutations.py | 521 | except OSError: | CODE |
| HIGH | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 949 | except anyio.ClosedResourceError: | CODE |
| HIGH | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 1129 | except anyio.ClosedResourceError: | CODE |
| HIGH | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 1217 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_example_redis_session_store_live.py | 14 | CODE | |
| LOW | tests/test_example_s3_session_store.py | 9 | CODE | |
| LOW | tests/test_session_mutations.py | 3 | CODE | |
| LOW | tests/test_sessions.py | 3 | CODE | |
| LOW | tests/test_session_store_conformance.py | 8 | CODE | |
| LOW | tests/test_example_redis_session_store.py | 12 | CODE | |
| LOW | tests/test_session_store_anyio.py | 8 | CODE | |
| LOW | tests/test_session_summary.py | 8 | CODE | |
| LOW | tests/test_session_resume.py | 3 | CODE | |
| LOW | tests/test_session_helpers_store.py | 8 | CODE | |
| LOW | tests/test_example_s3_session_store_live.py | 12 | CODE | |
| LOW | tests/test_example_postgres_session_store.py | 14 | CODE | |
| LOW | tests/test_session_import.py | 3 | CODE | |
| LOW | tests/test_transcript_mirror.py | 6 | CODE | |
| LOW | tests/test_types.py | 776 | CODE | |
| LOW | tests/test_types.py | 776 | CODE | |
| LOW | tests/test_types.py | 776 | CODE | |
| LOW | tests/test_types.py | 776 | CODE | |
| LOW | tests/test_types.py | 776 | CODE | |
| LOW | examples/hooks.py | 16 | CODE | |
| LOW | examples/include_partial_messages.py | 18 | CODE | |
| LOW | examples/include_partial_messages.py | 18 | CODE | |
| LOW | examples/include_partial_messages.py | 18 | CODE | |
| LOW | examples/include_partial_messages.py | 18 | CODE | |
| LOW | examples/include_partial_messages.py | 18 | CODE | |
| LOW | examples/session_stores/postgres_session_store.py | 65 | CODE | |
| LOW | examples/session_stores/redis_session_store.py | 50 | CODE | |
| LOW | examples/session_stores/s3_session_store.py | 45 | CODE | |
| LOW | scripts/check_pypi_quota.py | 10 | CODE | |
| LOW | scripts/build_wheel.py | 39 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 32 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 32 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 32 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 32 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 32 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 32 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 41 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 42 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 53 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 53 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 54 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 55 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 67 | CODE | |
| 140 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_task_compat.py | 249 | except Exception as e: # pragma: no cover - failure path | CODE |
| MEDIUM | tests/test_task_compat.py | 245 | def cancel_in_other_task(): | CODE |
| LOW | tests/test_sdk_mcp_integration.py | 578 | except Exception as e: | CODE |
| LOW | tests/test_sdk_mcp_integration.py | 1734 | except Exception as e: | CODE |
| LOW | tests/test_transport.py | 2042 | except Exception as e: | CODE |
| LOW | tests/test_transport.py | 2110 | except Exception as e: | CODE |
| MEDIUM | tests/test_query.py | 1893 | def close_in_other_task(): | CODE |
| LOW | tests/test_query.py | 1802 | except Exception as e: | CODE |
| LOW | tests/test_query.py | 1896 | except Exception as e: | CODE |
| LOW | e2e-tests/test_dynamic_control.py | 92 | except Exception as e: | CODE |
| LOW | e2e-tests/test_run_end.py | 148 | except Exception as e: # noqa: BLE001 - re-raised below unless skipped | CODE |
| LOW⚡ | examples/streaming_mode_ipython.py | 163 | except Exception as e: | CODE |
| MEDIUM⚡ | examples/streaming_mode_ipython.py | 164 | print(f"Error: {e}") | CODE |
| MEDIUM | examples/setting_sources.py | 193 | print(f"Error: Unknown example '{example_name}'") | CODE |
| MEDIUM | examples/hooks.py | 339 | print(f"Error: Unknown example '{example_name}'") | CODE |
| MEDIUM | examples/stderr_callback_example.py | 19 | print(f"Error detected: {message}") | CODE |
| LOW | examples/streaming_mode.py | 407 | except Exception as e: | CODE |
| LOW | examples/streaming_mode.py | 465 | except Exception as e: | CODE |
| MEDIUM | examples/streaming_mode.py | 510 | print(f"Error: Unknown example '{example_name}'") | CODE |
| MEDIUM | scripts/update_cli_version.py | 70 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | scripts/download_cli.py | 181 | print(f"Error: could not run the install command: {e}", file=sys.stderr) | CODE |
| MEDIUM | scripts/download_cli.py | 316 | print("Error: Could not find installed Claude CLI binary", file=sys.stderr) | CODE |
| MEDIUM | scripts/download_cli.py | 366 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | scripts/build_wheel.py | 64 | print(f"Error: {description} failed", file=sys.stderr) | CODE |
| MEDIUM | scripts/build_wheel.py | 258 | print(f"Error: cannot recompress the wheel: {reason}", file=sys.stderr) | CODE |
| LOW | scripts/build_wheel.py | 537 | except Exception as e: | CODE |
| LOW | .github/workflows/build-and-publish.yml | 169 | except Exception as exc: | CODE |
| LOW | src/claude_agent_sdk/__init__.py | 640 | except Exception as e: | CODE |
| LOW | src/claude_agent_sdk/_internal/session_resume.py | 311 | except Exception as e: # noqa: BLE001 - surface adapter failures with context | CODE |
| LOW | src/claude_agent_sdk/_internal/session_resume.py | 506 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/session_resume.py | 524 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 591 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 795 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 868 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 1169 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 1642 | except Exception as e: # noqa: BLE001 - adapter is user code | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 306 | except Exception as e: # pragma: no cover - buffer-full edge case | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 512 | except Exception as e: | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 694 | except Exception as e: | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 777 | except Exception as e: | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 1117 | except Exception as e: | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 1132 | except Exception as e: | CODE |
| LOW | src/claude_agent_sdk/_internal/sdk_mcp_bridge.py | 163 | except Exception as e: | CODE |
| MEDIUM | src/claude_agent_sdk/_internal/sdk_mcp_bridge.py | 139 | def _run(self) -> None: | CODE |
| LOW | …laude_agent_sdk/_internal/transcript_mirror_batcher.py | 110 | except Exception as e: # pragma: no cover - defensive | CODE |
| LOW | …laude_agent_sdk/_internal/transcript_mirror_batcher.py | 131 | except Exception as e: # pragma: no cover - defensive | CODE |
| LOW | …laude_agent_sdk/_internal/transcript_mirror_batcher.py | 143 | except Exception as cb_err: # pragma: no cover - defensive | CODE |
| LOW | …laude_agent_sdk/_internal/transcript_mirror_batcher.py | 203 | except Exception as e: # noqa: BLE001 - adapter is user code | CODE |
| LOW | src/claude_agent_sdk/_internal/session_mutations.py | 535 | except Exception: | CODE |
| LOW | src/claude_agent_sdk/_internal/session_mutations.py | 649 | except Exception: | CODE |
| LOW⚡ | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 934 | except Exception: | CODE |
| LOW⚡ | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 951 | except Exception: | CODE |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 850 | except Exception: # noqa: BLE001 - best-effort tracing must never break connect() | CODE |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 912 | except Exception as e: | CODE |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 1082 | except Exception as e: | CODE |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 1152 | except Exception: | CODE |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 1217 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_streaming_client.py | 1039 | # Create a simple test script that validates stdin and outputs a result | COMMENT |
| MEDIUM | tests/test_streaming_client.py | 1158 | # Create a new mock transport for each call | COMMENT |
| MEDIUM⚡ | tests/test_sessions.py | 447 | # Create a non-UUID .jsonl file | COMMENT |
| MEDIUM | tests/test_sessions.py | 526 | # Create a real directory so realpath works | COMMENT |
| MEDIUM | tests/test_transport.py | 2016 | # Create a real subprocess that consumes stdin (cross-platform) | COMMENT |
| MEDIUM | tests/test_transport.py | 2070 | # Create a real subprocess that consumes stdin (cross-platform) | COMMENT |
| MEDIUM | tests/test_transport.py | 2338 | # Create a large agent definition (50KB prompt) | COMMENT |
| MEDIUM | e2e-tests/test_structured_output.py | 72 | # Define a schema with nested structure | COMMENT |
| MEDIUM | e2e-tests/test_agents_and_settings.py | 158 | # Create a temporary project with a filesystem agent | COMMENT |
| MEDIUM | e2e-tests/test_agents_and_settings.py | 163 | # Create a test agent file | COMMENT |
| MEDIUM | e2e-tests/test_agents_and_settings.py | 218 | # Create a temporary project with local settings | COMMENT |
| MEDIUM | e2e-tests/test_agents_and_settings.py | 254 | # Create a temporary project with a slash command | COMMENT |
| MEDIUM | e2e-tests/test_agents_and_settings.py | 296 | # Create a temporary project with local settings | COMMENT |
| MEDIUM | examples/streaming_mode_ipython.py | 101 | # Create a background task to consume messages | COMMENT |
| MEDIUM | examples/mcp_calculator.py | 142 | # Create the calculator server with all tools | COMMENT |
| MEDIUM | examples/streaming_mode.py | 145 | # Create a background task to consume messages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_changelog.py | 34 | CODE | |
| LOW | tests/test_streaming_client.py | 26 | CODE | |
| LOW | tests/test_streaming_client.py | 110 | CODE | |
| LOW | tests/test_streaming_client.py | 48 | CODE | |
| LOW | tests/test_streaming_client.py | 130 | CODE | |
| LOW | tests/test_streaming_client.py | 282 | CODE | |
| LOW | tests/test_streaming_client.py | 314 | CODE | |
| LOW | tests/test_streaming_client.py | 349 | CODE | |
| LOW | tests/test_streaming_client.py | 415 | CODE | |
| LOW | tests/test_streaming_client.py | 492 | CODE | |
| LOW | tests/test_streaming_client.py | 530 | CODE | |
| LOW | tests/test_streaming_client.py | 570 | CODE | |
| LOW | tests/test_streaming_client.py | 603 | CODE | |
| LOW | tests/test_streaming_client.py | 642 | CODE | |
| LOW | tests/test_streaming_client.py | 681 | CODE | |
| LOW | tests/test_streaming_client.py | 823 | CODE | |
| LOW | tests/test_streaming_client.py | 952 | CODE | |
| LOW | tests/test_streaming_client.py | 1198 | CODE | |
| LOW | tests/test_streaming_client.py | 742 | CODE | |
| LOW | tests/test_streaming_client.py | 870 | CODE | |
| LOW | tests/test_streaming_client.py | 962 | CODE | |
| LOW | tests/test_streaming_client.py | 1208 | CODE | |
| LOW | tests/test_sdk_mcp_integration.py | 1463 | CODE | |
| LOW | tests/test_option_warnings.py | 303 | CODE | |
| LOW | tests/test_option_warnings.py | 318 | CODE | |
| LOW | e2e-tests/test_forward_subagent_text.py | 43 | CODE | |
| LOW | examples/mcp_calculator.py | 100 | CODE | |
| LOW | examples/filesystem_agents.py | 28 | CODE | |
| LOW | examples/filesystem_agents.py | 43 | CODE | |
| LOW | examples/tools_option.py | 16 | CODE | |
| LOW | examples/tools_option.py | 45 | CODE | |
| LOW | examples/tools_option.py | 74 | CODE | |
| LOW | examples/streaming_mode_trio.py | 23 | CODE | |
| LOW | examples/streaming_mode.py | 36 | CODE | |
| LOW | examples/streaming_mode.py | 176 | CODE | |
| LOW | examples/streaming_mode.py | 301 | CODE | |
| LOW | examples/streaming_mode.py | 347 | CODE | |
| LOW | examples/streaming_mode.py | 427 | CODE | |
| LOW | examples/session_stores/s3_session_store.py | 344 | CODE | |
| LOW | scripts/build_wheel.py | 157 | CODE | |
| LOW | scripts/build_wheel.py | 316 | CODE | |
| LOW | scripts/build_wheel.py | 466 | CODE | |
| LOW | .github/scripts/check_workflow_hardening.py | 233 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 477 | CODE | |
| LOW | src/claude_agent_sdk/types.py | 163 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 229 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 259 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 739 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 844 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 1139 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sessions.py | 1672 | CODE | |
| LOW | src/claude_agent_sdk/_internal/session_summary.py | 51 | CODE | |
| LOW | src/claude_agent_sdk/_internal/query.py | 309 | CODE | |
| LOW | src/claude_agent_sdk/_internal/query.py | 388 | CODE | |
| LOW | src/claude_agent_sdk/_internal/query.py | 577 | CODE | |
| LOW | src/claude_agent_sdk/_internal/query.py | 870 | CODE | |
| LOW | src/claude_agent_sdk/_internal/message_parser.py | 50 | CODE | |
| LOW | src/claude_agent_sdk/_internal/sdk_mcp_bridge.py | 289 | CODE | |
| LOW | …laude_agent_sdk/_internal/transcript_mirror_batcher.py | 149 | CODE | |
| LOW | src/claude_agent_sdk/_internal/session_mutations.py | 504 | CODE | |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/claude_agent_sdk/query.py | 17 | Query Claude Code for one-shot or unidirectional streaming interactions. This function is ideal for simple, st | STRING |
| HIGH | src/claude_agent_sdk/__init__.py | 283 | Decorator for defining MCP tools with type safety. Creates a tool that can be used with SDK MCP servers. The tool r | STRING |
| HIGH | src/claude_agent_sdk/__init__.py | 520 | Create an in-process MCP server that runs within your Python application. Unlike external MCP servers that run as s | STRING |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 1678 | List sessions from a :class:`SessionStore`. Async, store-backed counterpart to :func:`list_sessions`. Loads each | STRING |
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 1901 | List subagent IDs for a session from a :class:`SessionStore`. Async, store-backed counterpart to :func:`list_subage | STRING |
| HIGH | src/claude_agent_sdk/_internal/message_parser.py | 51 | Parse message from CLI output into typed Message objects. Args: data: Raw message dictionary from CLI | STRING |
| HIGH | src/claude_agent_sdk/_internal/session_mutations.py | 246 | Fork a session into a new branch with fresh UUIDs. Copies transcript messages from the source session into a new se | STRING |
| HIGH | src/claude_agent_sdk/_internal/session_mutations.py | 892 | Fork a session into a new branch with fresh UUIDs via a :class:`SessionStore`. Async, store-backed counterpart to : | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/hooks.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | scripts/update_version.py | 9 | def update_version(new_version: str) -> None: | CODE |
| LOW | scripts/update_cli_version.py | 22 | def update_cli_version(new_version: str, version_path: Path | None = None) -> None: | CODE |
| LOW | scripts/build_wheel.py | 69 | def update_version(version: str) -> None: | CODE |
| LOW | src/claude_agent_sdk/client.py | 314 | async def set_permission_mode(self, mode: PermissionMode) -> None: | CODE |
| LOW | src/claude_agent_sdk/client.py | 341 | async def set_model(self, model: str | None = None) -> None: | CODE |
| LOW | src/claude_agent_sdk/__init__.py | 198 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/__init__.py | 648 | __all__ = [ | CODE |
| LOW | src/claude_agent_sdk/_internal/session_resume.py | 51 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | src/claude_agent_sdk/_internal/sessions.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/_internal/session_summary.py | 25 | __all__ = ["fold_session_summary", "summary_entry_to_sdk_info"] | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 278 | def set_transcript_mirror_batcher(self, batcher: "TranscriptMirrorBatcher") -> None: | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 796 | async def set_permission_mode(self, mode: PermissionMode) -> None: | CODE |
| LOW | src/claude_agent_sdk/_internal/query.py | 805 | async def set_model(self, model: str | None) -> None: | CODE |
| LOW | src/claude_agent_sdk/_internal/session_import.py | 26 | __all__ = ["import_session_to_store"] | CODE |
| LOW | src/claude_agent_sdk/_internal/_task_compat.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/_internal/message_parser.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/_internal/sdk_mcp_bridge.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | …laude_agent_sdk/_internal/transcript_mirror_batcher.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/_internal/session_store.py | 20 | __all__ = [ | CODE |
| LOW | src/claude_agent_sdk/_internal/transport/__init__.py | 87 | __all__ = ["Transport"] | CODE |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/claude_agent_sdk/testing/__init__.py | 9 | __all__ = ["run_session_store_conformance"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_download_cli.py | 86 | ("1.0.0 && id", None), | CODE |
| HIGH⚡ | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 943 | for line in framer.push(chunk): | CODE |
| HIGH | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 1122 | for line in framer.push(chunk): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_example_redis_session_store_live.py | 102 | # The harness calls make_store() once per contract for isolation. Give | COMMENT |
| LOW | tests/test_streaming_client.py | 1109 | # On Unix, just use the script directly | STRING |
| MEDIUM⚡ | tests/test_example_redis_session_store.py | 81 | # Conformance harness | COMMENT |
| MEDIUM⚡ | tests/test_example_postgres_session_store.py | 119 | # Conformance harness | COMMENT |
| MEDIUM⚡ | tests/test_example_postgres_session_store.py | 126 | # The harness calls make_store() once per contract for isolation. Give | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | e2e-tests/test_stderr_callback.py | 21 | # and since CLI 2.1.193 the CLI refuses to honor project-scoped grants from | COMMENT |
| LOW | scripts/test-docker.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .github/egress-firewall.yaml | 1 | # Hosts that jobs on GitHub's egress-firewall runner (runs-on: ubuntu-24.04-firewall) | COMMENT |
| LOW | .github/workflows/claude-code-review.yml | 61 | # Review this PR focusing on: | COMMENT |
| LOW | .github/workflows/claude.yml | 61 | COMMENT | |
| LOW | .github/scripts/run-e2e-firewalled-macos.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | src/claude_agent_sdk/client.py | 101 | # Auto-connect with empty async iterable if no prompt is provided | COMMENT |
| LOW | src/claude_agent_sdk/types.py | 1301 | "MessageOrigin", | COMMENT |
| LOW | src/claude_agent_sdk/_internal/query.py | 41 | # This mirrors the set the CLI itself holds a result back for, which is | COMMENT |
| LOW | src/claude_agent_sdk/_internal/query.py | 241 | # takes up after the run ended swaps in a fresh event (_reopen_run). | COMMENT |
| LOW | src/claude_agent_sdk/_internal/query.py | 261 | self._run_final = False | COMMENT |
| LOW | src/claude_agent_sdk/_internal/query.py | 541 | # CLI reports an error result during startup (e.g. a refused | COMMENT |
| LOW | src/claude_agent_sdk/_internal/message_parser.py | 261 | uuid=data["uuid"], | COMMENT |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 41 | # Asks the CLI for `session_state_changed` frames marked `sdk_host_only`, which | COMMENT |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 261 | COMMENT | |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 381 | # Classify EVERY path component, not only the final one. Win32 opens | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | examples/setting_sources.py | 0 | run all examples or a specific example based on command line argument. | STRING |
| HIGH | examples/hooks.py | 0 | run all examples or a specific example based on command line argument. | STRING |
| HIGH | examples/streaming_mode.py | 0 | run all examples or a specific example based on command line argument. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_streaming_client.py | 54 | # Check if initialization was requested | COMMENT |
| LOW | tests/test_sessions.py | 1390 | # Set mtime to Feb 2026 (well after the Jan timestamp) | COMMENT |
| LOW | e2e-tests/test_sdk_mcp_tools.py | 48 | # Check if the actual Python function was called | COMMENT |
| LOW | examples/streaming_mode_ipython.py | 113 | # Check if we got a result after interrupt | COMMENT |
| LOW | examples/max_budget_usd.py | 71 | # Check if budget was exceeded | COMMENT |
| LOW | scripts/build_wheel.py | 473 | # Check if we have a bundled CLI - if so, retag the wheel as platform-specific | COMMENT |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 497 | # Check if settings is a JSON string or a file path | COMMENT |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 507 | # Read the file | COMMENT |
| LOW | …claude_agent_sdk/_internal/transport/subprocess_cli.py | 902 | # Check if the error comes from the working directory or the CLI | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_query.py | 1741 | CODE | |
| MEDIUM | tests/test_query.py | 1748 | CODE | |
| MEDIUM | tests/test_session_resume.py | 919 | CODE | |
| MEDIUM | tests/test_client.py | 451 | CODE | |
| MEDIUM | src/claude_agent_sdk/client.py | 107 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/claude_agent_sdk/_internal/sessions.py | 441 | # User-set title (customTitle) wins over AI-generated title (aiTitle). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | examples/streaming_mode_ipython.py | 82 | # Don't forget to disconnect when done | COMMENT |
| MEDIUM | examples/plugin_example.py | 28 | # In production, you can use any path to your plugin directory | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | e2e-tests/README.md | 14 | export ANTHROPIC_API_KEY="your-api-key-here" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/test-docker.sh | 5 | # Usage: | COMMENT |
| LOW | scripts/gh.sh | 7 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_sessions.py | 53 | CODE | |
| LOW | src/claude_agent_sdk/__init__.py | 236 | CODE | |
| LOW | src/claude_agent_sdk/_internal/query.py | 157 | CODE |