AI Slop Code Risk Monitor

juice-shop/juice-shop

SlopCodeMonitor badge for juice-shop/juice-shop Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

OWASP Juice Shop: Probably the most modern and sophisticated insecure web application

1.4 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for juice-shop/juice-shop, a TypeScript project with 14,315 GitHub stars. SynthScan examined 196,376 lines of code across 1099 source files, recording 206 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.4 (Low 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.

1.4
Adjusted Signal
1.4
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
14.3K
Stars
TypeScript
Language
196.4K
Lines of Code
1.1K
Files
206
Pattern Hits
2026-10-31
Scan Date
0.01
HC Hit Rate

Risk Review · Payload v1

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

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 2.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 4.5/100 · LOW

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

Agent Over-Engineering Ratio 1.1/100 · LOW

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

PR Review Velocity Impact 6.1/100 · LOW

Which changes need focused human review? 206 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 1HIGH 6MEDIUM 2LOW 197

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 206 distinct pattern matches across 6 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.

Fake / Example Data144 hits · 172 pts
SeverityFileLineSnippetContext
LOW⚡ftp/acquisitions.md9Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumyCODE
LOW⚡ftp/acquisitions.md9Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumyCODE
LOW⚡ftp/acquisitions.md12clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sitCODE
LOW⚡ftp/acquisitions.md13amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diamCODE
LOW⚡ftp/acquisitions.md13amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diamCODE
LOW⚡ftp/acquisitions.md17ipsum dolor sit amet.CODE
LOWfrontend/src/app/app.guard.spec.ts49 name: 'John Doe',CODE
LOWfrontend/src/app/navbar/navbar.component.ts107 public selectedLanguage = 'placeholder'CODE
LOWfrontend/src/app/navbar/navbar.component.ts113 public shortKeyLang = 'placeholder'CODE
LOWfrontend/src/app/navbar/navbar.component.spec.ts588 component.userEmail = 'foo@bar.com'CODE
LOW⚡frontend/src/app/oauth/oauth.component.spec.ts89 userService.oauthLogin.mockReturnValue(of({ email: 'test@test.com' }))CODE
LOW⚡frontend/src/app/oauth/oauth.component.spec.ts91 expect(userService.save).toHaveBeenCalledWith({ email: 'test@test.com', password: 'bW9jLnRzZXRAdHNldA==', passwoCODE
LOW⚡frontend/src/app/oauth/oauth.component.spec.ts95 userService.oauthLogin.mockReturnValue(of({ email: 'test@test.com' }))CODE
LOW⚡frontend/src/app/oauth/oauth.component.spec.ts98 expect(userService.login).toHaveBeenCalledWith({ email: 'test@test.com', password: 'bW9jLnRzZXRAdHNldA==', oauthCODE
LOW…onents/challenge-card/challenge-card.component.spec.ts20 description: 'lorem ipsum',CODE
LOW…l-mode-warning/tutorial-mode-warning.component.spec.ts20 description: 'lorem ipsum',CODE
LOW…l-mode-warning/tutorial-mode-warning.component.spec.ts64 description: 'lorem ipsum',CODE
LOW…rning/challenges-unavailable-warning.component.spec.ts17 description: 'lorem ipsum',CODE
LOW…rning/challenges-unavailable-warning.component.spec.ts26 description: 'lorem ipsum',CODE
LOW…rning/challenges-unavailable-warning.component.spec.ts59 description: 'lorem ipsum',CODE
LOW…rning/challenges-unavailable-warning.component.spec.ts76 description: 'lorem ipsum',CODE
LOW…rning/challenges-unavailable-warning.component.spec.ts85 description: 'lorem ipsum',CODE
LOW…rc/app/score-board/helpers/challenge-filtering.spec.ts7 description: 'lorem ipsum',CODE
LOW…rc/app/score-board/helpers/challenge-filtering.spec.ts8 originalDescription: 'lorem ipsum',CODE
LOW…rc/app/score-board/helpers/challenge-filtering.spec.ts24 description: 'lorem ipsum',CODE
LOW…rc/app/score-board/helpers/challenge-filtering.spec.ts25 originalDescription: 'lorem ipsum',CODE
LOW…rc/app/score-board/helpers/challenge-filtering.spec.ts41 description: 'lorem ipsum',CODE
LOW…rc/app/score-board/helpers/challenge-filtering.spec.ts42 originalDescription: 'lorem ipsum',CODE
LOW…/src/app/score-board/helpers/challenge-sorting.spec.ts6 description: 'lorem ipsum',CODE
LOW…/src/app/score-board/helpers/challenge-sorting.spec.ts7 originalDescription: 'lorem ipsum',CODE
LOW…/src/app/score-board/helpers/challenge-sorting.spec.ts23 description: 'lorem ipsum',CODE
LOW…/src/app/score-board/helpers/challenge-sorting.spec.ts24 originalDescription: 'lorem ipsum',CODE
LOW…/src/app/score-board/helpers/challenge-sorting.spec.ts40 description: 'lorem ipsum',CODE
LOW…/src/app/score-board/helpers/challenge-sorting.spec.ts41 originalDescription: 'lorem ipsum',CODE
LOWfrontend/src/app/recycle/recycle.component.html67 <small>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt utCODE
LOWfrontend/src/app/recycle/recycle.component.html67 <small>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt utCODE
LOWfrontend/src/app/recycle/recycle.component.html79 <small>Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolorCODE
LOWfrontend/src/app/recycle/recycle.component.html79 <small>Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolorCODE
LOW⚡frontend/src/app/about/about.component.html16 Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore etCODE
LOW⚡frontend/src/app/about/about.component.html16 Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore etCODE
LOW⚡frontend/src/app/about/about.component.html18 clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,CODE
LOW⚡frontend/src/app/about/about.component.html18 clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,CODE
LOW⚡frontend/src/app/about/about.component.html21 takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sedCODE
LOW⚡frontend/src/app/about/about.component.html21 takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sedCODE
LOW⚡frontend/src/app/about/about.component.html26 delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit,CODE
LOW⚡frontend/src/app/about/about.component.html26 delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit,CODE
LOW⚡frontend/src/app/about/about.component.html32 Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmodCODE
LOW⚡frontend/src/app/about/about.component.html32 Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmodCODE
LOW⚡frontend/src/app/about/about.component.html34 dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. LoremCODE
LOW⚡frontend/src/app/about/about.component.html34 dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. LoremCODE
LOW⚡frontend/src/app/about/about.component.html35 ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eosCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html28 Lorem ipsum dolor sit amet <strong><i class='fab fa-bitcoin'></i> {{altcoinName}}</strong>, consetetur sadipscCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html28 Lorem ipsum dolor sit amet <strong><i class='fab fa-bitcoin'></i> {{altcoinName}}</strong>, consetetur sadipscCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html32 Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu fCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html32 Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu fCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html40 Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer pCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html40 Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer pCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html48 At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus esCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html48 At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus esCODE
LOW⚡frontend/src/app/token-sale/token-sale.component.html62 Stet clita kasd gubergren, no <strong><i class='fab fa-bitcoin'></i> {{altcoinName}}</strong> sea takimata sCODE
84 more matches not shown…
Hyper-Verbose Identifiers44 hits · 44 pts
SeverityFileLineSnippetContext
LOWfrontend/src/hacking-instructor/index.ts190export async function startHackingInstructorFor (challengeName: string): Promise<void> {CODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts65export function waitForInputToNotHaveValue (inputSelector: string, value: string, options = { ignoreCase: true }) {CODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts82export function waitForInputToNotHaveValueAndNotBeEmpty (inputSelector: string, value: string, options = { ignoreCase: tCODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts116export function waitForElementToGetClicked (elementSelector: string) {CODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts131export function waitForElementsInnerHtmlToBe (elementSelector: string, value: string) {CODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts159export function waitForAngularRouteToBeVisited (route: string) {CODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts244export function waitForSelectToNotHaveValue (selectSelector: string, value: string) {CODE
LOWfrontend/src/hacking-instructor/helpers/helpers.ts259export function waitForRightUriQueryParamPair (key: string, value: string) {CODE
LOW…strength-info/password-strength-info.component.spec.ts5function createPasswordComponentStub (overrides: Partial<any> = {}): any {CODE
LOW…er-settings/pipes/difficulty-selection-summary.pipe.ts27function breakDifficultiesIntoNeighboringGroups (difficulties: (1 | 2 | 3 | 4 | 5 | 6)[]): DifficultyGroup[] {CODE
LOW…er-settings/pipes/difficulty-selection-summary.pipe.ts46function convertDifficultyGroupsToString (difficultyGroups: DifficultyGroup[]): string {CODE
LOW…end/src/app/score-board/helpers/challenge-filtering.ts100function getCompleteChallengeStatus (CODE
LOWfrontend/src/assets/private/three.js21805 function materialNeedsSmoothNormals ( material ) {CODE
LOWfrontend/src/assets/private/three.js21833 function bufferGuessVertexColorType( material ) {CODE
LOWfrontend/src/assets/private/three.js24365 function unrollImmediateBufferMaterial ( globject ) {CODE
LOWlib/antiCheat.ts162function isLooselyCoupledToPreviouslySolved (challenge: Challenge) {CODE
LOWlib/antiCheat.ts206export function checkForSourceFileOverlap (challengeKey: string, submission: string): boolean {CODE
LOWlib/utils.ts153export function getChallengeEnablementStatus (challenge: Challenge,CODE
LOWlib/codingChallenges.ts47function getCodeChallengesFromFile (file: FileMatch) {CODE
LOWlib/codingChallenges.ts59export function getCodingChallengeFromFileContent (source: string, challengeKey: string) {CODE
LOWdata/staticData.ts93export async function loadStaticSecurityQuestionsData (): Promise<StaticSecurityQuestions[]> {CODE
LOWdata/datacreator.ts296 function getGeneratedRandomFakeUserEmail () {CODE
LOWdata/datacreator.ts473 function customizeChangeProductChallenge (description: string, customUrl: string, customProduct: Product) {CODE
LOWdata/datacache.ts34export function setRetrieveBlueprintChallengeFile (retrieveBlueprintChallengeFileArg: string) {CODE
LOWdata/static/codefixes/xssBonusChallenge.info.yml7 explanation: 'Using bypassSecurityTrustSoundCloud() instead of bypassSecurityTrustHtml() supposedly bypasses sanitizCODE
LOWroutes/login.ts68 function verifyPostLoginChallenges (user: User) {CODE
LOWroutes/verify.ts144async function checkPatternInFeedbackAndComplaints (CODE
LOWroutes/verify.ts245function knownVulnerableComponentChallenge () {CODE
LOWroutes/verify.ts252function knownVulnerableComponents () {CODE
LOWroutes/verify.ts286function typosquattingNpmChallenge () {CODE
LOWroutes/verify.ts293function typosquattingAngularChallenge () {CODE
LOWroutes/verify.ts307function supplyChainAttackChallenge () {CODE
LOWroutes/verify.ts321function dlpPastebinDataLeakChallenge () {CODE
LOWroutes/verify.ts342function vulnerableDockerImageChallenge () {CODE
LOWroutes/verify.ts363export function checkSystemPromptSimilarity (submission: string, reference: string, threshold = 0.25): boolean {CODE
LOWroutes/verify.ts368async function systemPromptExtractionChallenge (): Promise<void> {CODE
LOWroutes/resetPassword.ts57function verifySecurityAnswerChallenges (user: UserModel, answer: string) {CODE
LOWroutes/basketItems.ts58export function quantityCheckBeforeBasketItemAddition () {CODE
LOWroutes/basketItems.ts65export function quantityCheckBeforeBasketItemUpdate () {CODE
LOWroutes/order.ts190function calculateApplicableDiscount (basket: BasketModel, req: Request) {CODE
LOWroutes/fileServer.ts39 function verifySuccessfulPoisonNullByteExploit (file: string) {CODE
LOWroutes/fileServer.ts56 function endsWithAllowlistedFileType (param: string) {CODE
LOWroutes/metrics.ts63export function observeRequestMetricsMiddleware () {CODE
LOWroutes/metrics.ts73export function observeFileUploadMetricsMiddleware () {CODE
Synthetic Comment Markers6 hits · 40 pts
SeverityFileLineSnippetContext
HIGHCONTRIBUTING.md196. Noise (e.g. unnecessary comments) generated by AI tools _must_ be removed before opening a PR.CODE
HIGHAGENTS.md101**Required** per CONTRIBUTING.md rule #6: Remove unnecessary AI-generated content before submitting PRs.CODE
HIGH.github/workflows/issue-compliance.yml162 // A generic automated/AI-generated vulnerability report tends to (a) use several "field: value"COMMENT
HIGH.github/workflows/issue-compliance.yml226 // 12. Generic AI-generated maintenance/bug report smell: formal audit-style structure and vagueCOMMENT
HIGH.github/workflows/issue-compliance.yml241 // 13. Formulaic / bulk AI-generated challenge idea: lists several generic vulnerability buzzwordsCOMMENT
HIGH.github/workflows/issue-compliance.yml254 // 14. Formulaic AI-generated vulnerability narrative: boilerplate framing ("introduce a ...COMMENT
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALfrontend/src/app/oauth/oauth.component.ts72 const hash = this.route.snapshot.data.params.substr(1)CODE
Over-Commented Block9 hits · 9 pts
SeverityFileLineSnippetContext
LOWfrontend/src/assets/private/three.js30161 points.push( points[ 0 ] );COMMENT
LOWfrontend/src/assets/private/three.js30501//COMMENT
LOWfrontend/src/assets/private/three.js31321// var c = [];COMMENT
LOWfrontend/src/assets/private/OrbitControls.js1/**COMMENT
LOW…efixes/resetPasswordBjoernOwaspChallenge_2_correct.yml1# Provide password reset option via a one-time link withCOMMENT
LOW…c/codefixes/resetPasswordBjoernChallenge_1_correct.yml1# Provide password reset option via a one-time link withCOMMENT
LOW…c/codefixes/resetPasswordBenderChallenge_2_correct.yml1# Provide password reset option via a one-time link withCOMMENT
LOW…c/codefixes/resetPasswordUvoginChallenge_3_correct.yml1# Provide password reset option via a one-time link withCOMMENT
LOW…atic/codefixes/resetPasswordJimChallenge_3_correct.yml1# Provide password reset option via a one-time link withCOMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMfrontend/src/assets/private/three.js3514 // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axesCOMMENT
MEDIUMfrontend/src/assets/private/three.js3838 // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axesCOMMENT