AI Slop Code RIsk Monitor

miroslavpejic85/mirotalk

🚀 Open-source, self-hosted P2P WebRTC video conferencing for fast, private real-time communication. Create browser-based meeting rooms with no downloads or time limits, plus screen sharing, chat, whiteboard, recording, and collaboration.

5.1 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for miroslavpejic85/mirotalk, a JavaScript project with 4,780 GitHub stars. SynthScan examined 98,820 lines of code across 186 source files, recording 150 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 5.1 (Moderate 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.

5.1
Adjusted Signal
5.1
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
4.8K
Stars
JavaScript
Language
98.8K
Lines of Code
186
Files
150
Pattern Hits
2026-10-12
Scan Date
0.16
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 4.2/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 17.2/100 · LOW

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

Agent Over-Engineering Ratio 5.2/100 · LOW

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

PR Review Velocity Impact 19.7/100 · LOW

Which changes need focused human review? 150 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 28HIGH 1MEDIUM 13LOW 108

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 150 distinct pattern matches across 9 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.

Hallucination Indicators28 hits · 365 pts
SeverityFileLineSnippetContext
CRITICALtests/test-noiseSuppression.js207 context.window.AudioContext.prototype.audioWorklet.addModule.callsFake(CODE
CRITICAL⚡tests/test-videoDrawing.js556 tools.panel.hidden.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js558 tools.panel.hidden.should.be.false();CODE
CRITICAL⚡tests/test-videoDrawing.js562 tools.panel.hidden.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js563 appearance.panel.hidden.should.be.false();CODE
CRITICAL⚡tests/test-videoDrawing.js566 appearance.panel.hidden.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js580 tools.panel.hidden.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js586 tools.panel.hidden.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js592 overlay.appearanceButton.firstChild.style.backgroundColor.should.equal('rgb(255, 23, 68)');CODE
CRITICAL⚡tests/test-videoDrawing.js596 overlay.widthPreview.style.height.should.equal('8px');CODE
CRITICALtests/test-videoDrawing.js711 overlay.toolButtons.pencil.disabled.should.be.true();CODE
CRITICALtests/test-videoDrawing.js731 overlay.toolButtons.pencil.disabled.should.be.false();CODE
CRITICAL⚡tests/test-videoDrawing.js745 overlay.toolButtons.pencil.disabled.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js746 overlay.undoButton.disabled.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js747 overlay.clearButton.disabled.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js748 overlay.visibilityButton.disabled.should.be.false();CODE
CRITICAL⚡tests/test-videoDrawing.js761 overlay.toolButtons.pencil.disabled.should.be.false();CODE
CRITICAL⚡tests/test-videoDrawing.js770 queued.toolButtons.pencil.disabled.should.be.true();CODE
CRITICAL⚡tests/test-videoDrawing.js774 dom.window.Overlay.pendingPermissions.size.should.equal(0);CODE
CRITICAL⚡tests/test-videoDrawing.js784 ownerOverlay.toolButtons.pencil.disabled.should.be.false();CODE
CRITICALtests/test-videoDrawing.js907 saved.blob.size.should.be.above(0);CODE
CRITICALtests/test-hostProtection.js171 result.data.is_presenter.should.be.true();CODE
CRITICALtests/test-hostProtection.js196 guestResult.data.is_presenter.should.be.false();CODE
CRITICALtests/test-validate.js281 cfg.wbCanvasJson.objects.should.have.length(4);CODE
CRITICALtests/test-presenterSecurity.js126 presenterResult.data.is_presenter.should.be.true();CODE
CRITICALtests/test-presenterSecurity.js131 participantResult.data.is_presenter.should.be.false();CODE
CRITICALtests/test-presenterSecurity.js192 result.data.is_presenter.should.be.false();CODE
CRITICALtests/test-presenterSecurity.js203 result.data.is_presenter.should.be.false();CODE
Hyper-Verbose Identifiers90 hits · 58 pts
SeverityFileLineSnippetContext
LOWpublic/js/detectSpeaking.js20async function getMicrophoneVolumeIndicator(stream) {CODE
LOWpublic/js/client.js1015function refreshMainButtonsToolTipPlacement() {CODE
LOWpublic/js/client.js2434function attachCameraBackgroundStream(stream, previousStream) {CODE
LOWpublic/js/client.js2512async function loadCameraBackgroundImage(event) {CODE
LOWpublic/js/client.js2616 async function updateInitLocalVideoMediaStream(camStream) {CODE
LOWpublic/js/client.js2706 async function updateLocalVideoMediaStream(camStream) {CODE
LOWpublic/js/client.js2835function handleRNNoiseNotSupported() {CODE
LOWpublic/js/client.js2907function setMicrophoneNoiseSuppression(track, enabled, isCurrent) {CODE
LOWpublic/js/client.js2966function stopNoiseSuppressionPipeline() {CODE
LOWpublic/js/client.js3203async function handlePeersConnectionStatus(peer_id) {CODE
LOWpublic/js/client.js4114async function initEnumerateAudioDevices() {CODE
LOWpublic/js/client.js4132async function initEnumerateVideoDevices() {CODE
LOWpublic/js/client.js4258async function refreshMyAudioVideoDevices() {CODE
LOWpublic/js/client.js4423 async function updateLocalVideoMediaStream(stream) {CODE
LOWpublic/js/client.js5747function createResponsiveDropdownItem(sourceButton, label, tier = 'secondary') {CODE
LOWpublic/js/client.js5762function createResponsiveDropdownRangeItem(sourceRange, label, iconClass) {CODE
LOWpublic/js/client.js6432function scheduleParticipantViewRestore() {CODE
LOWpublic/js/client.js6749function removeVideoPinMediaContainer(peer_id, force_remove = false) {CODE
LOWpublic/js/client.js7519function openPinnedParticipantsSidebar(announce = false) {CODE
LOWpublic/js/client.js7682function confirmTranscriptionStartWithAudioOff() {CODE
LOWpublic/js/client.js7709function applyWhisperUiAvailability() {CODE
LOWpublic/js/client.js8187async function documentPictureInPictureRestart() {CODE
LOWpublic/js/client.js8198async function documentPictureInPictureClose() {CODE
LOWpublic/js/client.js8209async function documentPictureInPictureOpen() {CODE
LOWpublic/js/client.js8278 function observeElementClassChanges(element, observerName) {CODE
LOWpublic/js/client.js8585function updateSettingsExtraGroups() {CODE
LOWpublic/js/client.js8691function handleExitMenuOutsideClick(e) {CODE
LOWpublic/js/client.js9177function loadSettingsFromLocalStorage() {CODE
LOWpublic/js/client.js9280function handleUsernameEmojiPicker() {CODE
LOWpublic/js/client.js9599function createVideoLoadingSpinner(wrap, videoEl) {CODE
LOWpublic/js/client.js10112function getScreenShareConstraints() {CODE
LOWpublic/js/client.js10335async function handleToggleScreenException(reason, init) {CODE
LOWpublic/js/client.js10903function getAudioStreamFromAudioElements() {CODE
LOWpublic/js/client.js11217function setChatRoomAndCaptionForMobile() {CODE
LOWpublic/js/client.js11284function shouldDockParticipantsPanel() {CODE
LOWpublic/js/client.js11288function syncParticipantsListContainer(showParticipantsPanel = false) {CODE
LOWpublic/js/client.js11308function syncParticipantsPanelVisibility(forceVisible = null) {CODE
LOWpublic/js/client.js11384function toggleCaptionDropDownMenu() {CODE
LOWpublic/js/client.js11404function handleMsgerDropdownOutsidePress(event) {CODE
LOWpublic/js/client.js11424function toggleParticipantsDropDownMenu(activeMenu, siblingMenu = null) {CODE
LOWpublic/js/client.js11436function syncCaptionEveryoneButtons(isActive) {CODE
LOWpublic/js/client.js11779function hideChatRoomAndEmojiPicker() {CODE
LOWpublic/js/client.js12049function handleDataChannelChatReaction(dataMessage) {CODE
LOWpublic/js/client.js12145function handleDataChannelSpeechTranscript(config) {CODE
LOWpublic/js/client.js12211function showCaptionEmptyNoticeIfNoCaptions() {CODE
LOWpublic/js/client.js12421function isConversationCurrentlyVisible(type = 'public', peerName = '', peerId = '') {CODE
LOWpublic/js/client.js12481function filterMessagesByConversation() {CODE
LOWpublic/js/client.js12517function isChatGPTConversationActive() {CODE
LOWpublic/js/client.js12534function getConversationShareTarget(actionLabel = 'this item') {CODE
LOWpublic/js/client.js12557function ensureChatGPTConversationEntry() {CODE
LOWpublic/js/client.js12593function toggleMsgerParticipantsEmptyNotice() {CODE
LOWpublic/js/client.js12768function closeAllMsgerParticipantDropdownMenus() {CODE
LOWpublic/js/client.js12788function positionMsgerParticipantDropdownMenu(toggleEl, menuEl) {CODE
LOWpublic/js/client.js12830function openMsgerParticipantDropdownMenu(toggleEl, menuEl) {CODE
LOWpublic/js/client.js12843function toggleMsgerParticipantDropdownMenu(toggleEl, menuEl) {CODE
LOWpublic/js/client.js12854function handleMsgerParticipantDropdownDocumentClick(event) {CODE
LOWpublic/js/client.js12865function getMsgerParticipantDropdownActionMarkup(buttonId, iconClass, label, variant = 'default') {CODE
LOWpublic/js/client.js12881function getMsgerParticipantDropdownDividerMarkup() {CODE
LOWpublic/js/client.js12885function getMsgerRoomActionsDropdownMarkup(idSuffix = '') {CODE
LOWpublic/js/client.js12896function renderMsgerRoomActionsDropdown(dropdownContent, idSuffix = '') {CODE
30 more matches not shown…
Decorative Section Separators11 hits · 46 pts
SeverityFileLineSnippetContext
MEDIUM⚡docker-compose-whisper.yml1# =============================================================================COMMENT
MEDIUM⚡docker-compose-whisper.yml3# =============================================================================COMMENT
MEDIUM⚡docker-compose-whisper.yml12# -----------------------------------------------------------------------------COMMENT
MEDIUM⚡docker-compose-whisper.yml14# -----------------------------------------------------------------------------COMMENT
MEDIUM⚡docker-compose-whisper.yml20# -----------------------------------------------------------------------------COMMENT
MEDIUM⚡docker-compose-whisper.yml22# -----------------------------------------------------------------------------COMMENT
MEDIUM⚡docker-compose-whisper.yml40# =============================================================================COMMENT
MEDIUM⚡docker-compose-whisper.yml43 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡docker-compose-whisper.yml45 # -------------------------------------------------------------------------COMMENT
MEDIUMdocker-compose-whisper.yml67 # -------------------------------------------------------------------------COMMENT
MEDIUMdocker-compose-whisper.yml69 # -------------------------------------------------------------------------COMMENT
Fake / Example Data8 hits · 9 pts
SeverityFileLineSnippetContext
LOWapp/src/scripts/extract-ui-lang.js23const ATTR_KEYS = ['title', 'placeholder', 'aria-label', 'data-tippy-content'];CODE
LOW⚡tests/test-api.js44 peerId1: { peer_name: 'John Doe' },CODE
LOW⚡tests/test-api.js45 peerId2: { peer_name: 'John Doe' },CODE
LOW⚡tests/test-api.js48 peerId1: { peer_name: 'John Doe' },CODE
LOWtests/test-api.js94 peer_name: 'John Doe',CODE
LOWtests/test-api.js139 name: 'John Doe',CODE
LOWpublic/js/client.js15701 const text = new fabric.IText('Lorem Ipsum', {CODE
LOWpublic/js/i18n.js60 const ATTR_KEYS = ['title', 'placeholder', 'aria-label', 'data-tippy-content'];CODE
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHpublic/js/client.js10464 // Enable/disable local audio as requested by callerCOMMENT
Over-Commented Block7 hits · 7 pts
SeverityFileLineSnippetContext
LOWdocker-compose-whisper.yml1# =============================================================================COMMENT
LOWdocker-compose-whisper.yml21# Point MiroTalk P2P at this serverCOMMENT
LOWdocker-compose.template.yml21# See https://doc.traefik.io/traefik/user-guides/docker-compose/basic-example/COMMENT
LOWapp/src/config.template.js201 chatGPT: {COMMENT
LOWapp/src/config.template.js221 // lowest possible latency. The resulting text is distributed to peers overCOMMENT
LOWpublic/css/client.css4241#myProfileAvatarUploadBtn,COMMENT
LOWpublic/js/helpers.js81// To start recording, call audioRecorder.getMixedAudioStream(audioStreams);COMMENT
Slop Phrases1 hit · 4 pts
SeverityFileLineSnippetContext
MEDIUM⚡docker-compose-whisper.yml5# Runs an OpenAI-compatible Whisper server so you can use the roomCOMMENT
Structural Annotation Overuse3 hits · 4 pts
SeverityFileLineSnippetContext
LOWwebhook/README.md7### Step 1: Enable WebhooksCOMMENT
LOWwebhook/README.md20### Step 2: Run the Webhook ServerCOMMENT
LOWwebhook/README.md36### Step 3: Webhook EventsCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMapp/src/lib/whisper.js13// Stored normalized (lowercase, no spaces/punctuation) for robust matching.COMMENT