AI Slop Code RIsk Monitor

amoffat/sh

Python process launching

15.4 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for amoffat/sh, a Python project with 7,245 GitHub stars. SynthScan examined 8,489 lines of code across 18 source files, recording 112 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 15.4 (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.

15.4
Adjusted Signal
15.4
Raw Pattern Score
100%
Time Factor
2026-07-25
Last Push
7.2K
Stars
Python
Language
8.5K
Lines of Code
18
Files
112
Pattern Hits
2026-10-12
Scan Date
0.72
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 27.0/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 90 finding(s).

Hallucinated Dependency & Supply Chain Risk 0.3/100 · LOW

Are imports declared and package/API names verified? 1 finding(s).

Agent Over-Engineering Ratio 49.8/100 · MEDIUM

Are wrappers, guards, and repeated structures necessary? 89 finding(s).

PR Review Velocity Impact 66.0/100 · HIGH

Which changes need focused human review? 112 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 13MEDIUM 3LOW 96

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 112 distinct pattern matches across 9 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.

Empty Error Handlers13 hits · 65 pts
SeverityFileLineSnippetContext
HIGHtests/sh_test.py366except ErrorReturnCode_3:CODE
HIGHtests/sh_test.py3181except TimeoutException:CODE
HIGHtests/sh_test.py3372except sig_exception:CODE
HIGHtests/sh_test.py3690except StopIteration:CODE
HIGHtests/sh_test.py3465except Exception:CODE
HIGHtests/sh_test.py3470except Exception:CODE
HIGHsrc/sh/__init__.py419except KeyError:CODE
HIGHsrc/sh/__init__.py1026except UnsupportedOperation:CODE
HIGHsrc/sh/__init__.py3043except OSError:CODE
HIGHsrc/sh/__init__.py3123except UnicodeDecodeError:CODE
HIGHsrc/sh/__init__.py3513except KeyError:CODE
HIGHsrc/sh/__init__.py2380except ProcessLookupError:CODE
HIGHsrc/sh/__init__.py2175except OSError:CODE
Hyper-Verbose Identifiers68 hits · 40 pts
SeverityFileLineSnippetContext
LOWtests/sh_test.py172def create_stdin_transform_test(transform="upper"):CODE
LOWtests/sh_test.py350 def test_exit_code_with_hasattr(self):CODE
LOWtests/sh_test.py369 def test_exit_code_from_exception(self):CODE
LOWtests/sh_test.py732 def test_incompatible_special_args(self):CODE
LOWtests/sh_test.py817 def test_command_wrapper_equivalence(self):CODE
LOWtests/sh_test.py823 def test_doesnt_execute_directories(self):CODE
LOWtests/sh_test.py859 def test_multiple_args_short_option(self):CODE
LOWtests/sh_test.py875 def test_multiple_args_long_option(self):CODE
LOWtests/sh_test.py955 def test_incremental_composition(self):CODE
LOWtests/sh_test.py1036 def test_custom_separator_space(self):CODE
LOWtests/sh_test.py1118 def test_background_exception(self):CODE
LOWtests/sh_test.py1221 def test_err_to_out_and_sys_stdout(self):CODE
LOWtests/sh_test.py1331 def test_out_and_err_redirection(self):CODE
LOWtests/sh_test.py1385 def test_err_redirection_actual_file(self):CODE
LOWtests/sh_test.py1449 def test_bake_boolean_override(self):CODE
LOWtests/sh_test.py1496 def test_bake_args_come_first(self):CODE
LOWtests/sh_test.py1930 def test_async_return_cmd_exc(self):CODE
LOWtests/sh_test.py1943 def test_handle_both_out_and_err(self):CODE
LOWtests/sh_test.py2033 def test_for_generator_to_err(self):CODE
LOWtests/sh_test.py2160 def test_generator_and_callback(self):CODE
LOWtests/sh_test.py2685 def test_decode_error_handling(self):CODE
LOWtests/sh_test.py2712 def test_signal_exception_sigusr(self):CODE
LOWtests/sh_test.py2837 def test_baked_command_can_be_printed(self):CODE
LOWtests/sh_test.py2842 def test_baked_command_can_be_printed_with_whitespace_args(self):CODE
LOWtests/sh_test.py2855 def test_baked_command_can_be_printed_with_whitespace_in_options(self):CODE
LOWtests/sh_test.py2904 def test_done_callback_no_deadlock(self):CODE
LOWtests/sh_test.py2938 def test_new_session_new_group(self):CODE
LOWtests/sh_test.py2985 def session_false_group_false(pid, pgid, sid, test_pid):CODE
LOWtests/sh_test.py3059 def test_stdin_unbuffered_bufsize(self):CODE
LOWtests/sh_test.py3102 def test_stdin_newline_bufsize(self):CODE
LOWtests/sh_test.py3148 def test_custom_timeout_signal(self):CODE
LOWtests/sh_test.py3166 def test_timeout_race_condition_process_exit(self):CODE
LOWtests/sh_test.py3215 def test_partially_applied_callback(self):CODE
LOWtests/sh_test.py3244 def test_grandchild_no_sighup(self):CODE
LOWtests/sh_test.py3289 def test_unchecked_producer_failure(self):CODE
LOWtests/sh_test.py3312 def test_unchecked_pipeline_failure(self):CODE
LOWtests/sh_test.py3351 def test_bad_sig_raise_exception(self):CODE
LOWtests/sh_test.py3377 def test_ok_code_ignores_bad_sig_exception(self):CODE
LOWtests/sh_test.py3410 def test_uid_drops_supplementary_groups(self):CODE
LOWtests/sh_test.py3545 def test_percent_doesnt_fail_logging(self):CODE
LOWtests/sh_test.py3678 def test_stop_iteration_doesnt_block(self):CODE
LOWtests/sh_test.py3694 def test_threaded_with_contexts(self):CODE
LOWtests/sh_test.py3856 def test_set_in_parent_function(self):CODE
LOWtests/sh_test.py3881 def test_command_with_baked_call_args(self):CODE
LOWtests/sh_test.py522 def test_manual_stdin_iterable(self):STRING
LOWtests/sh_test.py1555 def test_stdout_callback_no_wait(self):STRING
LOWtests/sh_test.py1583 def test_stdout_callback_line_buffered(self):STRING
LOWtests/sh_test.py1603 def test_stdout_callback_line_unbuffered(self):STRING
LOWtests/sh_test.py1624 def test_stdout_callback_buffered(self):STRING
LOWtests/sh_test.py1644 def test_stdout_callback_with_input(self):STRING
LOWtests/sh_test.py1665 def test_stdout_callback_exit(self):STRING
LOWtests/sh_test.py1689 def test_stdout_callback_terminate(self):STRING
LOWtests/sh_test.py1727 def test_stdout_callback_kill(self):STRING
LOWtests/sh_test.py2411 def test_change_stdout_buffering(self):STRING
LOWtests/sh_test.py2532 def test_timeout_wait_overstep(self):STRING
LOWtests/sh_test.py2542 def test_timeout_wait_negative(self):STRING
LOWtests/sh_test.py2580 def test_failure_with_large_output(self):STRING
LOWtests/sh_test.py3640 def test_signal_exception_aliases(self):STRING
LOWsrc/sh/__init__.py985def output_redirect_is_filename(out):CODE
LOWsrc/sh/__init__.py1056def output_iterator_validator(passed_kwargs, merged_kwargs):CODE
8 more matches not shown…
Deep Nesting12 hits · 6 pts
SeverityFileLineSnippetContext
LOWdev_scripts/changelog_extract.py10CODE
LOWsrc/sh/__init__.py377CODE
LOWsrc/sh/__init__.py1580CODE
LOWsrc/sh/__init__.py1629CODE
LOWsrc/sh/__init__.py2655CODE
LOWsrc/sh/__init__.py2723CODE
LOWsrc/sh/__init__.py2792CODE
LOWsrc/sh/__init__.py3049CODE
LOWsrc/sh/__init__.py172CODE
LOWsrc/sh/__init__.py733CODE
LOWsrc/sh/__init__.py1861CODE
LOWsrc/sh/__init__.py3285CODE
Excessive Try-Catch Wrapping6 hits · 6 pts
SeverityFileLineSnippetContext
LOWtests/sh_test.py3465 except Exception:CODE
LOWtests/sh_test.py3470 except Exception:CODE
MEDIUMsrc/sh/__init__.py911def queue_connector():CODE
LOWsrc/sh/__init__.py1710 except Exception as e:CODE
LOWsrc/sh/__init__.py2196 except Exception: # noqa: E722CODE
LOWsrc/sh/__init__.py2203 except Exception as e:CODE
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMsrc/sh/__init__.py6# ===============================================================================COMMENT
MEDIUMsrc/sh/__init__.py26# ===============================================================================COMMENT
Over-Commented Block8 hits · 4 pts
SeverityFileLineSnippetContext
LOWsrc/sh/__init__.py1"""COMMENT
LOWsrc/sh/__init__.py1181 "out": None, # redirect STDOUTCOMMENT
LOWsrc/sh/__init__.py1221 "decode_errors": "strict",COMMENT
LOWsrc/sh/__init__.py1241 # stdin ttys, if ttys are being usedCOMMENT
LOWsrc/sh/__init__.py1921COMMENT
LOWsrc/sh/__init__.py2061 os.close(close_pipe_write)COMMENT
LOWsrc/sh/__init__.py2541 """polls if our child process has completed, without blocking. thisCOMMENT
LOWsrc/sh/__init__.py3001 # this can be demonstrated with the following program:COMMENT
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/sh/__init__.py1687 # if it's true, it has no value, just pass the nameCOMMENT
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/sh/__init__.py2085 # python ignores SIGPIPE by default. we must make sure to putCOMMENT
Unused Imports1 hit · 0 pts
SeverityFileLineSnippetContext
LOWtests/sh_test.py799CODE