AI Slop Code Risk Monitor

maplibre/maplibre-gl-js

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

MapLibre GL JS - Interactive vector tile maps in the browser

0.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for maplibre/maplibre-gl-js, a TypeScript project with 11,985 GitHub stars. SynthScan examined 379,903 lines of code across 2903 source files, recording 169 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 0.6 (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.

0.6
Adjusted Signal
0.6
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
12.0K
Stars
TypeScript
Language
379.9K
Lines of Code
2.9K
Files
169
Pattern Hits
2026-10-31
Scan Date
0.00
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.2/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.7/100 · LOW

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

Agent Over-Engineering Ratio 1.7/100 · LOW

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

PR Review Velocity Impact 2.8/100 · LOW

Which changes need focused human review? 169 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 4HIGH 0MEDIUM 4LOW 161

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

Hyper-Verbose Identifiers124 hits · 127 pts
SeverityFileLineSnippetContext
LOWtest/examples/raycast-3d-tiles-using-threejs.html134 function raycastFromOriginAndDirection(ecef_origin, ecef_direction) {CODE
LOWsrc/index.ts162function getMaxParallelImageRequests(): number { return config.MAX_PARALLEL_IMAGE_REQUESTS; }CODE
LOWsrc/index.ts172function setMaxParallelImageRequests(numRequests: number): void { config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; }CODE
LOWsrc/ui/camera.test.ts58async function simulateAllAnimationFrames(stub: ReturnType<typeof vi.spyOn>, camera: Camera, queue: TaskQueue, duration:CODE
LOWsrc/ui/handler/mouse.ts59export function generateMouseRotationHandler({enable, clickTolerance, minPixelCenterThreshold = 100, rotateSpeed = 0.8}:CODE
LOWsrc/ui/handler/mouse.ts100export function generateMousePitchHandler({enable, clickTolerance, pitchSpeed = -0.5}: {CODE
LOWsrc/ui/handler/tap_drag_zoom.test.ts35function startDoubleTapDragGesture(map: Map, target: HTMLElement) {CODE
LOWsrc/ui/map_tests/map_terrain.test.ts526 function startPitchDragThatSwitchesTerrainOn(map: Map): void {CODE
LOWsrc/ui/map_tests/map_terrain.test.ts1355 function southwardCameraMovesOverFrames(map: Map, frame: () => void, count: number): number[] {CODE
LOWsrc/ui/map_tests/map_terrain.test.ts1369 async function createMapOverShapedTerrain(options: Partial<MapOptions>, height: TerrainHeight, min: number, max: numCODE
LOWsrc/ui/map_tests/map_terrain.test.ts1577 async function cameraMovesZoomingOutOver(height: TerrainHeight, max: number): Promise<number[]> {CODE
LOWsrc/ui/control/geolocate_control.test.ts30function createResizeObserverEntryMock() {CODE
LOWsrc/util/intersection_tests.ts24function polygonIntersectsBufferedPoint(polygon: Polygon, point: Point, radius: number): boolean {CODE
LOWsrc/util/intersection_tests.ts29function polygonIntersectsMultiPolygon(polygon: Polygon, multiPolygon: MultiPolygon): boolean {CODE
LOWsrc/util/intersection_tests.ts52function polygonIntersectsBufferedMultiLine(polygon: Polygon, multiLine: MultiLine, radius: number): boolean {CODE
LOWsrc/util/intersection_tests.ts66function lineIntersectsBufferedLine(lineA: Line, lineB: Line, radius: number) {CODE
LOWsrc/util/intersection_tests.ts98function lineSegmentIntersectsLineSegment(a0: Point, a1: Point, b0: Point, b1: Point) {CODE
LOWsrc/util/intersection_tests.ts103function pointIntersectsBufferedLine(p: Point, line: Line, radius: number) {CODE
LOWsrc/util/intersection_tests.ts128function multiPolygonContainsPoint(rings: Ring[], p: Point) {CODE
LOWsrc/util/create_tile_mesh.ts80export function createTileMeshWithBuffers(context: Context, options: CreateTileMeshOptions): Mesh {CODE
LOWsrc/util/geojson_bounds.ts15function getCoordinatesFromGeometry(geometry: GeoJSON.Geometry | null): number[][] {CODE
LOWsrc/util/geojson_reproject.ts88export function reprojectGeoJSONSourceDiffToWorld(diff: GeoJSONSourceDiff, crsHelper: CRSWorldCoordinateHelper): GeoJSONCODE
LOW⚡src/util/script_detection.ts14export function charIsSymbolOrPunctuation(codePoint: number): boolean {CODE
LOW⚡src/util/script_detection.ts18export function allowsIdeographicBreaking(chars: string): boolean {CODE
LOW⚡src/util/script_detection.ts25export function allowsVerticalWritingMode(chars: string): boolean {CODE
LOWsrc/util/script_detection.ts57export function charHasRotatedVerticalOrientation(char: number): boolean {CODE
LOWsrc/util/script_detection.ts62export function charInComplexShapingScript(char: number): boolean {CODE
LOWsrc/util/find_pole_of_inaccessibility.ts14export function findPoleOfInaccessibility(CODE
LOWsrc/util/util.ts213export function differenceOfAnglesDegrees(degreesA: number, degreesB: number): number {CODE
LOWsrc/util/util.ts229export function differenceOfAnglesRadians(degreesA: number, degreesB: number): number {CODE
LOWsrc/util/util.ts850function computeVideoFrameParameters(image: Size, x: number, y: number, width: number, height: number): VideoFrameCopyToCODE
LOWsrc/util/util.ts924export function readImageDataUsingOffscreenCanvas(CODE
LOWsrc/util/util.ts1187export function isTouchableOrPointableType(eventType: string): boolean {CODE
LOWsrc/util/offscreen_canvas_distorted.ts12export function isOffscreenCanvasDistorted(): boolean {CODE
LOWsrc/util/web_worker_transfer.ts109function isSerializeHandledByBuiltin(input: unknown) {CODE
LOWsrc/util/test/util.ts346export function createRasterDEMTileManager(): TileManager {CODE
LOWsrc/util/test/util.ts427export function createIdentityCrsTransform(width: number, height: number): MercatorTransform {CODE
LOWsrc/util/test/util.ts465export function createIdentityCrsAnsweringInside(answerOutside: number[] | null): CRS {CODE
LOWsrc/util/test/util.ts522export function createPolarStereographicCrs(): CRS {CODE
LOWsrc/util/primitives/frustum.ts84function adjustFarPlaneByHorizonPlane(frustumCoords: vec4[], nearPlanePointsIndices: number[], horizonPlane: vec4, flippCODE
LOWsrc/util/primitives/frustum.ts155function getIdealNearFarPlaneDistance(horizonPlane: vec4, nearPlaneNormalized: vec4): number | null {CODE
LOWsrc/source/image_source.ts572export function getCoordinatesCenterTileID(coords: MercatorCoordinate[]): CanonicalTileID {CODE
LOWsrc/source/rtl_text_plugin_main_thread.ts107export function rtlMainThreadPluginFactory(): RTLMainThreadPlugin {CODE
LOWsrc/source/image_source.test.ts29async function createLoadedSourceWithTile(map: Map, server: FakeServer) {CODE
LOWsrc/source/query_features.ts247function mergeRenderedFeatureLayers(tiles: RenderedFeatureLayer[]): QueryResults {CODE
LOWsrc/source/query_features.ts271function convertFeaturesToMapFeatures(result: QueryResults, tileManager: TileManager): QueryRenderedFeaturesResults {CODE
LOWsrc/source/query_features.ts281function convertFeaturesToMapFeaturesMultiple(result: QueryResults, styleLayers: {[_: string]: StyleLayer}, tileManagersCODE
LOWsrc/source/query_features.ts293function convertFeatureToMapFeature(featureWrapper: QueryResultsItem, tileManager: TileManager) {CODE
LOWsrc/source/rtl_text_plugin_main_thread.test.ts39 function broadcastMockSuccessDefer(message: MessageType, payload: PluginState): Promise<PluginState[]> {CODE
LOWsrc/geo/projection/mercator_utils.ts26export function tileCoordinatesToMercatorCoordinates(inTileX: number, inTileY: number, canonicalTileID: {x: number; y: nCODE
LOWsrc/geo/projection/mercator_utils.ts38export function getMercatorTileCoordinates(overscaledTileID?: {canonical: {x: number; y: number; z: number}} | null): [nCODE
LOWsrc/geo/projection/mercator_utils.ts57export function tileCoordinatesToLocation(inTileX: number, inTileY: number, canonicalTileID: {x: number; y: number; z: nCODE
LOWsrc/geo/projection/mercator_utils.ts68export function projectToWorldCoordinates(worldSize: number, lnglat: LngLat, helper: WorldCoordinateHelper): Point {CODE
LOWsrc/geo/projection/mercator_utils.ts81export function unprojectFromWorldCoordinates(worldSize: number, point: Point, helper: WorldCoordinateHelper): LngLat {CODE
LOWsrc/geo/projection/mercator_utils.ts115export function cameraMercatorCoordinateFromCenterAndRotation(centerMercator: MercatorCoordinate, pitch: number, bearingCODE
LOWsrc/geo/projection/mercator_utils.ts146export function cameraDirectionFromPitchBearing(pitch: number, bearing: number): {x: number; y: number; z: number} {CODE
LOWsrc/geo/projection/projection_factory.ts95function findRegisteredProjectionName(expression: unknown[]): string | undefined {CODE
LOWsrc/geo/projection/covering_tiles.ts129export function createCalculateTileZoomFunction(maxZoomLevelsOnScreen: number, tileCountMaxMinRatio: number): CalculateTCODE
LOWsrc/geo/projection/covering_tiles.ts206function getElevationForTileCulling(transform: IReadonlyTransform, maxContentElevation?: number): number {CODE
LOWsrc/geo/projection/covering_tiles.ts260export function expandCullingToContentElevation(frustum: Frustum, plane: vec4, cameraPos: vec3, maxContentElevation: numCODE
64 more matches not shown…
Hallucination Indicators4 hits · 45 pts
SeverityFileLineSnippetContext
CRITICAL…examples/add-a-custom-layer-with-tiles-to-a-globe.html191 const granularity = map.style.projection.subdivisionGranularity.tile.getGranularityForZoomLevel(z);CODE
CRITICALsrc/ui/map_tests/map_basic.test.ts130 map.style.tileManagers.geojson._inViewTiles.setTile(fakeTileId.key, new Tile(fakeTileId, undefined));CODE
CRITICALsrc/ui/map_tests/map_basic.test.ts132 map.style.tileManagers.geojson._inViewTiles.getTileById(fakeTileId.key).state = 'loaded';CODE
CRITICALsrc/util/create_tile_mesh.ts106 * granularity: map.style.projection.subdivisionGranularity.tile.getGranularityForZoomLevel(tileID.z),COMMENT
Over-Commented Block20 hits · 20 pts
SeverityFileLineSnippetContext
LOWtest/examples/create-a-time-slider.html101 const filters = ['==', 'month', month];COMMENT
LOW…examples/add-a-custom-layer-with-tiles-to-a-globe.html41 // web mercator tiles with a custom shader.COMMENT
LOWtest/examples/add-a-simple-custom-layer-on-a-globe.html81 // in range 0..EXTENT (8192), but for custom layers MapLibre supplies uniforms such thatCOMMENT
LOWtest/examples/add-a-simple-custom-layer-on-a-globe.html161 helsinki.y,COMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml61 # 📚 https://git.io/JvXDlCOMMENT
LOWsrc/util/ref_properties.ts1import type {FillLayerSpecification} from '@maplibre/maplibre-gl-style-spec';COMMENT
LOW…eo/projection/globe_covering_tiles_details_provider.ts221 // We will also include the tile center point, since it will always be an extreme for the "center" axis.COMMENT
LOWsrc/geo/projection/vertical_perspective_transform.ts341 // gggggggggCOMMENT
LOWsrc/geo/projection/vertical_perspective_transform.ts781 vec3.rotateY(rotatedPixelVector, vecToPixelCurrent, zero, -this._cameraState.center.lng * Math.PI / 180.0);COMMENT
LOWsrc/render/subdivision.test.ts341 // 3: 12COMMENT
LOWsrc/render/subdivision.test.ts361 10, 2, 9,COMMENT
LOWsrc/render/subdivision.test.ts521COMMENT
LOWsrc/render/subdivision.test.ts941 // | | | | |COMMENT
LOWsrc/render/subdivision.ts241 }COMMENT
LOWsrc/render/subdivision.ts381 // aCOMMENT
LOWsrc/style/style.ts1601 // The order between a feature in a 2D layer and a 3D layer is tricky:COMMENT
LOWsrc/symbol/quads.ts301 const br = new Point(x2, y2);COMMENT
LOWsrc/symbol/placement.ts461 // of the collision grid).COMMENT
LOWsrc/data/bucket/line_bucket.ts361COMMENT
Verbosity Indicators4 hits · 8 pts
SeverityFileLineSnippetContext
LOWsrc/source/geojson_worker_source.test.ts216 // Step 1: Create source and load dataCOMMENT
LOW⚡src/source/geojson_worker_source.test.ts234 // Step 2: Call loadTile and have it abortCOMMENT
LOW⚡src/source/geojson_worker_source.test.ts243 // Step 3: Call reloadTile and have it abortCOMMENT
LOW⚡src/source/geojson_worker_source.test.ts252 // Step 4: Call reloadTileCOMMENT
Structural Annotation Overuse4 hits · 8 pts
SeverityFileLineSnippetContext
LOWsrc/source/geojson_worker_source.test.ts216 // Step 1: Create source and load dataCOMMENT
LOW⚡src/source/geojson_worker_source.test.ts234 // Step 2: Call loadTile and have it abortCOMMENT
LOW⚡src/source/geojson_worker_source.test.ts243 // Step 3: Call reloadTile and have it abortCOMMENT
LOW⚡src/source/geojson_worker_source.test.ts252 // Step 4: Call reloadTileCOMMENT
Fake / Example Data8 hits · 8 pts
SeverityFileLineSnippetContext
LOW…ts/text-max-width/zero-width-line-placement/style.json56 "text-field": "Lorem ipsum dolor sit amet.",CODE
LOW…ts/text-max-width/zero-width-line-placement/style.json56 "text-field": "Lorem ipsum dolor sit amet.",CODE
LOW…s/text-max-width/zero-width-point-placement/style.json45 "text-field": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",CODE
LOW…s/text-max-width/zero-width-point-placement/style.json45 "text-field": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",CODE
LOW…-max-width/zero-width-line-center-placement/style.json56 "text-field": "Lorem ipsum dolor sit amet.",CODE
LOW…-max-width/zero-width-line-center-placement/style.json56 "text-field": "Lorem ipsum dolor sit amet.",CODE
LOW…render/tests/line-layer-opacity/line-offset/style.json21 "name": "Lorem ipsum dolor sit amet"CODE
LOW…render/tests/line-layer-opacity/line-offset/style.json21 "name": "Lorem ipsum dolor sit amet"CODE
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMsrc/data/bucket/fill_extrusion_bucket.ts303 // ┌──────┐COMMENT
MEDIUMsrc/data/bucket/fill_extrusion_bucket.ts307 // └──────┘COMMENT
AI Slop Vocabulary2 hits · 5 pts
SeverityFileLineSnippetContext
MEDIUMpackage-lock.json11472 "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",CODE
MEDIUMsrc/tile/tile_manager.ts484 // In order to make this transition seamless, we calculate the rounded difference ofCOMMENT
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtest/examples/check-if-webgl-is-supported.html47 // Don't forget to log the error to the consoleCOMMENT