get things from one computer to another, safely
This report presents the forensic synthetic code analysis of magic-wormhole/magic-wormhole, a Python project with 22,710 GitHub stars. SynthScan v2.0 examined 29,573 lines of code across 115 source files, recording 238 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 9.2 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 238 distinct pattern matches across 11 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 | versioneer.py | 691 | def git_versions_from_keywords( | CODE |
| LOW | versioneer.py | 1222 | def git_versions_from_keywords( | STRING |
| LOW⚡ | misc/demo-journal.py | 217 | def wormhole_dispatch_got_code(self, code, iid): | CODE |
| LOW⚡ | misc/demo-journal.py | 225 | def wormhole_dispatch_got_verifier(self, verifier, iid): | CODE |
| LOW⚡ | misc/demo-journal.py | 228 | def wormhole_dispatch_verified(self, _, iid): | CODE |
| LOW⚡ | misc/demo-journal.py | 231 | def wormhole_dispatch_got_data(self, data, iid): | CODE |
| LOW | src/wormhole/_rlcompleter.py | 67 | def _commit_and_build_completions(self, text): | CODE |
| LOW | src/wormhole/_rlcompleter.py | 153 | def _input_code_with_completion(prompt, input_helper, reactor): | CODE |
| LOW | src/wormhole/transit.py | 83 | def build_sided_relay_handshake(key, side): | CODE |
| LOW | src/wormhole/_version.py | 184 | def git_versions_from_keywords( | CODE |
| LOW | src/wormhole/_nameplate.py | 164 | def send_status_code_allocated(self): | CODE |
| LOW | src/wormhole/_nameplate.py | 170 | def send_status_code_consumed(self): | CODE |
| LOW | src/wormhole/_interfaces.py | 59 | def wormhole_got_unverified_key(key: bytes) -> None: # XXX definitely bytes? | CODE |
| LOW | src/wormhole/_interfaces.py | 416 | def get_nameplate_completions(prefix): | CODE |
| LOW | src/wormhole/_interfaces.py | 451 | def when_wordlist_is_available(): | CODE |
| LOW | src/wormhole/_rendezvous.py | 178 | def _initial_connection_failed(self, f): | CODE |
| LOW | src/wormhole/_rendezvous.py | 287 | def _response_handle_allocated(self, msg): | CODE |
| LOW | src/wormhole/_rendezvous.py | 292 | def _response_handle_nameplates(self, msg): | CODE |
| LOW | src/wormhole/_rendezvous.py | 332 | def _response_handle_released(self, msg): | CODE |
| LOW | src/wormhole/_key.py | 120 | def deliver_code_and_stashed_pake(self, code): | CODE |
| LOW | src/wormhole/_boss.py | 402 | def send_status_confirmed_key(self, plaintext): | CODE |
| LOW | src/wormhole/_input.py | 46 | def when_wordlist_is_available(self): | CODE |
| LOW | src/wormhole/_input.py | 94 | def get_nameplate_completions(self, prefix): | CODE |
| LOW | src/wormhole/_input.py | 129 | def _get_nameplate_completions(self, prefix): | CODE |
| LOW | src/wormhole/_input.py | 316 | def get_nameplate_completions(self, prefix): | CODE |
| LOW | src/wormhole/_input.py | 326 | def when_wordlist_is_available(self): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 822 | def test_close_while_idle_nameplate(): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 828 | def test_close_while_idle_connected(): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 836 | def test_close_while_unclaimed(): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 842 | def test_close_while_claiming(): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 1185 | def test_close_while_idle_but_connected(): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 1191 | def test_close_while_mailbox_disconnected(): | CODE |
| LOW⚡ | src/wormhole/test/test_machines.py | 1197 | def test_close_while_reconnecting(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 504 | def test_connect_first_lister(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 531 | def test_connect_first_ask_twice(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 627 | def test_connect_first_allocator(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 700 | def test_connect_first_nameplate(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 726 | def test_reconnect_while_claiming(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 740 | def test_reconnect_while_claimed(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 763 | def test_reconnect_while_releasing(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 790 | def test_reconnect_while_done(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 857 | def test_close_while_claiming_but_disconnected(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 901 | def test_close_while_claimed_but_disconnected(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 928 | def test_close_while_releasing(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 954 | def test_close_while_releasing_but_disconnecteda(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 1017 | def test_close_while_done_but_disconnected(): | CODE |
| LOW | src/wormhole/test/test_machines.py | 1069 | def test_connect_first_mailbox(): # connect before got_mailbox | CODE |
| LOW | src/wormhole/test/test_transit.py | 39 | async def test_there_might_also_be_none(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 74 | async def test_cancel_after_one_failure(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 124 | async def test_not_forever_cancel_early(forever): | CODE |
| LOW | src/wormhole/test/test_transit.py | 152 | def test_allocate_port_no_reuseaddr(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 204 | async def test_ignore_localhost_hint_orig(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 219 | async def test_ignore_localhost_hint(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 234 | async def test_keep_only_localhost_hint(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 270 | async def test_transit_key_already_set(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 464 | async def test_one_fail_one_success(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 669 | async def test_handshake_other_error(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 812 | async def test_receiver_rejected_politely(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 844 | async def test_receiver_rejected_rudely(): | CODE |
| LOW | src/wormhole/test/test_transit.py | 875 | async def test_cancel_during_negotiation(): | CODE |
| 73 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .appveyor.yml | 41 | after_test: | COMMENT |
| LOW | versioneer.py | 1881 | # this fixes the "python setup.py develop" case (also 'install' and | COMMENT |
| LOW | versioneer.py | 1921 | # | COMMENT |
| LOW | misc/demo-journal.py | 201 | return b"ok" | COMMENT |
| LOW | misc/web/timeline.js | 101 | // [id], details={} } | COMMENT |
| LOW | docs/conf.py | 1 | COMMENT | |
| LOW | docs/conf.py | 141 | # The paper size ('letterpaper' or 'a4paper'). | COMMENT |
| LOW | src/wormhole/_rlcompleter.py | 101 | if not self._committed_nameplate: | COMMENT |
| LOW | src/wormhole/_rlcompleter.py | 181 | # user into satisfying the blocking read so we can exit. | COMMENT |
| LOW | src/wormhole/transit.py | 41 | COMMENT | |
| LOW | src/wormhole/transit.py | 281 | COMMENT | |
| LOW | src/wormhole/transit.py | 921 | # how should the Listener be managed? we want to shut it down when the | COMMENT |
| LOW | src/wormhole/_rendezvous.py | 241 | # CLOSE_STATUS_CODE_ABNORMAL_CLOSE, and delivers onClose() without | COMMENT |
| LOW | src/wormhole/_boss.py | 201 | COMMENT | |
| LOW | src/wormhole/wormhole.py | 21 | COMMENT | |
| LOW | src/wormhole/wormhole.py | 301 | client_version = ("python", v) | COMMENT |
| LOW | src/wormhole/test/test_machines.py | 1701 | # #Terminator | COMMENT |
| LOW | src/wormhole/test/test_cli.py | 241 | f.write(b"fail") | COMMENT |
| LOW | src/wormhole/test/test_cli.py | 321 | return pytest.skip( | COMMENT |
| LOW | src/wormhole/test/dilate/test_record.py | 141 | assert n.mock_calls == [mock.call.start_handshake(), | COMMENT |
| LOW | src/wormhole/test/dilate/test_record.py | 161 | # | 3 | | write_message | handshake | | | COMMENT |
| LOW | src/wormhole/cli/cmd_receive.py | 81 | tor=self._tor, | COMMENT |
| LOW | src/wormhole/cli/cmd_send.py | 181 | notify.cancel() | COMMENT |
| LOW | src/wormhole/cli/cmd_send.py | 301 | # os.path.joined with the unicode args.what . | COMMENT |
| LOW | src/wormhole/cli/cmd_send.py | 321 | # * we're running on windows | COMMENT |
| LOW | src/wormhole/_dilation/inbound.py | 141 | COMMENT | |
| LOW | src/wormhole/_dilation/connection.py | 21 | # The next object up knows whether it's expecting a Handshake or a message. It | COMMENT |
| LOW | src/wormhole/_dilation/connection.py | 61 | # * send "sided relay handshake": "please relay TOKEN for side SIDE\n" | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 21 | # to reestablish a new one), registered subchannels will be paused, but | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 41 | # unusual because we have multiple Subchannels that get merged into the | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 61 | # Producers will be paused, and others will be resumed | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 81 | # queues some data on the TCP connection (and then might call | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 101 | # | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 121 | # * keep a set of IPushProducers which are paused, a second set of | COMMENT |
| LOW | src/wormhole/_dilation/outbound.py | 141 | # | COMMENT |
| LOW | src/wormhole/_dilation/subchannel.py | 21 | # length prefix itself), so the padded message must be less than 2**32 bytes | COMMENT |
| LOW | src/wormhole/_dilation/connector.py | 341 | made_direct = True | COMMENT |
| LOW | src/wormhole/_dilation/manager.py | 141 | # in WANTING, then we process all previously-queued inbound DILATE-n | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/wormhole/_rlcompleter.py | 43 | except Exception as e: | CODE |
| MEDIUM | src/wormhole/_rlcompleter.py | 40 | def completer(self, text, state): | CODE |
| LOW | src/wormhole/transit.py | 138 | except Exception as e: | CODE |
| MEDIUM | src/wormhole/transit.py | 135 | def dataReceived(self, data): | CODE |
| LOW | src/wormhole/_rendezvous.py | 32 | except Exception: | CODE |
| LOW | src/wormhole/_rendezvous.py | 204 | except Exception as e: | CODE |
| LOW | src/wormhole/_rendezvous.py | 231 | except Exception as e: | CODE |
| LOW | src/wormhole/tor_manager.py | 107 | except Exception: | CODE |
| LOW | src/wormhole/eventual.py | 32 | except Exception: | CODE |
| LOW | src/wormhole/ipaddrs.py | 60 | except Exception: | CODE |
| LOW | src/wormhole/cli/cmd_receive.py | 114 | except Exception: | CODE |
| MEDIUM | src/wormhole/cli/cmd_receive.py | 111 | def _bad(f): | CODE |
| LOW | src/wormhole/cli/cmd_ssh.py | 52 | except Exception: | CODE |
| LOW | src/wormhole/cli/cmd_send.py | 94 | except Exception: | CODE |
| MEDIUM | src/wormhole/cli/cmd_send.py | 91 | def _bad(f): | CODE |
| LOW | src/wormhole/cli/cli.py | 179 | except Exception as e: | CODE |
| LOW | src/wormhole/_dilation/outbound.py | 353 | except Exception: | CODE |
| LOW | src/wormhole/_dilation/outbound.py | 360 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | versioneer.py | 1194 | CODE | |
| LOW | versioneer.py | 1427 | CODE | |
| LOW | versioneer.py | 1752 | CODE | |
| LOW | versioneer.py | 2172 | CODE | |
| LOW | src/wormhole/transit.py | 681 | CODE | |
| LOW | src/wormhole/_version.py | 156 | CODE | |
| LOW | src/wormhole/_version.py | 602 | CODE | |
| LOW | src/wormhole/tor_manager.py | 32 | CODE | |
| LOW | src/wormhole/test/test_ssh.py | 44 | CODE | |
| LOW | src/wormhole/test/test_cli.py | 416 | CODE | |
| LOW | src/wormhole/test/test_cli.py | 808 | CODE | |
| LOW | src/wormhole/cli/cmd_receive.py | 406 | CODE | |
| LOW | src/wormhole/cli/cmd_ssh.py | 15 | CODE | |
| LOW | src/wormhole/cli/cmd_send.py | 273 | CODE | |
| LOW | src/wormhole/_dilation/connection.py | 213 | CODE | |
| LOW | src/wormhole/_dilation/connection.py | 635 | CODE | |
| LOW | src/wormhole/_dilation/manager.py | 460 | CODE | |
| LOW | src/wormhole/_dilation/manager.py | 583 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | versioneer.py | 533 | # each be defined on a line of their own. _version.py will just call | COMMENT |
| LOW | src/wormhole/transit.py | 483 | # close-on-exec because we close it right away. So just add SO_REUSEADDR. | COMMENT |
| MEDIUM | src/wormhole/_status.py | 108 | # note that the tests (e.g. test_api.py) leverage the order of these | COMMENT |
| LOW | src/wormhole/_version.py | 26 | # each be defined on a line of their own. _version.py will just call | COMMENT |
| MEDIUM | src/wormhole/test/dilate/test_record.py | 302 | # structures can be set up and paired properly. Essentially | COMMENT |
| MEDIUM | src/wormhole/_dilation/manager.py | 29 | # note that these are strings, not numbers, to facilitate | COMMENT |
| LOW | src/wormhole/_dilation/manager.py | 975 | # invoked; upstream calls are basically just call-through -- so | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | versioneer.py | 318 | CODE | |
| LOW | versioneer.py | 318 | CODE | |
| LOW | versioneer.py | 318 | CODE | |
| LOW | misc/dump-timing.py | 5 | CODE | |
| LOW | misc/dump-timing.py | 5 | CODE | |
| LOW | src/wormhole/__init__.py | 1 | CODE | |
| LOW | src/wormhole/__init__.py | 2 | CODE | |
| LOW | src/wormhole/__init__.py | 3 | CODE | |
| LOW | src/wormhole/__init__.py | 3 | CODE | |
| LOW | src/wormhole/__init__.py | 4 | CODE | |
| LOW | src/wormhole/_dilation/_noise.py | 5 | CODE | |
| LOW | src/wormhole/_dilation/_noise.py | 11 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/wormhole/test/test_wormhole.py | 715 | w1._boss._RC._ws.transport.loseConnection() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | versioneer.py | 514 | # This file is released into the public domain. | COMMENT |
| MEDIUM | docs/conf.py | 5 | # This file is execfile()d with the current directory set to its | COMMENT |
| MEDIUM | src/wormhole/_version.py | 7 | # This file is released into the public domain. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | misc/demo-journal.py | 114 | CODE | |
| LOW | src/wormhole/_key.py | 46 | CODE | |
| LOW | src/wormhole/wormhole.py | 266 | CODE | |
| LOW | src/wormhole/test/test_ipaddrs.py | 111 | CODE | |
| LOW | src/wormhole/test/test_cli.py | 416 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/wormhole/_dilation/connection.py | 560 | # when we move to the sans-io event-driven scheme, this queue | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/wormhole/__init__.py | 9 | __all__ = [ | CODE |
| LOW | src/wormhole/_key.py | 17 | __all__ = ["derive_key", "derive_phase_key", "CryptoError", "Key"] | CODE |