AI Slop Code Risk Monitor

lingdojo/kana-dojo

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

Aesthetic, minimalist platform for learning Japanese inspired by Duolingo and Monkeytype, built with Next.js and sponsored by Vercel. Beginner-friendly with plenty of good first issues - all contributions are welcome!

0.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for lingdojo/kana-dojo, a TypeScript project with 3,769 GitHub stars. SynthScan examined 350,089 lines of code across 1197 source files, recording 206 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 0.8 (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.8
Adjusted Signal
0.8
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
3.8K
Stars
TypeScript
Language
350.1K
Lines of Code
1.2K
Files
206
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 3.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.3/100 · LOW

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

Agent Over-Engineering Ratio 1.9/100 · LOW

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

PR Review Velocity Impact 3.4/100 · LOW

Which changes need focused human review? 206 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 3MEDIUM 11LOW 192

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 206 distinct pattern matches across 11 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 Identifiers105 hits · 107 pts
SeverityFileLineSnippetContext
LOWapp/api/progress-sync/route.ts111function createRateLimitErrorResponse(CODE
LOWapp/api/progress-sync/route.ts148async function upsertProgressSyncRecordAtomically(CODE
LOWapp/api/progress-sync/lib.ts121export function buildProgressSyncStorageKey(syncKey: string): string {CODE
LOWapp/api/progress-sync/lib.ts126export function validateProgressSyncRequestBody(CODE
LOWapp/api/progress-sync/lib.ts212export function shouldAcceptIncomingUpdate(CODE
LOWfeatures/Preferences/lib/auditThemes.ts78export function getThemesNeedingImprovement(): {CODE
LOWfeatures/Preferences/lib/colorUtils.ts198export function getRelativeLuminanceFromRgb(rgb: RGB): number {CODE
LOWfeatures/Preferences/data/wallpapers/wallpapers.ts38export function unregisterCustomWallpaper(id: string): void {CODE
LOWfeatures/Preferences/data/audio/clickSounds.ts561export function getClickSoundVariantBaseUrls(id: ClickSoundId): string[] {CODE
LOWfeatures/Preferences/data/themes/themeColors.ts182export function generateButtonBorderColor(CODE
LOWfeatures/Preferences/data/themes/themes.ts151export function getThemeDefaultWallpaperId(CODE
LOWfeatures/Preferences/data/themes/themes.ts280function buildCustomWallpaperTheme(id: string): Theme {CODE
LOW…es/Progress/components/stats/AchievementSummaryBar.tsx166export function getAchievementDisplayValues(summary: AchievementSummary): {CODE
LOW…ures/Progress/components/stats/TimedModeStatsPanel.tsx253export function getTimedModeDisplayValues(stats: TimedModeStats): {CODE
LOWfeatures/Progress/components/stats/StatsPage.tsx286export function getStatsOverviewDisplayValues(stats: {CODE
LOW…Progress/components/stats/MasteryDistributionChart.tsx246export function getMasteryDistributionDisplayValues(CODE
LOWfeatures/Progress/hooks/useStatsAggregator.ts52function createDefaultMasteryDistribution(): MasteryDistribution {CODE
LOWfeatures/Progress/hooks/useStatsAggregator.ts90export function calculateMasteryDistribution(CODE
LOWfeatures/Progress/hooks/useStatsAggregator.ts120function transformCharacterMastery(CODE
LOWfeatures/Progress/hooks/useStatsAggregator.ts393export function filterCharacterMasteryByType(CODE
LOWfeatures/Progress/hooks/useStatsAggregator.ts406export function getTopDifficultCharacters(CODE
LOWfeatures/Progress/lib/setProgress.ts36export function calculateKanaSetProgressAndStars(CODE
LOW⚡features/Progress/lib/setProgress.ts64export function getCappedVocabularyMeaningProgress(correct: number): number {CODE
LOW⚡features/Progress/lib/setProgress.ts68export function getCappedVocabularyReadingProgress(correct: number): number {CODE
LOW⚡features/Progress/lib/setProgress.ts72export function calculateKanjiSetProgress(CODE
LOWfeatures/Progress/lib/setProgress.ts85export function calculateVocabularySetProgress(CODE
LOWfeatures/Progress/lib/setProgress.ts101export function calculateKanjiSetProgressAndStars(CODE
LOWfeatures/Progress/lib/setProgress.ts126export function calculateVocabularySetProgressAndStars(CODE
LOWfeatures/Achievements/__tests__/meta.property.test.ts46function checkMetaAchievementRequirement(CODE
LOW…atures/Achievements/__tests__/mastery.property.test.ts40function createStatsForMasteryAchievement(CODE
LOW…ures/Achievements/__tests__/timeBased.property.test.ts23function createStatsForSpeedAchievement(CODE
LOWfeatures/Achievements/__tests__/streak.property.test.ts18function createStatsForStreakAchievement(CODE
LOW…Achievements/__tests__/modeCompletion.property.test.ts65function createStatsForModeCompletion(CODE
LOW…Achievements/__tests__/modeCompletion.property.test.ts143function checkModeCompletionRequirement(CODE
LOW…ures/Achievements/__tests__/threshold.property.test.ts33function createStatsForThresholdAchievement(CODE
LOW…ures/Achievements/__tests__/threshold.property.test.ts129function checkThresholdRequirement(CODE
LOW…atures/Achievements/__tests__/variety.property.test.ts19function createStatsForVarietyAchievement(CODE
LOWfeatures/Achievements/store/useAchievementStore.ts1764function checkDaysTrainedRequirement(CODE
LOWfeatures/Achievements/store/useAchievementStore.ts1778function checkTimeOfDayRequirement(CODE
LOWfeatures/Achievements/store/useAchievementStore.ts1799function checkWrongStreakRequirement(CODE
LOWfeatures/Achievements/store/useAchievementStore.ts1813function checkExactCountRequirement(CODE
LOWfeatures/Achievements/store/useAchievementStore.ts1830function checkAchievementCountRequirement(CODE
LOWfeatures/Achievements/store/useAchievementStore.ts1855function checkTotalPointsRequirement(CODE
LOWfeatures/Resources/__tests__/seo.property.test.ts54function generateCategoryPageMetadata(CODE
LOWfeatures/Resources/__tests__/seo.property.test.ts96function generateSubcategoryPageMetadata(CODE
LOWfeatures/Resources/lib/counts.ts21export function getCategoryResourceCounts(CODE
LOWfeatures/Resources/lib/counts.ts40export function getSubcategoryResourceCounts(CODE
LOWfeatures/Resources/lib/counts.ts64export function getResourceCountForCategory(CODE
LOWfeatures/Resources/lib/counts.ts78export function getResourceCountForSubcategory(CODE
LOWfeatures/Resources/lib/counts.ts94export function enrichCategoriesWithCounts(CODE
LOWfeatures/Resources/lib/filters.ts48export function filterByCategoryAndSubcategory(CODE
LOWfeatures/Resources/data/index.ts122export function getResourcesBySubcategory(CODE
LOWfeatures/Resources/data/index.ts147export function getFeaturedResourcesByCategory(CODE
LOWfeatures/Resources/data/index.ts176export function getSubcategoryResourceCount(CODE
LOW…ures/Translator/components/TranslationAlternatives.tsx29function generateLiteralTranslation(tokens: AnalyzedToken[]): string {CODE
LOWfeatures/Conjugator/lib/seo/structuredData.ts138export function generateWebApplicationSchema(): Record<string, unknown> {CODE
LOWfeatures/Conjugator/lib/seo/structuredData.ts362function generateOrganizationSchema(): Record<string, unknown> {CODE
LOWfeatures/Conjugator/lib/engine/conjugateIchidan.ts251export function getIchidanColloquialPotential(verb: VerbInfo): string {CODE
LOWfeatures/Conjugator/lib/engine/conjugateIchidan.ts268export function getIchidanTraditionalPotential(verb: VerbInfo): string {CODE
LOWfeatures/AnkiConverter/parsers/colpkgParser.ts56export async function extractDatabaseFromCOLPKG(CODE
45 more matches not shown…
Structural Annotation Overuse32 hits · 58 pts
SeverityFileLineSnippetContext
LOWTODO_INDEXNOW_SETUP.md5## Step 1: Generate UUID KeyCOMMENT
LOWTODO_INDEXNOW_SETUP.md17## Step 2: Create Public Key FileCOMMENT
LOWTODO_INDEXNOW_SETUP.md36## Step 3: Add Environment VariableCOMMENT
LOWTODO_INDEXNOW_SETUP.md48## Step 4: Add to Production EnvironmentCOMMENT
LOWTODO_INDEXNOW_SETUP.md62## Step 5: Commit and DeployCOMMENT
LOWTODO_INDEXNOW_SETUP.md77## Step 6: Verify After DeploymentCOMMENT
LOWTODO_INDEXNOW_SETUP.md100## Step 7: Submit to Bing Webmaster ToolsCOMMENT
LOWTODO_INDEXNOW_SETUP.md111## Step 8: Integrate into Your WorkflowCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts284 // Step 1: Remove media tagsCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts287 // Step 2: Convert formatting tags to text markers (if enabled)COMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts292 // Step 3: Decode HTML entitiesCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts295 // Step 4: Strip remaining HTML tagsCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts298 // Step 5: Clean whitespace (if enabled)COMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts108 // Step 1: Remove control charactersCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts111 // Step 2: Replace Anki deck separator (::) with a safe alternative BEFORE replacing individual colonsCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts114 // Step 3: Replace invalid filename charactersCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts117 // Step 4: Collapse multiple replacement charactersCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts125 // Step 5: Trim whitespace and replacement characters from ends (repeat until stable)COMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts133 // Step 6: Handle Windows reserved namesCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts148 // Step 7: Handle empty result after sanitizationCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts153 // Step 8: Enforce length limit (accounting for extension)COMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts161 // Step 9: Add extension if requestedCOMMENT
LOWdocs/ADDING_LANGUAGES.md15### Step 1: Create Metadata FileCOMMENT
LOWdocs/ADDING_LANGUAGES.md25### Step 2: Translate MetadataCOMMENT
LOWdocs/ADDING_LANGUAGES.md50### Step 3: Update Routing ConfigurationCOMMENT
LOWdocs/ADDING_LANGUAGES.md61### Step 4: Update Root Layout MetadataCOMMENT
LOWdocs/ADDING_LANGUAGES.md74### Step 5: Update Sitemap ConfigurationCOMMENT
LOWdocs/ADDING_LANGUAGES.md80### Step 6: Test Your New LanguageCOMMENT
LOWdocs/ADDING_LANGUAGES.md93### Step 7: Build and VerifyCOMMENT
LOWdocs/SEO.md13### Step 1: Import Metadata TypeCOMMENT
LOWdocs/SEO.md19### Step 2: Export Metadata ObjectCOMMENT
LOWdocs/SEO.md43### Step 3: Test Your ChangesCOMMENT
Verbosity Indicators14 hits · 32 pts
SeverityFileLineSnippetContext
LOW⚡features/AnkiConverter/lib/textExtractor.ts284 // Step 1: Remove media tagsCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts287 // Step 2: Convert formatting tags to text markers (if enabled)COMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts292 // Step 3: Decode HTML entitiesCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts295 // Step 4: Strip remaining HTML tagsCOMMENT
LOW⚡features/AnkiConverter/lib/textExtractor.ts298 // Step 5: Clean whitespace (if enabled)COMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts108 // Step 1: Remove control charactersCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts111 // Step 2: Replace Anki deck separator (::) with a safe alternative BEFORE replacing individual colonsCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts114 // Step 3: Replace invalid filename charactersCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts117 // Step 4: Collapse multiple replacement charactersCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts125 // Step 5: Trim whitespace and replacement characters from ends (repeat until stable)COMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts133 // Step 6: Handle Windows reserved namesCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts148 // Step 7: Handle empty result after sanitizationCOMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts153 // Step 8: Enforce length limit (accounting for extension)COMMENT
LOW⚡features/AnkiConverter/lib/filenameSanitizer.ts161 // Step 9: Add extension if requestedCOMMENT
Over-Commented Block24 hits · 24 pts
SeverityFileLineSnippetContext
LOWdocker-compose.yml21 # Production environment (uncomment for production)COMMENT
LOWfeatures/Demo/components/DemoGame.tsx41// TEMPORARILY DISABLED - focusing on kanji onlyCOMMENT
LOWfeatures/Demo/components/DemoGame.tsx361COMMENT
LOWfeatures/Preferences/fonts.ts1// Heavy entrypoint: explicit import surface for font catalog only.COMMENT
LOWfeatures/Preferences/index.ts21} from './facade';COMMENT
LOWfeatures/Resources/index.ts101// HooksCOMMENT
LOWfeatures/Kana/index.ts21export type { KanaCharacter, KanaGroup } from '@/entities/kana';COMMENT
LOWfeatures/Kanji/index.ts21// PRIVATE - DO NOT IMPORT DIRECTLYCOMMENT
LOWfeatures/Conjugator/lib/engine/conjugateIchidan.ts101 // ============================================================================COMMENT
LOWfeatures/Conjugator/lib/engine/conjugateIchidan.ts161COMMENT
LOWfeatures/Vocabulary/index.ts21// PRIVATE - DO NOT IMPORT DIRECTLYCOMMENT
LOWdocs/archived/ARCHITECTURE_DIAGRAM.md421// ❌ BLOCKED: shared/ → features/COMMENT
LOWsupabase/config.toml1# For detailed configuration reference documentation, visit:COMMENT
LOWsupabase/config.toml21# without explicit GRANTs. When unset, new entities are NOT auto-exposed, matching the new cloudCOMMENT
LOWsupabase/config.toml121# [storage.buckets.images]COMMENT
LOWsupabase/config.toml161# external_url = ""COMMENT
LOWsupabase/config.toml181# Passwords shorter than this value will be rejected as weak. Minimum 6, recommended 8 or more.COMMENT
LOWsupabase/config.toml201sms_sent = 30COMMENT
LOWsupabase/config.toml221enable_signup = trueCOMMENT
LOWsupabase/config.toml241# user = "apikey"COMMENT
LOWsupabase/config.toml261enable_confirmations = falseCOMMENT
LOWsupabase/config.toml401s3_region = "env(S3_REGION)"COMMENT
LOW.github/dependabot.yml61 # Always create security PRs immediatelyCOMMENT
LOWopenspec/config.yaml1schema: spec-drivenCOMMENT
Decorative Section Separators8 hits · 24 pts
SeverityFileLineSnippetContext
MEDIUM…eferences/components/renderers/CursorTrailRenderer.tsx8// ─── Particle (flat struct, no strings at draw time) ──────────────────────────COMMENT
MEDIUM…eferences/components/renderers/CursorTrailRenderer.tsx23// ─── Component ────────────────────────────────────────────────────────────────COMMENT
MEDIUM…eferences/components/renderers/CursorTrailRenderer.tsx64 // ── Throttled mousemove: spawn max 1 particle every 30ms ──────────────COMMENT
MEDIUM…eferences/components/renderers/CursorTrailRenderer.tsx107 // ── Render loop ───────────────────────────────────────────────────────────COMMENT
MEDIUM…eferences/components/renderers/ClickEffectRenderer.tsx7// ─── Particle ─────────────────────────────────────────────────────────────────COMMENT
MEDIUM…eferences/components/renderers/ClickEffectRenderer.tsx22// ─── Component ────────────────────────────────────────────────────────────────COMMENT
MEDIUM…eferences/components/renderers/ClickEffectRenderer.tsx61 // ── Spawn burst ───────────────────────────────────────────────────────────COMMENT
MEDIUM…eferences/components/renderers/ClickEffectRenderer.tsx105 // ── Render loop (only runs while particles exist) ─────────────────────────COMMENT
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippetContext
HIGHdocs/session-history-implementation.md113#### UX behavior now (as requested)COMMENT
HIGHdocs/github-gfi-visibility-research.md631## 11) Risk-tiered execution policy (as requested)COMMENT
Fake / Example Data14 hits · 14 pts
SeverityFileLineSnippetContext
LOWcore/i18n/locales/zh/translator.json5 "placeholder": "输入要翻译的文本...",CODE
LOWcore/i18n/locales/zh/conjugator.json15 "placeholder": "输入日语动词...",CODE
LOWcore/i18n/locales/fr/translator.json16 "placeholder": {CODE
LOWcore/i18n/locales/fr/translator.json26 "placeholder": {CODE
LOWcore/i18n/locales/fr/resources.json8 "placeholder": "Rechercher des ressources...",CODE
LOWcore/i18n/locales/fr/conjugator.json15 "placeholder": "日本語の動詞を入力...",CODE
LOWcore/i18n/locales/es/translator.json16 "placeholder": {CODE
LOWcore/i18n/locales/es/translator.json26 "placeholder": {CODE
LOWcore/i18n/locales/es/resources.json8 "placeholder": "Buscar recursos...",CODE
LOWcore/i18n/locales/es/conjugator.json15 "placeholder": "日本語の動詞を入力...",CODE
LOWcore/i18n/locales/en/translator.json16 "placeholder": {CODE
LOWcore/i18n/locales/en/translator.json26 "placeholder": {CODE
LOWcore/i18n/locales/en/resources.json8 "placeholder": "Search resources...",CODE
LOWcore/i18n/locales/en/conjugator.json15 "placeholder": "日本語の動詞を入力...",CODE
Cross-Language Confusion1 hit · 8 pts
SeverityFileLineSnippetContext
HIGH⚡batch_new.py35 run("git checkout main --quiet && git pull -q nn main")CODE
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMfeatures/Experiments/components/RunnerGame.tsx410 // Draw twice for seamless scrollingCOMMENT
MEDIUM…ures/Translator/components/TranslationAlternatives.tsx135 // Common Japanese phrases with nuanced English translationsCOMMENT
Excessive Try-Catch Wrapping3 hits · 4 pts
SeverityFileLineSnippetContext
LOW⚡batch_new.py24 except Exception:CODE
LOW⚡batch_new.py27 except Exception: entry = rawCODE
LOW⚡batch_new.py44 except Exception as e:CODE
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMdocs/ARCHITECTURE.md185└── TrainingGame/ # Shared training orchestration widgetCODE