AI Slop Code Risk Monitor

marmelab/react-admin

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

A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design

1.9 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for marmelab/react-admin, a TypeScript project with 26,976 GitHub stars. SynthScan examined 387,542 lines of code across 2343 source files, recording 498 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 1.9 (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.9
Adjusted Signal
1.9
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
27.0K
Stars
TypeScript
Language
387.5K
Lines of Code
2.3K
Files
498
Pattern Hits
2026-10-31
Scan Date
0.02
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 1.2/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 8.1/100 · LOW

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

Agent Over-Engineering Ratio 0.2/100 · LOW

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

PR Review Velocity Impact 9.0/100 · LOW

Which changes need focused human review? 498 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 42MEDIUM 2LOW 452

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 498 distinct pattern matches across 12 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 Data388 hits · 456 pts
SeverityFileLineSnippetContext
LOWcypress/e2e/navigation.cy.js11 // We need to wait for 'John Doe' and 'Posts' to be visible, because enabling canAccess triggersCOMMENT
LOWcypress/e2e/navigation.cy.js13 cy.contains('John Doe');CODE
LOW⚡cypress/e2e/edit.cy.js37 EditPostPage.setInputValue('input', 'title', 'Lorem Ipsum{enter}');CODE
LOW⚡cypress/e2e/edit.cy.js43 expect(el).to.have.value('Lorem Ipsum')CODE
LOW⚡cypress/e2e/edit.cy.js50 EditPostPage.setInputValue('input', 'title', 'Lorem Ipsum{enter}');CODE
LOWcypress/e2e/edit.cy.js243 CreatePostPage.setInputValue('input', 'title', 'Lorem Ipsum');CODE
LOWcypress/e2e/edit.cy.js249 expect(el).to.have.value('Lorem Ipsum');CODE
LOWdocs/SmartRichTextInput.md153<Form record={{ id: 123, title: 'Hello, world!', body: '<p>Lorem Ipsum</p>' }}>CODE
LOWdocs/SmartRichTextInput.md155 {/* default value is "<p>Lorem Ipsum</p>" */}CODE
LOWdocs/SmartRichTextInput.md254 .getCompletion({ prompt: 'Lorem ipsum' })CODE
LOWdocs/SmartRichTextInput.md256// ' dolor sit amet, consectetur adipiscing elit.'COMMENT
LOWdocs/NumberInput.md26 "title": "Lorem Ipsum",CODE
LOWdocs/SelectArrayInput.md57 name: 'John Doe',CODE
LOWdocs/CheckboxGroupInput.md53 name: 'John Doe',CODE
LOWdocs/RecordField.md298 "name": "John Doe"CODE
LOWdocs/Buttons.md880<DeleteButton record={{ id: 123, author: 'John Doe' }} resource="comments" />CODE
LOWdocs/Buttons.md975<DeleteButton record={{ id: 123, author: 'John Doe' }} />CODE
LOWdocs/Buttons.md993<DeleteButton record={{ id: 123, author: 'John Doe' }} resource="comments" />CODE
LOWdocs/AccordionForm.md361 title: 'Lorem Ipsum',CODE
LOWdocs/AccordionForm.md385 title: 'Lorem Ipsum',CODE
LOWdocs/FormFillerButton.md161 .generateContent({ prompt: 'Lorem ipsum' })CODE
LOWdocs/FormFillerButton.md163// ' dolor sit amet, consectetur adipiscing elit.'COMMENT
LOWdocs/AutocompleteInput.md44 title: 'Lorem Ipsum',CODE
LOWdocs/Admin.md484 <CardContent>Lorem ipsum sic dolor amet...</CardContent>CODE
LOWdocs/Inputs.md31 <TextInput multiline source="body" defaultValue="Lorem Ipsum" />CODE
LOW⚡docs/Inputs.md66| String | `'Lorem Ipsum'` | [`<TextInput>`](./TextInput.md)CODE
LOW⚡docs/Inputs.md67| Rich text | `<p>Lorem Ipsum</p>` | [`<RichTextInput>`](./RichTextICODE
LOW⚡docs/Inputs.md68| Markdown | `# Lorem Ipsum` | [`<MarkdownInput>`](./MarkdownICODE
LOWdocs/Inputs.md104<Form record={{ id: 123, title: 'Lorem ipsum' }}>CODE
LOWdocs/Inputs.md106 <TextInput source="title" defaultValue="Hello, World!" /> {/* input initially renders with value "Lorem ipsum" */}CODE
LOW⚡docs/ReferenceArrayInput.md54 title: "Lorem Ipsum",CODE
LOW⚡docs/ReferenceArrayInput.md55 body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",CODE
LOW⚡docs/ReferenceArrayInput.md55 body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",CODE
LOWdocs/Form.md153 title: 'Lorem Ipsum',CODE
LOWdocs/Form.md177 title: 'Lorem Ipsum',CODE
LOWdocs/useLockOnMount.md86 identity: 'John Doe',CODE
LOWdocs/TranslationTranslating.md230translate('hello_name', { name: 'John Doe' });CODE
LOWdocs/AutocompleteArrayInput.md53 name: 'John Doe',CODE
LOWdocs/useCreate.md219 { data: { id, message: 'Lorem ipsum' } },CODE
LOWdocs/DataProviderWriting.md497// author: { id: 456, name: "John Doe" },COMMENT
LOWdocs/DataProviderWriting.md547// authors: [{ "id": 456, "name": "John Doe" }]COMMENT
LOWdocs/DataProviderWriting.md570 "name": "John Doe"CODE
LOWdocs/DataProviderWriting.md673// data: { id: 123, title: "hello, world", author_id: 12, body: 'Lorem Ipsum Sic Dolor Amet' }COMMENT
LOWdocs/LongForm.md343 title: 'Lorem Ipsum',CODE
LOWdocs/LongForm.md367 title: 'Lorem Ipsum',CODE
LOWdocs/SoftDeleteButton.md36<SoftDeleteButton record={{ id: 123, author: 'John Doe' }} resource="comments" />CODE
LOWdocs/SoftDeleteButton.md134<SoftDeleteButton record={{ id: 123, author: 'John Doe' }} />CODE
LOWdocs/SoftDeleteButton.md152<SoftDeleteButton record={{ id: 123, author: 'John Doe' }} resource="comments" />CODE
LOWdocs/ArrayInput.md21 "customer": "John Doe",CODE
LOWdocs/TextField.md15// renders the record { id: 1234, name: 'John Doe' } asCOMMENT
LOWdocs/TabbedForm.md236 title: 'Lorem Ipsum',CODE
LOWdocs/TabbedForm.md260 title: 'Lorem Ipsum',CODE
LOWdocs/RadioButtonGroupInput.md43 title: 'Lorem Ipsum',CODE
LOWdocs/PredictiveTextInput.md306 .getCompletion({ prompt: 'Lorem ipsum' })CODE
LOWdocs/PredictiveTextInput.md308// ' dolor sit amet, consectetur adipiscing elit.'COMMENT
LOWdocs/StackedFilters.md102 defaultValue: 'Lorem Ipsum',CODE
LOWdocs/useTranslate.md63translate('hello_name', { name: 'John Doe' });CODE
LOWdocs/DataProviders.md346 "name": "John Doe"CODE
LOWdocs/DataProviders.md403 "authors": [{ "id": 456, "name": "John Doe" }]CODE
LOW⚡docs/SoftDeleteDataProvider.md134 title: "Lorem ipsum",CODE
328 more matches not shown…
Cross-Language Confusion (JS/TS)40 hits · 168 pts
SeverityFileLineSnippetContext
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts28 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts45 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts267 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts553 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts562 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts586 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts595 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts618 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts627 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts651 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts660 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts684 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts693 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts717 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts726 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts749 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts758 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts779 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts788 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts808 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts817 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts838 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts847 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts867 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts876 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts897 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts906 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts926 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts935 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts956 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts965 print(gql`CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts985 print(CODE
HIGH…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts1005 print(CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts7 print(getGqlType({ kind: TypeKind.SCALAR, name: 'foo' }))CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts13 print(CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts24 print(CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts35 print(CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts52 print(CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts69 print(CODE
HIGHpackages/ra-data-graphql-simple/src/getGqlType.test.ts89 print(CODE
Verbosity Indicators17 hits · 30 pts
SeverityFileLineSnippetContext
LOWexamples/crm/src/providers/commons/getCompanyAvatar.ts30 // Step 1: Try to get favicon from website domainCOMMENT
LOWexamples/crm/src/providers/commons/getContactAvatar.ts47 // Step 1: Try to get Gravatar imageCOMMENT
LOWexamples/crm/src/providers/commons/getContactAvatar.ts58 // Step 2: Try to get favicon from email domainCOMMENT
LOW⚡scripts/release.sh115# Step 1: InstallCOMMENT
LOW⚡scripts/release.sh118# Step 2: BuildCOMMENT
LOW⚡scripts/release.sh121# Step 3: EE TestsCOMMENT
LOW⚡scripts/release.sh142# Step 4: Manual demo testsCOMMENT
LOW⚡scripts/release.sh152# Step 5: Lerna versionCOMMENT
LOW⚡scripts/release.sh209# Step 8: Git tagCOMMENT
LOW⚡scripts/release.sh219# Step 9: Git pushCOMMENT
LOW⚡scripts/release.sh230# Step 10: Publish packagesCOMMENT
LOW⚡scripts/release.sh237# Step 11: Update milestonesCOMMENT
LOW⚡scripts/release.sh240# Step 12: Create GitHub releaseCOMMENT
LOW⚡scripts/release.sh243# Step 13: Update documentationCOMMENT
LOWscripts/release.sh94# Step 0: Check npm authenticationCOMMENT
LOWscripts/release.sh168# Step 6: Handle minor version updatesCOMMENT
LOWscripts/release.sh197# Step 7: Update changelogCOMMENT
Structural Annotation Overuse17 hits · 30 pts
SeverityFileLineSnippetContext
LOWexamples/crm/src/providers/commons/getCompanyAvatar.ts30 // Step 1: Try to get favicon from website domainCOMMENT
LOWexamples/crm/src/providers/commons/getContactAvatar.ts47 // Step 1: Try to get Gravatar imageCOMMENT
LOWexamples/crm/src/providers/commons/getContactAvatar.ts58 // Step 2: Try to get favicon from email domainCOMMENT
LOW⚡scripts/release.sh115# Step 1: InstallCOMMENT
LOW⚡scripts/release.sh118# Step 2: BuildCOMMENT
LOW⚡scripts/release.sh121# Step 3: EE TestsCOMMENT
LOW⚡scripts/release.sh142# Step 4: Manual demo testsCOMMENT
LOW⚡scripts/release.sh152# Step 5: Lerna versionCOMMENT
LOW⚡scripts/release.sh209# Step 8: Git tagCOMMENT
LOW⚡scripts/release.sh219# Step 9: Git pushCOMMENT
LOW⚡scripts/release.sh230# Step 10: Publish packagesCOMMENT
LOW⚡scripts/release.sh237# Step 11: Update milestonesCOMMENT
LOW⚡scripts/release.sh240# Step 12: Create GitHub releaseCOMMENT
LOW⚡scripts/release.sh243# Step 13: Update documentationCOMMENT
LOWscripts/release.sh94# Step 0: Check npm authenticationCOMMENT
LOWscripts/release.sh168# Step 6: Handle minor version updatesCOMMENT
LOWscripts/release.sh197# Step 7: Update changelogCOMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICALpackages/ra-core/src/storybook/FakeBrowser.tsx53 const newLocation = event.target.elements.location.value.replace(CODE
CRITICAL…kages/ra-input-rich-text/src/RichTextInput.stories.tsx552 props.editor.view.dom.parentElement.appendChild(floatingEl);CODE
Hyper-Verbose Identifiers13 hits · 14 pts
SeverityFileLineSnippetContext
LOWdocs/404.html58 function replaceNavigationWithVersion(version) {CODE
LOWexamples/crm/src/activity/ActivityLogCompanyCreated.tsx14export function ActivityLogCompanyCreated({CODE
LOW…les/crm/src/activity/ActivityLogContactNoteCreated.tsx15export function ActivityLogContactNoteCreated({CODE
LOWexamples/crm/src/activity/ActivityLogContactCreated.tsx14export function ActivityLogContactCreated({CODE
LOW…amples/crm/src/activity/ActivityLogDealNoteCreated.tsx15export function ActivityLogDealNoteCreated({CODE
LOW⚡examples/crm/src/providers/fakerest/dataProvider.ts74async function fetchAndUpdateCompanyData(CODE
LOW⚡examples/crm/src/providers/fakerest/dataProvider.ts79async function fetchAndUpdateCompanyData(CODE
LOW⚡examples/crm/src/providers/fakerest/dataProvider.ts84async function fetchAndUpdateCompanyData(CODE
LOW…-materialui/src/button/BulkDeleteWithConfirmButton.tsx24 function BulkDeleteWithConfirmButton(CODE
LOW…-materialui/src/button/BulkUpdateWithConfirmButton.tsx23 function BulkUpdateWithConfirmButton(CODE
LOW…kages/ra-data-graphql-simple/src/buildGqlQuery.test.ts86function buildGQLParamsWithSparseFieldsFactory() {CODE
LOWpackages/ra-core/src/form/validation/validate.ts33function isValidationErrorMessageWithArgs(CODE
LOWdocs_headless/src/content/docs/RealtimeFeatures.md368function myTransformTopicFromRaRealtime(topic: string): string {CODE
Over-Commented Block13 hits · 13 pts
SeverityFileLineSnippetContext
LOWtsconfig.json21 // "noEmit": true, /* Do not emit outputs. */COMMENT
LOWtsconfig.json41 /* Module Resolution Options */COMMENT
LOWtsconfig.json61 "skipLibCheck": true,COMMENT
LOWdocs/Permissions.md121 // { action: "create", resource: "companies" },COMMENT
LOWdocs/DataProviderWriting.md81 filter: { author_id: 12 },COMMENT
LOWdocs/DataProviderWriting.md381// { id: 126, title: "allo?", author_id: 12 },COMMENT
LOWdocs/List.md1341COMMENT
LOWexamples/crm/src/setupTests.js1// jest-dom adds custom jest matchers for asserting on DOM nodes.COMMENT
LOWscripts/update-package-exports.ts41 // This is the current exports field:COMMENT
LOW…re/src/controller/input/SimpleFormIteratorItemBase.tsx41 getSource: (source: string) => {COMMENT
LOW…ckages/ra-core/src/controller/input/ArrayInputBase.tsx121 const sourceContext = React.useMemo<SourceContextValue>(COMMENT
LOWpackages/ra-core/src/i18n/useTranslatable.ts81// { description: { en: 'item1_en', fr: 'item1_fr' } },COMMENT
LOWdocs_headless/src/content/docs/DataProviderWriting.md81// {COMMENT
Magic Placeholder Names2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHdocs/DataProviders.md266Authorization: Bearer YOUR_TOKEN_HERECODE
HIGHdocs_headless/src/content/docs/DataProviders.md260Authorization: Bearer YOUR_TOKEN_HERECODE
Slop Phrases2 hits · 3 pts
SeverityFileLineSnippetContext
LOW…/ra-ui-materialui/src/input/AutocompleteInput.spec.tsx612 // don't forget to close the dropdown, otherwise following tests will failCOMMENT
LOW…/ra-ui-materialui/src/input/AutocompleteInput.spec.tsx675 // don't forget to close the dropdown, otherwise following tests will failCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpackages/ra-core/src/form/Form.spec.tsx793 // not very robust but there are other React warnings due to act()COMMENT
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMdocs/DataProviderWriting.md467A simple react-admin app with one `<Resource>` using [guessers](./Features.md#guessers--scaffolding) for the `list`, `edCODE
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippetContext
LOWexamples/demo/public/mockServiceWorker.js126async function handleRequest(event, requestId) {CODE
LOWexamples/crm/public/mockServiceWorker.js126async function handleRequest(event, requestId) {CODE