AI Slop Code RIsk Monitor

GreyDGL/PentestGPT

Automated Penetration Testing Agentic Framework Powered by Large Language Models

21.8 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for GreyDGL/PentestGPT, a Python project with 15,889 GitHub stars. SynthScan examined 20,592 lines of code across 146 source files, recording 375 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 21.8 (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.

21.8
Adjusted Signal
21.8
Raw Pattern Score
100%
Time Factor
2026-07-14
Last Push
15.9K
Stars
Python
Language
20.6K
Lines of Code
146
Files
375
Pattern Hits
2026-10-12
Scan Date
0.04
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 48.9/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 21.6/100 · LOW

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

Agent Over-Engineering Ratio 53.6/100 · HIGH

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

PR Review Velocity Impact 65.2/100 · HIGH

Which changes need focused human review? 375 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 6MEDIUM 15LOW 354

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 375 distinct pattern matches across 16 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.

Hyper-Verbose Identifiers217 hits · 242 pts
SeverityFileLineSnippetContext
LOWpentestgpt_agent/tests/test_episode.py135async def test_successful_episode_is_recoverable_from_its_trace(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_episode.py172async def test_provider_crash_leaves_a_complete_failure_trace(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_episode.py195async def test_reasoning_and_raw_provider_payloads_are_never_persisted(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_episode.py227async def test_operational_events_and_terminal_result_share_one_ordered_trace(CODE
LOWpentestgpt_agent/tests/test_episode.py264async def test_episode_trace_and_wrapper_monitor_accept_live_operational_events(CODE
LOWpentestgpt_agent/tests/test_episode.py326async def test_missing_terminal_event_is_an_explicit_episode_failure(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_episode.py349async def test_trace_load_preserves_events_before_a_torn_jsonl_tail(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_episode.py372async def test_trace_records_the_provider_configuration_that_shaped_the_episode(CODE
LOWpentestgpt_agent/tests/test_episode.py414def test_claude_safety_rejection_has_a_typed_informative_failure() -> None:CODE
LOWpentestgpt_agent/tests/test_episode.py448def test_existing_provider_stop_reasons_remain_typed() -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py66def test_valid_supervisor_decision_atomically_adds_and_leases_one_task(CODE
LOWpentestgpt_agent/tests/test_plan.py104def test_discovered_url_path_is_inside_its_authorized_origin(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py141def test_url_scope_rejects_targets_outside_the_authorized_origin(CODE
LOWpentestgpt_agent/tests/test_plan.py183def test_url_subtree_scope_rejects_prefix_and_ambiguous_path_escapes(CODE
LOWpentestgpt_agent/tests/test_plan.py214def test_supervisor_cannot_create_a_speculative_task_backlog(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py241def test_new_task_must_be_selected_immediately_instead_of_deferred(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py307def test_unknown_basis_observation_is_rejected(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py336def test_basis_producer_must_be_a_dependency(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py402def test_exploit_requires_the_latest_test_evidence_on_the_same_surface(CODE
LOWpentestgpt_agent/tests/test_plan.py478def test_exploit_provenance_requires_the_exact_test_target_including_query(CODE
LOWpentestgpt_agent/tests/test_plan.py522def test_supervisor_cannot_finish_while_work_is_open(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py566def test_finish_requires_an_explicit_existing_canonical_basis(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py625def test_finish_basis_must_come_from_a_completed_task(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_plan.py694def test_test_task_cannot_embed_exploitation_as_its_objective(CODE
LOWpentestgpt_agent/tests/test_plan.py727def test_plan_text_and_reference_collections_are_bounded(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_local_benchmark.py185async def test_local_template_injection_benchmark_reaches_a_grounded_flag(CODE
LOWpentestgpt_agent/tests/test_dependency.py8def test_unified_agent_is_loaded_from_the_external_dependency() -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py37def _latest_observation_basis(prompt: str) -> list[str]:CODE
LOWpentestgpt_agent/tests/test_loop.py539async def test_one_grounded_task_can_drive_a_run_to_completion(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py602async def test_max_turn_failure_after_an_action_is_atomically_terminal(CODE
LOWpentestgpt_agent/tests/test_loop.py667async def test_provider_failure_before_actions_retries_once_in_the_same_run(CODE
LOWpentestgpt_agent/tests/test_loop.py722async def test_malformed_result_after_an_action_is_a_terminal_validation_failure(CODE
LOWpentestgpt_agent/tests/test_loop.py773async def test_uncaptured_done_evidence_degrades_to_grounded_progress_and_retries(CODE
LOWpentestgpt_agent/tests/test_loop.py833async def test_reopening_a_completed_run_does_not_invoke_a_provider(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py900async def test_restart_commits_a_completed_executor_trace_without_replaying_it(CODE
LOWpentestgpt_agent/tests/test_loop.py982async def test_restart_retries_a_failed_executor_trace_only_when_it_has_no_actions(CODE
LOWpentestgpt_agent/tests/test_loop.py1068async def test_restart_recovers_a_terminal_executor_event_when_output_write_was_interrupted(CODE
LOWpentestgpt_agent/tests/test_loop.py1153async def test_restart_retries_when_crash_created_only_the_executor_episode_directory(CODE
LOWpentestgpt_agent/tests/test_loop.py1221async def test_restart_commits_a_completed_supervisor_trace_without_replaying_it(CODE
LOWpentestgpt_agent/tests/test_loop.py1281async def test_invalid_supervisor_plan_retries_in_a_new_logged_episode(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py1325async def test_exhausted_supervisor_contract_failures_settle_the_run(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py1376async def test_decision_limit_atomically_settles_the_run(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py1424async def test_known_structured_transport_failure_is_recovered_without_replaying_actions(CODE
LOWpentestgpt_agent/tests/test_loop.py1470async def test_exact_result_at_max_turns_is_recovered_without_replaying_actions(CODE
LOWpentestgpt_agent/tests/test_loop.py1516async def test_earlier_grounded_result_is_recovered_after_ungrounded_retry(CODE
LOWpentestgpt_agent/tests/test_loop.py1560async def test_decision_budget_is_persistent_across_process_restart(tmp_path: Path) -> None:CODE
LOWpentestgpt_agent/tests/test_loop.py1640async def test_restart_settles_a_malformed_trace_without_leaving_an_active_lease(CODE
LOWpentestgpt_agent/tests/test_execution.py18def test_transport_recovery_skips_a_later_incomplete_done_candidate() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py56def test_transport_recovery_accepts_only_an_exact_executor_contract() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py110def test_executor_cannot_complete_from_an_uncaptured_evidence_claim() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py153def test_executor_can_complete_by_exactly_reusing_same_task_evidence() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py202def test_executor_cannot_reuse_evidence_from_another_task() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py247def test_paraphrased_prior_evidence_degrades_without_creating_an_observation() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py291def test_actionful_attempt_cannot_degrade_an_unresolved_prior_evidence_quote() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py338def test_whitespace_equivalent_text_is_not_an_exact_evidence_quote() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py379def test_crlf_transport_normalization_resolves_to_the_exact_receipt_slice() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py419def test_exact_ordered_lines_widen_to_one_contiguous_receipt_span() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py467def test_line_span_widening_rejects_reordered_receipt_lines() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py506def test_exact_unique_line_envelope_recovers_a_rich_reordered_quote() -> None:CODE
LOWpentestgpt_agent/tests/test_execution.py568def test_canonical_execution_fields_have_conservative_size_limits() -> None:CODE
157 more matches not shown…
Unused Imports85 hits · 76 pts
SeverityFileLineSnippetContext
LOWpentestgpt_legacy/smoke_test.py13CODE
LOWpentestgpt_legacy/config.py9CODE
LOWpentestgpt_legacy/config.py11CODE
LOWpentestgpt_legacy/config.py11CODE
LOWpentestgpt_legacy/test_connection.py8CODE
LOWpentestgpt_legacy/__init__.py9CODE
LOWpentestgpt_legacy/main.py10CODE
LOWpentestgpt_legacy/llm/config.py9CODE
LOWpentestgpt_legacy/llm/registry.py14CODE
LOWpentestgpt_legacy/llm/client.py10CODE
LOWpentestgpt_legacy/llm/__init__.py11CODE
LOWpentestgpt_legacy/llm/__init__.py12CODE
LOWpentestgpt_legacy/llm/__init__.py12CODE
LOWpentestgpt_legacy/llm/__init__.py13CODE
LOWpentestgpt_legacy/llm/__init__.py13CODE
LOWpentestgpt_legacy/llm/__init__.py13CODE
LOWpentestgpt_legacy/llm/__init__.py13CODE
LOWpentestgpt_legacy/llm/factory.py3CODE
LOWpentestgpt_legacy/llm/base.py9CODE
LOWpentestgpt_legacy/llm/providers/openai_compatible.py12CODE
LOWpentestgpt_legacy/llm/providers/__init__.py3CODE
LOWpentestgpt_legacy/llm/providers/__init__.py4CODE
LOWpentestgpt_legacy/llm/providers/__init__.py5CODE
LOWpentestgpt_legacy/llm/providers/anthropic_provider.py8CODE
LOWpentestgpt_legacy/llm/providers/gemini_provider.py9CODE
LOWpentestgpt_legacy/utils/pentest_gpt.py15CODE
LOWpentestgpt_agent/tests/test_local_benchmark.py1CODE
LOWpentestgpt_agent/tests/support/local_target.py1CODE
LOWpentestgpt_agent/tests/live/test_local_model.py1CODE
LOWpentestgpt_agent/src/pentestgpt_agent/plan.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trace.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trial.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/execution.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/audit.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/memory.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/identifiers.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/agents.py3CODE
LOWpentestgpt_agent/src/pentestgpt_agent/loop.py3CODE
LOWunified_agent/task.py3CODE
LOWunified_agent/skills.py10CODE
LOWunified_agent/events.py3CODE
LOWunified_agent/tools.py15CODE
LOWunified_agent/__init__.py7CODE
LOWunified_agent/__init__.py7CODE
LOWunified_agent/__init__.py7CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py8CODE
LOWunified_agent/__init__.py21CODE
LOWunified_agent/__init__.py21CODE
LOWunified_agent/__init__.py21CODE
LOWunified_agent/__init__.py21CODE
25 more matches not shown…
Decorative Section Separators10 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMpyproject.toml63# ============================================================================COMMENT
MEDIUMpyproject.toml65# ============================================================================COMMENT
MEDIUMpyproject.toml77# ============================================================================COMMENT
MEDIUMpyproject.toml79# ============================================================================COMMENT
MEDIUMpyproject.toml115# ============================================================================COMMENT
MEDIUMpyproject.toml117# ============================================================================COMMENT
MEDIUMpyproject.toml131# ============================================================================COMMENT
MEDIUMpyproject.toml133# ============================================================================COMMENT
MEDIUMtests/conftest.py5# =============================================================================COMMENT
MEDIUMtests/conftest.py7# =============================================================================COMMENT
Modern Structural Boilerplate15 hits · 15 pts
SeverityFileLineSnippetContext
LOWpentestgpt_legacy/config.py22__all__ = [CODE
LOWpentestgpt_legacy/__init__.py11__all__ = ["__version__"]CODE
LOWpentestgpt_legacy/llm/__init__.py15__all__ = [CODE
LOWpentestgpt_legacy/llm/providers/__init__.py7__all__ = ["AnthropicProvider", "GeminiProvider", "OpenAICompatibleProvider"]CODE
LOWpentestgpt_agent/tests/support/local_target.py94__all__ = ["LocalTarget", "local_template_target"]CODE
LOWpentestgpt_agent/src/pentestgpt_agent/plan.py335__all__ = [CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trace.py427__all__ = [CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trial.py366__all__ = ["TrialConfig", "main", "run_trial"]CODE
LOWpentestgpt_agent/src/pentestgpt_agent/execution.py385__all__ = [CODE
LOWpentestgpt_agent/src/pentestgpt_agent/audit.py447__all__ = ["audit_run", "main"]CODE
LOWpentestgpt_agent/src/pentestgpt_agent/memory.py986__all__ = [CODE
LOWpentestgpt_agent/src/pentestgpt_agent/identifiers.py18__all__ = ["validate_opaque_id"]CODE
LOWpentestgpt_agent/src/pentestgpt_agent/agents.py628__all__ = [CODE
LOWpentestgpt_agent/src/pentestgpt_agent/loop.py314__all__ = ["PentestLoop"]CODE
LOWunified_agent/__init__.py41__all__ = [CODE
Cross-Language Confusion3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHtests/docker/test_container_health.py89 result = self._exec_in_container(running_container, "test -d /workspace && echo ok")CODE
HIGHtests/docker/test_container_health.py125 running_container, "which nc || which netcat || which ncat"CODE
HIGHtests/docker/test_container_health.py168 result = self._exec_in_container(running_container, "which claude || echo 'not found'")CODE
Redundant / Tautological Comments7 hits · 13 pts
SeverityFileLineSnippetContext
LOW⚡setup.sh29# Check if Docker is installedCOMMENT
LOW⚡setup.sh36# Check if Docker is runningCOMMENT
LOW⚡setup.sh45# Check if Claude Code is installed (not strictly required since it's in Docker)COMMENT
LOWfix-workspace-permissions.sh14# Check if workspace existsCOMMENT
LOWtests/docker/test_container_health.py46 # Check if container is runningCOMMENT
LOWscripts/entrypoint.sh30 # Check if template existsCOMMENT
LOWscripts/entrypoint.sh61 # Check if CCR is running by testing the portCOMMENT
Excessive Try-Catch Wrapping10 hits · 10 pts
SeverityFileLineSnippetContext
LOWpentestgpt_legacy/smoke_test.py54 except Exception as e:CODE
LOWpentestgpt_legacy/main.py135 except Exception as e:CODE
LOWpentestgpt_legacy/utils/pentest_gpt.py161 except Exception as e:CODE
LOWpentestgpt_legacy/utils/pentest_gpt.py425 except Exception as e:CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trace.py257 except Exception as exc: # provider failures become a durable failed resultCODE
LOWpentestgpt_agent/src/pentestgpt_agent/trial.py170 except Exception as exc:CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trial.py188 except Exception:CODE
LOWpentestgpt_agent/src/pentestgpt_agent/trial.py355 except Exception:CODE
LOWunified_agent/agent.py198 except Exception as e:CODE
LOWunified_agent/backends/codex.py288 except Exception as e: # JSON-RPC / transport errors from the SDKCODE
Empty Error Handlers2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHpentestgpt_agent/src/pentestgpt_agent/loop.py218except AgentContractError:CODE
HIGHpentestgpt_agent/src/pentestgpt_agent/loop.py242except ExecutionValidationError:CODE
Fake / Example Data7 hits · 10 pts
SeverityFileLineSnippetContext
LOWtests/test_agent.py20 def __init__(self, events=None, delay=0.0, fail_with=None, fake_name="fake"):CODE
LOWtests/test_agent.py21 self.name = fake_nameCODE
LOW⚡tests/test_agent.py82 backend = FakeBackend(events=GOOD_EVENTS, fake_name="codex")CODE
LOW⚡tests/test_agent.py162 backend=FakeBackend(events=GOOD_EVENTS, delay=0.2, fake_name="a"), workspace=tmp_path / "wa"CODE
LOW⚡tests/test_agent.py165 backend=FakeBackend(events=GOOD_EVENTS, delay=0.2, fake_name="b"), workspace=tmp_path / "wb"CODE
LOW⚡tests/test_agent.py178 backend=FakeBackend(events=GOOD_EVENTS, fake_name="a"), workspace=tmp_path / "wa"CODE
LOW⚡tests/test_agent.py181 backend=FakeBackend(events=GOOD_EVENTS, fake_name="b"), workspace=tmp_path / "wb"CODE
Deep Nesting9 hits · 9 pts
SeverityFileLineSnippetContext
LOWpentestgpt_legacy/utils/pentest_gpt.py207CODE
LOWpentestgpt_legacy/utils/pentest_gpt.py262CODE
LOWpentestgpt_agent/src/pentestgpt_agent/audit.py64CODE
LOWpentestgpt_agent/src/pentestgpt_agent/memory.py431CODE
LOWpentestgpt_agent/src/pentestgpt_agent/loop.py83CODE
LOWpentestgpt_agent/src/pentestgpt_agent/loop.py184CODE
LOWunified_agent/backends/codex.py133CODE
LOWunified_agent/backends/codex.py191CODE
LOWunified_agent/backends/claude_code.py129CODE
Dead Code4 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMpentestgpt_agent/tests/test_episode.py64CODE
MEDIUMpentestgpt_agent/tests/test_loop.py282CODE
MEDIUMpentestgpt_agent/tests/test_loop.py307CODE
MEDIUMpentestgpt_agent/tests/test_trial.py139CODE
Synthetic Comment Markers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGH.agents/skills/triage/SKILL.md16> *This was generated by AI during triage.*CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpentestgpt_legacy/utils/pentest_gpt.py81 # Chunk size for parsing, scaled to the reasoning model's context window.COMMENT
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOW…s/skills/diagnosing-bugs/scripts/hitl-loop.template.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/docker-login.sh1#!/usr/bin/env bashCOMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW…s/skills/diagnosing-bugs/scripts/hitl-loop.template.sh6# Usage:COMMENT
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWunified_agent/agent.py105CODE