AI Slop Code Risk Monitor

togatoga/karukan

SlopCodeMonitor badge for togatoga/karukan Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Japanese Input Method System for Linux, macOS, Neural Kana-Kanji Conversion Engine

1.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for togatoga/karukan, a Rust project with 751 GitHub stars. SynthScan examined 108,574 lines of code across 148 source files, recording 118 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.5 (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.5
Adjusted Signal
1.5
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
751
Stars
Rust
Language
108.6K
Lines of Code
148
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 5.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 1.7/100 · LOW

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

PR Review Velocity Impact 6.6/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 13LOW 104

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 10 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 Block70 hits · 70 pts
SeverityFileLineSnippetContext
LOWkarukan-engine/data/single_kanji.yml1# Single-kanji conversion data: たか → 高, 嵩, 鷹, … one kanji at a time.COMMENT
LOWkarukan-engine/src/learning.rs21}COMMENT
LOWkarukan-engine/src/dict.rs141 /// Format:COMMENT
LOWkarukan-engine/src/width.rs1//! Which width a character comes out at: half (`(`, `?`, `1`) or fullCOMMENT
LOWkarukan-engine/src/width.rs21/// The width a group comes out at.COMMENT
LOWkarukan-engine/src/kana.rs1use unicode_normalization::UnicodeNormalization;COMMENT
LOWkarukan-engine/src/kana.rs21/// True if the text contains any hiragana or katakana **letter**.COMMENT
LOWkarukan-engine/src/romaji/style.rs1//! Which symbol a key types: the `,` `.` `/` `[` `]` keys have more thanCOMMENT
LOWkarukan-engine/src/rewriter/symbol.rs1//! Symbol rewriter — given a typed symbol or hiragana reading, emit relatedCOMMENT
LOWkarukan-engine/src/rewriter/symbol.rs21//! `scripts/symbols_porter.py`, driving job (2). Re-running the porterCOMMENT
LOWkarukan-engine/src/rewriter/emoji.rs1//! Emoji rewriter — surfaces emoji candidates from two input paths.COMMENT
LOWkarukan-engine/src/rewriter/emoji.rs21//! 2. **Earliest match position** in the trigger (ascending).COMMENT
LOWkarukan-engine/src/rewriter/emoji.rs121/// `min()` selects the most relevant: longer contiguous runs comeCOMMENT
LOWkarukan-engine/src/rewriter/number.rs1//! Number rewriter — expand a numeric candidate into related styles.COMMENT
LOWkarukan-engine/src/rewriter/single_kanji.rs1//! Single-kanji rewriter: the reading as one kanji at a time (たか → 高,COMMENT
LOWkarukan-engine/src/rewriter/alphabet.rs1//! Alphabet width/case rewriter — for ASCII or full-width alphabetic input,COMMENT
LOWkarukan-engine/src/rewriter/date.rs1//! Date rewriter — turn a registered phrase (きょう, あした, いま, …) intoCOMMENT
LOWkarukan-engine/src/rewriter/date.rs21pub struct DateConfig {COMMENT
LOWkarukan-engine/src/rewriter/mod.rs1//! Candidate rewriters: produce additional variants from existing conversion candidates.COMMENT
LOWkarukan-engine/src/rewriter/half_katakana.rs1//! Katakana form rewriter — produces full-width and half-width katakana variants.COMMENT
LOWkarukan-engine/src/kanji/hf_download.rs1//! HuggingFace model download utilitiesCOMMENT
LOWkarukan-engine/src/kanji/hf_download.rs21/// unreachable host was retried for minutes — each attempt eats a full OSCOMMENT
LOWkarukan-engine/src/kanji/hf_download.rs41 PATHS.get_or_init(Mutex::default)COMMENT
LOWscripts/single_kanji_porter.py161# Single-kanji conversion data: たか → 高, 嵩, 鷹, … one kanji at a time.COMMENT
LOWscripts/emoji_porter.py221# Extra hiragana readings to append onto Mozc's table.COMMENT
LOWscripts/emoji_porter.py241# from Mozc's `romanji-hiragana.tsv` because:COMMENT
LOWscripts/emoji_porter.py461COMMENT
LOWkarukan-cli/src/bin/sudachi_dict.rs21///COMMENT
LOWkarukan-cli/src/bin/server.rs21COMMENT
LOWkarukan-cli/src/bin/dict.rs21}COMMENT
LOWkarukan-cli/src/bin/dict.rs41 /// Input format: json or mozc (auto-detected from extension if omitted)COMMENT
LOWkarukan-im/fcitx5/src/lib.rs1//! karukan-fcitx5: fcitx5 addon for the Karukan Japanese IMECOMMENT
LOWkarukan-im/macos/scripts/generate_icons.swift1#!/usr/bin/env swiftCOMMENT
LOWkarukan-im/macos/Sources/KarukanIME/KeyCodeMap.swift121/// before they reach the input context, and mouse events never reach anCOMMENT
LOW…/macos/Sources/KarukanIME/KarukanInputController.swift201 }COMMENT
LOWkarukan-im/core/config/default.toml1# Karukan IME デフォルト設定COMMENT
LOWkarukan-im/core/config/default.toml21# この数までの記号は区切らずに一緒に変換されるため、「おい、お前だよ」がCOMMENT
LOWkarukan-im/core/config/default.toml41beam_width = 3COMMENT
LOWkarukan-im/core/config/default.toml81# 候補ウィンドウをいつ開くか。"always" は入力中から常時、"conversion" は Space でCOMMENT
LOWkarukan-im/core/config/default.toml101# かな入力中に出力される文字の幅。文字の種類ごとに "half"(半角)かCOMMENT
LOWkarukan-im/core/src/core/keycode.rs161COMMENT
LOWkarukan-im/core/src/core/preedit.rs1//! Preedit string managementCOMMENT
LOWkarukan-im/core/src/core/candidate.rs1//! Candidate list managementCOMMENT
LOWkarukan-im/core/src/core/engine/cache.rs1//! LRU cache for model conversion results.COMMENT
LOWkarukan-im/core/src/core/engine/types.rs61#[derive(Debug, Clone)]COMMENT
LOWkarukan-im/core/src/core/engine/types.rs81 /// and the aux mode indicator shows.COMMENT
LOWkarukan-im/core/src/core/engine/types.rs181pub(in crate::core) struct Converters {COMMENT
LOWkarukan-im/core/src/core/engine/types.rs201 Hiragana,COMMENT
LOWkarukan-im/core/src/core/engine/types.rs261 }COMMENT
LOWkarukan-im/core/src/core/engine/types.rs341/// Whether a conversion consults the learning cache. Tab asks forCOMMENT
LOWkarukan-im/core/src/core/engine/mod.rs121 /// Converters (romaji, kanji, light kanji)COMMENT
LOWkarukan-im/core/src/core/engine/mod.rs141 chunks: Vec<ComposingChunk>,COMMENT
LOWkarukan-im/core/src/core/engine/mod.rs461 // exempt — their events routinely carry their own modifier state.COMMENT
LOWkarukan-im/core/src/core/engine/mod.rs521 /// for text that arrives already converted: the model is prompted withCOMMENT
LOWkarukan-im/core/src/core/engine/mod.rs541 .map(|c| if c.is_whitespace() { space } else { c })COMMENT
LOWkarukan-im/core/src/core/engine/input_buffer.rs1//! InputBuffer: a recorded element array plus a caret, with every viewCOMMENT
LOWkarukan-im/core/src/core/engine/input_buffer.rs21//! right of the cursor are never touched, so nothing combines across theCOMMENT
LOWkarukan-im/core/src/core/engine/input_buffer.rs321/// one element per output character.COMMENT
LOWkarukan-im/core/src/core/engine/filter.rs1//! Source-filtered candidate views (Ctrl+R / Ctrl+T).COMMENT
LOWkarukan-im/core/src/core/engine/filter.rs161 // One dictionary view over both dictionaries: usually the userCOMMENT
10 more matches not shown…
Decorative Section Separators12 hits · 36 pts
SeverityFileLineSnippetContext
MEDIUMtests/integration/test_fcitx5_addon.sh29# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh31# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh61# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh63# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh87# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh89# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh119# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh121# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh166# -------------------------------------------------------COMMENT
MEDIUMtests/integration/test_fcitx5_addon.sh168# -------------------------------------------------------COMMENT
MEDIUMkarukan-engine/data/symbols.yml904# ---------------------------------------------------------------------------COMMENT
MEDIUMkarukan-engine/data/symbols.yml912# ---------------------------------------------------------------------------COMMENT
Verbosity Indicators13 hits · 23 pts
SeverityFileLineSnippetContext
LOWkarukan-engine/src/kanji/llamacpp.rs287 // Step 1: Process input tokens for ALL sequences in one batchCOMMENT
LOW⚡karukan-engine/src/kanji/llamacpp.rs301 // Step 2: Get top-k initial tokens (from any seq, all have same logits at this point)COMMENT
LOW⚡karukan-engine/src/kanji/llamacpp.rs304 // Step 3: Initialize beam state. A beam whose initial token isCOMMENT
LOW⚡karukan-engine/src/kanji/llamacpp.rs313 // Step 4: Add initial tokens to each beam's sequenceCOMMENT
LOWkarukan-engine/src/kanji/llamacpp.rs327 // Step 5: Generate tokens for all beams in parallel. Greedy samplingCOMMENT
LOWkarukan-engine/src/kanji/llamacpp.rs421 // Step 1: decode the prompt once into slot 0 and read its logits.COMMENT
LOWkarukan-engine/src/kanji/llamacpp.rs442 // Step 2: Main beam search loopCOMMENT
LOWkarukan-cli/static/app.js232 // Step 1: Romaji -> HiraganaCOMMENT
LOWkarukan-cli/static/app.js257 // Step 2: Hiragana -> Kanji (debounced)COMMENT
LOW⚡karukan-cli/src/bin/sudachi_dict.rs91 // Step 1: Parse CSV filesCOMMENT
LOW⚡karukan-cli/src/bin/sudachi_dict.rs98 // Step 2: Convert to sorted entriesCOMMENT
LOWkarukan-cli/src/bin/sudachi_dict.rs117 // Step 3: Score with model or use Sudachi cost directlyCOMMENT
LOWkarukan-cli/src/bin/sudachi_dict.rs140 // Step 4: Write JSON outputCOMMENT
Structural Annotation Overuse13 hits · 23 pts
SeverityFileLineSnippetContext
LOWkarukan-engine/src/kanji/llamacpp.rs287 // Step 1: Process input tokens for ALL sequences in one batchCOMMENT
LOW⚡karukan-engine/src/kanji/llamacpp.rs301 // Step 2: Get top-k initial tokens (from any seq, all have same logits at this point)COMMENT
LOW⚡karukan-engine/src/kanji/llamacpp.rs304 // Step 3: Initialize beam state. A beam whose initial token isCOMMENT
LOW⚡karukan-engine/src/kanji/llamacpp.rs313 // Step 4: Add initial tokens to each beam's sequenceCOMMENT
LOWkarukan-engine/src/kanji/llamacpp.rs327 // Step 5: Generate tokens for all beams in parallel. Greedy samplingCOMMENT
LOWkarukan-engine/src/kanji/llamacpp.rs421 // Step 1: decode the prompt once into slot 0 and read its logits.COMMENT
LOWkarukan-engine/src/kanji/llamacpp.rs442 // Step 2: Main beam search loopCOMMENT
LOWkarukan-cli/static/app.js232 // Step 1: Romaji -> HiraganaCOMMENT
LOWkarukan-cli/static/app.js257 // Step 2: Hiragana -> Kanji (debounced)COMMENT
LOW⚡karukan-cli/src/bin/sudachi_dict.rs91 // Step 1: Parse CSV filesCOMMENT
LOW⚡karukan-cli/src/bin/sudachi_dict.rs98 // Step 2: Convert to sorted entriesCOMMENT
LOWkarukan-cli/src/bin/sudachi_dict.rs117 // Step 3: Score with model or use Sudachi cost directlyCOMMENT
LOWkarukan-cli/src/bin/sudachi_dict.rs140 // Step 4: Write JSON outputCOMMENT
Deep Nesting4 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/single_kanji_porter.py121CODE
LOWscripts/emoji_porter.py332CODE
LOWscripts/emoji_porter.py424CODE
LOWscripts/emoji_porter.py616CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMkarukan-engine/src/rewriter/emoji.rs412 // ---------- guardrails ----------COMMENT
Cross-Language Confusion1 hit · 2 pts
SeverityFileLineSnippetContext
HIGHscripts/emoji_porter.py559 scalar (numbers like `+1`, booleans, null) so it round-trips backSTRING
Unused Imports2 hits · 2 pts
SeverityFileLineSnippetContext
LOWscripts/single_kanji_porter.py37CODE
LOWscripts/emoji_porter.py51CODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/integration/run_fcitx5_test.sh4# Usage:COMMENT
Hyper-Verbose Identifiers1 hit · 1 pts
SeverityFileLineSnippetContext
LOWkarukan-cli/static/app.js268async function handleDirectHiraganaInput(e) {CODE