AI Slop Code Risk Monitor

Rdatatable/data.table

SlopCodeMonitor badge for Rdatatable/data.table Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

R's data.table package extends data.frame:

3.2 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for Rdatatable/data.table, a R project with 3,927 GitHub stars. SynthScan examined 49,125 lines of code across 195 source files, recording 118 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 3.2 (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.

3.2
Adjusted Signal
3.2
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
3.9K
Stars
R
Language
49.1K
Lines of Code
195
Files
118
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 14.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 0.0/100 · LOW

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

PR Review Velocity Impact 13.4/100 · LOW

Which changes need focused human review? 118 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 1MEDIUM 9LOW 108

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

Over-Commented Block87 hits · 87 pts
SeverityFileLineSnippetContext
LOWNEWS.md241 d = data.table(id1=rep(1:2, each=3L), id2=letters[c(4:3,5L,3:5)], v1=1:6)COMMENT
LOWNEWS.md401 #5: 2025-09-14 5COMMENT
LOWNEWS.md441 # user system elapsedCOMMENT
LOWNEWS.md641 # 3: a2 b1 c2 999 999 NaN 3COMMENT
LOWNEWS.md1161 # UsageCOMMENT
LOWNEWS.md1241 # <int> <int> <int>COMMENT
LOWNEWS.md1401COMMENT
LOWNEWS.md1441 # was:COMMENT
LOWNEWS.md1461COMMENT
LOWNEWS.md1501COMMENT
LOW.ci/.lintr.R21 message = "Use messagef to avoid fragmented translations.",COMMENT
LOW.ci/atime/tests.R41 dt <- data.table(group = rep(1:2, l=N))COMMENT
LOW.ci/atime/tests.R61#COMMENT
LOW.ci/atime/tests.R81 #COMMENT
LOW.ci/atime/tests.R161 #define isFrame(x) isDataFrame(x)COMMENT
LOW.ci/linters/r/dt_lengths_linter.R1# This is lintr::lengths_linter(), but including 'vapply_1i()' which is more common internally in data.tableCOMMENT
LOWR/duplicated.R41 f = attr(o, "starts", exact=TRUE)COMMENT
LOWR/duplicated.R61# H = 1:2e8,COMMENT
LOWR/test.data.table.R161 # runtime test number (i.e. 'numStr') since we're just doing a static check here, though we _are_ careful to matchCOMMENT
LOWR/test.data.table.R181 on=c(id='call_id')]COMMENT
LOWR/test.data.table.R441 }COMMENT
LOWR/data.table.R21COMMENT
LOWR/data.table.R141 }COMMENT
LOWR/data.table.R221 # (1) lapply(.SD, ...)COMMENT
LOWR/data.table.R641 # exclude '..1' etc. for #5460COMMENT
LOWR/data.table.R2281 if (length(expr)==3L && .arg_is_narm(expr))COMMENT
LOWR/data.table.R2861 .Call(Cselfrefokwrapper,DT,verbose)COMMENT
LOWR/data.table.R3521 ## Additional restrictions are imposed if x is .SD, or if options indicate that no optimizationCOMMENT
LOWR/foverlaps.R201COMMENT
LOWR/foverlaps.R221# distinguishable representative number*!!! In case of integers, the next integer after 5L is 6L. Simple. Increment is 1COMMENT
LOWR/foverlaps.R241# ---COMMENT
LOWR/cedta.R1cedta.pkgEvalsUserCode = c("gWidgetsWWW","statET","FastRWeb","slidify","rmarkdown","knitr","ezknitr","IRkernel", "rtvs")COMMENT
LOW.dev/revdep.R1# Run by package maintainer via aliases revdepsh and revdepr in .dev/.bash_aliases. SeeCOMMENT
LOW.dev/revdep.R81require(utils) # only base is loaded when R_PROFILE_USER runsCOMMENT
LOW.dev/cc.R1# data.table devCOMMENT
LOW.github/workflows/rchk.yaml1# adapted from a similar check run by {arrow}COMMENT
LOWsrc/forder.c701 // several columns could squash into 1 byte. due to this bit squashing is why we dealCOMMENT
LOWsrc/forder.c921 // insert sort with some twists:COMMENT
LOWsrc/forder.c1341 }COMMENT
LOWsrc/inrange.c21 // while (i < n) {COMMENT
LOWsrc/fread.h1#ifndef dt_FREAD_HCOMMENT
LOWsrc/fread.h81 // Maximum number of rows to read, or INT64_MAX to read the entire dataset.COMMENT
LOWsrc/fread.h101 // always at least 1).COMMENT
LOWsrc/fread.h121 // Character that marks the beginning of a comment. When '\0', commentCOMMENT
LOWsrc/fread.h141COMMENT
LOWsrc/myomp.h1COMMENT
LOWsrc/myomp.h21 #define omp_get_num_threads() 1COMMENT
LOWsrc/dogroups.c1#include "data.table.h"COMMENT
LOWsrc/dogroups.c21 // x yCOMMENT
LOWsrc/dogroups.c541// user system elapsedCOMMENT
LOWsrc/dogroups.c561// old code - no changes, R v3.1.0 --- BUT RESULTS ARE WRONG!COMMENT
LOWsrc/fwriteR.c1#include <stdbool.h>COMMENT
LOWsrc/ijoin.c641 // k = from[i];COMMENT
LOWsrc/data.table.h1#include "myomp.h" // first for clang-13-omp, #5122COMMENT
LOWsrc/data.table.h21#endifCOMMENT
LOWsrc/data.table.h41#define IS_UTF8(x) (getCharCE(x) == CE_UTF8)COMMENT
LOWsrc/data.table.h61# undef MAXCOMMENT
LOWsrc/data.table.h81#define NEED2UTF8(s) !(IS_ASCII(s) || (s)==NA_STRING || IS_UTF8(s))COMMENT
LOWsrc/freadR.h1#ifndef dt_FREAD_R_HCOMMENT
LOWsrc/fsort.c281COMMENT
27 more matches not shown…
AI Slop Vocabulary14 hits · 33 pts
SeverityFileLineSnippetContext
MEDIUM.gitlab-ci.yml103## most comprehensive testsCOMMENT
MEDIUM.ci/atime/tests.R52# See documentation in https://github.com/Rdatatable/data.table/wiki/Performance-testing for best practices.COMMENT
MEDIUM.ci/atime/tests.R80 # A function to customize R package metadata and source files to facilitate version-specific installation and testing.COMMENT
LOWR/fread.R219 # not worth doing a behavior test here, so just use getRversion().COMMENT
LOWR/duplicated.R74## unique.data.table has been refactored to simply call duplicated.data.tableCOMMENT
LOWR/wrappers.R2# Very small (e.g. one line) R functions that just call C.COMMENT
LOWR/data.table.R2008 # TO DO: combine uniqlist and uniquelengths into one call. Or, just set len__ to NULL when dogroups infers thatCOMMENT
MEDIUMR/data.table.R3434# is robust to unnamed expr. Note that NA names are not possible here.COMMENT
LOWR/foverlaps.R209# Firstly, assuming 64-bit precision, we can't simply add 1L. For e.g., consider:COMMENT
LOWR/fcast.R136 # just use the last column (as guess(data) would do) because length will beCOMMENT
MEDIUMsrc/snprintf.c36 // loop here with more robust checks as well to catch mistakes in fmtCOMMENT
MEDIUMsrc/utils.c25// which needed a repeat of the argument. Hence simpler and more robust to return false when not type double.COMMENT
MEDIUMsrc/openmp-utils.c69 // Keep this light, simple and robust. initDTthreads() ensures 1 <= DTthreads <= omp_get_num_proc()COMMENT
MEDIUMsrc/openmp-utils.c140 // Allows robust testing of environment variables using Sys.setenv() to experiment.COMMENT
Redundant / Tautological Comments5 hits · 8 pts
SeverityFileLineSnippetContext
LOWR/fread.R98 # Check if input is a connection and read it into memoryCOMMENT
LOWR/test.data.table.R373# Check if UTF-8 symbols can be represented in native encodingCOMMENT
LOWR/test.data.table.R393 # Check if y was explicitly provided (not just the default)COMMENT
LOWR/data.table.R329 # Return resultCOMMENT
LOW.dev/cc.R50 # Assign directly to better imitate actual namespace imports. Earlier tried to require(include.only=) these objects,COMMENT
Verbosity Indicators3 hits · 7 pts
SeverityFileLineSnippetContext
LOW⚡R/data.table.R508 # Step 1: Apply lapply(.SD) optimizationCOMMENT
LOW⚡R/data.table.R513 # Step 2: Apply GForce optimizationCOMMENT
LOW⚡R/data.table.R518 # Step 3: Apply old mean optimization (fallback when GForce is not used)COMMENT
Structural Annotation Overuse3 hits · 7 pts
SeverityFileLineSnippetContext
LOW⚡R/data.table.R508 # Step 1: Apply lapply(.SD) optimizationCOMMENT
LOW⚡R/data.table.R513 # Step 2: Apply GForce optimizationCOMMENT
LOW⚡R/data.table.R518 # Step 3: Apply old mean optimization (fallback when GForce is not used)COMMENT
Synthetic Comment Markers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHNEWS.1.md15401. It seems OpenMP is not available on CRAN's Mac platform; NOTEs appeared in [CRAN checks](https://cran.r-project.org/wCODE
TODO Padding3 hits · 4 pts
SeverityFileLineSnippetContext
LOWR/data.table.R941 # TODO: implement better version of "any"/"all"/"which" to avoidCOMMENT
LOWR/setkey.R219 # TODO: implement integer and character in Cfsort and remove this branch and warningCOMMENT
LOWsrc/ijoin.c8// TODO: implement 'lookup' for 'gaps' and 'overlaps' argumentsCOMMENT
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMR/IDateTime.R257 # This method is just for ggplot2, #1713COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWR/test.data.table.R443 # Usage:COMMENT