A lightweight library for converting complex objects to and from simple Python datatypes.
This report presents the forensic synthetic code analysis of marshmallow-code/marshmallow, a Python project with 7,240 GitHub stars. SynthScan v2.0 examined 16,154 lines of code across 51 source files, recording 542 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 28.5 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 542 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_deserialization.py | 51 | def test_fields_allow_none_deserialize_to_none(self, FieldClass): | CODE |
| LOW⚡ | tests/test_deserialization.py | 57 | def test_fields_dont_allow_none_by_default(self, FieldClass): | CODE |
| LOW⚡ | tests/test_deserialization.py | 62 | def test_allow_none_is_true_if_missing_is_true(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 67 | def test_list_field_deserialize_none_to_none(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 71 | def test_tuple_field_deserialize_none_to_none(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 75 | def test_list_of_nested_allow_none_deserialize_none_to_none(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 79 | def test_list_of_nested_non_allow_none_deserialize_none_to_validation_error(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 86 | def test_float_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 92 | def test_invalid_float_field_deserialization(self, in_val): | CODE |
| LOW⚡ | tests/test_deserialization.py | 98 | def test_float_field_overflow(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 104 | def test_integer_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 401 | def test_boolean_field_deserialization_with_empty_truthy(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 407 | def test_boolean_field_deserialization_with_custom_falsy_values(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 412 | def test_field_toggle_show_invalid_value_in_error_message(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 595 | def test_boolean_timestamp_field_deserialization(self, fmt, in_value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 605 | def test_invalid_timestamp_field_deserialization(self, fmt, in_value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 615 | def test_oversized_timestamp_field_deserialization(self, fmt, mock_fromtimestamp): | CODE |
| LOW⚡ | tests/test_deserialization.py | 657 | def test_naive_datetime_with_timezone(self, fmt, timezone, value, expected): | CODE |
| LOW⚡ | tests/test_deserialization.py | 666 | def test_aware_datetime_default_timezone(self, fmt, timezone, value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 672 | def test_time_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 717 | def test_iso_time_field_deserialization(self, fmt, value, expected): | CODE |
| LOW⚡ | tests/test_deserialization.py | 724 | def test_invalid_timedelta_precision(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 728 | def test_timedelta_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 973 | def test_url_field_non_list_validators(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 978 | def test_relative_url_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 982 | def test_url_field_schemes_argument(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 990 | def test_email_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1003 | def test_email_field_non_list_validators(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1008 | def test_function_field_deserialization_is_noop_by_default(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1014 | def test_function_field_deserialization_with_callable(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1018 | def test_function_field_deserialization_missing_with_length_validator(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1025 | def test_function_field_passed_deserialize_only_is_load_only(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1029 | def test_function_field_passed_deserialize_and_serialize_is_not_load_only(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1035 | def test_uuid_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1198 | def test_enum_field_by_symbol_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1202 | def test_enum_field_by_symbol_invalid_value(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1210 | def test_enum_field_by_symbol_rejects_non_member_attributes(self, non_member): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1217 | def test_enum_field_by_symbol_not_string(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1222 | def test_enum_field_by_value_true_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1228 | def test_enum_field_by_value_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1236 | def test_enum_field_by_value_true_invalid_value(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1285 | def test_enum_by_value_allow_none_default(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1289 | def test_deserialization_function_must_be_callable(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1293 | def test_method_field_deserialization_is_noop_by_default(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1303 | def test_deserialization_method(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1316 | def test_deserialization_method_must_be_a_method(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1323 | def test_method_field_deserialize_only(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1332 | def test_datetime_list_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1341 | def test_list_field_deserialize_invalid_item(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1413 | def test_tuple_field_deserialize_value_that_is_not_a_collection(self, value): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1419 | def test_tuple_field_deserialize_invalid_length(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1425 | def test_constant_field_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1429 | def test_constant_is_always_included_in_deserialized_data(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1437 | def test_constant_none_allows_none_value(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1446 | def test_constant_with_required(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1454 | def test_field_deserialization_with_user_validator_function(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1462 | def test_field_deserialization_with_user_validator_that_raises_error_with_list( | CODE |
| LOW⚡ | tests/test_deserialization.py | 1701 | def test_nested_none_deserialization(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1711 | def test_deserialize_with_attribute_param(self): | CODE |
| LOW⚡ | tests/test_deserialization.py | 1722 | def test_deserialize_with_attribute_param_symmetry(self): | CODE |
| 427 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_registry.py | 192 | CODE | |
| LOW | tests/test_registry.py | 207 | CODE | |
| LOW | tests/test_registry.py | 214 | CODE | |
| LOW | tests/test_utils.py | 1 | CODE | |
| LOW | tests/mypy_test_cases/test_validation_error.py | 1 | CODE | |
| LOW | examples/flask_example.py | 10 | CODE | |
| LOW | src/marshmallow/fields.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 1 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 2 | CODE | |
| LOW | src/marshmallow/__init__.py | 10 | CODE | |
| LOW | src/marshmallow/__init__.py | 11 | CODE | |
| LOW | src/marshmallow/__init__.py | 11 | CODE | |
| LOW | src/marshmallow/__init__.py | 13 | CODE | |
| LOW | src/marshmallow/types.py | 8 | CODE | |
| LOW | src/marshmallow/validate.py | 3 | CODE | |
| LOW | src/marshmallow/class_registry.py | 12 | CODE | |
| LOW | src/marshmallow/utils.py | 3 | CODE | |
| LOW | src/marshmallow/exceptions.py | 3 | CODE | |
| LOW | src/marshmallow/schema.py | 4 | CODE | |
| LOW | src/marshmallow/decorators.py | 68 | CODE | |
| LOW | src/marshmallow/experimental/context.py | 31 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_deserialization.py | 992 | assert field.deserialize("foo@bar.com") == "foo@bar.com" | CODE |
| LOW⚡ | tests/test_deserialization.py | 999 | field.deserialize("foo@bar.com") | CODE |
| LOW⚡ | tests/test_deserialization.py | 1716 | data = {"username": "foo@bar.com", "years": "42"} | CODE |
| LOW⚡ | tests/test_deserialization.py | 1718 | assert result["email"] == "foo@bar.com" | CODE |
| LOW⚡ | tests/test_deserialization.py | 1767 | data = {"Name": "Mick", "UserName": "foo@bar.com", "years": "42"} | CODE |
| LOW⚡ | tests/test_deserialization.py | 1770 | assert result["email"] == "foo@bar.com" | CODE |
| LOW⚡ | tests/test_deserialization.py | 1855 | {"email": "foo@bar.com", "colors": "red", "age": 18}, | CODE |
| LOW⚡ | tests/test_schema.py | 574 | "email": "foo@bar.com", | CODE |
| LOW | tests/test_validate.py | 333 | "!#$%&'*+-/=?^_`{}|~@example.org", | CODE |
| LOW | tests/test_validate.py | 356 | '" "@example.org', | CODE |
| LOW⚡ | tests/test_serialization.py | 42 | return User("Foo", email="foo@bar.com", age=42) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_fields.py | 313 | CODE | |
| LOW | src/marshmallow/fields.py | 567 | CODE | |
| LOW | src/marshmallow/fields.py | 1686 | CODE | |
| LOW | src/marshmallow/error_store.py | 37 | CODE | |
| LOW | src/marshmallow/schema.py | 597 | CODE | |
| LOW | src/marshmallow/schema.py | 773 | CODE | |
| LOW | src/marshmallow/schema.py | 1124 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/inflection_example.py | 24 | # ----------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/flask_example.py | 144 | # Create a new author | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/base.py | 104 | CODE | |
| LOW | src/marshmallow/fields.py | 192 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/marshmallow/fields.py | 44 | __all__ = [ | CODE |
| LOW | src/marshmallow/__init__.py | 15 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/marshmallow/orderedset.py | 1 | # OrderedSet | COMMENT |
| LOW | src/marshmallow/class_registry.py | 41 | register("MyClass", MyClass) | COMMENT |