AI Slop Code Risk Monitor

SillyTavern/SillyTavern

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

LLM Frontend for Power Users.

2.0 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for SillyTavern/SillyTavern, a JavaScript project with 35,148 GitHub stars. SynthScan examined 282,003 lines of code across 770 source files, recording 472 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 2.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.

2.0
Adjusted Signal
2.0
Raw Pattern Score
100%
Time Factor
2026-10-02
Last Push
35.1K
Stars
JavaScript
Language
282.0K
Lines of Code
770
Files
472
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 8.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.9/100 · LOW

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

Agent Over-Engineering Ratio 6.7/100 · LOW

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

PR Review Velocity Impact 9.3/100 · LOW

Which changes need focused human review? 472 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 3HIGH 1MEDIUM 23LOW 445

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

Hyper-Verbose Identifiers381 hits · 384 pts
SeverityFileLineSnippetContext
LOWtests/util.test.js8function createMockExpressResponse() {CODE
LOWtests/frontend/MacroLexer.e2e.js1364async function runLexerGetTokensAndErrors(page, input) {CODE
LOWtests/frontend/MacroEngine.e2e.js3377async function evaluateWithEngineAndCaptureMacroLogs(page, input) {CODE
LOWtests/frontend/MacroEngine.e2e.js3413async function evaluateWithEngineAndVariables(page, input, variables) {CODE
LOWtests/frontend/MacroRegistry.e2e.js623async function registerMacroAndCaptureErrors(page, { macroName, options }) {CODE
LOWtests/frontend/MacroRegistry.e2e.js679async function registerAliasAndCaptureErrors(page, { targetMacroName, aliasName, options = {} }) {CODE
LOWtests/frontend/ReasoningHiddenBlocks.e2e.js4function createEditableReasoningMessageHtml({ detailsAttributes = 'data-has-content="false"', includeMessageContainers =CODE
LOWpublic/script.js1086function verifyCharactersSearchSortRule() {CODE
LOWpublic/script.js1364export async function deleteCharacterChatByName(characterId, fileName) {CODE
LOWpublic/script.js1614function getMessageDeletionStartId(id, deleteToolCalls = true) {CODE
LOWpublic/script.js2050export function ensureMessageMediaIsArray(mes) {CODE
LOWpublic/script.js2506function updateMessageItemizedPromptButton(message, { messageId = chat.indexOf(message), messageElement = chatElement.fiCODE
LOWpublic/script.js3203function addPersonaDescriptionExtensionPrompt() {CODE
LOWpublic/script.js3281export function getExtensionPromptMaxDepth() {CODE
LOWpublic/script.js3402export function getCharacterCardFieldsLazy({ chid = undefined } = {}) {CODE
LOWpublic/script.js7114export function setExternalAbortController(controller) {CODE
LOWpublic/script.js8121export function setGenerationParamsFromPreset(preset) {CODE
LOWpublic/script.js8632export function selectRightMenuWithAnimation(selectedMenuId) {CODE
LOWpublic/script.js8942export function getExtensionPromptRoleByName(roleName) {CODE
LOWpublic/script.js8996export async function setCharacterSettingsOverrides() {CODE
LOWpublic/script.js9481export function getFirstDisplayedMessageId() {CODE
LOWpublic/script.js9547function updateAlternateGreetingsHintVisibility(root) {CODE
LOWpublic/script.js9714 function handleMoveAlternateGreeting(event, direction) {CODE
LOWpublic/script.js10658export async function renameGroupOrCharacterChat({ characterId, groupId, oldFileName, newFileName, loader: showLoader })CODE
LOWpublic/global.d.ts232 function convertVideoToAnimatedWebp(args: ConvertVideoArgs): Promise<Uint8Array>;CODE
LOWpublic/scripts/swipe-picker.js17export function canOpenSwipePickerForMessage(messageId) {CODE
LOWpublic/scripts/welcome-screen.js204export function getPermanentAssistantAvatar() {CODE
LOWpublic/scripts/welcome-screen.js255async function unshallowPermanentAssistant() {CODE
LOWpublic/scripts/welcome-screen.js534async function renameRecentCharacterChat(avatarId, fileName) {CODE
LOWpublic/scripts/welcome-screen.js599async function deleteRecentCharacterChat(avatarId, fileName) {CODE
LOWpublic/scripts/welcome-screen.js690async function openRecentChatsSettingsPopup() {CODE
LOWpublic/scripts/welcome-screen.js819export async function openPermanentAssistantChat({ tryCreate = true, created = false } = {}) {CODE
LOWpublic/scripts/welcome-screen.js883export async function openPermanentAssistantCard() {CODE
LOWpublic/scripts/welcome-screen.js898export function assignCharacterAsAssistant(characterId) {CODE
LOWpublic/scripts/variables.js895function closureDeserializeCallback(args, value) {CODE
LOWpublic/scripts/action-loader-slashcommands.js15export function registerActionLoaderSlashCommands() {CODE
LOWpublic/scripts/chat-templates.js120export async function deriveTemplatesFromChatTemplate(chat_template, hash) {CODE
LOWpublic/scripts/kai-settings.js134function loadKoboldSettingsFromPreset(preset) {CODE
LOWpublic/scripts/kai-settings.js229export async function generateKoboldWithStreaming(generate_data, signal) {CODE
LOWpublic/scripts/itemized-prompts.js65export async function replaceItemizedPromptText(mesId, promptText) {CODE
LOWpublic/scripts/itemized-prompts.js389export function deleteItemizedPromptForMessage(messageId) {CODE
LOWpublic/scripts/logprobs.js74function renderAlternativeTokensView() {CODE
LOWpublic/scripts/logprobs.js509export function saveLogprobsForActiveMessage(logprobs, continueFrom) {CODE
LOWpublic/scripts/logprobs.js559function getActiveMessageLogprobData() {CODE
LOWpublic/scripts/logprobs.js575function convertTokenIdLogprobsToText(input) {CODE
LOWpublic/scripts/personas.js207function verifyPersonaSearchSortRule() {CODE
LOWpublic/scripts/personas.js551export async function convertCharacterToPersona(characterId = null) {CODE
LOWpublic/scripts/personas.js689export function updatePersonaConnectionsAvatarList() {CODE
LOWpublic/scripts/personas.js965export function isPersonaConnectionLocked(connection) {CODE
LOWpublic/scripts/personas.js1206async function onPersonaDescriptionInput() {CODE
LOWpublic/scripts/personas.js1238async function onPersonaDescriptionDepthValueInput() {CODE
LOWpublic/scripts/personas.js1252async function onPersonaDescriptionDepthRoleInput() {CODE
LOWpublic/scripts/personas.js1316async function onPersonaDescriptionPositionInput() {CODE
LOWpublic/scripts/personas.js1334export function getOrCreatePersonaDescriptor() {CODE
LOWpublic/scripts/personas.js1334export function getOrCreatePersonaDescriptor() {CODE
LOWpublic/scripts/personas.js1518function getPersonaTemporaryLockInfo() {CODE
LOWpublic/scripts/personas.js1543async function loadPersonaForCurrentChat({ doRender = false } = {}) {CODE
LOWpublic/scripts/personas.js1875export async function retriggerFirstMessageOnEmptyChat() {CODE
LOWpublic/scripts/personas.js2463function userMessageNamesEnumProvider() {CODE
LOWpublic/scripts/personas.js2472function registerPersonaSlashCommands() {CODE
321 more matches not shown…
Self-Referential Comments18 hits · 54 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/pr-check-merge-conflicts.yaml23 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/on-close-handler.yml23 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/issues-updates-on-merge.yml23 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/on-open-handler.yml23 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/job-close-stale.yml23 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/job-close-stale.yml68 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/job-close-stale.yml106 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/issues-auto-manager.yml23 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/issues-auto-manager.yml57 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/issues-auto-manager.yml115 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/issues-auto-manager.yml142 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml32 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml69 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml100 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml134 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml171 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml250 # Create a GitHub App tokenCOMMENT
MEDIUM.github/workflows/pr-auto-manager.yml290 # Create a GitHub App tokenCOMMENT
Hallucination Indicators3 hits · 35 pts
SeverityFileLineSnippetContext
CRITICALpublic/lib/jquery-ui.min.js6!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(V){"use strict"CODE
CRITICALpublic/lib/jquery-3.5.1.min.js2!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):fCODE
CRITICAL⚡public/lib/epub.min.js1!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("JSZip")):"function"==typeof dCODE
Slop Phrases19 hits · 20 pts
SeverityFileLineSnippetContext
LOWpublic/locales/it-it.json1400 "Don't forget to save a snapshot of your settings before proceeding.": "Non dimenticare di salvare un'istantanea delCODE
LOWpublic/locales/th-th.json1413 "Don't forget to save a snapshot of your settings before proceeding.": "อย่าลืมบันทึกสแนปช็อตการตั้งค่าของคุณก่อนดำเนิCODE
LOWpublic/locales/ko-kr.json1417 "Don't forget to save a snapshot of your settings before proceeding.": "계속하기 전에 설정의 스냅샷을 저장하는 것을 잊지 마세요.",CODE
LOWpublic/locales/es-es.json1400 "Don't forget to save a snapshot of your settings before proceeding.": "No olvide guardar una instantánea de su confCODE
LOWpublic/locales/ja-jp.json1402 "Don't forget to save a snapshot of your settings before proceeding.": "続行する前に、設定のスナップショットを保存することを忘れないでください。",CODE
LOWpublic/locales/zh-cn.json3416 "Don't forget to save a snapshot of your settings before proceeding.": "在继续之前,不要忘记保存您的设置快照。",CODE
LOWpublic/locales/ar-sa.json1400 "Don't forget to save a snapshot of your settings before proceeding.": "لا تنس حفظ لقطة من إعداداتك قبل المتابعة.",CODE
LOWpublic/locales/pt-pt.json1398 "Don't forget to save a snapshot of your settings before proceeding.": "Não se esqueça de salvar um instantâneo de sCODE
LOWpublic/locales/uk-ua.json1398 "Don't forget to save a snapshot of your settings before proceeding.": "Перш ніж продовжити, не забудьте зберегти знCODE
LOWpublic/locales/de-de.json1400 "Don't forget to save a snapshot of your settings before proceeding.": "Vergessen Sie nicht, einen Schnappschuss IhrCODE
LOWpublic/locales/fr-fr.json1322 "Don't forget to save a snapshot of your settings before proceeding.": "N'oubliez pas d'enregistrer un instantané deCODE
LOWpublic/locales/zh-tw.json1400 "Don't forget to save a snapshot of your settings before proceeding.": "在繼續之前,請不要忘記進行備份。",CODE
LOWpublic/locales/is-is.json1398 "Don't forget to save a snapshot of your settings before proceeding.": "Ekki gleyma að vista mynd af stillingunum þíCODE
LOWpublic/locales/ru-ru.json1569 "Don't forget to save a snapshot of your settings before proceeding.": "Настоятельно советуем перед этим сохранить сCODE
LOWpublic/locales/nl-nl.json1396 "Don't forget to save a snapshot of your settings before proceeding.": "Vergeet niet een momentopname van uw instellCODE
LOWpublic/locales/vi-vn.json1398 "Don't forget to save a snapshot of your settings before proceeding.": "Đừng quên sao lưu snapshot của cài đặt của bCODE
LOWpublic/scripts/templates/resetSettings.html5 <div data-i18n="Don't forget to save a snapshot of your settings before proceeding.">CODE
LOWpublic/scripts/templates/resetSettings.html6 Don't forget to save a snapshot of your settings before proceeding.CODE
LOWsrc/endpoints/vectors.js21// Don't forget to add new sources to the SOURCES arrayCOMMENT
Verbosity Indicators8 hits · 16 pts
SeverityFileLineSnippetContext
LOWpublic/script.js3406 // For group chats, we need to check if group cards should be usedCOMMENT
LOW⚡public/scripts/world-info.js2259 // Step 1: Clean all <option> elements within <select>COMMENT
LOW⚡public/scripts/world-info.js2267 // Step 2: Clean all <select> elementsCOMMENT
LOWpublic/scripts/world-info.js2289 // Step 3: Clean <div>, <span>, <input>COMMENT
LOW⚡public/scripts/extensions/gallery/index.js630 // Step 1: Clone the template contentCOMMENT
LOW⚡public/scripts/extensions/gallery/index.js640 // Step 2: Append the given imageCOMMENT
LOW⚡public/scripts/extensions/gallery/index.js687 // Step 3: Attach it to the movingDivs containerCOMMENT
LOW⚡public/scripts/extensions/gallery/index.js690 // Step 4: Call dragElement and loadMovingUIStateCOMMENT
Over-Commented Block15 hits · 15 pts
SeverityFileLineSnippetContext
LOWdefault/config.yaml21 # Open the browser automatically on server startup.COMMENT
LOWdefault/config.yaml41# Interval in seconds to write a heartbeat file. Set to 0 to disable.COMMENT
LOWdefault/config.yaml101 url: "socks5://username:password@example.com:1080"COMMENT
LOWdefault/config.yaml121 # This will use auto login to an account with the same usernameCOMMENT
LOWdefault/config.yaml141# Host whitelist configuration. Recommended if you're using a listen modeCOMMENT
LOWdefault/config.yaml181# Disable startup security checks - NOT RECOMMENDEDCOMMENT
LOWdefault/config.yaml221 chat:COMMENT
LOWdefault/config.yaml281 - cdn.discordapp.comCOMMENT
LOWdefault/config.yaml321enableDownloadableTokenizers: trueCOMMENT
LOWdefault/config.yaml341# -- OLLAMA API CONFIGURATION --COMMENT
LOWdefault/config.yaml361 # Enables caching of the message history at depth (if supported).COMMENT
LOWdefault/config.yaml381 # Adds thought signatures to requests (if available). Only for Gemini 3 and above.COMMENT
LOWpublic/script.js1161 ];COMMENT
LOWpublic/scripts/dynamic-styles.js121COMMENT
LOWpublic/scripts/slash-commands/SlashCommandParser.js581 * @returns Whether the next characters are the indicated symbol.COMMENT
Structural Annotation Overuse7 hits · 15 pts
SeverityFileLineSnippetContext
LOW⚡public/scripts/world-info.js2259 // Step 1: Clean all <option> elements within <select>COMMENT
LOW⚡public/scripts/world-info.js2267 // Step 2: Clean all <select> elementsCOMMENT
LOWpublic/scripts/world-info.js2289 // Step 3: Clean <div>, <span>, <input>COMMENT
LOW⚡public/scripts/extensions/gallery/index.js630 // Step 1: Clone the template contentCOMMENT
LOW⚡public/scripts/extensions/gallery/index.js640 // Step 2: Append the given imageCOMMENT
LOW⚡public/scripts/extensions/gallery/index.js687 // Step 3: Attach it to the movingDivs containerCOMMENT
LOW⚡public/scripts/extensions/gallery/index.js690 // Step 4: Call dragElement and loadMovingUIStateCOMMENT
Fake / Example Data14 hits · 14 pts
SeverityFileLineSnippetContext
LOWpublic/scripts/variables.js2070 <pre><code class="language-stscript">/len Lorem ipsum | /echo</code></pre>CODE
LOWpublic/scripts/RossAscends-mods.js327 send_textarea.attr('placeholder', send_textarea.attr('no_connection_text')); //Input bar placeholder tells usersCODE
LOWpublic/scripts/RossAscends-mods.js338 send_textarea.attr('placeholder', send_textarea.attr('connected_text')); //on connect, placeholder tells useCODE
LOWpublic/scripts/secrets.js264 $(input_selector).attr('placeholder', placeholderWithLabel);CODE
LOWpublic/scripts/openai.js5744 $('#openai_reverse_proxy').attr('placeholder', 'https://api.anthropic.com/v1');CODE
LOWpublic/scripts/openai.js5755 $('#openai_reverse_proxy').attr('placeholder', 'https://api.openai.com/v1');CODE
LOWpublic/scripts/world-info.js2970 placeholder: input.attr('placeholder'),CODE
LOWpublic/scripts/world-info.js3353 commentInput.attr('placeholder', (keys || t`Entry Title/Memo`));CODE
LOWpublic/scripts/slash-commands.js2537 name: 'placeholder',CODE
LOWpublic/scripts/extensions/tts/index.js94 const fallbackPreview = 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet';CODE
LOWpublic/scripts/extensions/tts/index.js94 const fallbackPreview = 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet';CODE
LOWpublic/lib/select2.min.js2!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.eCODE
LOWpublic/lib/jquery-ui.min.js6!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(V){"use strict"CODE
LOWpublic/lib/select2-search-placeholder.js19 this.$search.attr('placeholder', this.options.get('searchInputPlaceholder'));CODE
AI Slop Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMpublic/scripts/world-info.js2802 // we gonna utilize the custom tokenizer that also handles the input.COMMENT
MEDIUM⚡public/lib/epub.min.js1!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("JSZip")):"function"==typeof dCODE
MEDIUM⚡public/lib/epub.min.js1!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("JSZip")):"function"==typeof dCODE
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMsrc/endpoints/characters.js1330 // ── Bulk mode: avatars array is present ──────────────────COMMENT
MEDIUMsrc/endpoints/characters.js1400 // ── Single mode (default behavior) ───────────────────────COMMENT
Synthetic Comment Markers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHpublic/script.js616export let amount_gen = 80; //default max length of AI generated responsesCODE
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWdocker/docker-entrypoint.sh58 # Check if PUID/PGID variables are providedCOMMENT