AI Slop Code Risk Monitor

mikro-orm/mikro-orm

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

TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.

1.0 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for mikro-orm/mikro-orm, a TypeScript project with 9,263 GitHub stars. SynthScan examined 574,898 lines of code across 2725 source files, recording 485 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.0 (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.0
Adjusted Signal
1.0
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
9.3K
Stars
TypeScript
Language
574.9K
Lines of Code
2.7K
Files
485
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 0.7/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 4.4/100 · LOW

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

Agent Over-Engineering Ratio 0.2/100 · LOW

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

PR Review Velocity Impact 4.2/100 · LOW

Which changes need focused human review? 485 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 0MEDIUM 2LOW 483

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 485 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 Data423 hits · 518 pts
SeverityFileLineSnippetContext
LOWtests/bench/types/other-types.ts95 useEntityData<Author>({ name: 'test', email: 'test@test.com' });CODE
LOWtests/bench/types/other-types.ts114 useRequiredData<Author>({ name: 'test', email: 'test@test.com' });CODE
LOWtests/features/pivot-table-upsert.test.ts77 const author = orm.em.create(Author, { name: 'John Doe' });CODE
LOWtests/features/pivot-table-upsert.test.ts113 const author = orm.em.create(Author, { name: 'Jane Doe' });CODE
LOWtests/features/define-entity-setclass.sqlite.test.ts69 expect(author.fullName()).toBe('John Doe');CODE
LOWtests/features/filters/GH6460.test.ts67 const author = orm.em.create(Author, { name: 'John Doe', deletedAt: new Date() });CODE
LOWtests/features/filters/GH6484.test.ts75 const author = orm.em.create(Author, { name: 'John Doe', pen: { brand: 'Bic', active: true } });CODE
LOWtests/features/filters/GH6943.test.ts68 const user = orm.em.create(User, { email: 'user@example.com', account });CODE
LOWtests/features/filters/GH6943.test.ts101 expect(userAfter?.email).toBe('user@example.com');CODE
LOW…er-type-inheritance/table-per-type-inheritance.test.ts2147 expect(loaded.fullName).toBe('John Doe');CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2251 name: 'John Doe',CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2252 address: { street: '123 Main St', city: 'Springfield', zipCode: '12345' },CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2258 expect(loaded.name).toBe('John Doe');CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2259 expect(loaded.address.street).toBe('123 Main St');CODE
LOW…er-type-inheritance/table-per-type-inheritance.test.ts2781 address: { street: '123 Main St', city: 'Springfield' },CODE
LOW…er-type-inheritance/table-per-type-inheritance.test.ts2793 expect(loadedEmployee.address.street).toBe('123 Main St');CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2920 const address = orm.em.create(Address7453, { street: '123 Main St' });CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2922 name: 'John Doe',CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2930 const person = await orm.em.findOneOrFail(Person7453, { name: 'John Doe' }, { populate: ['*'] });CODE
LOW⚡…er-type-inheritance/table-per-type-inheritance.test.ts2934 expect((person as Employee7453).address!.unwrap().street).toBe('123 Main St');CODE
LOW…er-type-inheritance/table-per-type-inheritance.test.ts2949 name: 'Jane Doe',CODE
LOW…er-type-inheritance/table-per-type-inheritance.test.ts2956 const person = await orm.em.findOneOrFail(Person7453, { name: 'Jane Doe' }, { populate: true as any });CODE
LOW⚡tests/features/custom-types/GH6050.test.ts46 email: 'test@test.com',CODE
LOW⚡tests/features/custom-types/GH6050.test.ts52 const user2 = await orm.em.findOneOrFail(User, { email: 'test@test.com' });CODE
LOW⚡tests/features/custom-types/GH6050.test.ts58 email: 'test@test.com',CODE
LOW⚡tests/features/custom-types/GH6050.test.ts64 const user2 = await orm.em.findOneOrFail(User, { email: 'test@test.com' });CODE
LOWtests/features/custom-types/GH6050.test.ts77 const user3 = await orm.em.findOneOrFail(User, { email: 'test@test.com' });CODE
LOW…/features/composite-keys/composite-keys.sqlite.test.ts363 const owner = new CarOwner12('John Doe');CODE
LOW…/features/composite-keys/composite-keys.sqlite.test.ts372 name: 'John Doe',CODE
LOW…/features/composite-keys/composite-keys.sqlite.test.ts387 name: 'John Doe',CODE
LOW…s/features/composite-keys/composite-keys.mysql.test.ts117 const owner = new CarOwner2('John Doe');CODE
LOW…s/features/composite-keys/composite-keys.mysql.test.ts126 name: 'John Doe',CODE
LOW…s/features/composite-keys/composite-keys.mysql.test.ts141 name: 'John Doe',CODE
LOW…features/compiled-functions/compiled-functions.test.ts163 address: { street: '123 Main St', city: 'Springfield' },CODE
LOW…features/compiled-functions/compiled-functions.test.ts170 address: { street: '123 Main St', city: 'Springfield' },CODE
LOW…features/compiled-functions/compiled-functions.test.ts188 const testRow = { id: 1, name: 'John', address_street: '123 Main St', address_city: 'Springfield' };CODE
LOW…ic-relations/polymorphic-composite-keys.sqlite.test.ts127 const org = new Organization(1, 100, 'Acme Corp');CODE
LOW…ic-relations/polymorphic-composite-keys.sqlite.test.ts143 expect(loadedOrg.name).toBe('Acme Corp');CODE
LOW…ic-relations/polymorphic-composite-keys.sqlite.test.ts147 const user = new User(1, 42, 'user@example.com');CODE
LOW…ic-relations/polymorphic-composite-keys.sqlite.test.ts163 expect(loadedUser.email).toBe('user@example.com');CODE
LOW…morphic-relations/polymorphic-relations.sqlite.test.ts1119 const org = new Organization('Acme Corp');CODE
LOWtests/features/upsert/GH7399.test.ts64 user.email = 'foo@bar.com';CODE
LOW…s/entity-assigner/assign-unpersisted-reference.test.ts50 const author = orm.em.create(Author, { name: 'John Doe' });CODE
LOW…s/native-query-builder/MsSqlNativeQueryBuilder.test.ts82 name: 'John Doe',CODE
LOW…s/native-query-builder/MsSqlNativeQueryBuilder.test.ts90 params: ['bar', 1, 1, 'John Doe', date],CODE
LOW…/native-query-builder/OracleNativeQueryBuilder.test.ts82 name: 'John Doe',CODE
LOW…/native-query-builder/OracleNativeQueryBuilder.test.ts90 params: ['bar', 1, 1, 'John Doe', date],CODE
LOW…s/native-query-builder/MySqlNativeQueryBuilder.test.ts77 name: 'John Doe',CODE
LOW…s/native-query-builder/MySqlNativeQueryBuilder.test.ts85 params: ['bar', 'John Doe', date, 1, 1],CODE
LOWtests/features/clone/clone.test.ts431 address: { street: '123 Main St', city: 'Springfield' },CODE
LOWtests/features/clone/clone.test.ts438 loaded.name = 'Acme Inc';CODE
LOWtests/features/clone/clone.test.ts458 address: { street: '123 Main St', city: 'Springfield' },CODE
LOWtests/features/clone/clone.test.ts471 expect(cloned.address.street).toBe('123 Main St');CODE
LOWtests/features/clone/clone.test.ts661 loaded.name = 'Acme Inc';CODE
LOWtests/features/clone/clone.test.ts667 { name: 'Acme Inc' },CODE
LOW⚡…k-relation-target/non-pk-relation-target.mongo.test.ts71 const author = orm.em.create(Author, { uuid: 'uuid-123', name: 'John Doe' });CODE
LOW⚡…k-relation-target/non-pk-relation-target.mongo.test.ts76 const loadedAuthor = await orm.em.findOneOrFail(Author, { name: 'John Doe' });CODE
LOW⚡…k-relation-target/non-pk-relation-target.mongo.test.ts84 expect(loadedBook.author.unwrap().name).toBe('John Doe');CODE
LOW…elation-target/non-pk-relation-target.postgres.test.ts63 const author = orm.em.create(Author, { uuid: 'uuid-123', name: 'John Doe' });CODE
LOW…elation-target/non-pk-relation-target.postgres.test.ts68 const loadedAuthor = await orm.em.findOneOrFail(Author, { name: 'John Doe' });CODE
363 more matches not shown…
Hyper-Verbose Identifiers29 hits · 29 pts
SeverityFileLineSnippetContext
LOW…features/compiled-functions/compiled-functions.test.ts61 function generateCompiledFunctions(fromOrm: MikroORM): Record<string, (...args: any[]) => any> {CODE
LOW…atures/upsert/upsert-unidentifiable-row.sqlite.test.ts47async function expectSeededRowsUntouched() {CODE
LOWtests/issues/populate-mn-after-upsert.test.ts96function upsertProductsWithMergeFields(...products: any[]) {CODE
LOWdocs/plugins/changelog/Changelog.jsx92function useScrollToHashAfterMount() {CODE
LOWdocs/docs/usage-with-jest.md99export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/docs/usage-with-jest.md130export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/docs/usage-with-jest.md154function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.2/usage-with-jest.md99export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.2/usage-with-jest.md130export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.2/usage-with-jest.md154function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-6.6/usage-with-jest.md99export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-6.6/usage-with-jest.md130export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-6.6/usage-with-jest.md154function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.1/usage-with-jest.md99export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.1/usage-with-jest.md130export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.1/usage-with-jest.md154function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.0/usage-with-jest.md99export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.0/usage-with-jest.md130export function enableFakeTimersWithMikroOrm() {CODE
LOWdocs/versioned_docs/version-7.0/usage-with-jest.md154function enableFakeTimersWithMikroOrm() {CODE
LOW…cs/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js15export default function BlogPostItemFooterReadMoreLink(props) {CODE
LOWdocs/src/theme/BlogPostItem/Header/Authors/index.js7export default function BlogPostItemHeaderAuthors({className}) {CODE
LOWpackages/core/src/utils/rls-utils.ts68export function computeRlsFilterVariables(CODE
LOWpackages/core/src/utils/rls-utils.ts119export function computeRemovedRlsVariables(CODE
LOWpackages/core/src/utils/partition-utils.ts1function normalizeIdentifierSegment(segment: string): string {CODE
LOWpackages/core/src/utils/partition-utils.ts20export function normalizePartitionNameForComparison(name: string): string {CODE
LOWpackages/core/src/utils/partition-utils.ts51export function splitCommaSeparatedIdentifiers(value: string): string[] | null {CODE
LOWpackages/oracledb/src/OracleConnection.ts26function oracleBindTypeFromRuntime(platform: OraclePlatform, runtime: string | undefined): Dictionary {CODE
LOWpackages/sql/src/schema/partitioning.ts271export function normalizePartitionDefinition(value: string): string {CODE
LOWpackages/sql/src/dialects/postgresql/typeOverrides.ts14export function createPostgreSqlTypeParsers(arrayParse: PostgreSqlArrayParser): Record<number, PostgreSqlValueParser> {CODE
Over-Commented Block23 hits · 23 pts
SeverityFileLineSnippetContext
LOW…atures/multiple-schemas/multiple-schemas.mssql.test.ts241 // 'Author-n1:1',COMMENT
LOW…es/transactions/transaction-propagation.sqlite.test.ts381 // SQLite has a single-writer limitation due to its file-based locking mechanism.COMMENT
LOWtests/issues/GH6032.test.ts61COMMENT
LOWtests/issues/GH7151.test.ts41COMMENT
LOWdocs/docs/entity-generator.md361 customRawType.prop = structuredClone(websitePropOnAuthor);COMMENT
LOWdocs/docs/entity-generator.md381 // This means we force this shape during create, selects, and serialization.COMMENT
LOWdocs/blog/2023-09-10-mikro-orm-5-8-released.md81const config = user.config.indexBy('key');COMMENT
LOWdocs/versioned_docs/version-7.2/entity-generator.md361 customRawType.prop = structuredClone(websitePropOnAuthor);COMMENT
LOWdocs/versioned_docs/version-7.2/entity-generator.md381 // This means we force this shape during create, selects, and serialization.COMMENT
LOWdocs/versioned_docs/version-5.9/deployment.md161 // You can toggle development mode on to better see what's going on in the webpack bundle,COMMENT
LOWdocs/versioned_docs/version-6.6/entity-generator.md361 customRawType.prop = structuredClone(websitePropOnAuthor);COMMENT
LOWdocs/versioned_docs/version-6.6/entity-generator.md381 // This means we force this shape during create, selects, and serialization.COMMENT
LOWdocs/versioned_docs/version-6.6/entity-manager.md561COMMENT
LOWdocs/versioned_docs/version-6.6/deployment.md181COMMENT
LOWdocs/versioned_docs/version-7.1/entity-generator.md361 customRawType.prop = structuredClone(websitePropOnAuthor);COMMENT
LOWdocs/versioned_docs/version-7.1/entity-generator.md381 // This means we force this shape during create, selects, and serialization.COMMENT
LOWdocs/versioned_docs/version-7.0/entity-generator.md361 customRawType.prop = structuredClone(websitePropOnAuthor);COMMENT
LOWdocs/versioned_docs/version-7.0/entity-generator.md381 // This means we force this shape during create, selects, and serialization.COMMENT
LOWdocs/versioned_docs/version-7.0/entity-manager.md741// ('Peter 2', 'peter+2@foo.bar'),COMMENT
LOWpackages/mikro-orm/src/index.ts1// THIS PACKAGE SHOULD NOT BE USED DIRECTLYCOMMENT
LOWpackages/core/src/metadata/MetadataDiscovery.ts2021COMMENT
LOWpackages/sql/src/schema/SchemaComparator.ts1201 .replace(/\binner\s+join\b/gi, 'join')COMMENT
LOWpackages/sql/src/schema/partitioning.ts81 }COMMENT
Verbosity Indicators4 hits · 9 pts
SeverityFileLineSnippetContext
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts205 // Step 1: Add first materialized viewCOMMENT
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts212 // Step 2: Add second materialized viewCOMMENT
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts219 // Step 3: Modify first materialized viewCOMMENT
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts226 // Step 4: Remove second materialized viewCOMMENT
Structural Annotation Overuse4 hits · 9 pts
SeverityFileLineSnippetContext
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts205 // Step 1: Add first materialized viewCOMMENT
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts212 // Step 2: Add second materialized viewCOMMENT
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts219 // Step 3: Modify first materialized viewCOMMENT
LOW⚡…a-generator/materialized-view-diffing.postgres.test.ts226 // Step 4: Remove second materialized viewCOMMENT
AI Slop Vocabulary2 hits · 5 pts
SeverityFileLineSnippetContext
MEDIUMdocs/plugins/changelog/releases.json394 "body": "# [6.5.0](https://github.com/mikro-orm/mikro-orm/compare/v6.4.16...v6.5.0) (2025-08-27)\r\n\r\nhttps://mikrCODE
MEDIUMdocs/src/pages/index.js163 // seamless loop: when the first set scrolls away, resetCOMMENT