AI Slop Code Risk Monitor

unovue/reka-ui

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

An open-source UI component library for building high-quality, accessible design systems and web apps for Vue. Previously Radix Vue

0.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for unovue/reka-ui, a Vue project with 6,918 GitHub stars. SynthScan examined 231,912 lines of code across 2102 source files, recording 155 pattern matches distributed across 4 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-11-01
Last Push
6.9K
Stars
Vue
Language
231.9K
Lines of Code
2.1K
Files
155
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 1.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 1.4/100 · LOW

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

Agent Over-Engineering Ratio 2.2/100 · LOW

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

PR Review Velocity Impact 3.9/100 · LOW

Which changes need focused human review? 155 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 15LOW 140

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 155 distinct pattern matches across 4 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 Data65 hits · 65 pts
SeverityFileLineSnippetContext
LOWdocs/content/meta/EditableRoot.md76 'name': 'placeholder',CODE
LOWdocs/content/meta/RangeCalendarRoot.md153 'name': 'placeholder',CODE
LOWdocs/content/meta/DateFieldRoot.md104 'name': 'placeholder',CODE
LOWdocs/content/meta/TimeFieldRoot.md98 'name': 'placeholder',CODE
LOWdocs/content/meta/MonthPickerRoot.md106 'name': 'placeholder',CODE
LOWdocs/content/meta/MonthRangePickerRoot.md119 'name': 'placeholder',CODE
LOWdocs/content/meta/DateRangePickerRoot.md171 'name': 'placeholder',CODE
LOWdocs/content/meta/YearPickerRoot.md106 'name': 'placeholder',CODE
LOWdocs/content/meta/TagsInputInput.md31 'name': 'placeholder',CODE
LOWdocs/content/meta/DateRangeFieldRoot.md104 'name': 'placeholder',CODE
LOWdocs/content/meta/TimeRangeFieldRoot.md104 'name': 'placeholder',CODE
LOWdocs/content/meta/YearRangePickerRoot.md119 'name': 'placeholder',CODE
LOWdocs/content/meta/DatePickerRoot.md145 'name': 'placeholder',CODE
LOWdocs/content/meta/ColorFieldRoot.md71 'name': 'placeholder',CODE
LOWdocs/content/meta/PinInputRoot.md67 'name': 'placeholder',CODE
LOWdocs/content/meta/SelectValue.md19 'name': 'placeholder',CODE
LOWdocs/content/meta/CalendarRoot.md134 'name': 'placeholder',CODE
LOW…/components/examples/DatePickerViewSwitching/index.vue113 v-model:placeholder="placeholder"CODE
LOW…/components/examples/DatePickerViewSwitching/index.vue202 v-model:placeholder="placeholder"CODE
LOW…/components/examples/DatePickerViewSwitching/index.vue274 v-model:placeholder="placeholder"CODE
LOWdocs/components/examples/DialogGestureDriven/index.vue117 Lorem ipsum dolor sit amet, consectetur adipiscing elit.CODE
LOWdocs/components/examples/DialogGestureDriven/index.vue117 Lorem ipsum dolor sit amet, consectetur adipiscing elit.CODE
LOWdocs/components/examples/DateRangePresets/index.vue75 v-model:placeholder="placeholder"CODE
LOWpackages/core/src/NavigationMenu/story/_StoryFrame.vue16 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam purusCODE
LOWpackages/core/src/NavigationMenu/story/_StoryFrame.vue16 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam purusCODE
LOW…kages/core/src/YearRangePicker/YearRangePickerRoot.vue196const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOW…kages/core/src/YearRangePicker/YearRangePickerRoot.vue385 :date="placeholder"CODE
LOWpackages/core/src/TimeField/TimeFieldRoot.vue172const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/Calendar/CalendarRoot.vue201const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/Calendar/CalendarRoot.vue356 :date="placeholder"CODE
LOW…ages/core/src/Calendar/story/CalendarPopover.story.vue29 v-model:placeholder="placeholder"CODE
LOW…es/core/src/Calendar/story/CalendarChromatic.story.vue36 :default-placeholder="placeholder"CODE
LOW…es/core/src/Calendar/story/CalendarChromatic.story.vue42 v-model:placeholder="placeholder"CODE
LOWpackages/core/src/TimeRangeField/TimeRangeFieldRoot.vue268const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/DatePicker/DatePickerRoot.vue132const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/DateRangeField/DateRangeFieldRoot.vue152const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/TagsInput/TagsInputInput.vue179 :placeholder="placeholder"CODE
LOWpackages/core/src/YearPicker/YearPickerRoot.vue163const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/YearPicker/YearPickerRoot.vue302 :date="placeholder"CODE
LOWpackages/core/src/ScrollArea/story/_ScrollAreaCopy.vue3 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sit amet erosCODE
LOWpackages/core/src/ScrollArea/story/_ScrollAreaCopy.vue3 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sit amet erosCODE
LOWpackages/core/src/ColorField/ColorField.test.ts146 expect(input.attributes('placeholder')).toBe('Enter color')CODE
LOWpackages/core/src/ColorField/story/_ColorField.vue29 :placeholder="placeholder"CODE
LOWpackages/core/src/RangeCalendar/RangeCalendar.test.ts336 :placeholder="placeholder"CODE
LOWpackages/core/src/RangeCalendar/RangeCalendarRoot.vue257const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/RangeCalendar/RangeCalendarRoot.vue483 :date="placeholder"CODE
LOW…c/RangeCalendar/story/RangeCalendarChromatic.story.vue37 :default-placeholder="placeholder"CODE
LOW…c/RangeCalendar/story/RangeCalendarChromatic.story.vue42 <RangeCalendar v-model:placeholder="placeholder" />CODE
LOW…src/RangeCalendar/story/RangeCalendarPopover.story.vue25 v-model:placeholder="placeholder"CODE
LOW…ges/core/src/Popover/story/PopoverForceMount.story.vue47 defaultValue="Lorem ipsum dolor sit amet consectetur adipisicing elit.CODE
LOW…ges/core/src/Popover/story/PopoverForceMount.story.vue47 defaultValue="Lorem ipsum dolor sit amet consectetur adipisicing elit.CODE
LOW…kages/core/src/Popover/story/PopoverModality.story.vue46 defaultValue="Lorem ipsum dolor sit amet consectetur adipisicing elit.CODE
LOW…kages/core/src/Popover/story/PopoverModality.story.vue46 defaultValue="Lorem ipsum dolor sit amet consectetur adipisicing elit.CODE
LOW…kages/core/src/Popover/story/PopoverModality.story.vue80 defaultValue="Lorem ipsum dolor sit amet consectetur adipisicing elit.CODE
LOW…kages/core/src/Popover/story/PopoverModality.story.vue80 defaultValue="Lorem ipsum dolor sit amet consectetur adipisicing elit.CODE
LOW…kages/core/src/DateRangePicker/DateRangePickerRoot.vue145const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/DateField/DateFieldRoot.vue159const placeholder = useVModel(props, 'placeholder', emits, {CODE
LOWpackages/core/src/Editable/EditableInput.vue58 :placeholder="placeholder"CODE
LOWpackages/core/src/Editable/Editable.test.ts170 await userEvent.type(input, 'lorem ipsum dolor sit amet')CODE
LOWpackages/core/src/Editable/Editable.test.ts170 await userEvent.type(input, 'lorem ipsum dolor sit amet')CODE
5 more matches not shown…
Hyper-Verbose Identifiers60 hits · 60 pts
SeverityFileLineSnippetContext
LOWdocs/scripts/autogen.ts234function getEventFromComponentPath(dir: string) {CODE
LOWpackages/core/scripts/postbuild.ts4function removeContentsFromSourceMaps(path = new URL('../dist/', import.meta.url)) {CODE
LOW…ages/core/src/NavigationMenu/NavigationMenuTrigger.vue134function handleVisuallyHiddenFocus(ev: FocusEvent) {CODE
LOWpackages/core/src/Tree/story/TreeVirtual.story.vue6function groupCountriesByFirstLetter(countries: string[]) {CODE
LOWpackages/core/src/Popper/utils.ts70export function getSideAndAlignFromPlacement(placement: Placement) {CODE
LOWpackages/core/src/Drawer/utils.ts23export function createNestedSwipeProgressStore(): NestedSwipeProgressStore & {CODE
LOWpackages/core/src/Drawer/utils.ts81export function computeSwipeReleaseScalar(params: {CODE
LOWpackages/core/src/Drawer/utils.ts178export function registerDrawerCssProperties() {CODE
LOWpackages/core/src/Drawer/DrawerContent.vue59function onInteractOutsideNonModal(e: any) {CODE
LOWpackages/core/src/Drawer/DrawerContentImpl.vue291function clearOpenCompleteListener() {CODE
LOW…ore/src/Drawer/composables/useDrawerVirtualKeyboard.ts82export function resolveKeyboardInputTarget(target: EventTarget | null): HTMLElement | null {CODE
LOW…ore/src/Drawer/composables/useDrawerVirtualKeyboard.ts93function resolveKeyboardTouchTarget(target: EventTarget | null): KeyboardTouchTarget | null {CODE
LOW…ore/src/Drawer/composables/useDrawerVirtualKeyboard.ts108function resolveKeyboardTouchTargetFromPoint(CODE
LOW…ore/src/Drawer/composables/useDrawerVirtualKeyboard.ts165function overrideGeometryDuringFocus(target: HTMLElement, translateY: number): () => void {CODE
LOW…ore/src/Drawer/composables/useDrawerVirtualKeyboard.ts183function focusKeyboardInputWithoutPageScroll(target: HTMLElement) {CODE
LOWpackages/core/src/PinInput/PinInputInput.vue236function removeTrailingEmptyStrings(input: PinInputContextValue<typeof context.type.value>) {CODE
LOWpackages/core/src/DismissableLayer/utils.ts101 function handleAndDispatchPointerDownOutsideEvent() {CODE
LOWpackages/core/src/DismissableLayer/utils.ts101 function handleAndDispatchPointerDownOutsideEvent() {CODE
LOWpackages/core/src/Toast/utils.ts20export function handleAndDispatchCustomEvent<CODE
LOWpackages/core/src/Toast/ToastViewport.vue184function getSortedTabbableCandidates({ tabbingDirection }: { tabbingDirection: 'forwards' | 'backwards' }) {CODE
LOWpackages/core/src/Splitter/SplitterGroup.vue174function getPanelConstraintsInPercent(groupSizeOverride?: number | null) {CODE
LOWpackages/core/src/Splitter/SplitterGroup.vue183function getPanelDataWithPercentConstraints(groupSizeOverride?: number | null) {CODE
LOWpackages/core/src/Splitter/SplitterGroup.vue198function convertLayoutToNativeUnits(internalLayout: number[]): number[] {CODE
LOWpackages/core/src/Splitter/SplitterGroup.vue591function reevaluatePanelConstraints(panelData: PanelData, prevConstraints: PanelConstraints) {CODE
LOWpackages/core/src/Splitter/utils/dom.ts65export function getResizeHandleElementIndex(CODE
LOWpackages/core/src/Splitter/utils/dom.ts79export function getResizeHandleElementsForGroup(CODE
LOWpackages/core/src/Splitter/utils/storage.ts70function loadSerializedPanelGroupState(CODE
LOWpackages/core/src/Splitter/utils/events.ts15export function getResizeEventCoordinates(event: ResizeEvent) {CODE
LOWpackages/core/src/Splitter/utils/events.ts38export function getResizeEventCursorPosition(CODE
LOWpackages/core/src/Splitter/utils/registry.ts168function recalculateIntersectingHandles({CODE
LOWpackages/core/src/Splitter/utils/registry.ts251export function reportConstraintsViolation(CODE
LOWpackages/core/src/Splitter/utils/registry.ts345function updateResizeHandlerStates(CODE
LOWpackages/core/src/Splitter/utils/calculate.ts7export function calculateDragOffsetPercentage(CODE
LOWpackages/core/src/Splitter/utils/calculate.ts138export function calculateUnsafeDefaultLayout({CODE
LOWpackages/core/src/Splitter/utils/units.ts29export function convertPanelConstraintsToPercent({CODE
LOWpackages/core/src/Splitter/utils/units.ts90export function recalculateLayoutForPixelPanels({CODE
LOW…plitter/utils/composables/useWindowSplitterBehavior.ts9export function useWindowSplitterResizeHandlerBehavior({CODE
LOW…ils/composables/useWindowSplitterPanelGroupBehavior.ts13export function useWindowSplitterPanelGroupBehavior({CODE
LOW…ckages/core/src/shared/handleAndDispatchCustomEvent.ts1export function handleAndDispatchCustomEvent<CODE
LOWpackages/core/src/shared/color/gradient.ts121function getChannelGradientForArea(CODE
LOWpackages/core/src/shared/date/useDateField.ts302 function minuteSecondIncrementation({ e, part, dateRef, prevValue }: MinuteSecondIncrementProps): number {CODE
LOWpackages/core/src/shared/date/useDateField.ts328 function dateTimeValueIncrementation({ e, part, dateRef, prevValue }: DateTimeValueIncrementation): number {CODE
LOWpackages/core/src/shared/date/useDateField.ts672 function handleMonthSegmentKeydown(e: KeyboardEvent) {CODE
LOWpackages/core/src/shared/date/useDateField.ts791 function handleMinuteSegmentKeydown(e: KeyboardEvent) {CODE
LOWpackages/core/src/shared/date/useDateField.ts820 function handleSecondSegmentKeydown(e: KeyboardEvent) {CODE
LOWpackages/core/src/shared/date/useDateField.ts848 function handleDayPeriodSegmentKeydown(e: KeyboardEvent) {CODE
LOWpackages/core/src/shared/date/useDateField.ts968 function handleSegmentCompositionStart(e: CompositionEvent) {CODE
LOWpackages/core/src/shared/date/useDateField.ts973 function handleSegmentCompositionEnd(e: CompositionEvent) {CODE
LOWpackages/core/src/shared/date/segment.ts42export function getTimeFieldSegmentElements(parentElement: HTMLElement): Element[] {CODE
LOWpackages/core/src/shared/date/utils.ts56export function handleCalendarInitialFocus(calendar: HTMLElement) {CODE
LOWpackages/core/src/shared/date/parser.ts45export function initializeTimeSegmentValues(granularity: 'hour' | 'minute' | 'second'): SegmentValueObj {CODE
LOWpackages/core/src/ScrollArea/utils.ts33export function addUnlinkedScrollListener(CODE
LOWpackages/core/src/ScrollArea/utils.ts77export function getScrollPositionFromPointer(CODE
LOWpackages/core/src/ScrollArea/utils.ts100export function isScrollingWithinScrollbarBounds(CODE
LOW…ges/core/src/Combobox/useComboboxContentPositioning.ts5export function useComboboxContentPositioning(CODE
LOWpackages/core/src/Combobox/ComboboxContentImpl.vue124function isEventTargetWithinCombobox(target: EventTarget | null) {CODE
LOWpackages/core/src/Combobox/Combobox.test.ts1302 async function mountVirtualPopperCombobox() {CODE
LOWpackages/core/src/Dialog/Dialog.test.ts38function renderAndClickDialogTrigger(Dialog: any) {CODE
LOWpackages/core/src/DateField/DateField.test.ts50function zonedDateTimeInForeignZone() {CODE
LOWpackages/core/src/Select/SelectContent.vue49function clearRenderPresenceTimeout() {CODE
Decorative Section Separators15 hits · 45 pts
SeverityFileLineSnippetContext
MEDIUMpackages/core/src/shared/color/gradient.test.ts5// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts7// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts89// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts91// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts182 // ─────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts184 // ─────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts246 // ─────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/shared/color/gradient.test.ts248 // ─────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts13// ─── Helpers ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts35// ─── Accessibility ────────────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts78// ─── Pointer interaction ─────────────────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts135// ─── HSL Saturation(x) / Lightness(y) ────────────────────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts351// ─── HSL Hue(x) / Saturation(y) — default channels ───────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts404// ─── HSB Saturation(x) / Brightness(y) ───────────────────────────────────────COMMENT
MEDIUMpackages/core/src/ColorArea/ColorArea.test.ts479// ─── RGB Red(x) / Green(y) ────────────────────────────────────────────────────COMMENT
Over-Commented Block15 hits · 15 pts
SeverityFileLineSnippetContext
LOWplayground/vue3/src/vite-env.d.ts1/// <reference types="vite/client" />COMMENT
LOWdocs/scripts/autogen.ts21const checkerOptions: MetaCheckerOptions = {COMMENT
LOWpackages/core/src/Drawer/DrawerContentImpl.vue181 const dir = rootContext.swipeDirection.valueCOMMENT
LOWpackages/core/src/DismissableLayer/DismissableLayer.vue181 // Remove this layer from the set and release its share of the body'sCOMMENT
LOWpackages/core/src/Checkbox/CheckboxRoot.vue101COMMENT
LOWpackages/core/src/Splitter/utils/layout.ts41 assert(secondPivotIndex != null)COMMENT
LOWpackages/core/src/Splitter/utils/registry.ts201 // We listen for pointers events at the root in order to support hit area marginsCOMMENT
LOWpackages/core/src/shared/useGraceArea.test.ts1import type { Ref } from 'vue'COMMENT
LOWpackages/core/src/shared/useComposing.ts21 // processed. Android soft keyboards (Gboard, Samsung Keyboard, …) keep theCOMMENT
LOWpackages/core/src/shared/date/useDateField.ts941 if (Object.values(props.segmentValues.value).every(item => item !== null)) {COMMENT
LOWpackages/core/src/Combobox/Combobox.test.ts321 it('should render the icon', () => {COMMENT
LOWpackages/core/src/Combobox/Combobox.test.ts341 // it('should filter with the searchTerm (Bl', async () => {COMMENT
LOWpackages/core/src/FocusScope/FocusScope.vue121 // 2. In Google Chrome, when the focused element is removed from the DOM.COMMENT
LOWpackages/core/src/FocusScope/FocusScope.vue161 // is only tracked while the scope is not paused, so an open popper (which pausesCOMMENT
LOW.github/workflows/claude.yml41 actions: readCOMMENT