AI Slop Code RIsk Monitor

getgrav/grav

Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

5.5 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for getgrav/grav, a PHP project with 15,685 GitHub stars. SynthScan examined 171,851 lines of code across 928 source files, recording 837 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 5.5 (Moderate 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.

5.5
Adjusted Signal
5.5
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
15.7K
Stars
PHP
Language
171.9K
Lines of Code
928
Files
837
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 21.1/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 3.8/100 · LOW

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

Agent Over-Engineering Ratio 19.5/100 · LOW

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

PR Review Velocity Impact 22.1/100 · LOW

Which changes need focused human review? 837 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 2HIGH 0MEDIUM 1LOW 834

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 837 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.

Hyper-Verbose Identifiers659 hits · 744 pts
SeverityFileLineSnippetContext
LOWtests/phpstan/classes/Grav/UtilsPathinfoExtension.php30 public function getTypeFromStaticMethodCall(CODE
LOWtests/unit/Grav/RouterTest.php18 public function testKeepsRestrictedFilesBehindGrav(): voidCODE
LOW…nit/Grav/Framework/File/Formatter/CsvFormatterTest.php10 public function testEncodeWithAssocColumns(): voidCODE
LOW…nit/Grav/Framework/File/Formatter/CsvFormatterTest.php29 public function testEncodeWithIndexColumns(): voidCODE
LOW…nit/Grav/Framework/Flex/FlexModuleContentCacheTest.php50 public function testModuleRenderIsNotStored(): voidCODE
LOW…nit/Grav/Framework/Flex/FlexModuleContentCacheTest.php62 public function testRegularPageRenderIsNotStored(): voidCODE
LOWtests/unit/Grav/Framework/Flex/FlexPageSearchTest.php30 public function testPageSearchMatchesTheKey(): voidCODE
LOWtests/unit/Grav/Framework/Flex/FlexPageSearchTest.php43 public function testOtherTypesKeepTheirSearch(): voidCODE
LOWtests/unit/Grav/Framework/Acl/AccessTest.php49 public function testDeniedRunDoesNotAllowLaterLetters(): voidCODE
LOWtests/unit/Grav/Framework/Acl/AccessTest.php59 public static function providerPermissionStrings(): arrayCODE
LOWtests/unit/Grav/Common/DebuggerCredentialsTest.php44 public function testMultipartFormBodyFromTheExtension(): voidCODE
LOW⚡tests/unit/Grav/Common/DebuggerCredentialsTest.php71 public function testEmptyRequestGivesEmptyCredentials(): voidCODE
LOW⚡tests/unit/Grav/Common/DebuggerCredentialsTest.php78 public function testLoopbackRequestWithoutConfiguredTokenIsDenied(): voidCODE
LOW⚡tests/unit/Grav/Common/DebuggerCredentialsTest.php83 public function testLoopbackRequestWithoutPresentedTokenIsDenied(): voidCODE
LOW⚡tests/unit/Grav/Common/DebuggerCredentialsTest.php88 public function testRawConfiguredTokenIsAccepted(): voidCODE
LOWtests/unit/Grav/Common/UtilsTest.php224 public function testGetMimeByExtensionHonoursMediaTypesOverride(): voidCODE
LOWtests/unit/Grav/Common/UtilsTest.php309 public function testPathPrefixedByLangCode(): voidCODE
LOWtests/unit/Grav/Common/UtilsTest.php589 public function testUrlWithRootDoesNotStripMatchingSegmentFromTheMiddle(): voidCODE
LOWtests/unit/Grav/Common/UtilsTest.php606 public function testUrlKeepsQueryAndFragmentWhilePageStillResolves(): voidCODE
LOWtests/unit/Grav/Common/UtilsTest.php656 public function testUrlResolvesPagesOnSubfolderInstall(): voidCODE
LOW⚡tests/unit/Grav/Common/ThemesTest.php54 public function testInitThemeRegistersBlueprintsWithoutPagesDirectory(): voidCODE
LOW⚡tests/unit/Grav/Common/ThemesTest.php63 public function testInitThemeStillRegistersPageBlueprints(): voidCODE
LOW⚡tests/unit/Grav/Common/ThemesTest.php72 public function testInitThemeRegistersMultipleNamespacesIndependently(): voidCODE
LOWtests/unit/Grav/Common/ThemesTest.php90 public function testInitThemeDoesNotMountRootLevelBlueprintsAtStreamRoot(): voidCODE
LOWtests/unit/Grav/Common/ThemesTest.php108 public function testThemePageBlueprintExtendsSystemDefaultWithoutRecursion(): voidCODE
LOWtests/unit/Grav/Common/GravRedirectTest.php23 public function testRedirectCodeIsStrippedFromRoute(string $route, int $code, string $location): voidCODE
LOW⚡tests/unit/Grav/Common/GravRedirectTest.php56 public function testRouteWithoutCodeUsesTheDefault(): voidCODE
LOW⚡tests/unit/Grav/Common/GravRedirectTest.php64 public function testExplicitCodeWinsOverTheOneInTheRoute(): voidCODE
LOW⚡tests/unit/Grav/Common/GravRedirectTest.php72 public function testExternalTargetKeepsItsQuery(): voidCODE
LOWtests/unit/Grav/Common/UriTest.php948 public function testRequestBasicCredentialsStayOutOfTheUri(): voidCODE
LOWtests/unit/Grav/Common/UriTest.php1111 public function testReferrerOnlyAcceptsOurOwnOrigin(): voidCODE
LOWtests/unit/Grav/Common/UriTest.php1266 public function testCustomBasePrefixCollision(): voidCODE
LOWtests/unit/Grav/Common/UriTest.php1293 public static function customBaseBoundaryProvider(): arrayCODE
LOWtests/unit/Grav/Common/GravOutputBuffersTest.php17 public function testShutdownFlushStopsAtTheCompressionBuffer(): voidCODE
LOWtests/unit/Grav/Common/GravOutputBuffersTest.php33 public function testCleanDiscardsWhatItCanAndKeepsTheCompressionBuffer(): voidCODE
LOWtests/unit/Grav/Common/GravOutputBuffersTest.php48 public function testWhoopsCleanupStopsAtTheCompressionBuffer(): voidCODE
LOWtests/unit/Grav/Common/PluginMergeConfigTest.php75 public function testMergedConfigStoredInTheConfigCanBeMergedAgain($deep, array $pageSettings, array $expected): voidCODE
LOWtests/unit/Grav/Common/PluginMergeConfigTest.php97 public function testMergedConfigStoredInTheConfigServesAnotherPage($deep, array $pageSettings, array $expected): voiCODE
LOWtests/unit/Grav/Common/DebuggerDeprecationsTest.php12 public function testRepeatedNoticesKeepOneTraceAndTheirOccurrenceCount(): voidCODE
LOWtests/unit/Grav/Common/DebuggerDeprecationsTest.php27 public function testDifferentMessagesFilesAndLinesRemainSeparate(): voidCODE
LOWtests/unit/Grav/Common/DebuggerDeprecationsTest.php44 public function testYamlNoticesAreGroupedByDocumentInsteadOfParserLocation(): voidCODE
LOWtests/unit/Grav/Common/DebuggerDeprecationsTest.php59 public function testDisabledDebuggerDoesNotCollectNotices(): voidCODE
LOWtests/unit/Grav/Common/DebuggerDeprecationsTest.php67 public function testTwigNoticesKeepDistinctTemplateLocations(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php15 public function testUnresolvedServiceIsNotInitialized(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php23 public function testResolvedServiceIsInitialized(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php32 public function testDirectlyAssignedValueIsInitialized(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php45 public function testDirectlyAssignedParameterIsInitialized(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php53 public function testProtectedClosureIsInitialized(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php61 public function testFactoryIsNeverInitialized(): voidCODE
LOW⚡tests/unit/Grav/Common/ContainerInitializedTest.php70 public function testUnknownIdIsNotInitialized(): voidCODE
LOWtests/unit/Grav/Common/SessionLazyTest.php43 public function testVisitorWithoutCookieGetsNoSessionUntilAWrite(): voidCODE
LOWtests/unit/Grav/Common/SessionLazyTest.php69 public function testVisitorWithCookieStartsAtOnce(): voidCODE
LOWtests/unit/Grav/Common/SessionLazyTest.php87 public function testLogoutOfAPendingSessionStartsNothing(): voidCODE
LOW⚡tests/unit/Grav/Common/SessionLazyTest.php99 public function testLoginStartsTheSessionBeforeRotatingItsId(): voidCODE
LOW⚡tests/unit/Grav/Common/SessionLazyTest.php109 public function testAskingForTheIdStartsTheSession(): voidCODE
LOW⚡tests/unit/Grav/Common/SessionLazyTest.php119 public function testMessagesStartTheSessionOnlyWhenOneIsAdded(): voidCODE
LOWtests/unit/Grav/Common/SessionLazyTest.php139 public function testMessagesAreNotSerializedWithTheirCallback(): voidCODE
LOWtests/unit/Grav/Common/SessionLazyTest.php149 public function testNonceStartsThePendingSession(): voidCODE
LOWtests/unit/Grav/Common/DebuggerFlexRenderHintsTest.php31 public function testOffByDefaultEvenWithDebuggerOn(): voidCODE
LOWtests/unit/Grav/Common/DebuggerFlexRenderHintsTest.php40 public function testNeedsBothTheDebuggerAndTheSetting(): voidCODE
599 more matches not shown…
Fake / Example Data109 hits · 114 pts
SeverityFileLineSnippetContext
LOW⚡…/unit/Grav/Common/Page/Markdown/MarkdownOutputTest.php156 self::assertStringContainsString("---\n\n# Item 1\n\nLorem ipsum", $document);CODE
LOW⚡…nit/Grav/Common/Page/Medium/MediaMetadataQueryTest.php64 $this->assertSame(['photo2.jpg'], $this->names($this->media->filterBy('copyright', 'Jane Doe', '!=')));CODE
LOW⚡…nit/Grav/Common/Page/Medium/MediaMetadataQueryTest.php69 $this->assertSame(['photo1.jpg', 'photo3.jpg'], $this->names($this->media->filterBy('copyright', 'Jane Doe')));CODE
LOW⚡…nit/Grav/Common/Page/Medium/MediaMetadataQueryTest.php91 $this->names($this->media->where(['copyright' => 'Jane Doe', 'rating' => 5]))CODE
LOW⚡…nit/Grav/Common/Page/Medium/MediaMetadataQueryTest.php96 $this->names($this->media->where(['copyright' => 'Jane Doe', 'rating' => [1, 5]]))CODE
LOW⚡…nit/Grav/Common/Page/Medium/MediaMetadataQueryTest.php128 $this->assertSame(['photo1.jpg', 'photo3.jpg'], $this->names($groups['Jane Doe']));CODE
LOW⚡…s/unit/Grav/Common/Page/Medium/MediumMagicCallTest.php69 $this->assertSame('Jane Doe', $this->render('{{ image.copyright }}', $medium));CODE
LOWtests/unit/Grav/Common/File/CompiledFileTest.php143 $lines[] = " help: " . str_repeat('lorem ipsum dolor sit amet ', 3);CODE
LOWtests/unit/Grav/Common/File/CompiledFileTest.php143 $lines[] = " help: " . str_repeat('lorem ipsum dolor sit amet ', 3);CODE
LOW…ts/unit/Grav/Common/Security/FileCacheSecurityTest.php134 $cache->set('alpha', 'placeholder'); // create the file so getFile() path existsCODE
LOW…mmon/Security/BlueprintDynamicConfigProvenanceTest.php88 self::assertNotSame('S3CRET-security', $fields['salt']['placeholder'] ?? null);CODE
LOW…mmon/Security/BlueprintDynamicConfigProvenanceTest.php109 self::assertSame('S3CRET-security', $fields['salt']['placeholder'] ?? null);CODE
LOW…ts/unit/Grav/Common/Twig/Sandbox/SandboxConfigTest.php31 'user' => 'admin@example.com',CODE
LOW⚡tests/unit/Grav/Common/Data/ValidationLengthTest.php20 $value = str_repeat("Lorem ipsum dolor sit amet.\n", 20000);CODE
LOW⚡tests/unit/Grav/Common/Data/ValidationLengthTest.php20 $value = str_repeat("Lorem ipsum dolor sit amet.\n", 20000);CODE
LOWtests/fake/nested-site/user/pages/01.item1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOWtests/fake/nested-site/user/pages/01.item1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/01.item1/01.item1-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/01.item1/01.item1-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/01.item1-1/02.item1-1-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/01.item1-1/02.item1-1-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/01.item1-1/01.item1-1-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/01.item1-1/01.item1-1-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/01.item1-1/03.item1-1-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/01.item1-1/03.item1-1-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/01.item1/03.item1-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/01.item1/03.item1-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/03.item1-3/02.item1-3-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/03.item1-3/02.item1-3-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/03.item1-3/01.item1-3-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/03.item1-3/01.item1-3-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/03.item1-3/03.item1-3-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/03.item1-3/03.item1-3-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/01.item1/02.item1-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/01.item1/02.item1-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/02.item1-2/01.item1-2-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/02.item1-2/01.item1-2-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/02.item1-2/03.item1-2-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/02.item1-2/03.item1-2-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/02.item1-2/02.item1-2-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/01.item1/02.item1-2/02.item1-2-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOWtests/fake/nested-site/user/pages/02.item2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOWtests/fake/nested-site/user/pages/02.item2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/02.item2/01.item2-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/02.item2/01.item2-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/01.item2-1/02.item2-1-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/01.item2-1/02.item2-1-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/01.item2-1/03.item2-1-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/01.item2-1/03.item2-1-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/01.item2-1/01.item2-1-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/01.item2-1/01.item2-1-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/02.item2/03.item2-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/02.item2/03.item2-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/03.item2-3/02.item2-3-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/03.item2-3/02.item2-3-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/03.item2-3/03.item2-3-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/03.item2-3/03.item2-3-3/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/03.item2-3/01.item2-3-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…user/pages/02.item2/03.item2-3/01.item2-3-1/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
LOW…/nested-site/user/pages/02.item2/02.item2-2/default.md5Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmodCODE
49 more matches not shown…
Over-Commented Block65 hits · 65 pts
SeverityFileLineSnippetContext
LOWbin/test-selfupgrade.sh1#!/usr/bin/env bashCOMMENT
LOWtests/functional.suite.yml1# Codeception Test Suite ConfigurationCOMMENT
LOWtests/unit/Grav/Common/Security/TwigSandboxTest.php421 //COMMENT
LOWtests/fake/htaccess-2.2.3.txt1<IfModule mod_rewrite.c>COMMENT
LOWtests/fake/htaccess-2.2.3.txt21# RewriteCond %{HTTP:X-Forwarded-Proto} httpsCOMMENT
LOWtests/fake/htaccess-2.2.3.txt41# Return 403 Forbidden header and show the content of the root homepageCOMMENT
LOWtests/fake/htaccess-2.2.3.txt61# Block all direct access to these sensitive user folders, whatever the file typeCOMMENT
LOWtests/fake/htaccess-2.2.3.txt101</IfModule>COMMENT
LOWtests/fake/htaccess-user-env.txt1# Deny direct web access to the sensitive folders inside each environment:COMMENT
LOWsystem/blueprints/config/system.yaml2201 accounts.avatar:COMMENT
LOWsystem/blueprints/config/system.yaml2221# type: sectionCOMMENT
LOWsystem/config/site.yaml21# '/old/(.*)': '/new/$1' # Would redirect /old/my-page to /new/my-pageCOMMENT
LOWsystem/config/security.yaml1# XSS heuristics (Security::detectXss and friends).COMMENT
LOWsystem/config/security.yaml81 - xhtCOMMENT
LOWsystem/config/security.yaml101# markup can never trip it, and there is no render-time cost. (GHSA-2c4f-86xc-cr74)COMMENT
LOWsystem/config/security.yaml121# page-edit access (or anyone who compromises the file system) canCOMMENT
LOWsystem/config/security.yaml141 # Twig sandbox allowlists & config redaction now ship as code defaults inCOMMENT
LOWsystem/config/security.yaml161 # the defaults, over allowed_* additions, and over plugin event additions.COMMENT
LOWsystem/config/security.yaml181# canonical absolute path.COMMENT
LOWsystem/config/system.yaml61 # (this is a single checkboxes field in the blueprint, not a deep-mergedCOMMENT
LOW…/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php681 $config = $grav['config'];COMMENT
LOWsystem/src/Grav/Common/Grav.php561 // A redirect or an early close is still a finished request: the slowCOMMENT
LOWsystem/src/Grav/Common/Security.php301 return $char === false ? "\u{FFFD}" : $char;COMMENT
LOWsystem/src/Grav/Common/Security.php321 // A space cannot: `java script:` is not a scheme to any browser.COMMENT
LOWsystem/src/Grav/Common/Security.php341 $protocol_url_regex = '#(?<![a-z0-9\s.])(' . $protocol_alt . ')(:|\&\#58)\S.*?#iUu';COMMENT
LOWsystem/src/Grav/Common/Security.php361 //COMMENT
LOWsystem/src/Grav/Common/Security.php381 // `=`, exactly as the HTML tokenizer does. The GHSA-269c patternCOMMENT
LOWsystem/src/Grav/Common/Security.php401 'on_events' => '#<(?:=\s*"[^">]*>[^"]*"|=\s*\'[^\'>]*>[^\']*\'|[^<>])*?(?:[\s\x00-\x20\"\'\/]|=\s*"[^"]*"|=\COMMENT
LOWsystem/src/Grav/Common/Security.php681COMMENT
LOWsystem/src/Grav/Common/Security.php701 //COMMENT
LOWsystem/src/Grav/Common/Page/Page.php981 $process_markdown = $this->shouldProcess('markdown');COMMENT
LOWsystem/src/Grav/Common/Page/Markdown/Excerpts.php301 // applied to image media. Applying it to audio, video or a documentCOMMENT
LOWsystem/src/Grav/Common/Page/Markdown/Excerpts.php381 // 1. It fails RFC 3986 scheme grammar - a real scheme alwaysCOMMENT
LOWsystem/src/Grav/Common/Page/Medium/ImageMedium.php381 $grav = $this->getGrav();COMMENT
LOWsystem/src/Grav/Common/Config/Setup.php461COMMENT
LOWsystem/src/Grav/Common/Twig/Twig.php221 if (empty($params['autoescape'])) {COMMENT
LOWsystem/src/Grav/Common/Twig/Twig.php421 // the @Page: source stays stable (the raw body) rather thanCOMMENT
LOWsystem/src/Grav/Common/Twig/Extension/GravExtension.php341 protected function assertSandboxDumpSafe(Environment $env, bool $isSandboxed, mixed $var, string $filter, bool $reflCOMMENT
LOWsystem/src/Grav/Common/Data/Blueprint.php301 // merged tree and can no longer distinguish one source from another.COMMENT
LOWsystem/src/Grav/Common/Data/Blueprint.php741 if (!$trusted && !isset(self::$allowedDynamicCallables[strtolower(ltrim($function, '\\'))])) {COMMENT
LOWsystem/src/Grav/Common/Assets/BaseAsset.php141COMMENT
LOW…stem/src/Grav/Installer/updates/1.8.0_2026-06-26_0.php41 * correct on every platform. Every rewrite below is idempotent.COMMENT
LOW…stem/src/Grav/Installer/updates/1.8.0_2026-08-13_0.php41COMMENT
LOW…stem/src/Grav/Installer/updates/2.1.5_2026-09-14_0.php61 'user/.htaccess' => <<<'HTACCESS'COMMENT
LOW…stem/src/Grav/Installer/updates/2.1.5_2026-09-14_0.php121 # Deny all direct web access to this folder and everything beneath it.COMMENT
LOW…stem/src/Grav/Installer/updates/2.1.6_2026-09-14_0.php61 // the same carve-out before 2026-06-26 widened itCOMMENT
LOW…stem/src/Grav/Installer/updates/2.1.6_2026-09-14_0.php101COMMENT
LOW…stem/src/Grav/Installer/updates/2.1.6_2026-09-14_0.php141 </IfModule>COMMENT
LOW…stem/src/Grav/Installer/updates/1.8.0_2026-06-30_0.php21// Avatar image extensions that may be served from user/accounts/avatars. SVG isCOMMENT
LOW…stem/src/Grav/Installer/updates/2.2.1_2026-09-25_0.php81 # FileInfo` (getgrav/grav#4309, #4311). mod_alias is FileInfo-class, leaves theCOMMENT
LOW…stem/src/Grav/Installer/updates/2.2.1_2026-09-25_0.php101 # subdirectories instead of being replaced, so a plugin or theme that ships itsCOMMENT
LOW…stem/src/Grav/Installer/updates/2.2.1_2026-09-25_0.php121 # Defense-in-depth backup for the rules in the site root .htaccess.COMMENT
LOW…stem/src/Grav/Installer/updates/2.2.1_2026-09-25_0.php141 # Data files (.yaml/.json/.md), databases, keys and tokens stay blocked.COMMENT
LOW…stem/src/Grav/Installer/updates/2.2.0_2026-09-23_0.php61 # Deny all direct web access to this folder and everything beneath it.COMMENT
LOW…stem/src/Grav/Installer/updates/2.2.0_2026-09-23_0.php81 </IfModule>COMMENT
LOW…stem/src/Grav/Installer/updates/2.2.0_2026-09-23_0.php121COMMENT
LOW…stem/src/Grav/Installer/updates/2.2.0_2026-09-23_0.php141 # Deliberately unanchored. These rules only run for requests that resolve intoCOMMENT
LOW…stem/src/Grav/Installer/updates/2.2.0_2026-09-23_0.php181 'user/data/.htaccess' => <<<'HTACCESS'COMMENT
LOWwebserver-configs/htaccess.txt1<IfModule mod_rewrite.c>COMMENT
LOWwebserver-configs/htaccess.txt21# RewriteCond %{HTTP:X-Forwarded-Proto} httpsCOMMENT
5 more matches not shown…
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICALsystem/assets/jquery/jquery-2.x.min.js3}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:funCODE
CRITICALsystem/assets/jquery/jquery-3.x.min.js2!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):fCODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMbin/test-selfupgrade.sh2# Local self-upgrade test harness.COMMENT
Verbosity Indicators1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsystem/src/Grav/Common/Utils.php110 // If URL has a scheme, we need to check if it's one of Grav streams.COMMENT