{"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-e7c92de7716dceae", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-font-catalog.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-font-catalog.ts:72"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-951b58692e641dbe", "name": "Stray `console.log` in TS/JS \u2014 src/components/AboutModal/AboutModal.stories.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/AboutModal/AboutModal.stories.tsx:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e043e5c2ece4c0d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/NewDocumentModal/NewDocumentModal.tsx:295", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/NewDocumentModal/NewDocumentModal.tsx:295"}, "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": 1.0}}, {"id": "scanner-48fcd1651c137ed1", "name": "Stray `console.log` in TS/JS \u2014 src/components/NewDocumentModal/NewDocumentModal.stories.tsx:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/NewDocumentModal/NewDocumentModal.stories.tsx:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccc5d08a8ad51b77", "name": "Stray `console.log` in TS/JS \u2014 src/components/ColorLutDialog/ColorLutDialog.stories.tsx:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ColorLutDialog/ColorLutDialog.stories.tsx:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb3ee0c965e55284", "name": "Stray `console.log` in TS/JS \u2014 src/components/ExportDialog/ExportDialog.stories.tsx:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ExportDialog/ExportDialog.stories.tsx:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd7a0d8ade0d0af6", "name": "Stray `console.log` in TS/JS \u2014 src/components/ContextMenu/ContextMenu.stories.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ContextMenu/ContextMenu.stories.tsx:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6f988b8aacddca7", "name": "Stray `console.log` in TS/JS \u2014 src/components/FilterDialog/NoiseDialog.stories.tsx:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/FilterDialog/NoiseDialog.stories.tsx:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13249c5f50d87640", "name": "Stray `console.log` in TS/JS \u2014 src/components/FilterDialog/FilterDialog.stories.tsx:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/FilterDialog/FilterDialog.stories.tsx:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f872fbd7a7cae87e", "name": "Stray `console.log` in TS/JS \u2014 src/components/CanvasSizeModal/CanvasSizeModal.stories.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/CanvasSizeModal/CanvasSizeModal.stories.tsx:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50b12c2e297b5523", "name": "Stray `console.log` in TS/JS \u2014 src/components/PatternFillDialog/PatternFillDialog.stories.tsx:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PatternFillDialog/PatternFillDialog.stories.tsx:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55f5bee588ed8ad2", "name": "Stray `console.log` in TS/JS \u2014 src/components/ImageSizeModal/ImageSizeModal.stories.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ImageSizeModal/ImageSizeModal.stories.tsx:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5cb9ab3a8a05eab3", "name": "Stray `console.log` in TS/JS \u2014 src/components/KeyboardShortcutsModal/KeyboardShortcutsModal.stories.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/KeyboardShortcutsModal/KeyboardShortcutsModal.stories.tsx:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d7c612a4e3694c3", "name": "Stray `console.log` in TS/JS \u2014 src/components/GradientModal/GradientModal.stories.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/GradientModal/GradientModal.stories.tsx:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4fe8d7f80330d74", "name": "Stray `console.log` in TS/JS \u2014 src/components/ShapeSizeModal/ShapeSizeModal.stories.tsx:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ShapeSizeModal/ShapeSizeModal.stories.tsx:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1023aa768e0ebbbf", "name": "Stray `console.log` in TS/JS \u2014 src/panels/AdjustmentsPanel/LevelsEditor.stories.tsx:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/panels/AdjustmentsPanel/LevelsEditor.stories.tsx:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77bfb21f90c2db4e", "name": "React Flow <Controls> without dark theming \u2014 src/panels/AdjustmentsPanel/AdjustmentsPanel.tsx:281", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/panels/AdjustmentsPanel/AdjustmentsPanel.tsx:281"}, "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": 1.0}}, {"id": "scanner-f813be2b9c3572f0", "name": "Stray `console.log` in TS/JS \u2014 e2e/stroke-effect-live.spec.ts:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/stroke-effect-live.spec.ts:149"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-123bb3c6f7ef44a5", "name": "Stray `console.log` in TS/JS \u2014 e2e/rendering.spec.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/rendering.spec.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffba0725a26515d7", "name": "Stray `console.log` in TS/JS \u2014 e2e/align-then-stroke-scale.spec.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-then-stroke-scale.spec.ts:133"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c022ed7653bde05", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-fade.spec.ts:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-fade.spec.ts:149"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d55ac8493c385bf7", "name": "Stray `console.log` in TS/JS \u2014 e2e/text-undo.spec.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-undo.spec.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb69b7c399ef3a72", "name": "Stray `console.log` in TS/JS \u2014 e2e/memory-retouch-session.spec.ts:193", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/memory-retouch-session.spec.ts:193"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e71233693731b117", "name": "Stray `console.log` in TS/JS \u2014 e2e/dng-import.spec.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/dng-import.spec.ts:47"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-12f1f9338ce05f9e", "name": "Stray `console.log` in TS/JS \u2014 e2e/raf-import.spec.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/raf-import.spec.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d38912d05ce82a5e", "name": "Stray `console.log` in TS/JS \u2014 e2e/layer-memory-realistic.spec.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/layer-memory-realistic.spec.ts:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6227f121351f03ce", "name": "Stray `console.log` in TS/JS \u2014 e2e/align-fill.spec.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-fill.spec.ts:105"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4394f231a2c2ff5e", "name": "Stray `console.log` in TS/JS \u2014 e2e/align-brush.spec.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-brush.spec.ts:126"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b91193a196751eb", "name": "Stray `console.log` in TS/JS \u2014 e2e/inner-stroke-large.spec.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/inner-stroke-large.spec.ts:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae84160f443c8831", "name": "Stray `console.log` in TS/JS \u2014 e2e/text-curve-quality.spec.ts:206", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-curve-quality.spec.ts:206"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65120a2c80d4d879", "name": "Stray `console.log` in TS/JS \u2014 e2e/tools.spec.ts:2100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/tools.spec.ts:2100"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ae9241d3b5f4e41", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf-6k.spec.ts:246", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf-6k.spec.ts:246"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f45949b9d4bd86a4", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-shift-click.spec.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-shift-click.spec.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45a97db1313c17bd", "name": "Stray `console.log` in TS/JS \u2014 e2e/align-then-brush.spec.ts:164", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-then-brush.spec.ts:164"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd569a977690e562", "name": "Stray `console.log` in TS/JS \u2014 e2e/guide-swatch.spec.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/guide-swatch.spec.ts:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6ab7f5b0966057a", "name": "Stray `console.log` in TS/JS \u2014 e2e/bug-text-shrink-rotate.spec.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/bug-text-shrink-rotate.spec.ts:99"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7580a1e37153711f", "name": "Stray `console.log` in TS/JS \u2014 e2e/memory-profile.spec.ts:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/memory-profile.spec.ts:148"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e351599576a941af", "name": "Stray `console.log` in TS/JS \u2014 e2e/text-rotation.spec.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-rotation.spec.ts:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d91849bb247c628b", "name": "Stray `console.log` in TS/JS \u2014 e2e/group-adj-perf.spec.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/group-adj-perf.spec.ts:115"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9650d3e6779872f", "name": "Stray `console.log` in TS/JS \u2014 e2e/layer-memory.spec.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/layer-memory.spec.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c38d38b5f4db2c3e", "name": "Stray `console.log` in TS/JS \u2014 e2e/text-selection-merge.spec.ts:187", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-selection-merge.spec.ts:187"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0ec94588d35d45d", "name": "Stray `console.log` in TS/JS \u2014 e2e/transform.spec.ts:246", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/transform.spec.ts:246"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8df498543ae5b66", "name": "Stray `console.log` in TS/JS \u2014 e2e/photo-filter-group.spec.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/photo-filter-group.spec.ts:137"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4da680f21b43da96", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-soft-overlap.spec.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-soft-overlap.spec.ts:123"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15b7e6e3bfe4ebb5", "name": "Stray `console.log` in TS/JS \u2014 e2e/raf-compare.spec.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/raf-compare.spec.ts:61"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e7dfc6c0b51eb50", "name": "Stray `console.log` in TS/JS \u2014 e2e/transform-stretch-clipping.spec.ts:208", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/transform-stretch-clipping.spec.ts:208"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e06a12b7368e6e32", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-jitter-texture.spec.ts:215", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-jitter-texture.spec.ts:215"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-11890e88af0bf0d0", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-taper-shift.spec.ts:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-taper-shift.spec.ts:149"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c53284177c334c7", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-opacity-range.spec.ts:187", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-opacity-range.spec.ts:187"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-617a564dae3a174a", "name": "Stray `console.log` in TS/JS \u2014 e2e/align-sequence.spec.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-sequence.spec.ts:114"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-986812b934f22ddf", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-hardness-bounds.spec.ts:202", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-hardness-bounds.spec.ts:202"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fe08a85e151ffcb", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf-1080.spec.ts:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf-1080.spec.ts:141"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3673f8575db5450a", "name": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf.spec.ts:202", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf.spec.ts:202"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ad6b79aa598e8ff", "name": "Stray `console.log` in TS/JS \u2014 e2e/shape-center-and-offedge.spec.ts:221", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/shape-center-and-offedge.spec.ts:221"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-117cf32a7d716623", "name": "Insecure pattern 'node_child_process' in scripts/generate-font-catalog.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/generate-font-catalog.ts:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6413c4c77205f7b8", "name": "Insecure pattern 'eval_used' in engine-rs/crates/lopsy-wasm/src/lib.rs:214", "shortDescription": {"text": "Insecure pattern 'eval_used' in engine-rs/crates/lopsy-wasm/src/lib.rs:214"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f186d56c4a8c411", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/NewDocumentModal/NewDocumentModal.tsx:295", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/NewDocumentModal/NewDocumentModal.tsx:295"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-afd797f0d09176bf", "name": "Insecure pattern 'new_function_used' in e2e/helpers.ts:23", "shortDescription": {"text": "Insecure pattern 'new_function_used' in e2e/helpers.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"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-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "cloudflare/wrangler-action@v3 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-d4f698dcefef5da8", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/cache@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": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6b84368588cdc2b", "name": "Very large file: engine-rs/crates/lopsy-wasm/src/compositor.rs (1844 lines)", "shortDescription": {"text": "Very large file: engine-rs/crates/lopsy-wasm/src/compositor.rs (1844 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-cca1c594ec73a42a", "name": "Very large file: engine-rs/crates/lopsy-wasm/src/layer_manager.rs (1622 lines)", "shortDescription": {"text": "Very large file: engine-rs/crates/lopsy-wasm/src/layer_manager.rs (1622 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-3236479e2dd1efad", "name": "Very large file: engine-rs/crates/lopsy-core/src/raf/mod.rs (1830 lines)", "shortDescription": {"text": "Very large file: engine-rs/crates/lopsy-core/src/raf/mod.rs (1830 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-602455594928b824", "name": "Very large file: src/utils/font-catalog.ts (1972 lines)", "shortDescription": {"text": "Very large file: src/utils/font-catalog.ts (1972 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-e7802365a8d60816", "name": "Very large file: e2e/rendering.spec.ts (4373 lines)", "shortDescription": {"text": "Very large file: e2e/rendering.spec.ts (4373 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-8d15780beddf0c5b", "name": "Very large file: e2e/tools.spec.ts (2184 lines)", "shortDescription": {"text": "Very large file: e2e/tools.spec.ts (2184 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-f61600bc9ee2dae1", "name": "Very large file: e2e/transform.spec.ts (1275 lines)", "shortDescription": {"text": "Very large file: e2e/transform.spec.ts (1275 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "133 tests / 658 src (ratio 0.20)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 56 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 18 placeholder/mock markers across 11 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b2e6d5af9943b5d", "name": "Agent authority lacks a verifier contract: .claude/skills/random/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/random/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1177c7e63f3b2b3c", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/compare_raf.py:23", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/compare_raf.py:23"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc0b996eea3b7558", "name": "Commented-code block (5 lines) in scripts/check-pixel-debt.mjs:78", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check-pixel-debt.mjs:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d827ee5ccfb0796a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-font-catalog.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-font-catalog.ts:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b0f2fe79e9e3bdcb", "name": "Commented-code block (5 lines) in src/layers/layer-model.test.ts:43", "shortDescription": {"text": "Commented-code block (5 lines) in src/layers/layer-model.test.ts:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b7317369edb68a65", "name": "Commented-code block (5 lines) in src/layers/layer-model.ts:77", "shortDescription": {"text": "Commented-code block (5 lines) in src/layers/layer-model.ts:77"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c784e825355a4959", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/font-loader.ts:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/font-loader.ts:111"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b35bdfd59627b7fe", "name": "Commented-code block (6 lines) in src/app/useCanvasInteraction.ts:177", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/useCanvasInteraction.ts:177"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac7337ef18c61b7f", "name": "Commented-code block (5 lines) in src/app/useKeyboardShortcuts.ts:264", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/useKeyboardShortcuts.ts:264"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cef951c5f06316bb", "name": "Commented-code block (5 lines) in src/app/tool-settings-store.ts:24", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/tool-settings-store.ts:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68591399c1279272", "name": "Commented-code block (5 lines) in src/app/useCanvasRendering.ts:90", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/useCanvasRendering.ts:90"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53c0a1eaab8884e1", "name": "Commented-code block (5 lines) in src/app/rendering/render-grid.test.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/rendering/render-grid.test.ts:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef7c305fcd1e52f3", "name": "Commented-code block (5 lines) in src/app/interactions/transform-handlers.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/interactions/transform-handlers.ts:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20a57d3b4dea87de", "name": "Commented-code block (5 lines) in src/app/hooks/useCanvasPointerHandlers.ts:194", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/hooks/useCanvasPointerHandlers.ts:194"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9ad6adc1f2fee67", "name": "Commented-code block (5 lines) in src/app/store/pixel-data-slice.ts:183", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/store/pixel-data-slice.ts:183"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e8517d01069d563c", "name": "Commented-code block (5 lines) in src/app/store/actions/resize-image.ts:24", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/store/actions/resize-image.ts:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e03db85f84ccaf67", "name": "Commented-code block (5 lines) in src/io/dng.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in src/io/dng.ts:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0b79cb2186b77ee", "name": "Commented-code block (8 lines) in src/tools/brush/brush-from-selection.test.ts:151", "shortDescription": {"text": "Commented-code block (8 lines) in src/tools/brush/brush-from-selection.test.ts:151"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-062f1e59e4fb36e3", "name": "Commented-code block (5 lines) in src/tools/gradient/gradient-interaction.ts:67", "shortDescription": {"text": "Commented-code block (5 lines) in src/tools/gradient/gradient-interaction.ts:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-803ffd18d61278dc", "name": "Commented-code block (6 lines) in src/tools/path/boolean-ops.test.ts:135", "shortDescription": {"text": "Commented-code block (6 lines) in src/tools/path/boolean-ops.test.ts:135"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ca5f4e1e0ab4117", "name": "Commented-code block (7 lines) in src/tools/crop/perspective-crop.ts:50", "shortDescription": {"text": "Commented-code block (7 lines) in src/tools/crop/perspective-crop.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87c544d727aee9d2", "name": "Commented-code block (5 lines) in src/engine/bitmap-cache.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in src/engine/bitmap-cache.ts:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d705020f64ae0fa", "name": "Commented-code block (5 lines) in src/engine/pixel-data-manager.test.ts:80", "shortDescription": {"text": "Commented-code block (5 lines) in src/engine/pixel-data-manager.test.ts:80"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9109c80137601f5", "name": "Commented-code block (6 lines) in src/selection/selection.ts:308", "shortDescription": {"text": "Commented-code block (6 lines) in src/selection/selection.ts:308"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-139790a372b641df", "name": "Commented-code block (6 lines) in src/engine-wasm/engine-sync.test.ts:423", "shortDescription": {"text": "Commented-code block (6 lines) in src/engine-wasm/engine-sync.test.ts:423"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8242e6514e3e94e5", "name": "Legacy-named symbol `migrateFromLegacy` in src/filters/adjustment-node-utils.test.ts:2", "shortDescription": {"text": "Legacy-named symbol `migrateFromLegacy` in src/filters/adjustment-node-utils.test.ts:2"}, "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-b802979b0b0b3c27", "name": "Legacy-named symbol `migrateFromLegacy` in src/filters/adjustment-node-utils.ts:17", "shortDescription": {"text": "Legacy-named symbol `migrateFromLegacy` in src/filters/adjustment-node-utils.ts:17"}, "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-1ae34a02034174f5", "name": "Commented-code block (6 lines) in e2e/rendering.spec.ts:3394", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/rendering.spec.ts:3394"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2de04fe94ce4470", "name": "Commented-code block (5 lines) in e2e/grid-slider.spec.ts:86", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/grid-slider.spec.ts:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-467590db641895ed", "name": "Commented-code block (5 lines) in e2e/align-then-stroke-scale.spec.ts:151", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/align-then-stroke-scale.spec.ts:151"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b37dec4960321536", "name": "Commented-code block (8 lines) in e2e/option-drag-duplicate.spec.ts:95", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/option-drag-duplicate.spec.ts:95"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f730db66c5b4fb38", "name": "Commented-code block (8 lines) in e2e/bug-repro-selection-fill.spec.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/bug-repro-selection-fill.spec.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9301a6f1f7b6ba1", "name": "Commented-code block (6 lines) in e2e/bug-repro-262-text-tab-commit.spec.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/bug-repro-262-text-tab-commit.spec.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be9393f2f367d7d5", "name": "Commented-code block (6 lines) in e2e/cut-paste-position.spec.ts:195", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/cut-paste-position.spec.ts:195"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c41c8f01461b6a23", "name": "Commented-code block (5 lines) in e2e/selection-coordinates.spec.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/selection-coordinates.spec.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f1dea521c41da9d", "name": "Commented-code block (5 lines) in e2e/guide-color-picker-click.spec.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/guide-color-picker-click.spec.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3da9de650a92e200", "name": "Commented-code block (8 lines) in e2e/bug-repro-233-text-tool.spec.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/bug-repro-233-text-tool.spec.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc2b728db90e93a5", "name": "Commented-code block (8 lines) in e2e/shape-tool.spec.ts:286", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/shape-tool.spec.ts:286"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b832fa03037533da", "name": "Commented-code block (6 lines) in e2e/export-adjustments.spec.ts:136", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/export-adjustments.spec.ts:136"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b872bca47e493a80", "name": "Commented-code block (5 lines) in e2e/filter-bounds-bug.spec.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/filter-bounds-bug.spec.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-608092c0ab5808ff", "name": "Commented-code block (9 lines) in e2e/align-then-brush.spec.ts:4", "shortDescription": {"text": "Commented-code block (9 lines) in e2e/align-then-brush.spec.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-240a820e3aa105be", "name": "Commented-code block (6 lines) in e2e/bug-text-shrink-rotate.spec.ts:265", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/bug-text-shrink-rotate.spec.ts:265"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34859d362e3d61ee", "name": "Commented-code block (5 lines) in e2e/smudge-bounds-bug.spec.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/smudge-bounds-bug.spec.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc392fdd83d14159", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/export-transparency.spec.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/export-transparency.spec.ts:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67200623673190fa", "name": "Legacy-named symbol `nodesToLegacy` in e2e/group-adj-perf.spec.ts:137", "shortDescription": {"text": "Legacy-named symbol `nodesToLegacy` in e2e/group-adj-perf.spec.ts:137"}, "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-b6e594a8f5e241e9", "name": "Commented-code block (5 lines) in e2e/magnetic-lasso.spec.ts:245", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/magnetic-lasso.spec.ts:245"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b5d51ade6271682", "name": "Commented-code block (5 lines) in e2e/undo-effect-position.spec.ts:148", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/undo-effect-position.spec.ts:148"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a3f78421d7988d1", "name": "Commented-code block (5 lines) in e2e/pixel-grid.spec.ts:117", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/pixel-grid.spec.ts:117"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-887ce8c911afbd44", "name": "Commented-code block (5 lines) in e2e/transform-stretch-clipping.spec.ts:185", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/transform-stretch-clipping.spec.ts:185"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7dfa02e61c3a376", "name": "Commented-code block (5 lines) in e2e/brush-jitter-texture.spec.ts:175", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/brush-jitter-texture.spec.ts:175"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db29ad65dfd5e18b", "name": "Commented-code block (5 lines) in e2e/bug-repro-multi-cut.spec.ts:130", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/bug-repro-multi-cut.spec.ts:130"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c6d3275aced3d8c", "name": "Legacy-named symbol `darkAtOld` in e2e/text-move-duplicate.spec.ts:347", "shortDescription": {"text": "Legacy-named symbol `darkAtOld` in e2e/text-move-duplicate.spec.ts:347"}, "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-b82e24ba860b5eae", "name": "Commented-code block (7 lines) in e2e/pixelate-filter.spec.ts:65", "shortDescription": {"text": "Commented-code block (7 lines) in e2e/pixelate-filter.spec.ts:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-332e6b7201449379", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/external-paste-drop.spec.ts:161", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/external-paste-drop.spec.ts:161"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e15ea8926c80e84b", "name": "Commented-code block (5 lines) in e2e/brush-hardness-bounds.spec.ts:170", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/brush-hardness-bounds.spec.ts:170"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61430752d098ea69", "name": "Commented-code block (8 lines) in e2e/move-layer.spec.ts:300", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/move-layer.spec.ts:300"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e821aa4b22fe65c", "name": "Commented-code block (5 lines) in e2e/rounded-corners.spec.ts:135", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/rounded-corners.spec.ts:135"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21167"}, "properties": {"repository": "theseamusjames/lopsy.art", "repoUrl": "https://github.com/theseamusjames/lopsy.art", "branch": "main"}, "results": [{"ruleId": "scanner-e7c92de7716dceae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-font-catalog.ts:72"}, "properties": {"repobilityId": "2a76d39c42235a7a", "scanner": "scanner-primary", "fingerprint": "e7c92de7716dceae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-951b58692e641dbe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/AboutModal/AboutModal.stories.tsx:13"}, "properties": {"repobilityId": "d2db75d3a945778a", "scanner": "scanner-primary", "fingerprint": "951b58692e641dbe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e043e5c2ece4c0d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/NewDocumentModal/NewDocumentModal.tsx:295"}, "properties": {"repobilityId": "aa266a9da74c1684", "scanner": "scanner-primary", "fingerprint": "2e043e5c2ece4c0d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-48fcd1651c137ed1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/NewDocumentModal/NewDocumentModal.stories.tsx:8"}, "properties": {"repobilityId": "54953f0c1e37129c", "scanner": "scanner-primary", "fingerprint": "48fcd1651c137ed1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ccc5d08a8ad51b77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ColorLutDialog/ColorLutDialog.stories.tsx:14"}, "properties": {"repobilityId": "5e13df1ddd9853f8", "scanner": "scanner-primary", "fingerprint": "ccc5d08a8ad51b77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb3ee0c965e55284", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ExportDialog/ExportDialog.stories.tsx:8"}, "properties": {"repobilityId": "833c799cc5cb389e", "scanner": "scanner-primary", "fingerprint": "fb3ee0c965e55284", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd7a0d8ade0d0af6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ContextMenu/ContextMenu.stories.tsx:13"}, "properties": {"repobilityId": "6ff8ff1623df03b3", "scanner": "scanner-primary", "fingerprint": "cd7a0d8ade0d0af6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6f988b8aacddca7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/FilterDialog/NoiseDialog.stories.tsx:15"}, "properties": {"repobilityId": "9fe487df1b517abe", "scanner": "scanner-primary", "fingerprint": "f6f988b8aacddca7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13249c5f50d87640", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/FilterDialog/FilterDialog.stories.tsx:8"}, "properties": {"repobilityId": "113019c0e1a039c4", "scanner": "scanner-primary", "fingerprint": "13249c5f50d87640", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f872fbd7a7cae87e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/CanvasSizeModal/CanvasSizeModal.stories.tsx:13"}, "properties": {"repobilityId": "11f8fb4a7e1951e5", "scanner": "scanner-primary", "fingerprint": "f872fbd7a7cae87e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-50b12c2e297b5523", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PatternFillDialog/PatternFillDialog.stories.tsx:14"}, "properties": {"repobilityId": "654cd182a963264b", "scanner": "scanner-primary", "fingerprint": "50b12c2e297b5523", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55f5bee588ed8ad2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ImageSizeModal/ImageSizeModal.stories.tsx:13"}, "properties": {"repobilityId": "0a2783296ff4be74", "scanner": "scanner-primary", "fingerprint": "55f5bee588ed8ad2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cb9ab3a8a05eab3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/KeyboardShortcutsModal/KeyboardShortcutsModal.stories.tsx:13"}, "properties": {"repobilityId": "f919e7a9edf1c5c6", "scanner": "scanner-primary", "fingerprint": "5cb9ab3a8a05eab3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d7c612a4e3694c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/GradientModal/GradientModal.stories.tsx:13"}, "properties": {"repobilityId": "ee45d9370b694321", "scanner": "scanner-primary", "fingerprint": "1d7c612a4e3694c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4fe8d7f80330d74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ShapeSizeModal/ShapeSizeModal.stories.tsx:14"}, "properties": {"repobilityId": "445958eb3af72e30", "scanner": "scanner-primary", "fingerprint": "d4fe8d7f80330d74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1023aa768e0ebbbf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/panels/AdjustmentsPanel/LevelsEditor.stories.tsx:34"}, "properties": {"repobilityId": "46ba01a1352feeac", "scanner": "scanner-primary", "fingerprint": "1023aa768e0ebbbf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77bfb21f90c2db4e", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/panels/AdjustmentsPanel/AdjustmentsPanel.tsx:281"}, "properties": {"repobilityId": "fa9986985850e49d", "scanner": "scanner-primary", "fingerprint": "77bfb21f90c2db4e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-f813be2b9c3572f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/stroke-effect-live.spec.ts:149"}, "properties": {"repobilityId": "c15331588540f2be", "scanner": "scanner-primary", "fingerprint": "f813be2b9c3572f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-123bb3c6f7ef44a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/rendering.spec.ts:62"}, "properties": {"repobilityId": "9ab924e69c4c21ea", "scanner": "scanner-primary", "fingerprint": "123bb3c6f7ef44a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ffba0725a26515d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-then-stroke-scale.spec.ts:133"}, "properties": {"repobilityId": "d0770f67110819f1", "scanner": "scanner-primary", "fingerprint": "ffba0725a26515d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c022ed7653bde05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-fade.spec.ts:149"}, "properties": {"repobilityId": "f5bebac24c8c03e7", "scanner": "scanner-primary", "fingerprint": "2c022ed7653bde05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d55ac8493c385bf7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-undo.spec.ts:62"}, "properties": {"repobilityId": "dd8744d64a138c4d", "scanner": "scanner-primary", "fingerprint": "d55ac8493c385bf7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb69b7c399ef3a72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/memory-retouch-session.spec.ts:193"}, "properties": {"repobilityId": "225afe174bd11318", "scanner": "scanner-primary", "fingerprint": "cb69b7c399ef3a72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e71233693731b117", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/dng-import.spec.ts:47"}, "properties": {"repobilityId": "381da1043cf4ea5d", "scanner": "scanner-primary", "fingerprint": "e71233693731b117", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-12f1f9338ce05f9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/raf-import.spec.ts:50"}, "properties": {"repobilityId": "c6d4eb76bedd3edc", "scanner": "scanner-primary", "fingerprint": "12f1f9338ce05f9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d38912d05ce82a5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/layer-memory-realistic.spec.ts:32"}, "properties": {"repobilityId": "efdcefff79f439fc", "scanner": "scanner-primary", "fingerprint": "d38912d05ce82a5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6227f121351f03ce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-fill.spec.ts:105"}, "properties": {"repobilityId": "39b197581f895948", "scanner": "scanner-primary", "fingerprint": "6227f121351f03ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4394f231a2c2ff5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-brush.spec.ts:126"}, "properties": {"repobilityId": "dfaffa8b80554eb1", "scanner": "scanner-primary", "fingerprint": "4394f231a2c2ff5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4b91193a196751eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/inner-stroke-large.spec.ts:56"}, "properties": {"repobilityId": "3ef2f17f8ba97312", "scanner": "scanner-primary", "fingerprint": "4b91193a196751eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae84160f443c8831", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-curve-quality.spec.ts:206"}, "properties": {"repobilityId": "0d8902214c6b4e3a", "scanner": "scanner-primary", "fingerprint": "ae84160f443c8831", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-65120a2c80d4d879", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/tools.spec.ts:2100"}, "properties": {"repobilityId": "eb736ee544adce81", "scanner": "scanner-primary", "fingerprint": "65120a2c80d4d879", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ae9241d3b5f4e41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf-6k.spec.ts:246"}, "properties": {"repobilityId": "a3023b57886e51a0", "scanner": "scanner-primary", "fingerprint": "8ae9241d3b5f4e41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f45949b9d4bd86a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-shift-click.spec.ts:109"}, "properties": {"repobilityId": "c0a3687c4721cefa", "scanner": "scanner-primary", "fingerprint": "f45949b9d4bd86a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45a97db1313c17bd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-then-brush.spec.ts:164"}, "properties": {"repobilityId": "f7c3b5ac6cd05267", "scanner": "scanner-primary", "fingerprint": "45a97db1313c17bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd569a977690e562", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/guide-swatch.spec.ts:57"}, "properties": {"repobilityId": "af791eb4d599576e", "scanner": "scanner-primary", "fingerprint": "fd569a977690e562", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6ab7f5b0966057a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/bug-text-shrink-rotate.spec.ts:99"}, "properties": {"repobilityId": "56538101ba72731b", "scanner": "scanner-primary", "fingerprint": "c6ab7f5b0966057a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7580a1e37153711f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/memory-profile.spec.ts:148"}, "properties": {"repobilityId": "d293f37a4c9debba", "scanner": "scanner-primary", "fingerprint": "7580a1e37153711f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e351599576a941af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-rotation.spec.ts:57"}, "properties": {"repobilityId": "3e25c3309b187f07", "scanner": "scanner-primary", "fingerprint": "e351599576a941af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d91849bb247c628b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/group-adj-perf.spec.ts:115"}, "properties": {"repobilityId": "c07d1cb6ea479ded", "scanner": "scanner-primary", "fingerprint": "d91849bb247c628b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9650d3e6779872f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/layer-memory.spec.ts:44"}, "properties": {"repobilityId": "5e68726577d5db9e", "scanner": "scanner-primary", "fingerprint": "c9650d3e6779872f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c38d38b5f4db2c3e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/text-selection-merge.spec.ts:187"}, "properties": {"repobilityId": "0de65b1b5a5435a6", "scanner": "scanner-primary", "fingerprint": "c38d38b5f4db2c3e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0ec94588d35d45d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/transform.spec.ts:246"}, "properties": {"repobilityId": "787582e949156517", "scanner": "scanner-primary", "fingerprint": "c0ec94588d35d45d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8df498543ae5b66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/photo-filter-group.spec.ts:137"}, "properties": {"repobilityId": "5487865859b6eacf", "scanner": "scanner-primary", "fingerprint": "f8df498543ae5b66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4da680f21b43da96", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-soft-overlap.spec.ts:123"}, "properties": {"repobilityId": "8d25fef282b63b37", "scanner": "scanner-primary", "fingerprint": "4da680f21b43da96", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15b7e6e3bfe4ebb5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/raf-compare.spec.ts:61"}, "properties": {"repobilityId": "35af22b0cf1e82c6", "scanner": "scanner-primary", "fingerprint": "15b7e6e3bfe4ebb5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e7dfc6c0b51eb50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/transform-stretch-clipping.spec.ts:208"}, "properties": {"repobilityId": "62a5c9c3229252c0", "scanner": "scanner-primary", "fingerprint": "8e7dfc6c0b51eb50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e06a12b7368e6e32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-jitter-texture.spec.ts:215"}, "properties": {"repobilityId": "de18eefe0dea3242", "scanner": "scanner-primary", "fingerprint": "e06a12b7368e6e32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11890e88af0bf0d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-taper-shift.spec.ts:149"}, "properties": {"repobilityId": "b69b3237c9d671f6", "scanner": "scanner-primary", "fingerprint": "11890e88af0bf0d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c53284177c334c7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-opacity-range.spec.ts:187"}, "properties": {"repobilityId": "e569162b0997cc09", "scanner": "scanner-primary", "fingerprint": "4c53284177c334c7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-617a564dae3a174a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/align-sequence.spec.ts:114"}, "properties": {"repobilityId": "06356fa40f3a4eeb", "scanner": "scanner-primary", "fingerprint": "617a564dae3a174a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-986812b934f22ddf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-hardness-bounds.spec.ts:202"}, "properties": {"repobilityId": "d2e0f679391fbde2", "scanner": "scanner-primary", "fingerprint": "986812b934f22ddf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1fe08a85e151ffcb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf-1080.spec.ts:141"}, "properties": {"repobilityId": "443b87efcc7c66d4", "scanner": "scanner-primary", "fingerprint": "1fe08a85e151ffcb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3673f8575db5450a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/brush-perf.spec.ts:202"}, "properties": {"repobilityId": "58098d755d47b231", "scanner": "scanner-primary", "fingerprint": "3673f8575db5450a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ad6b79aa598e8ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/shape-center-and-offedge.spec.ts:221"}, "properties": {"repobilityId": "0ca5418a907a3193", "scanner": "scanner-primary", "fingerprint": "2ad6b79aa598e8ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-117cf32a7d716623", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/generate-font-catalog.ts:8"}, "properties": {"repobilityId": "b140b79f1d15e7ad", "scanner": "scanner-primary", "fingerprint": "117cf32a7d716623", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate-font-catalog.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-6413c4c77205f7b8", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in engine-rs/crates/lopsy-wasm/src/lib.rs:214"}, "properties": {"repobilityId": "50b7bed76e771004", "scanner": "scanner-primary", "fingerprint": "6413c4c77205f7b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "engine-rs/crates/lopsy-wasm/src/lib.rs"}, "region": {"startLine": 214}}}]}, {"ruleId": "scanner-0f186d56c4a8c411", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/NewDocumentModal/NewDocumentModal.tsx:295"}, "properties": {"repobilityId": "54c01596edb57b18", "scanner": "scanner-primary", "fingerprint": "0f186d56c4a8c411", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/NewDocumentModal/NewDocumentModal.tsx"}, "region": {"startLine": 295}}}]}, {"ruleId": "scanner-afd797f0d09176bf", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in e2e/helpers.ts:23"}, "properties": {"repobilityId": "37dff8800a7d0a09", "scanner": "scanner-primary", "fingerprint": "afd797f0d09176bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/helpers.ts"}, "region": {"startLine": 23}}}]}, {"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-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "09a60410de7f2c23", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "09a60410de7f2c23", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c14f4d4b6fc0d3a8", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c14f4d4b6fc0d3a8", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ea94ab637fb20a99", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7fce599f28e27068", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7fce599f28e27068", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7fce599f28e27068", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a6b84368588cdc2b", "level": "note", "message": {"text": "Very large file: engine-rs/crates/lopsy-wasm/src/compositor.rs (1844 lines)"}, "properties": {"repobilityId": "dc2cf89c833255ea", "scanner": "scanner-primary", "fingerprint": "a6b84368588cdc2b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cca1c594ec73a42a", "level": "note", "message": {"text": "Very large file: engine-rs/crates/lopsy-wasm/src/layer_manager.rs (1622 lines)"}, "properties": {"repobilityId": "2df2951ce2f2860d", "scanner": "scanner-primary", "fingerprint": "cca1c594ec73a42a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3236479e2dd1efad", "level": "note", "message": {"text": "Very large file: engine-rs/crates/lopsy-core/src/raf/mod.rs (1830 lines)"}, "properties": {"repobilityId": "d99d951240b6a8ad", "scanner": "scanner-primary", "fingerprint": "3236479e2dd1efad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-602455594928b824", "level": "note", "message": {"text": "Very large file: src/utils/font-catalog.ts (1972 lines)"}, "properties": {"repobilityId": "5391806ca3014f9f", "scanner": "scanner-primary", "fingerprint": "602455594928b824", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e7802365a8d60816", "level": "note", "message": {"text": "Very large file: e2e/rendering.spec.ts (4373 lines)"}, "properties": {"repobilityId": "61aba56de8643f7c", "scanner": "scanner-primary", "fingerprint": "e7802365a8d60816", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8d15780beddf0c5b", "level": "note", "message": {"text": "Very large file: e2e/tools.spec.ts (2184 lines)"}, "properties": {"repobilityId": "56ff784bd23078a8", "scanner": "scanner-primary", "fingerprint": "8d15780beddf0c5b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f61600bc9ee2dae1", "level": "note", "message": {"text": "Very large file: e2e/transform.spec.ts (1275 lines)"}, "properties": {"repobilityId": "dbbc1b55cca6d080", "scanner": "scanner-primary", "fingerprint": "f61600bc9ee2dae1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "34a6ea316a66b791", "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": "94a1b7687a99499c", "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": "bcc51c8450fda9e2", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "6059b58f9747aabd", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "dea2a216a53b3ccb", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-6b2e6d5af9943b5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/random/SKILL.md"}, "properties": {"repobilityId": "c222c41a7818e7e1", "scanner": "scanner-primary", "fingerprint": "6b2e6d5af9943b5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/random/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-1177c7e63f3b2b3c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/compare_raf.py:23"}, "properties": {"repobilityId": "5314bb5e402222e9", "scanner": "scanner-primary", "fingerprint": "1177c7e63f3b2b3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc0b996eea3b7558", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check-pixel-debt.mjs:78"}, "properties": {"repobilityId": "f9bf523d9df44298", "scanner": "scanner-primary", "fingerprint": "fc0b996eea3b7558", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d827ee5ccfb0796a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-font-catalog.ts:73"}, "properties": {"repobilityId": "e901a7479e3da7d8", "scanner": "scanner-primary", "fingerprint": "d827ee5ccfb0796a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b0f2fe79e9e3bdcb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/layers/layer-model.test.ts:43"}, "properties": {"repobilityId": "d704f014a910ce12", "scanner": "scanner-primary", "fingerprint": "b0f2fe79e9e3bdcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7317369edb68a65", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/layers/layer-model.ts:77"}, "properties": {"repobilityId": "8e28cfaf3f62f4d1", "scanner": "scanner-primary", "fingerprint": "b7317369edb68a65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c784e825355a4959", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/font-loader.ts:111"}, "properties": {"repobilityId": "f5ebb5e66ce504fb", "scanner": "scanner-primary", "fingerprint": "c784e825355a4959", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b35bdfd59627b7fe", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/useCanvasInteraction.ts:177"}, "properties": {"repobilityId": "51552cbf47620a1e", "scanner": "scanner-primary", "fingerprint": "b35bdfd59627b7fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac7337ef18c61b7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/useKeyboardShortcuts.ts:264"}, "properties": {"repobilityId": "9e2d6f069f01ee98", "scanner": "scanner-primary", "fingerprint": "ac7337ef18c61b7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cef951c5f06316bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/tool-settings-store.ts:24"}, "properties": {"repobilityId": "6198c4b7b6f11c88", "scanner": "scanner-primary", "fingerprint": "cef951c5f06316bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68591399c1279272", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/useCanvasRendering.ts:90"}, "properties": {"repobilityId": "b7371a501a7740bb", "scanner": "scanner-primary", "fingerprint": "68591399c1279272", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53c0a1eaab8884e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/rendering/render-grid.test.ts:18"}, "properties": {"repobilityId": "5dc06e15836cebdb", "scanner": "scanner-primary", "fingerprint": "53c0a1eaab8884e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef7c305fcd1e52f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/interactions/transform-handlers.ts:64"}, "properties": {"repobilityId": "51e1718518433c87", "scanner": "scanner-primary", "fingerprint": "ef7c305fcd1e52f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20a57d3b4dea87de", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/hooks/useCanvasPointerHandlers.ts:194"}, "properties": {"repobilityId": "c7ea7ae1abd354b9", "scanner": "scanner-primary", "fingerprint": "20a57d3b4dea87de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9ad6adc1f2fee67", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/store/pixel-data-slice.ts:183"}, "properties": {"repobilityId": "7d4d384eb2407167", "scanner": "scanner-primary", "fingerprint": "f9ad6adc1f2fee67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8517d01069d563c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/store/actions/resize-image.ts:24"}, "properties": {"repobilityId": "c3454c9a56eb2e15", "scanner": "scanner-primary", "fingerprint": "e8517d01069d563c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e03db85f84ccaf67", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/io/dng.ts:79"}, "properties": {"repobilityId": "942ccb8758f7d022", "scanner": "scanner-primary", "fingerprint": "e03db85f84ccaf67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0b79cb2186b77ee", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/tools/brush/brush-from-selection.test.ts:151"}, "properties": {"repobilityId": "1521eaa49d314a85", "scanner": "scanner-primary", "fingerprint": "e0b79cb2186b77ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-062f1e59e4fb36e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/tools/gradient/gradient-interaction.ts:67"}, "properties": {"repobilityId": "68e0f51b1f341bd7", "scanner": "scanner-primary", "fingerprint": "062f1e59e4fb36e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-803ffd18d61278dc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/tools/path/boolean-ops.test.ts:135"}, "properties": {"repobilityId": "82dc6ebbbec35247", "scanner": "scanner-primary", "fingerprint": "803ffd18d61278dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ca5f4e1e0ab4117", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/tools/crop/perspective-crop.ts:50"}, "properties": {"repobilityId": "fb42d35c4b452b0c", "scanner": "scanner-primary", "fingerprint": "9ca5f4e1e0ab4117", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87c544d727aee9d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/engine/bitmap-cache.ts:18"}, "properties": {"repobilityId": "9eb215e7298397f6", "scanner": "scanner-primary", "fingerprint": "87c544d727aee9d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d705020f64ae0fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/engine/pixel-data-manager.test.ts:80"}, "properties": {"repobilityId": "94847dcb19fa02fb", "scanner": "scanner-primary", "fingerprint": "5d705020f64ae0fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9109c80137601f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/selection/selection.ts:308"}, "properties": {"repobilityId": "f2e63b3acbae9f20", "scanner": "scanner-primary", "fingerprint": "f9109c80137601f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-139790a372b641df", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/engine-wasm/engine-sync.test.ts:423"}, "properties": {"repobilityId": "65261913111e4228", "scanner": "scanner-primary", "fingerprint": "139790a372b641df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8242e6514e3e94e5", "level": "note", "message": {"text": "Legacy-named symbol `migrateFromLegacy` in src/filters/adjustment-node-utils.test.ts:2"}, "properties": {"repobilityId": "2b6e8eb3e7fe6930", "scanner": "scanner-primary", "fingerprint": "8242e6514e3e94e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b802979b0b0b3c27", "level": "note", "message": {"text": "Legacy-named symbol `migrateFromLegacy` in src/filters/adjustment-node-utils.ts:17"}, "properties": {"repobilityId": "19357a5cee1e9294", "scanner": "scanner-primary", "fingerprint": "b802979b0b0b3c27", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1ae34a02034174f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/rendering.spec.ts:3394"}, "properties": {"repobilityId": "72e17d5ccd2bd033", "scanner": "scanner-primary", "fingerprint": "1ae34a02034174f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2de04fe94ce4470", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/grid-slider.spec.ts:86"}, "properties": {"repobilityId": "4c9c21c3a5e4b7e4", "scanner": "scanner-primary", "fingerprint": "d2de04fe94ce4470", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-467590db641895ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/align-then-stroke-scale.spec.ts:151"}, "properties": {"repobilityId": "177b651f802c3ee0", "scanner": "scanner-primary", "fingerprint": "467590db641895ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b37dec4960321536", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/option-drag-duplicate.spec.ts:95"}, "properties": {"repobilityId": "8d88d16d5e21e872", "scanner": "scanner-primary", "fingerprint": "b37dec4960321536", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f730db66c5b4fb38", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/bug-repro-selection-fill.spec.ts:3"}, "properties": {"repobilityId": "a881d54e2c1d66ff", "scanner": "scanner-primary", "fingerprint": "f730db66c5b4fb38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9301a6f1f7b6ba1", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/bug-repro-262-text-tab-commit.spec.ts:1"}, "properties": {"repobilityId": "4d2f1342b24dd72b", "scanner": "scanner-primary", "fingerprint": "f9301a6f1f7b6ba1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be9393f2f367d7d5", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/cut-paste-position.spec.ts:195"}, "properties": {"repobilityId": "c962ba08023d0c87", "scanner": "scanner-primary", "fingerprint": "be9393f2f367d7d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c41c8f01461b6a23", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/selection-coordinates.spec.ts:34"}, "properties": {"repobilityId": "dee1c9b96b1ce486", "scanner": "scanner-primary", "fingerprint": "c41c8f01461b6a23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f1dea521c41da9d", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/guide-color-picker-click.spec.ts:3"}, "properties": {"repobilityId": "e1096ce6888dd945", "scanner": "scanner-primary", "fingerprint": "0f1dea521c41da9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3da9de650a92e200", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/bug-repro-233-text-tool.spec.ts:1"}, "properties": {"repobilityId": "4b143d76d23e1258", "scanner": "scanner-primary", "fingerprint": "3da9de650a92e200", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc2b728db90e93a5", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/shape-tool.spec.ts:286"}, "properties": {"repobilityId": "c6a4b5909bab38be", "scanner": "scanner-primary", "fingerprint": "bc2b728db90e93a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b832fa03037533da", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/export-adjustments.spec.ts:136"}, "properties": {"repobilityId": "9f49c94c5f1a5796", "scanner": "scanner-primary", "fingerprint": "b832fa03037533da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b872bca47e493a80", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/filter-bounds-bug.spec.ts:1"}, "properties": {"repobilityId": "8dd064ae6c55d719", "scanner": "scanner-primary", "fingerprint": "b872bca47e493a80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-608092c0ab5808ff", "level": "none", "message": {"text": "Commented-code block (9 lines) in e2e/align-then-brush.spec.ts:4"}, "properties": {"repobilityId": "664d1e20bad9afed", "scanner": "scanner-primary", "fingerprint": "608092c0ab5808ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-240a820e3aa105be", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/bug-text-shrink-rotate.spec.ts:265"}, "properties": {"repobilityId": "1e7b83c7df0d854a", "scanner": "scanner-primary", "fingerprint": "240a820e3aa105be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34859d362e3d61ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/smudge-bounds-bug.spec.ts:1"}, "properties": {"repobilityId": "746a10d133fcf94d", "scanner": "scanner-primary", "fingerprint": "34859d362e3d61ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc392fdd83d14159", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/export-transparency.spec.ts:48"}, "properties": {"repobilityId": "98ecd48f773fcda3", "scanner": "scanner-primary", "fingerprint": "cc392fdd83d14159", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67200623673190fa", "level": "note", "message": {"text": "Legacy-named symbol `nodesToLegacy` in e2e/group-adj-perf.spec.ts:137"}, "properties": {"repobilityId": "cd0a0ce8200e7227", "scanner": "scanner-primary", "fingerprint": "67200623673190fa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b6e594a8f5e241e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/magnetic-lasso.spec.ts:245"}, "properties": {"repobilityId": "11217e6066b4871f", "scanner": "scanner-primary", "fingerprint": "b6e594a8f5e241e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b5d51ade6271682", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/undo-effect-position.spec.ts:148"}, "properties": {"repobilityId": "3f0cdf29475ef55c", "scanner": "scanner-primary", "fingerprint": "7b5d51ade6271682", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a3f78421d7988d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/pixel-grid.spec.ts:117"}, "properties": {"repobilityId": "9b20f2eec80ecade", "scanner": "scanner-primary", "fingerprint": "8a3f78421d7988d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-887ce8c911afbd44", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/transform-stretch-clipping.spec.ts:185"}, "properties": {"repobilityId": "572829e6480ccd66", "scanner": "scanner-primary", "fingerprint": "887ce8c911afbd44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7dfa02e61c3a376", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/brush-jitter-texture.spec.ts:175"}, "properties": {"repobilityId": "8e82d4bcac6aa400", "scanner": "scanner-primary", "fingerprint": "a7dfa02e61c3a376", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db29ad65dfd5e18b", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/bug-repro-multi-cut.spec.ts:130"}, "properties": {"repobilityId": "8ba476a15fff9c8f", "scanner": "scanner-primary", "fingerprint": "db29ad65dfd5e18b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c6d3275aced3d8c", "level": "note", "message": {"text": "Legacy-named symbol `darkAtOld` in e2e/text-move-duplicate.spec.ts:347"}, "properties": {"repobilityId": "6386ad569e01c34c", "scanner": "scanner-primary", "fingerprint": "1c6d3275aced3d8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b82e24ba860b5eae", "level": "none", "message": {"text": "Commented-code block (7 lines) in e2e/pixelate-filter.spec.ts:65"}, "properties": {"repobilityId": "9a90c582ac4bf9b3", "scanner": "scanner-primary", "fingerprint": "b82e24ba860b5eae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-332e6b7201449379", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/external-paste-drop.spec.ts:161"}, "properties": {"repobilityId": "0e7afd4aec551e04", "scanner": "scanner-primary", "fingerprint": "332e6b7201449379", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e15ea8926c80e84b", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/brush-hardness-bounds.spec.ts:170"}, "properties": {"repobilityId": "b33b40b392cb8703", "scanner": "scanner-primary", "fingerprint": "e15ea8926c80e84b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61430752d098ea69", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/move-layer.spec.ts:300"}, "properties": {"repobilityId": "e26917a793316fa9", "scanner": "scanner-primary", "fingerprint": "61430752d098ea69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e821aa4b22fe65c", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/rounded-corners.spec.ts:135"}, "properties": {"repobilityId": "9f1c679f18bf181e", "scanner": "scanner-primary", "fingerprint": "2e821aa4b22fe65c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}