Your codebase has issues. 9 of them cost nothing to fix.
Truemend analyzed 5,550 files and 14,718 functions. 51,724 quality issues found; <1% can be fixed automatically at zero cost.
Contents
What this report contains
Jump to a section, or print the whole document.
Health Score on the cover is the mechanical composite /100. Subjective quality lives on its own page when a review ran.
Executive Overview
Code Quality Assessment: Grove
Truemend performed an automated code quality audit of 5,550 source files containing 14,718 functions across 947,595 lines of code. This report summarizes the findings and quantifies the engineering effort required to address them.
Issue severity
Fix type
Industry Benchmark
This project versus the industry
The health score on the cover is mechanical. These marks show where that score sits relative to published industry averages, not a second scoring system.
Financial Impact
Cost of Inaction vs Remediation
Technical debt compounds. Industry research shows unaddressed code quality issues grow at approximately 23% annually as surrounding code adapts to work around problems, making them progressively harder to resolve.
Remediation cost trajectory
Remediation Effort
Engineering time and fix mix
Manual remediation is priced at the full effort. Truemend keeps only the hours that still need a person: cataloged procedures and structural rewrites.
Engineering time: manual vs Truemend
Remediation by fix type
9 deterministic fixes. Automated AST transforms applied instantly at zero cost.
46,430 cataloged refactors. Constrained procedures: 5 minutes each vs 90 minutes manually.
4,663 structural rewrites. These require human architectural judgment and stay flagged for review.
Return on Investment
Truemend ROI Analysis
The following breakdown compares the engineering cost of manual remediation against Truemend-assisted remediation for each fix category. Waiting does not freeze the bill: the same debt costs more as surrounding code adapts around it.
Cost if you wait
Fixing now costs $674,227. Waiting 12 months raises that to $829,299 (+$155,072) before Truemend has still not run.
What waiting adds
| Fix Type | Count | Manual (per fix) | Truemend (per fix) | Manual Total | Truemend Total | Savings |
|---|---|---|---|---|---|---|
| Deterministic | 9 | 0 min | 0 min | 0 hrs | 0 hrs | 0 hrs |
| Cataloged Refactor | 46,430 | 3 min | 0 min | 2598 hrs | 144 hrs | 2453 hrs |
| Structural Rewrite | 4,663 | 3 min | 3 min | 249 hrs | 249 hrs | 0 hrs |
| Total | 51,102 | 2847 hrs | 393 hrs | 2453 hrs | ||
Cover issue count (51,724) includes findings not classified into a fix tier. This table totals 51,102.
Methodology
Assessment methodology
Every Truemend audit follows a standardized, reproducible process. Findings are generated by deterministic AST analysis, regex line-scan, and semantic Python analysis, not opinion.
Analysis Engine
4,672 anti-patterns across 149 spec files using ast-grep (Rust AST), regex line-scan, and semantic Python analysis. 26 language grammars.
Mechanical health score (0-100) computed from anti-pattern density, severity weights, and function-level metrics. Optional LLM-powered subjective review across 40 dimensions with blind review mode.
Three-tier fix classification ensures every finding has a clear, cost-appropriate remediation path.
8 project-level detectors: naming consistency, flat directories, orphaned files, dead code blocks, single-use abstractions, signature variance, passthrough files, duplicate clusters.
13-check assessment with PASS/FAIL/WARN verdicts and blocker identification.
Per-author attribution from git history: commits, debt introduced/fixed, test discipline, commit message quality.
Each finding priced from its pattern fix-time estimate at the audit rate and overhead shown under Financial Impact, calibrated with measured fix times.
Quality Dimensions
Fix Classification
This report was prepared exclusively for Grove in connection with the Grove engagement. It contains proprietary analysis and recommendations. Distribution, reproduction, or disclosure to third parties without written authorization is prohibited.
Security Assessment
Security Posture
Security posture aggregates findings from anti-pattern detection, semantic boundary analysis, configuration scanning, and subjective dimension scoring. Findings include hardcoded secrets, XSS vectors, CSRF vulnerabilities, unvalidated input, and authorization gaps.
Security Assessment
Security Findings (continued 8–17 of 33 patterns)
Security Assessment
Security Findings (continued 18–27 of 33 patterns)
Security Assessment
Security Findings (continued 28–33 of 33 patterns)
Production Readiness
Production Readiness Verdict
Assesses whether the codebase is ready for production deployment across 13 checks spanning security, testing, code quality, and structural health.
| Status | Check | Details | Blocker |
|---|---|---|---|
| FAIL | Critical findings | 148 critical-severity anti-patterns detected (fail at 1) | Yes |
| FAIL | High-severity findings | 2053 high-severity findings (warn at 1, fail above 10) | Yes |
| FAIL | Test coverage | 0 test files — no test coverage (fail at 0 files, warn below 50%) | Yes |
| FAIL | Security issues | 262 critical, 737 high security findings (fail at 1) | Yes |
| FAIL | Hardcoded secrets | 32 hardcoded secrets detected (fail at 1) | Yes |
| WARN | Health score | Health score 78.1 (fail below 60, warn below 80) | No |
| WARN | Orphaned files | 747 orphaned files (123,313 lines), 13.5% of files (warn above 5%) | No |
| WARN | Dead code blocks | 1563 dead code blocks (14,044 lines), 1.65/KLOC (warn above 1.5/KLOC) | No |
| WARN | Duplicate clusters | 4169 duplicate clusters (14518 copies), 25.2% of lines duplicated (warn above 10%) | No |
| WARN | Function length violations | 670 functions over 50 lines (warn above 50 such functions) | No |
| WARN | Debug artifacts | 1876 debug print statements (warn at 1) | No |
| PASS | Empty catch blocks | No empty catch blocks (warn at 1, fail above 5) | Yes |
| PASS | Unused imports | 30 unused imports, 0.03/KLOC (warn above 0.1/KLOC) | No |
Dead Exports
308 Unused Exports Detected
Dead exports are symbols (functions, classes, constants) that are defined and exported but never imported or called within the codebase. Removing them reduces bundle size, decreases cognitive load, and eliminates potential attack surface.
| File | Symbol | Line | Severity | Description |
|---|---|---|---|---|
| file-3072.py | Handler | 9 | MEDIUM | Public symbol 'Handler' is defined but never imported by any other file in the project |
| file-1920.py | sentences | 81 | MEDIUM | Public symbol 'sentences' is defined but never imported by any other file in the project |
| file-1920.py | canon_hits | 85 | MEDIUM | Public symbol 'canon_hits' is defined but never imported by any other file in the project |
| file-1920.py | classify | 108 | MEDIUM | Public symbol 'classify' is defined but never imported by any other file in the project |
| file-1900.py | say | 63 | MEDIUM | Public symbol 'say' is defined but never imported by any other file in the project |
| file-1900.py | section | 67 | MEDIUM | Public symbol 'section' is defined but never imported by any other file in the project |
| file-1900.py | find_tsx_files | 75 | MEDIUM | Public symbol 'find_tsx_files' is defined but never imported by any other file in the project |
| file-1900.py | is_violation | 91 | MEDIUM | Public symbol 'is_violation' is defined but never imported by any other file in the project |
| file-1900.py | check_safe_area_imports | 104 | MEDIUM | Public symbol 'check_safe_area_imports' is defined but never imported by any other file in the project |
| file-1989.py | luminance | 17 | MEDIUM | Public symbol 'luminance' is defined but never imported by any other file in the project |
| file-1989.py | contrast | 23 | MEDIUM | Public symbol 'contrast' is defined but never imported by any other file in the project |
| file-1989.py | Pair | 29 | MEDIUM | Public symbol 'Pair' is defined but never imported by any other file in the project |
| file-1989.py | grade | 199 | MEDIUM | Public symbol 'grade' is defined but never imported by any other file in the project |
| file-1989.py | report | 208 | MEDIUM | Public symbol 'report' is defined but never imported by any other file in the project |
| file-1714.py | parse_allow | 125 | MEDIUM | Public symbol 'parse_allow' is defined but never imported by any other file in the project |
| file-2093.py | impersonate | 28 | MEDIUM | Public symbol 'impersonate' is defined but never imported by any other file in the project |
| file-2093.py | insert_new_key | 36 | MEDIUM | Public symbol 'insert_new_key' is defined but never imported by any other file in the project |
| file-2093.py | pick_stranded_and_other | 54 | MEDIUM | Public symbol 'pick_stranded_and_other' is defined but never imported by any other file in the project |
| file-2232.py | env_value | 65 | MEDIUM | Public symbol 'env_value' is defined but never imported by any other file in the project |
| file-2232.py | new_media_path | 83 | MEDIUM | Public symbol 'new_media_path' is defined but never imported by any other file in the project |
| file-2232.py | move_storage_object | 89 | MEDIUM | Public symbol 'move_storage_object' is defined but never imported by any other file in the project |
| file-2232.py | fix_media_paths | 107 | MEDIUM | Public symbol 'fix_media_paths' is defined but never imported by any other file in the project |
| file-2232.py | fix_observation_hours | 151 | MEDIUM | Public symbol 'fix_observation_hours' is defined but never imported by any other file in the project |
| file-2246.py | query | 28 | MEDIUM | Public symbol 'query' is defined but never imported by any other file in the project |
| file-2364.py | as_user | 34 | MEDIUM | Public symbol 'as_user' is defined but never imported by any other file in the project |
| file-2364.py | expect_error | 42 | MEDIUM | Public symbol 'expect_error' is defined but never imported by any other file in the project |
| file-2392.py | try_insert | 21 | MEDIUM | Public symbol 'try_insert' is defined but never imported by any other file in the project |
| file-2393.py | impersonate | 27 | MEDIUM | Public symbol 'impersonate' is defined but never imported by any other file in the project |
| file-2393.py | stop_impersonating | 35 | MEDIUM | Public symbol 'stop_impersonating' is defined but never imported by any other file in the project |
| file-2393.py | attempt | 39 | MEDIUM | Public symbol 'attempt' is defined but never imported by any other file in the project |
Test Health
Test Coverage Analysis
Truemend estimates test coverage by matching public function definitions against test file references (no coverage report was found; pass --coverage to measure it). Functions with higher cyclomatic complexity are prioritized as the highest-value test targets.
Coverage vs Industry
Highest-Priority Test Gaps
Ranked by cyclomatic complexity — complex untested functions carry the most risk.
| File | Function | Complexity | Line | Source |
|---|---|---|---|---|
| file-3210.py | run | 65 | 15 | inferred |
| file-3212.py | run | 54 | 11 | inferred |
| file-2056.py | check_unreferenced_routes | 41 | 209 | inferred |
| file-3240.py | main | 34 | 412 | inferred |
| file-2056.py | check_orphan_routes | 34 | 332 | inferred |
| file-3093.py | main | 33 | 77 | inferred |
| file-3240.py | apply | 29 | 272 | inferred |
| file-1920.py | classify | 27 | 108 | inferred |
| file-2233.py | transform_file | 25 | 175 | inferred |
| file-3094.py | main | 22 | 35 | inferred |
| file-3240.py | split_statements | 20 | 74 | inferred |
| file-3215.py | run | 19 | 17 | inferred |
| file-3825.py | main | 19 | 97 | inferred |
| file-2418.py | main | 18 | 73 | inferred |
| file-3213.py | run | 17 | 24 | inferred |
Migration Health
353 Stale Migration Findings
Stale migrations are signs of incomplete refactorings: mixed dir-336/file-2631 API usage, migration-related TODO comments, deprecated file naming, and dual dependencies in package configs. Each indicates work that was started but not finished, accumulating confusion and technical debt.
mixed-logging (190)mixed-async-patterns (152)deprecated-file-naming (9)mixed-react-components (2)
| Severity | Pattern | Description | Files |
|---|---|---|---|
| MEDIUM | mixed-async-patterns | Mixed async patterns: both callbacks and async/await in the same codebase | 147 |
| _layout.tsx file-2154.tsx file-2935.tsx file-1688.tsx file-2064.ts file-2998.ts file-1676.test.tsx file-2581.ts file-1019.test.tsx file-798.test.tsx file-1514.test.ts file-1226.test.tsx file-1163.test.tsx file-1341.test.tsx file-885.test.tsx file-1788.test.ts file-3325.test.ts file-3653.test.ts file-3754.test.ts file-3686.test.tsx+ 127 more | |||
| MEDIUM | deprecated-file-naming | File 'file-012.jsx' uses deprecated/backup naming convention, suggesting | 9 |
| file-012.jsx file-3881.html file-010.jsx file-638.jsx file-008.jsx file-643.jsx file-3882.html file-3883.html file-640.jsx | |||
| MEDIUM | mixed-react-components | Mixed React patterns: both class components and hooks detected | 2 |
| file-2882.d.ts file-984.tsx | |||
| LOW | mixed-logging | Mixed logging: both print() and logging module used for output | 190 |
| file-2073.py file-1989.py file-1900.py file-2055.py file-2056.py file-3781.py file-2482.py file-1764.sh file-2233.py file-3874.py file-2054.py file-3248.py file-1920.py file-2991.py file-3273.py file-3819.py file-2398.py file-3816.py file-3204.py file-2246.py+ 170 more | |||
Structural Analysis
Structural Health
Structural analysis detects naming inconsistencies, flat directory sprawl, orphaned files, dead code, passthrough functions, and signature issues across the codebase. Scan completed in 34897ms.
By Category
| Category | Finding | File |
|---|---|---|
| Naming Issues | 2 files violate snake_case | . |
| Naming Issues | 5 files violate snake_case | ./app |
| Naming Issues | 2 files violate kebab-case | ./app/.maestro |
| Flat Directories | 647 files (threshold: 20) | ./dir-298/file-2563 |
| Flat Directories | 365 files (threshold: 20) | ./docs/file-3877 |
| Flat Directories | 299 files (threshold: 20) | ./app/src/hooks |
| Single-Use Modules | Only imported by app/file-3878 | app/jest.config.js |
| Single-Use Modules | Only imported by app/metro.config.js | app/file-2559.js |
| Single-Use Modules | Only imported by app/scripts/dir-164/file-3879 | app/scripts/dir-164/file-1831.ts |
| Orphaned Files | zero importers, not an entry point | app/app.config.ts |
| Orphaned Files | zero importers, not an entry point | app/app/(auth)/_layout.tsx |
| Orphaned Files | zero importers, not an entry point | app/app/(auth)/complete-profile.tsx |
Duplicates
Duplicate Function Clusters
Duplicate detection identifies functions with identical or near-identical logic across multiple files. Consolidating duplicates reduces maintenance burden and prevents divergent bug fixes.
| Function | Copies | Similarity | Found In |
|---|---|---|---|
| <block:34> | 721 | 100% | file-1769.test.tsx, file-3851.test.tsx, file-1931.test.tsx, file-2693.test.tsx +717 |
| <block:11> | 266 | 100% | file-1660.test.ts, file-1660.test.ts, file-1660.test.ts, file-1772.test.ts +262 |
| <block:109> | 179 | 100% | file-2082.ts, index.test.ts, index.test.ts, index.test.ts +175 |
| <block:145> | 171 | 100% | file-1457.test.tsx, file-2696.ts, file-1569.tsx, file-1137.tsx +167 |
| <block:347> | 105 | 100% | file-2769.tsx, file-2277.tsx, file-925.tsx, file-1041.tsx +101 |
| <block:11> | 94 | 100% | file-2080.css, file-2080.css, file-2080.css, file-2080.css +90 |
| <block:11> | 70 | 100% | file-009.jsx, file-010.jsx, file-011.jsx, file-012.jsx +66 |
| <block:52> | 70 | 100% | file-2120.tsx, index.tsx, file-1798.ts, file-893.tsx +66 |
| jsonResponse | 68 | 95% | file-1660.test.ts, file-1772.test.ts, file-2082.ts, file-2765.ts +64 |
| <block:50> | 62 | 100% | file-2979.ts, file-3070.ts, file-2046.ts, index.ts +58 |
| <block:13> | 62 | 100% | file-655.ts, file-694.ts, file-697.ts, file-730.ts +58 |
| <block:68> | 55 | 100% | file-3292.test.ts, file-3292.test.ts, file-3292.test.ts, file-3292.test.ts +51 |
| <block:22> | 54 | 100% | file-1712.py, file-1714.py, file-1734.py, file-2395.py +50 |
| <block:19> | 53 | 100% | file-153.sql, file-257.sql, file-296.sql, file-306.sql +49 |
| <block:33> | 46 | 100% | file-718.tsx, file-1171.tsx, file-1331.tsx, file-1413.tsx +42 |
| + 4154 more clusters (the largest 604 ship in the JSON export: truemend audit --format json) | |||
Subjective Review
Subjective Quality Dimensions
These scores are 0-100 readings of style, naming, error handling, design, and test strategy. They complement anti-pattern counts: a file can be mechanically clean and still hard to change. The cover reports one mechanical health score; this page is the qualitative half.
How the score is built
Needs attention
Holding up
Finding History
51724 Detector Findings Tracked, 0 Reopened
Truemend records every analysis run in an append-only ledger. Findings below have been observed across multiple runs; a reopened finding was fixed at some point and returned. Rows are one per (file, line, pattern) below, the same granularity as the total anti-pattern count elsewhere in this report — a single reopened line can still contribute more than one row if more than one rule fires on it. “At least Nx” means a run of unknown scope makes the true count uncertain — never inflated, only ever a floor.
| File | Line | Pattern | Runs | Reopened |
|---|---|---|---|---|
| file-3884.yaml | 1 | yaml-missing-document-start | 4 | never |
| file-3885.yaml | 1 | yaml-missing-document-start | 4 | never |
| file-2516.yaml | 1 | yaml-missing-document-start | 4 | never |
| file-3886.yaml | 1 | yaml-missing-document-start | 4 | never |
| file-3081.yaml | 1 | yaml-missing-document-start | 4 | never |
| App.tsx | 4 | rn-loading-no-error-boundary | 4 | never |
| App.tsx | 16 | rn-dark-hardcoded-colors | 4 | never |
| App.tsx | 4 | rn-dark-no-appearance-hook | 4 | never |
| App.tsx | 4 | react-default-export-inconsistency | 4 | never |
| file-3827.js | 37 | typescript-biome-no-useless-this-alias | 4 | never |
| file-1825.js | 21 | react-context-default-value-mismatch | 4 | never |
| file-2239.js | 2 | high-complexity | 4 | never |
| file-2160.js | 6 | rn-responsive-hardcoded-dimensions | 4 | never |
| file-2175.js | 13 | react-ux-effect-missing-deps | 4 | never |
| file-2878.js | 62 | typescript-eslint-ts-prefer-optional-chain | 4 | never |
| file-2884.js | 11 | rn-responsive-hardcoded-dimensions | 4 | never |
| file-2876.js | 89 | rn-responsive-hardcoded-dimensions | 4 | never |
| file-2876.js | 52 | typescript-unicorn-no-array-reduce | 4 | never |
| file-1769.test.tsx | 29 | test_mock_everything | 4 | never |
| file-1769.test.tsx | 35 | test_mock_everything | 4 | never |
| file-1769.test.tsx | 39 | test_mock_everything | 4 | never |
| file-1769.test.tsx | 48 | test_mock_everything | 4 | never |
| file-1769.test.tsx | 64 | test_no_aftereach_cleanup | 4 | never |
| file-1769.test.tsx | 75 | test_no_aftereach_cleanup | 4 | never |
| file-1769.test.tsx | 83 | test_no_aftereach_cleanup | 4 | never |
| file-1769.test.tsx | 91 | test_no_aftereach_cleanup | 4 | never |
| file-2534.test.tsx | 26 | test_no_aftereach_cleanup | 4 | never |
| file-2535.test.tsx | 94 | react-missing-user-event-tests | 4 | never |
| file-2535.test.tsx | 9 | test_mock_everything | 4 | never |
| file-2535.test.tsx | 14 | test_mock_everything | 4 | never |
Change Age
18265/51724 Findings Age-Resolved via Git Blame
Each finding's enclosing function is matched against git blame to determine when it last changed. “Unknown” means git blame could not resolve an age (no repo, uncommitted file, or unresolvable range) -- it is never a false claim of freshness.
| File | Line | Pattern | Changed Since |
|---|---|---|---|
| file-3884.yaml | 1 | yaml-missing-document-start | 2026-06-10T01:40:23+00:00 |
| file-3885.yaml | 1 | yaml-missing-document-start | 2026-04-15T18:35:45+00:00 |
| file-2516.yaml | 1 | yaml-missing-document-start | 2026-04-15T18:35:45+00:00 |
| file-3886.yaml | 1 | yaml-missing-document-start | 2026-06-10T11:39:09+00:00 |
| file-3081.yaml | 1 | yaml-missing-document-start | 2026-04-15T18:35:45+00:00 |
| App.tsx | 4 | rn-loading-no-error-boundary | unknown |
| App.tsx | 16 | rn-dark-hardcoded-colors | unknown |
| App.tsx | 4 | rn-dark-no-appearance-hook | unknown |
| App.tsx | 4 | react-default-export-inconsistency | unknown |
| file-3827.js | 37 | typescript-biome-no-useless-this-alias | unknown |
| file-1825.js | 21 | react-context-default-value-mismatch | unknown |
| file-2239.js | 2 | high-complexity | 2026-05-06T19:26:55+00:00 |
| file-2160.js | 6 | rn-responsive-hardcoded-dimensions | unknown |
| file-2175.js | 13 | react-ux-effect-missing-deps | unknown |
| file-2878.js | 62 | typescript-eslint-ts-prefer-optional-chain | unknown |
| file-2884.js | 11 | rn-responsive-hardcoded-dimensions | unknown |
| file-2876.js | 89 | rn-responsive-hardcoded-dimensions | unknown |
| file-2876.js | 52 | typescript-unicorn-no-array-reduce | unknown |
| file-1769.test.tsx | 29 | test_mock_everything | unknown |
| file-1769.test.tsx | 35 | test_mock_everything | unknown |
| file-1769.test.tsx | 39 | test_mock_everything | unknown |
| file-1769.test.tsx | 48 | test_mock_everything | unknown |
| file-1769.test.tsx | 64 | test_no_aftereach_cleanup | unknown |
| file-1769.test.tsx | 75 | test_no_aftereach_cleanup | unknown |
| file-1769.test.tsx | 83 | test_no_aftereach_cleanup | unknown |
| file-1769.test.tsx | 91 | test_no_aftereach_cleanup | unknown |
| file-2534.test.tsx | 26 | test_no_aftereach_cleanup | unknown |
| file-2535.test.tsx | 94 | react-missing-user-event-tests | unknown |
| file-2535.test.tsx | 9 | test_mock_everything | unknown |
| file-2535.test.tsx | 14 | test_mock_everything | unknown |
Executive Summary
51,724 anti-patterns in 4125 of 5,550 files analyzed, 9 fixable at zero cost.
Truemend analyzed 5,550 source files containing 14,718 functions. <1% of findings (9) are deterministic fixes the engine applies automatically, each verified by a re-parse.
Severity Distribution
Fix Type Distribution
of issues fixable at $0 cost. 9 deterministic fixes, zero risk.
Worst Files by Anti-Pattern Density
Detailed Findings
51,724 anti-patterns in 4125 of 5,550 files analyzed
Each row is one pattern in one file, collapsed across functions. Open Finding Details for evidence, recommended fix, and the files this finding can reach.
By severity
By fix type
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 315 | INFO | STR | 49–1214 |
Inline style object literal creates new reference every render react-inline-style-object | 86 | INFO | CAT | 67–1216 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 16 | INFO | CAT | 48–934 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 16 | INFO | CAT | 49–935 |
label element must have associated input control react-a11y-label-has-assoc | 12 | INFO | CAT | 164–946 |
Form input using defaultValue instead of value + onChange - form data cannot be validated or controlled programmatically react-uncontrolled-input | 10 | INFO | CAT | 165–947 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 10 | INFO | CAT | 421–1062 |
Input without associated label — inaccessible to screen readers and autofill react-input-no-label | 4 | INFO | CAT | 165, 169, 175, 219 |
Form input without associated label — screen readers cannot identify purpose react-ux-form-no-label | 4 | INFO | CAT | 165, 169, 175, 219 |
Input without name attribute — form submission excludes the value react-ux-input-no-name | 4 | INFO | CAT | 165, 169, 175, 219 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 3 | INFO | CAT | 197, 767, 916 |
Cyclomatic complexity 14 > 10 high-complexity | 2 | INFO | CAT | 273, 417 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 2 | INFO | CAT | 442, 443 |
Non-loop variable with single-character name -- unclear intent slop-single-letter-variable | 1 | INFO | CAT | 421 |
<button> with no text content, aria-label, or aria-labelledby — inaccessible to screen readers ux-a11y-button-no-accessible-name | 1 | INFO | CAT | 197 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 315 | INFO | STR | 49–1211 |
Inline style object literal creates new reference every render react-inline-style-object | 86 | INFO | CAT | 67–1213 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 16 | INFO | CAT | 48–934 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 16 | INFO | CAT | 49–935 |
label element must have associated input control react-a11y-label-has-assoc | 12 | INFO | CAT | 164–946 |
Form input using defaultValue instead of value + onChange - form data cannot be validated or controlled programmatically react-uncontrolled-input | 10 | INFO | CAT | 165–947 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 10 | INFO | CAT | 421–1059 |
Input without associated label — inaccessible to screen readers and autofill react-input-no-label | 4 | INFO | CAT | 165, 169, 175, 219 |
Form input without associated label — screen readers cannot identify purpose react-ux-form-no-label | 4 | INFO | CAT | 165, 169, 175, 219 |
Input without name attribute — form submission excludes the value react-ux-input-no-name | 4 | INFO | CAT | 165, 169, 175, 219 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 3 | INFO | CAT | 197, 767, 916 |
Cyclomatic complexity 14 > 10 high-complexity | 2 | INFO | CAT | 273, 417 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 2 | INFO | CAT | 442, 443 |
Non-loop variable with single-character name -- unclear intent slop-single-letter-variable | 1 | INFO | CAT | 421 |
<button> with no text content, aria-label, or aria-labelledby — inaccessible to screen readers ux-a11y-button-no-accessible-name | 1 | INFO | CAT | 197 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Use double quotes for identifiers only when necessary sql-sqlfluff-L059-quoted-identifier | 392 | MEDIUM | CAT | 44–798 |
INSERT into GENERATED ALWAYS AS IDENTITY without OVERRIDE pg_identity_override | 4 | MEDIUM | CAT | 312, 492, 774, 787 |
CTE materialized unnecessarily pg_cte_materialized | 3 | MEDIUM | CAT | 42, 324, 501 |
Comma-separated tables instead of JOIN sql_implicit_join | 3 | MEDIUM | CAT | 314, 494, 780 |
Scalar subquery in SELECT list executes once per row — use JOIN instead sql_subquery_in_select | 2 | MEDIUM | CAT | 34, 827 |
Function volatility mismatch — STABLE where IMMUTABLE possible pg_plpgsql_volatility_wrong | 1 | MEDIUM | CAT | 789 |
HAVING used without WHERE — filters after aggregation instead of before, less efficient sql_having_no_where | 1 | MEDIUM | CAT | 838 |
OR prevents single index use pg_or_no_index | 1 | INFO | CAT | 789 |
RAISE without DETAIL or ERRCODE pg_plpgsql_raise_no_detail | 1 | INFO | CAT | 821 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Use double quotes for identifiers only when necessary sql-sqlfluff-L059-quoted-identifier | 361 | MEDIUM | CAT | 39–731 |
INSERT into GENERATED ALWAYS AS IDENTITY without OVERRIDE pg_identity_override | 4 | MEDIUM | CAT | 291, 465, 707, 720 |
CTE materialized unnecessarily pg_cte_materialized | 3 | MEDIUM | CAT | 37, 303, 474 |
Comma-separated tables instead of JOIN sql_implicit_join | 3 | MEDIUM | CAT | 293, 467, 713 |
Scalar subquery in SELECT list executes once per row — use JOIN instead sql_subquery_in_select | 2 | MEDIUM | CAT | 29, 760 |
HAVING used without WHERE — filters after aggregation instead of before, less efficient sql_having_no_where | 1 | MEDIUM | CAT | 771 |
RAISE without DETAIL or ERRCODE pg_plpgsql_raise_no_detail | 1 | INFO | CAT | 754 |
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Use double quotes for identifiers only when necessary sql-sqlfluff-L059-quoted-identifier | 313 | MEDIUM | CAT | 20–570 |
INSERT into GENERATED ALWAYS AS IDENTITY without OVERRIDE pg_identity_override | 4 | MEDIUM | CAT | 192, 320, 580, 593 |
CTE materialized unnecessarily pg_cte_materialized | 3 | MEDIUM | CAT | 18, 206, 329 |
Comma-separated tables instead of JOIN sql_implicit_join | 3 | MEDIUM | CAT | 194, 322, 586 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Use double quotes for identifiers only when necessary sql-sqlfluff-L059-quoted-identifier | 295 | MEDIUM | CAT | 49–624 |
INSERT into GENERATED ALWAYS AS IDENTITY without OVERRIDE pg_identity_override | 4 | MEDIUM | CAT | 261, 399, 601, 614 |
CTE materialized unnecessarily pg_cte_materialized | 3 | MEDIUM | CAT | 47, 273, 408 |
Comma-separated tables instead of JOIN sql_implicit_join | 3 | MEDIUM | CAT | 263, 401, 607 |
Scalar subquery in SELECT list executes once per row — use JOIN instead sql_subquery_in_select | 2 | MEDIUM | CAT | 39, 653 |
HAVING used without WHERE — filters after aggregation instead of before, less efficient sql_having_no_where | 1 | MEDIUM | CAT | 664 |
RAISE without DETAIL or ERRCODE pg_plpgsql_raise_no_detail | 1 | INFO | CAT | 647 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 146 | INFO | CAT | 52–1074 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 74 | INFO | STR | 101–1105 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 18 | INFO | CAT | 54–529 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 9 | INFO | CAT | 94–1035 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 9 | INFO | CAT | 187–1057 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 7 | INFO | CAT | 186–1056 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–481 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 659, 968 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 1059, 1061 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 582 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1113 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 582 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 582 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Cyclomatic complexity 11 > 10 high-complexity | 1 | LOW | CAT | 532 |
Over-reliance on getByTestId when accessible queries available react-test-query-by-test-id | 126 | INFO | CAT | 614–2102 |
Test file with 5+ jest.mock/vi.mock calls — over-mocking hides integration bugs test_mock_everything | 52 | INFO | CAT | 9–517 |
Tests using fireEvent instead of userEvent - fireEvent doesn't simulate real user behavior (no focus, no selection, no event bubbling) react-missing-user-event-tests | 39 | INFO | CAT | 650–1819 |
jest.useFakeTimers without advanceTimersByTime or runAllTimers — timers never fire, async code hangs jest_timer_no_advance | 13 | INFO | CAT | 628–2048 |
Test that only checks toBeDefined()/toBeTruthy() — verifies existence but not correctness of value test_expect_tobedefined_only | 8 | INFO | CAT | 1040–1139 |
Test using shared mutable variable declared outside test blocks — test results depend on execution order test_order_dependent | 1 | INFO | CAT | 284 |
Use optional chaining instead of manual null checks typescript-eslint-ts-prefer-optional-chain | 1 | INFO | CAT | 497 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style object literal creates new reference every render react-inline-style-object | 124 | INFO | CAT | 52–969 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 57 | INFO | STR | 101–1000 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 15 | INFO | CAT | 54–440 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 8 | INFO | CAT | 94–930 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 7 | INFO | CAT | 187–952 |
CSS animation or transition without prefers-reduced-motion check — causes discomfort for vestibular disorder users react-ux-no-reduced-motion | 6 | INFO | CAT | 53–392 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 5 | INFO | CAT | 186, 232, 332, 356, 951 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 4 | INFO | CAT | 202, 226, 570, 863 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 3 | INFO | CAT | 45, 46, 110 |
Streamed AI response content rendered via dangerouslySetInnerHTML/v-html with no sanitizer nearby — model output is attacker-influenceable through prompt injection, so this is stored/reflected XSS via the AI response itself ai-ux-unsanitized-streamed-html | 2 | INFO | CAT | 954, 956 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 1 | INFO | CAT | 493 |
document.getElementById/querySelector used instead of useRef — bypasses React DOM react-useref-dom-not-cached | 1 | INFO | CAT | 1008 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 1 | INFO | CAT | 174 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | INFO | CAT | 493 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | INFO | CAT | 493 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
FK constraint not DEFERRABLE for bulk operations pg_no_deferrable | 32 | MEDIUM | CAT | 44–343 |
Missing CASCADE on foreign key delete pg_missing_cascade | 29 | MEDIUM | CAT | 44–343 |
Mutable default parameter value pg_plpgsql_mutable_default | 29 | MEDIUM | CAT | 34–352 |
Index-only scan not possible — reads table pages pg_covering_index_missing | 28 | MEDIUM | CAT | 53–325 |
All columns nullable — no integrity enforcement pg_nullable_everything | 22 | MEDIUM | CAT | 27–341 |
Missing NOT NULL on required columns pg_missing_not_null | 2 | MEDIUM | CAT | 255, 304 |
JSONB column without CHECK constraint pg_jsonb_no_check | 2 | MEDIUM | CAT | 33, 259 |
PL/pgSQL function without EXCEPTION handling pg_plpgsql_no_exception | 2 | MEDIUM | CAT | 16, 368 |
Use double quotes for identifiers only when necessary sql-sqlfluff-L059-quoted-identifier | 1 | MEDIUM | CAT | 9 |
Creating index that already exists pg_create_index_redundant | 30 | INFO | CAT | 53–325 |
Table missing created_at/updated_at columns pg_missing_timestamps | 22 | INFO | CAT | 27–341 |
CREATE TABLE without PRIMARY KEY pg_no_pk | 22 | INFO | CAT | 27–341 |
Polymorphic association via type column pg_polymorphic_assoc | 1 | INFO | STR | 257 |
TEXT column without length limit for bounded data pg_unbounded_text | 1 | INFO | CAT | 32 |
Missing UNIQUE constraint on logically unique column pg_missing_unique | 1 | INFO | CAT | 45 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
IN subquery instead of EXISTS pg_subquery_in | 99 | MEDIUM | CAT | 1–828 |
Use double quotes for identifiers only when necessary sql-sqlfluff-L059-quoted-identifier | 99 | MEDIUM | CAT | 95–824 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Touchable component missing accessibilityRole rn-a11y-touchable-missing-role | 5 | HIGH | CAT | 1096, 1198, 1227, 1247, 1431 |
Touchable/Pressable component missing accessible label rn-a11y-touchable-missing-label | 5 | HIGH | CAT | 1096, 1198, 1227, 1247, 1431 |
TouchableOpacity/Pressable without accessibilityLabel — invisible to screen readers (TalkBack/VoiceOver) rn-a11y-missing-accessibility-label | 5 | HIGH | CAT | 1096, 1198, 1227, 1247, 1431 |
Image component missing accessibilityLabel rn-a11y-image-missing-label | 1 | HIGH | CAT | 557 |
Inline style objects in JSX — creates new object reference every render, defeating shouldComponentUpdate rn-perf-inline-style-objects | 69 | MEDIUM | CAT | 498–1678 |
Cyclomatic complexity 26 > 10 high-complexity | 4 | MEDIUM | CAT | 256, 950, 1300, 1584 |
Function is 80 lines (> 50 dynamic threshold) function-too-long | 2 | MEDIUM | CAT | 950, 1584 |
Catch block that logs but does not re-throw or return an error — caller does not know the operation failed cq-catch-and-ignore | 1 | MEDIUM | CAT | 377 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 1 | MEDIUM | CAT | 261 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 1 | MEDIUM | CAT | 261 |
Array.reduce can be replaced with simpler methods typescript-unicorn-no-array-reduce | 1 | MEDIUM | CAT | 392 |
Inline style object literal creates new reference every render react-inline-style-object | 69 | INFO | CAT | 498–1678 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 10 | INFO | STR | 767–1265 |
Using 'type' for object shapes that should be interfaces, or 'interface' for unions - misaligned with TypeScript best practices ts-interface-type-confusion | 8 | INFO | CAT | 54–1290 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 4 | INFO | CAT | 321, 371, 1655, 1660 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 82 | INFO | STR | 131–532 |
Inline style object literal creates new reference every render react-inline-style-object | 67 | INFO | CAT | 28–537 |
Using div/span for navigation, header, footer, main content - screen readers cannot understand page structure react-semantic-html-missing | 8 | INFO | CAT | 94–499 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 8 | INFO | CAT | 7–394 |
label element must have associated input control react-a11y-label-has-assoc | 5 | INFO | CAT | 131, 309, 449, 457, 465 |
Using array index as key — breaks when items reorder or insert react-ux-array-index-key | 5 | INFO | CAT | 71, 420, 424, 439, 527 |
Using array index as the sole key or identifier in callbacks like .map() breaks when items are reordered, filtered, or inserted — the index does not stably identify the item js-array-index-as-key | 4 | INFO | CAT | 420, 424, 439, 526 |
<Text> without numberOfLines inside a constrained-height container — text can overflow invisibly ux-mobile-text-no-number-of-lines | 3 | INFO | CAT | 73, 74, 197 |
Form input using defaultValue instead of value + onChange - form data cannot be validated or controlled programmatically react-uncontrolled-input | 2 | INFO | CAT | 132, 310 |
Data table without caption or aria-label - screen reader users cannot understand the table's purpose react-table-missing-caption | 2 | INFO | CAT | 341, 515 |
Button without text or aria-label — screen readers cannot identify react-button-no-accessible-name | 2 | INFO | CAT | 273, 506 |
Cyclomatic complexity 11 > 10 high-complexity | 1 | INFO | CAT | 6 |
Hardcoded numeric literal used in logic — extract to a named constant for readability and maintainability cq-magic-number | 1 | INFO | CAT | 656 |
Detailed Findings
| Finding | Ct | Severity | Fix | Lines |
|---|---|---|---|---|
Inline style objects in JSX — creates new object reference every render, defeating shouldComponentUpdate rn-perf-inline-style-objects | 57 | MEDIUM | CAT | 95–970 |
Screen header text not marked with accessibilityRole header rn-a11y-header-missing-accessible | 5 | MEDIUM | CAT | 242, 578, 608, 673, 836 |
Cyclomatic complexity 16 > 10 high-complexity | 4 | MEDIUM | CAT | 469, 814, 914, 999 |
Function is 51 lines (> 50 dynamic threshold) function-too-long | 2 | MEDIUM | CAT | 469, 999 |
Touchable area smaller than 44x44 minimum accessibility guideline rn-a11y-small-touch-target | 2 | MEDIUM | MANUAL | 161, 162 |
useState + useEffect to derive state from other state — unnecessary re-render. Use useMemo instead react-ux-derived-state | 2 | MEDIUM | CAT | 1027, 1058 |
Effect missing dependencies — stale closures, inconsistent behavior react-ux-effect-missing-deps | 2 | MEDIUM | CAT | 1027, 1058 |
Array.reduce can be replaced with simpler methods typescript-unicorn-no-array-reduce | 1 | MEDIUM | CAT | 506 |
Inline style object literal creates new reference every render react-inline-style-object | 57 | INFO | CAT | 95–970 |
JSX nesting exceeds 5 levels — hard to read and maintain react-component-deeply-nested | 15 | INFO | STR | 265–772 |
Hardcoded string literal used in logic — extract to a named constant or enum cq-magic-string | 11 | INFO | CAT | 851–1277 |
useMemo wrapping a trivially cheap value - memoization overhead exceeds computation cost, adds unnecessary complexity react-usememo-no-benefit | 6 | INFO | CAT | 1021–1204 |
<ScrollView> without showsVerticalScrollIndicator set explicitly ux-mobile-scroll-no-indicator | 5 | INFO | CAT | 210, 317, 523, 654, 839 |
Dynamic status/loading text without aria-live region — screen readers miss content updates react-ux-no-aria-live | 3 | INFO | CAT | 235, 575, 605 |
setState in useEffect to derive state from other state — use useMemo instead react-useeffect-setstate-in-callback | 2 | INFO | CAT | 1027, 1058 |
truemend audit <path> --format json for the complete list.Finding Details
Most critical findings in detail
Each finding includes function metrics, evidence, recommended remediation, and the files this change can reach.
Finding Details
Finding Details
Finding Details
Finding Details
Finding Details
Improvement Roadmap
Three-phase improvement roadmap
Fixes are classified into three tiers by execution method. Phase 1 is immediate and automated. Phase 2 requires constrained LLM assistance. Phase 3 requires human architectural judgment. Large audits use one full page per phase so the plan stays readable end to end.
Improvement Roadmap
Phase 1: Deterministic Fixes
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 2: Cataloged Refactors (continued)
Grouped by pattern so the plan stays readable even on large audits.
Improvement Roadmap
Phase 3: Structural Review
Grouped by pattern so the plan stays readable even on large audits.
UX Audit
UX Quality Audit
Truemend scanned 5550 files for UX anti-patterns across accessibility (WCAG 2.1), loading states, mobile responsiveness, component design, and performance. 5318 findings detected.
Overall UX Score
Regulatory Compliance
Category Breakdown
UX Findings (5318 total across 46 patterns)
| Pattern | Severity | Description | Count | Files |
|---|---|---|---|---|
| ux-async-no-empty-state | MEDIUM | List .map() without empty state for zero items | 1875 | 717 |
| ux-perf-large-list-no-virtualization | HIGH | Large list rendering without virtualization | 574 | 207 |
| ux-comp-inline-styles-excessive | MEDIUM | Component has 6 inline style objects (>= 5) | 512 | 99 |
| react-ux-effect-missing-deps | MEDIUM | Effect missing dependencies — stale closures, inconsistent behavior | 263 | 245 |
| react-ux-derived-state | MEDIUM | useState + useEffect to derive state from other state — unnecessary re | 211 | 193 |
| ux-comp-prop-drilling-deep | MEDIUM | Props drilled through 3+ levels: dismiss, present, resize | 186 | 128 |
| react-ux-array-index-key | MEDIUM | Using array index as key — breaks when items reorder or insert | 159 | 106 |
UX Audit
UX Findings (continued 8–27 of 46)
| Pattern | Severity | Description | Count | Files |
|---|---|---|---|---|
| ux-async-toast-no-action | MEDIUM | Error toast without retry/action button | 143 | 69 |
| api-ux-n-plus-one | INFO | Database query inside a loop — causes N+1 query problem with severe pe | 142 | 142 |
| ux-comp-missing-default-props | LOW | Optional prop 'testID' without default value | 137 | 119 |
| ux-async-no-loading | HIGH | Data fetching without loading UI | 129 | 116 |
| ux-comp-no-error-boundary | MEDIUM | Data-fetching component without ErrorBoundary wrapper | 120 | 120 |
| ux-async-timeout-no-feedback | MEDIUM | Long-running operation without timeout or progress feedback | 92 | 56 |
| ux-perf-no-lazy-loading | LOW | Route component 'GroveGemma' not code-split | 87 | 2 |
| ux-comp-too-many-props | MEDIUM | Component Props interface has 10 properties (>= 10) | 78 | 74 |
| api-ux-no-connection-pool | INFO | New database connection created per request — exhausts connections and | 78 | 78 |
| react-ux-no-aria-live | INFO | Dynamic status/loading text without aria-live region — screen readers | 68 | 67 |
| ux-a11y-heading-order-skip | MEDIUM | Heading level skipped: h1 -> h3 | 51 | 15 |
| react-ux-no-reduced-motion | INFO | CSS animation or transition without prefers-reduced-motion check — cau | 46 | 12 |
| ux-a11y-input-no-label | CRITICAL | <input> without associated label or aria-label | 44 | 14 |
| ux-async-optimistic-no-rollback | HIGH | Optimistic update without error rollback handler | 43 | 43 |
| react-ux-effect-for-fetching | INFO | useEffect for data fetching — should use React Query or SWR | 39 | 39 |
| react-ux-no-react-memo | INFO | List item component without React.memo — re-renders all items on any c | 33 | 33 |
| ux-async-no-error-ui | HIGH | Data fetching with error state but no error UI | 30 | 26 |
| react-ux-no-focus-trap | INFO | Modal or dialog component without focus trap — keyboard users can tab | 22 | 22 |
| ux-perf-no-abort-controller | MEDIUM | useEffect with fetch() but no AbortController cleanup | 22 | 20 |
| api-ux-unbounded-query | INFO | Database query without LIMIT clause — can return millions of rows and | 22 | 22 |
UX Audit
UX Findings (continued 28–46 of 46)
| Pattern | Severity | Description | Count | Files |
|---|---|---|---|---|
| react-ux-effect-missing-cleanup | INFO | Effect with subscription/timer without cleanup — memory leak | 14 | 14 |
| ux-a11y-div-click-handler | HIGH | onClick on <div> instead of <button> | 13 | 7 |
| ux-a11y-button-no-accessible-name | CRITICAL | <button> with no text content or aria-label | 12 | 4 |
| ux-async-network-no-offline | MEDIUM | Data fetching without offline/network-error handling | 9 | 9 |
| react-ux-input-no-name | INFO | Input without name attribute — form submission excludes the value | 9 | 9 |
| react-ux-props-to-state | INFO | Copying props to state via useState(props.x) — creates stale state tha | 8 | 8 |
| react-ux-form-no-label | INFO | Form input without associated label — screen readers cannot identify p | 7 | 7 |
| ux-async-infinite-scroll-no-end | MEDIUM | Infinite scroll without end-of-list indicator | 6 | 6 |
| ux-perf-animation-no-gpu | LOW | Transition on 'height' — use transform/opacity instead | 6 | 5 |
| ux-a11y-no-lang-attribute | HIGH | <html> without lang attribute | 6 | 6 |
| react-ux-div-with-click | INFO | <div> with onClick but no role="button" — not recognized as interactiv | 6 | 6 |
| ux-comp-too-many-effects | HIGH | Component has 8 useEffect hooks (>= 5) | 4 | 4 |
| react-ux-inline-function-props | INFO | Inline function in props — creates new reference on every render, brea | 3 | 3 |
| ux-a11y-icon-button-no-label | CRITICAL | Icon-only button without aria-label | 2 | 1 |
| react-ux-click-keyboard-gap | INFO | onClick handler on non-button element without onKeyDown — keyboard use | 2 | 2 |
| ux-a11y-role-misuse | MEDIUM | role="button" on <div> — use native <button> instead | 2 | 2 |
| react-ux-img-no-alt | INFO | Image without alt attribute — screen readers skip or announce filename | 1 | 1 |
| react-ux-object-state-spread | INFO | Updating object state with spread — easier to use useImmer or reducer | 1 | 1 |
| react-ux-no-skip-link | INFO | Page without skip navigation link — keyboard users must tab through na | 1 | 1 |
Confidential — Proprietary & Restricted