{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-55749c97f287329f", "name": "Debug `console.log` remains in browser-facing code \u2014 bench/replay.js:286", "shortDescription": {"text": "Debug `console.log` remains in browser-facing code \u2014 bench/replay.js:286"}, "fullDescription": {"text": "Remove debug output or route intentional diagnostics through the project's structured logger. Browser console output can expose state and create noise; server and CLI output are outside this rule's scope.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 0.85}}, {"id": "scanner-7ab9716257ea1d38", "name": "React Flow <Controls> without dark theming \u2014 src/App.tsx:736", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/App.tsx:736"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 0.85}}, {"id": "scanner-d812f59f51cc9837", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/SettingsPanel.tsx:1083", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/SettingsPanel.tsx:1083"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-b0f01158f25571da", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/MainLibrary.tsx:515", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/MainLibrary.tsx:515"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-bebc3742a36511b4", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/CommunityPage.tsx:321", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/CommunityPage.tsx:321"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-48c5264171e177be", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/panel/CommunityPage.tsx:350", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/panel/CommunityPage.tsx:350"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 0.8}}, {"id": "scanner-2fa93e4a4f8a0f5d", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/library/LibraryItems.tsx:326", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/library/LibraryItems.tsx:326"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-28185df0a731f979", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/ExportPanel.tsx:682", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/ExportPanel.tsx:682"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-8744e3d3e2336abd", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/CropPanel.tsx:1074", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/CropPanel.tsx:1074"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-2a26775e38f32c67", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/AIPanel.tsx:1308", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/AIPanel.tsx:1308"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-0daa1b46b189dad3", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/MasksPanel.tsx:1242", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/MasksPanel.tsx:1242"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-2c3db885b38aa6df", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/MetadataPanel.tsx:167", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/MetadataPanel.tsx:167"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-401c9c38db282416", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/FolderTree.tsx:334", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/FolderTree.tsx:334"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-95d35127f234f552", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/PresetsPanel.tsx:311", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/PresetsPanel.tsx:311"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-96adb97736776706", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/TetheringPanel.tsx:631", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/TetheringPanel.tsx:631"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-c6a6f71662a3a4a7", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/editor/EditorToolbar.tsx:406", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/editor/EditorToolbar.tsx:406"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-710d894412fb8d0e", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/ui/LUTControl.tsx:235", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/ui/LUTControl.tsx:235"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-526ed17345f8f5da", "name": "Truncated text has no discoverable full-value affordance \u2014 src/components/ui/ExternalEditBar.tsx:23", "shortDescription": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/ui/ExternalEditBar.tsx:23"}, "fullDescription": {"text": "A visibly truncated value should expose its full text through an accessible tooltip, description, or equivalent interaction. Native `title=` is one option, but it is not the only valid implementation.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 0.65}}, {"id": "scanner-bea50732f64c0975", "name": "react insecure request \u2014 src/components/panel/SettingsPanel.tsx:328", "shortDescription": {"text": "react insecure request \u2014 src/components/panel/SettingsPanel.tsx:328"}, "fullDescription": {"text": "Unencrypted request over HTTP detected.\n\nRule: typescript.react.security.react-insecure-request.react-insecure-request\nSeverity: ERROR\nOWASP: A03:2017 - Sensitive Data Exposure, A02:2021 - Cryptographic Failures, A04:2025 - Cryptographic Failures\nCWE: CWE-319: Cleartext Transmission of Sensitive Information\nCategory: security\nContext: production"}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.75}}, {"id": "scanner-1081c39021be1fea", "name": "react insecure request \u2014 src/components/panel/right/AIPanel.tsx:370", "shortDescription": {"text": "react insecure request \u2014 src/components/panel/right/AIPanel.tsx:370"}, "fullDescription": {"text": "Unencrypted request over HTTP detected.\n\nRule: typescript.react.security.react-insecure-request.react-insecure-request\nSeverity: ERROR\nOWASP: A03:2017 - Sensitive Data Exposure, A02:2021 - Cryptographic Failures, A04:2025 - Cryptographic Failures\nCWE: CWE-319: Cleartext Transmission of Sensitive Information\nCategory: security\nContext: production"}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.75}}, {"id": "scanner-2ad55aeb9f859416", "name": "GHSA-wrw7-89jp-8q8g: glib 0.18.5 \u2014 src-tauri/Cargo.lock", "shortDescription": {"text": "GHSA-wrw7-89jp-8q8g: glib 0.18.5 \u2014 src-tauri/Cargo.lock"}, "fullDescription": {"text": "Unsoundness in `Iterator` and `DoubleEndedIterator` impls for `glib::VariantStrIter`\n\nThe `VariantStrIter::impl_get` function (called internally by implementations of the `Iterator` and `DoubleEndedIterator` traits for this type) was unsound, resulting in undefined behaviour.\n\nAn immutable reference `&p` to a `*mut libc::c_char` pointer initialized to `NULL` was passed as an argument to a C function that that mutates the pointer behind `&p` in-place (i.e. as an out-argument), which was unsound. After changes in recent versions of the Rust compiler, these unsound writes through `&\n\nPackage: glib\nInstalled: 0.18.5\nFixed in: 0.20.0\nSeverity: MEDIUM\nFix: Upgrade glib to 0.20.0"}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f4f8d22db02b8f56", "name": "Secret leak: Stripe Publishable Key \u2014 src/App.tsx", "shortDescription": {"text": "Secret leak: Stripe Publishable Key \u2014 src/App.tsx"}, "fullDescription": {"text": "Trivy detected a possible secret in `src/App.tsx`.\n\nRule: stripe-publishable-token\nSeverity: LOW\nMatch (redacted): onst CLERK_PUBLISHABLE_KEY = '****************************************YWNjb3VudH\n\nAction: rotate the credential and remove it from the repo. Use a secrets manager or environment variables."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c26cb2fbd01bc10b", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/panel/CommunityPage.tsx:350", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/panel/CommunityPage.tsx:350"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.65}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64192a3c67110d01", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1838a141491ce38c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ba9bfab5f283202", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a6d154549150c92", "name": "Very large file: src-tauri/src/gpu_processing.rs (2202 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/gpu_processing.rs (2202 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-71cae32c70610a6e", "name": "Very large file: src-tauri/src/lib.rs (2318 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/lib.rs (2318 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d6d0e10bcc110e0", "name": "Very large file: src-tauri/src/image_processing.rs (3487 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/image_processing.rs (3487 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3a882d20d47e227", "name": "Very large file: src-tauri/src/exif_processing.rs (1702 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/exif_processing.rs (1702 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a16d562212903640", "name": "Very large file: src-tauri/src/export_processing.rs (1853 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/export_processing.rs (1853 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06be921959cd0e78", "name": "Very large file: src-tauri/src/ai_processing.rs (1759 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/ai_processing.rs (1759 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e630e2e83e06a654", "name": "Very large file: src-tauri/src/focus_stacking.rs (2165 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/focus_stacking.rs (2165 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c52db8e7ef5a8fbc", "name": "Very large file: src-tauri/src/file_management.rs (4314 lines)", "shortDescription": {"text": "Very large file: src-tauri/src/file_management.rs (4314 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e62125ebea19cb52", "name": "Very large file: src/components/panel/SettingsPanel.tsx (2567 lines)", "shortDescription": {"text": "Very large file: src/components/panel/SettingsPanel.tsx (2567 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ead5b593495f6a51", "name": "Very large file: src/components/panel/Editor.tsx (2360 lines)", "shortDescription": {"text": "Very large file: src/components/panel/Editor.tsx (2360 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-12281874c4eee3c7", "name": "Very large file: src/components/panel/right/CropPanel.tsx (1551 lines)", "shortDescription": {"text": "Very large file: src/components/panel/right/CropPanel.tsx (1551 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-521c39bb0cb7881c", "name": "Very large file: src/components/panel/right/AIPanel.tsx (2197 lines)", "shortDescription": {"text": "Very large file: src/components/panel/right/AIPanel.tsx (2197 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edd3f9295bcfe0e5", "name": "Very large file: src/components/panel/right/MasksPanel.tsx (2291 lines)", "shortDescription": {"text": "Very large file: src/components/panel/right/MasksPanel.tsx (2291 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec008d85c8206d4b", "name": "Very large file: src/components/panel/editor/ImageCanvas.tsx (3585 lines)", "shortDescription": {"text": "Very large file: src/components/panel/editor/ImageCanvas.tsx (3585 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ba27590ad6fb3d3", "name": "Very large file: src/hooks/useAppContextMenus.ts (1386 lines)", "shortDescription": {"text": "Very large file: src/hooks/useAppContextMenus.ts (1386 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 162 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 27 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 70 placeholder/mock markers across 23 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6947cb27bc5cc660", "name": "Legacy-named symbol `is_virtual_copy` in src/utils/imageGrouping.ts:23", "shortDescription": {"text": "Legacy-named symbol `is_virtual_copy` in src/utils/imageGrouping.ts:23"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4358cedd2f1b7459", "name": "Legacy-named symbol `is_virtual_copy` in src/components/panel/Filmstrip.tsx:696", "shortDescription": {"text": "Legacy-named symbol `is_virtual_copy` in src/components/panel/Filmstrip.tsx:696"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27b5e37d5558bd17", "name": "Legacy-named symbol `scaleOld` in src/components/panel/Editor.tsx:1222", "shortDescription": {"text": "Legacy-named symbol `scaleOld` in src/components/panel/Editor.tsx:1222"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fb8e0480bbe7640", "name": "Legacy-named symbol `create_virtual_copy` in src/components/ui/AppProperties.tsx:47", "shortDescription": {"text": "Legacy-named symbol `create_virtual_copy` in src/components/ui/AppProperties.tsx:47"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4e2b37f5c9e2985", "name": "Vulnerable dependency quick-xml 0.37.5: RUSTSEC-2026-0194", "shortDescription": {"text": "Vulnerable dependency quick-xml 0.37.5: RUSTSEC-2026-0194"}, "fullDescription": {"text": "OSV.dev reports `quick-xml` at version `0.37.5` (resolved in `src-tauri/Cargo.lock`) is affected by RUSTSEC-2026-0194.\n\nQuadratic run time when checking a start tag for duplicate attribute names\n\nAdvisory: https://osv.dev/vulnerability/RUSTSEC-2026-0194\nFix: upgrade `quick-xml` past the affected range per the advisory."}, "properties": {"scanner": "scanner-primary", "layer": "dependencies", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1acc3afcf1cbe764", "name": "Vulnerable dependency quick-xml 0.37.5: RUSTSEC-2026-0195", "shortDescription": {"text": "Vulnerable dependency quick-xml 0.37.5: RUSTSEC-2026-0195"}, "fullDescription": {"text": "OSV.dev reports `quick-xml` at version `0.37.5` (resolved in `src-tauri/Cargo.lock`) is affected by RUSTSEC-2026-0195.\n\nUnbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service\n\nAdvisory: https://osv.dev/vulnerability/RUSTSEC-2026-0195\nFix: upgrade `quick-xml` past the affected range per the advisory."}, "properties": {"scanner": "scanner-primary", "layer": "dependencies", "severity": "high", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/30833"}, "properties": {"repository": "CyberTimon/RapidRAW", "repoUrl": "https://github.com/CyberTimon/RapidRAW", "branch": "main"}, "results": [{"ruleId": "scanner-55749c97f287329f", "level": "note", "message": {"text": "Debug `console.log` remains in browser-facing code \u2014 bench/replay.js:286"}, "properties": {"repobilityId": "368a0e783f6d1955", "scanner": "scanner-primary", "fingerprint": "55749c97f287329f", "layer": "frontend", "severity": "low", "confidence": 0.85, "tags": ["frontend-quality", "fq.console-leak"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bench/replay.js"}, "region": {"startLine": 286}}}]}, {"ruleId": "scanner-7ab9716257ea1d38", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/App.tsx:736"}, "properties": {"repobilityId": "f75ebeed56ee22b3", "scanner": "scanner-primary", "fingerprint": "7ab9716257ea1d38", "layer": "frontend", "severity": "low", "confidence": 0.85, "tags": ["frontend-quality", "fq.controls.no-bg"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/App.tsx"}, "region": {"startLine": 736}}}]}, {"ruleId": "scanner-d812f59f51cc9837", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/SettingsPanel.tsx:1083"}, "properties": {"repobilityId": "a8cd20b01c68bf79", "scanner": "scanner-primary", "fingerprint": "d812f59f51cc9837", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/SettingsPanel.tsx"}, "region": {"startLine": 1083}}}]}, {"ruleId": "scanner-b0f01158f25571da", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/MainLibrary.tsx:515"}, "properties": {"repobilityId": "6c30462c7311d238", "scanner": "scanner-primary", "fingerprint": "b0f01158f25571da", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/MainLibrary.tsx"}, "region": {"startLine": 515}}}]}, {"ruleId": "scanner-bebc3742a36511b4", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/CommunityPage.tsx:321"}, "properties": {"repobilityId": "65c71b38f37b5502", "scanner": "scanner-primary", "fingerprint": "bebc3742a36511b4", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/CommunityPage.tsx"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-48c5264171e177be", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/panel/CommunityPage.tsx:350"}, "properties": {"repobilityId": "6373aaa215b9ad41", "scanner": "scanner-primary", "fingerprint": "48c5264171e177be", "layer": "frontend", "severity": "medium", "confidence": 0.8, "tags": ["frontend-quality", "fq.dangerous-html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/CommunityPage.tsx"}, "region": {"startLine": 350}}}]}, {"ruleId": "scanner-2fa93e4a4f8a0f5d", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/library/LibraryItems.tsx:326"}, "properties": {"repobilityId": "93ae5b70dfe1f8d8", "scanner": "scanner-primary", "fingerprint": "2fa93e4a4f8a0f5d", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/library/LibraryItems.tsx"}, "region": {"startLine": 326}}}]}, {"ruleId": "scanner-28185df0a731f979", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/ExportPanel.tsx:682"}, "properties": {"repobilityId": "f1d4e5a979724b88", "scanner": "scanner-primary", "fingerprint": "28185df0a731f979", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/ExportPanel.tsx"}, "region": {"startLine": 682}}}]}, {"ruleId": "scanner-8744e3d3e2336abd", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/CropPanel.tsx:1074"}, "properties": {"repobilityId": "5399e01a0c60a847", "scanner": "scanner-primary", "fingerprint": "8744e3d3e2336abd", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/CropPanel.tsx"}, "region": {"startLine": 1074}}}]}, {"ruleId": "scanner-2a26775e38f32c67", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/AIPanel.tsx:1308"}, "properties": {"repobilityId": "69c88ba170fb9205", "scanner": "scanner-primary", "fingerprint": "2a26775e38f32c67", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/AIPanel.tsx"}, "region": {"startLine": 1308}}}]}, {"ruleId": "scanner-0daa1b46b189dad3", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/MasksPanel.tsx:1242"}, "properties": {"repobilityId": "1e0764c1b69f0ade", "scanner": "scanner-primary", "fingerprint": "0daa1b46b189dad3", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/MasksPanel.tsx"}, "region": {"startLine": 1242}}}]}, {"ruleId": "scanner-2c3db885b38aa6df", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/MetadataPanel.tsx:167"}, "properties": {"repobilityId": "0bce9e70b8b48708", "scanner": "scanner-primary", "fingerprint": "2c3db885b38aa6df", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/MetadataPanel.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-401c9c38db282416", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/FolderTree.tsx:334"}, "properties": {"repobilityId": "95be07fdfd7eae35", "scanner": "scanner-primary", "fingerprint": "401c9c38db282416", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/FolderTree.tsx"}, "region": {"startLine": 334}}}]}, {"ruleId": "scanner-95d35127f234f552", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/PresetsPanel.tsx:311"}, "properties": {"repobilityId": "bab9e78f91346a9f", "scanner": "scanner-primary", "fingerprint": "95d35127f234f552", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/PresetsPanel.tsx"}, "region": {"startLine": 311}}}]}, {"ruleId": "scanner-96adb97736776706", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/right/TetheringPanel.tsx:631"}, "properties": {"repobilityId": "fbfabfd617ed8538", "scanner": "scanner-primary", "fingerprint": "96adb97736776706", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/TetheringPanel.tsx"}, "region": {"startLine": 631}}}]}, {"ruleId": "scanner-c6a6f71662a3a4a7", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/panel/editor/EditorToolbar.tsx:406"}, "properties": {"repobilityId": "df65ada04734cb18", "scanner": "scanner-primary", "fingerprint": "c6a6f71662a3a4a7", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/editor/EditorToolbar.tsx"}, "region": {"startLine": 406}}}]}, {"ruleId": "scanner-710d894412fb8d0e", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/ui/LUTControl.tsx:235"}, "properties": {"repobilityId": "92ad8c9cc7fde634", "scanner": "scanner-primary", "fingerprint": "710d894412fb8d0e", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/LUTControl.tsx"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-526ed17345f8f5da", "level": "none", "message": {"text": "Truncated text has no discoverable full-value affordance \u2014 src/components/ui/ExternalEditBar.tsx:23"}, "properties": {"repobilityId": "fab2fa503742bdd0", "scanner": "scanner-primary", "fingerprint": "526ed17345f8f5da", "layer": "frontend", "severity": "info", "confidence": 0.65, "tags": ["frontend-quality", "fq.truncate.no-title"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/ExternalEditBar.tsx"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-bea50732f64c0975", "level": "error", "message": {"text": "react insecure request \u2014 src/components/panel/SettingsPanel.tsx:328"}, "properties": {"repobilityId": "67038bafa0e501e6", "scanner": "scanner-primary", "fingerprint": "bea50732f64c0975", "layer": "security", "severity": "high", "confidence": 0.75, "tags": ["semgrep", "security", "react"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/SettingsPanel.tsx"}, "region": {"startLine": 328}}}]}, {"ruleId": "scanner-1081c39021be1fea", "level": "error", "message": {"text": "react insecure request \u2014 src/components/panel/right/AIPanel.tsx:370"}, "properties": {"repobilityId": "66555b9853e96bbe", "scanner": "scanner-primary", "fingerprint": "1081c39021be1fea", "layer": "security", "severity": "high", "confidence": 0.75, "tags": ["semgrep", "security", "react"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/right/AIPanel.tsx"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-2ad55aeb9f859416", "level": "warning", "message": {"text": "GHSA-wrw7-89jp-8q8g: glib 0.18.5 \u2014 src-tauri/Cargo.lock"}, "properties": {"repobilityId": "0772865093f18de8", "scanner": "scanner-primary", "fingerprint": "2ad55aeb9f859416", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["trivy", "vuln", "GHSA-wrw7-89jp-8q8g"]}}, {"ruleId": "scanner-f4f8d22db02b8f56", "level": "note", "message": {"text": "Secret leak: Stripe Publishable Key \u2014 src/App.tsx"}, "properties": {"repobilityId": "d40d13e479cddfa2", "scanner": "scanner-primary", "fingerprint": "f4f8d22db02b8f56", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["trivy", "secret"]}}, {"ruleId": "scanner-c26cb2fbd01bc10b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/panel/CommunityPage.tsx:350"}, "properties": {"repobilityId": "27bb6b9f0ae3b8df", "scanner": "scanner-primary", "fingerprint": "c26cb2fbd01bc10b", "layer": "security", "severity": "medium", "confidence": 0.65, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/panel/CommunityPage.tsx"}, "region": {"startLine": 350}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-64192a3c67110d01", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "87338a8bfcb6f435", "scanner": "scanner-primary", "fingerprint": "64192a3c67110d01", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1bf0fd1430c42e23", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-4a6d154549150c92", "level": "note", "message": {"text": "Very large file: src-tauri/src/gpu_processing.rs (2202 lines)"}, "properties": {"repobilityId": "de3baa8157655757", "scanner": "scanner-primary", "fingerprint": "4a6d154549150c92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-71cae32c70610a6e", "level": "note", "message": {"text": "Very large file: src-tauri/src/lib.rs (2318 lines)"}, "properties": {"repobilityId": "f072133525c0c23b", "scanner": "scanner-primary", "fingerprint": "71cae32c70610a6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7d6d0e10bcc110e0", "level": "note", "message": {"text": "Very large file: src-tauri/src/image_processing.rs (3487 lines)"}, "properties": {"repobilityId": "b2d9ce4af437d48b", "scanner": "scanner-primary", "fingerprint": "7d6d0e10bcc110e0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c3a882d20d47e227", "level": "note", "message": {"text": "Very large file: src-tauri/src/exif_processing.rs (1702 lines)"}, "properties": {"repobilityId": "45789e443917ebf8", "scanner": "scanner-primary", "fingerprint": "c3a882d20d47e227", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a16d562212903640", "level": "note", "message": {"text": "Very large file: src-tauri/src/export_processing.rs (1853 lines)"}, "properties": {"repobilityId": "9814d7d32a026845", "scanner": "scanner-primary", "fingerprint": "a16d562212903640", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-06be921959cd0e78", "level": "note", "message": {"text": "Very large file: src-tauri/src/ai_processing.rs (1759 lines)"}, "properties": {"repobilityId": "66ad41c3ab25c274", "scanner": "scanner-primary", "fingerprint": "06be921959cd0e78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e630e2e83e06a654", "level": "note", "message": {"text": "Very large file: src-tauri/src/focus_stacking.rs (2165 lines)"}, "properties": {"repobilityId": "4dd36cb996996cab", "scanner": "scanner-primary", "fingerprint": "e630e2e83e06a654", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c52db8e7ef5a8fbc", "level": "note", "message": {"text": "Very large file: src-tauri/src/file_management.rs (4314 lines)"}, "properties": {"repobilityId": "22a855bb75954ba1", "scanner": "scanner-primary", "fingerprint": "c52db8e7ef5a8fbc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e62125ebea19cb52", "level": "note", "message": {"text": "Very large file: src/components/panel/SettingsPanel.tsx (2567 lines)"}, "properties": {"repobilityId": "149983bb161ecdec", "scanner": "scanner-primary", "fingerprint": "e62125ebea19cb52", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ead5b593495f6a51", "level": "note", "message": {"text": "Very large file: src/components/panel/Editor.tsx (2360 lines)"}, "properties": {"repobilityId": "9ba752f4d90aa21a", "scanner": "scanner-primary", "fingerprint": "ead5b593495f6a51", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-12281874c4eee3c7", "level": "note", "message": {"text": "Very large file: src/components/panel/right/CropPanel.tsx (1551 lines)"}, "properties": {"repobilityId": "982b15c01690eedc", "scanner": "scanner-primary", "fingerprint": "12281874c4eee3c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-521c39bb0cb7881c", "level": "note", "message": {"text": "Very large file: src/components/panel/right/AIPanel.tsx (2197 lines)"}, "properties": {"repobilityId": "11fb453d5c259ed9", "scanner": "scanner-primary", "fingerprint": "521c39bb0cb7881c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-edd3f9295bcfe0e5", "level": "note", "message": {"text": "Very large file: src/components/panel/right/MasksPanel.tsx (2291 lines)"}, "properties": {"repobilityId": "4707ee665c70391e", "scanner": "scanner-primary", "fingerprint": "edd3f9295bcfe0e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ec008d85c8206d4b", "level": "note", "message": {"text": "Very large file: src/components/panel/editor/ImageCanvas.tsx (3585 lines)"}, "properties": {"repobilityId": "c407cfb75bf468b4", "scanner": "scanner-primary", "fingerprint": "ec008d85c8206d4b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5ba27590ad6fb3d3", "level": "note", "message": {"text": "Very large file: src/hooks/useAppContextMenus.ts (1386 lines)"}, "properties": {"repobilityId": "698e8fa1bfdb300e", "scanner": "scanner-primary", "fingerprint": "5ba27590ad6fb3d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6824b4f687bd36b0", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "8fe8409a5823495e", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f72aab7cb29110ce", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "dba8fd0bf916f60b", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-6947cb27bc5cc660", "level": "note", "message": {"text": "Legacy-named symbol `is_virtual_copy` in src/utils/imageGrouping.ts:23"}, "properties": {"repobilityId": "0c12a34c9f702635", "scanner": "scanner-primary", "fingerprint": "6947cb27bc5cc660", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4358cedd2f1b7459", "level": "note", "message": {"text": "Legacy-named symbol `is_virtual_copy` in src/components/panel/Filmstrip.tsx:696"}, "properties": {"repobilityId": "b967770cefce35cf", "scanner": "scanner-primary", "fingerprint": "4358cedd2f1b7459", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-27b5e37d5558bd17", "level": "note", "message": {"text": "Legacy-named symbol `scaleOld` in src/components/panel/Editor.tsx:1222"}, "properties": {"repobilityId": "7509740499485a15", "scanner": "scanner-primary", "fingerprint": "27b5e37d5558bd17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1fb8e0480bbe7640", "level": "note", "message": {"text": "Legacy-named symbol `create_virtual_copy` in src/components/ui/AppProperties.tsx:47"}, "properties": {"repobilityId": "60ecd8d9f416a9e4", "scanner": "scanner-primary", "fingerprint": "1fb8e0480bbe7640", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a4e2b37f5c9e2985", "level": "error", "message": {"text": "Vulnerable dependency quick-xml 0.37.5: RUSTSEC-2026-0194"}, "properties": {"repobilityId": "dee04401747d6d52", "scanner": "scanner-primary", "fingerprint": "a4e2b37f5c9e2985", "layer": "dependencies", "severity": "high", "confidence": 1.0, "tags": ["dependency", "sca", "osv", "RUSTSEC-2026-0194"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src-tauri/Cargo.lock"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1acc3afcf1cbe764", "level": "error", "message": {"text": "Vulnerable dependency quick-xml 0.37.5: RUSTSEC-2026-0195"}, "properties": {"repobilityId": "fe0f8f2110f1b189", "scanner": "scanner-primary", "fingerprint": "1acc3afcf1cbe764", "layer": "dependencies", "severity": "high", "confidence": 1.0, "tags": ["dependency", "sca", "osv", "RUSTSEC-2026-0195"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src-tauri/Cargo.lock"}, "region": {"startLine": 1}}}]}]}]}