{"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-a9b62b831cb4c259", "name": "Possibly dead Python function: include_object", "shortDescription": {"text": "Possibly dead Python function: include_object"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1215426fa451aa99", "name": "Possibly dead Python function: include_name", "shortDescription": {"text": "Possibly dead Python function: include_name"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7e9ff2751b0b158", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46342a48a952be9f", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a30f1095355b9d3", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb21f717885c2100", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86bab9de586c4ca5", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6c0627e1f8acd2de", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-988142e3a8f77f34", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd9982838bdbe7f3", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e44c28bbca24b6d1", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-099f607e18947a53", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edaf9198c0055332", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70a491a003a56a28", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c88ff697ab6de0d8", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f27a00582e59744a", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0e7661c6ea4d236", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76d1fa914b123f72", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2df65bf27f60b8c1", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f09ef6f48e278ad", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec00ca96f5ad5e7b", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d382c17c0c0ca33f", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ec3bd9db684b7f5", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff5f101a73f2fca6", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a7b9657c092784c", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ecd9897f350218c", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b45261661b2cbfb", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30bbe8c368944c22", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-851255e7643f7bd5", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d94b31a41e27cf10", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-975715e4bf6fc2bb", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-mobile/scripts/reset-project.js:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-mobile/scripts/reset-project.js:55"}, "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-c1ee3ce8f0545b60", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-mobile/src/app/(auth)/login.tsx:335", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-mobile/src/app/(auth)/login.tsx:335"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-910f19a35ced1087", "name": "Stray `console.log` in TS/JS \u2014 k6/scripts/verify-config.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 k6/scripts/verify-config.js:19"}, "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-20ccd6076df15da8", "name": "Stray `console.log` in TS/JS \u2014 k6/scenarios/dashboard.js:253", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 k6/scenarios/dashboard.js:253"}, "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-a4019232a5952511", "name": "Stray `console.log` in TS/JS \u2014 k6/scenarios/auth.js:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 k6/scenarios/auth.js:145"}, "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-e86116f905a00a4c", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/vite.config.ts:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/vite.config.ts:140"}, "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-90d3435375dc87b0", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts:131"}, "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-0e045ff5d2e72315", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/premium-badge.spec.ts:125", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/premium-badge.spec.ts:125"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6544f4ac4c7fd069", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/card-audio-playback.spec.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/card-audio-playback.spec.ts:131"}, "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-6c3a8f79ad5631a9", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/admin-decks.spec.ts:74", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/admin-decks.spec.ts:74"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc81e713e75e30ab", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/changelog.spec.ts:182", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/changelog.spec.ts:182"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1008e619c51d4efd", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/card-error-reporting.spec.ts:328", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/card-error-reporting.spec.ts:328"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-931d50a3c1e53219", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/card-error-reporting.spec.ts:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/card-error-reporting.spec.ts:154"}, "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-9dd2138de0f6a352", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/analytics.spec.ts:20", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/analytics.spec.ts:20"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fee1264e1376fcbb", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/gamification-immediate-toast.spec.ts:188", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/gamification-immediate-toast.spec.ts:188"}, "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-c386532911771024", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/my-decks.spec.ts:237", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/my-decks.spec.ts:237"}, "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-67198193f5806c00", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/auth.setup.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/auth.setup.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-bdb83e5f37cfb26f", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/lcp-baseline.spec.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/lcp-baseline.spec.ts:117"}, "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-4aeff749573bb184", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/i18n/admin-translations.spec.ts:16", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/i18n/admin-translations.spec.ts:16"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b11240a66ae934a", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/auth/logout.spec.ts:34", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/auth/logout.spec.ts:34"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d8c3f1ff95ceff3", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/helpers/auth-helpers.ts:191", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/helpers/auth-helpers.ts:191"}, "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-2e7c740164ffe5aa", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/helpers/diagnostics.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/helpers/diagnostics.ts:19"}, "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-5e56304af3c9b2b1", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/stores/adminCardErrorStore.ts:112", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/stores/adminCardErrorStore.ts:112"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5db37b8042bf4f09", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/analytics/ActivityFeedItem", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/analytics/ActivityFeedItem.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b7accc7a915c7acc", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/review/grammar/TenseTabs.tsx:37", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/review/grammar/TenseTabs.tsx:37"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40a007419ad42c99", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/decks/DeckSelectorModal.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/decks/DeckSelectorModal.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77643a0f4abcfde0", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/decks/DeckCard.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/decks/DeckCard.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1c190c155acfc5c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 learn-greek-easy-frontend/src/components/ui/chart.tsx:77", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 learn-greek-easy-frontend/src/components/ui/chart.tsx:77"}, "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-f34ae5225c2d4f66", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/DeckDetailModal.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/DeckDetailModal.tsx:943"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4be32c60e0e48709", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/AdminCardErrorCard.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/AdminCardErrorCard.tsx:197"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-970cf96ea2c21e52", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/admin/CardErrorDrawer.tsx:33", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/admin/CardErrorDrawer.tsx:33"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95329b3c8074e54b", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/UnifiedVerificationT", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/UnifiedVerificationTable.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d58aeeb246846e9", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/admin/FeedbackDrawer.tsx:301", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/admin/FeedbackDrawer.tsx:301"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-902eb7f11f3a333d", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/exercises/AdminExerc", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/exercises/AdminExerciseRow.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84035d9bab94813b", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/decks/DeckRow.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/decks/DeckRow.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4cdc01e18b00170", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/situations/Situation", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/situations/SituationDrawer.linkedNews.tsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4ddbd36e88c2b5f", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/practice/LanguageToggle.tsx:10", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/practice/LanguageToggle.tsx:10"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb4383c84dc3ded7", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/statistics/AchievementsGri", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/statistics/AchievementsGrid.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4b89214c10387ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 learn-greek-easy-frontend/src/lib/markdown-inline.ts:10", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 learn-greek-easy-frontend/src/lib/markdown-inline.ts:10"}, "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-ccb2d69d8750db66", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/hooks/useDashboard.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/hooks/useDashboard.ts:3"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1147a39cdc916fb", "name": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/hooks/useDecks.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/hooks/useDecks.ts:3"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef575781c967bd4b", "name": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/src/services/adminAPI.ts:1600", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/src/services/adminAPI.ts:1600"}, "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-b7e14a970c63f801", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/V2DeckPage.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc0e0ddb9f292870", "name": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/features/words/components/AddToDeckMo", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/features/words/components/AddToDeckModal.tsx:235"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9b42fd948925041", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9da994d89afaaa1f", "name": "Dockerfile runs as root: learn-greek-easy-frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: learn-greek-easy-frontend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5260d0912d9b728a", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09878a533bd99436", "name": "Docker base image is tag-pinned but not digest-pinned: caddy:alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: caddy:alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca1bd2cdeb636ee5", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/Design-System-v2.4.html:3962", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/Design-System-v2.4.html:3962"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2666b877ab4c383", "name": "Possible secret in learn-greek-easy-backend/src/constants.py", "shortDescription": {"text": "Possible secret in learn-greek-easy-backend/src/constants.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6ef533379e822970", "name": "Possible secret in learn-greek-easy-backend/src/api/v1/test/seed.py", "shortDescription": {"text": "Possible secret in learn-greek-easy-backend/src/api/v1/test/seed.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-256f9e51d742e350", "name": "Possible secret in learn-greek-easy-backend/src/services/seed_service.py", "shortDescription": {"text": "Possible secret in learn-greek-easy-backend/src/services/seed_service.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-5f0702742d816ca7", "name": "Possible secret in learn-greek-easy-frontend/scripts/release-web-verify.cjs", "shortDescription": {"text": "Possible secret in learn-greek-easy-frontend/scripts/release-web-verify.cjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4389ea2158543969", "name": "Insecure pattern 'dangerous_innerhtml' in learn-greek-easy-frontend/src/components/ui/chart.tsx:77", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in learn-greek-easy-frontend/src/components/ui/chart.tsx:77"}, "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-4f2e7507bec20ff2", "name": "Insecure pattern 'local_storage_auth_token' in learn-greek-easy-frontend/src/lib/__tests__/versionCheck.test.ts:103", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in learn-greek-easy-frontend/src/lib/__tests__/versionCheck.test.ts:103"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41383a2554c0bfb6", "name": "Insecure pattern 'direct_innerhtml_assignment' in learn-greek-easy-frontend/src/lib/tour/__tests__/tourUtils.test.ts:7", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in learn-greek-easy-frontend/src/lib/tour/__tests__/tourUtils.test.ts:7"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7c369f2fcfce22a", "name": "Insecure pattern 'local_storage_auth_token' in learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePracticePage", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePracticePage.test.tsx:473"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98eac7c7ee5d35f9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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-7efbda965f283c17", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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-83c2a23772997a49", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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-523eb16acdca66a2", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dorny/paths-filter@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-530c06de4af2bfb8", "name": "GitHub Action tracks a moving branch", "shortDescription": {"text": "GitHub Action tracks a moving branch"}, "fullDescription": {"text": "MishaKav/pytest-coverage-comment@main 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": "high", "confidence": 1.0}}, {"id": "scanner-1de10718c91369cb", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/github-script@v7 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-1fa7854d020cdf93", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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-57b27cf6040b979d", "name": "Very large file: learn-greek-easy-backend/tests/integration/api/test_admin_exercises_list.py (1455 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/integration/api/test_admin_exercises_list.py (1455 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-668ddcbb342046da", "name": "Very large file: learn-greek-easy-backend/tests/integration/api/test_decks.py (2818 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/integration/api/test_decks.py (2818 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-af258d4db8cfe68a", "name": "Very large file: learn-greek-easy-backend/tests/unit/middleware/test_logging_middleware.py (1598 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/middleware/test_logging_middleware.py (1598 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-29f98b3dd2016929", "name": "Very large file: learn-greek-easy-backend/tests/unit/api/test_admin_generate_word_entry.py (1465 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/api/test_admin_generate_word_entry.py (1465 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-5ab301f8d18f2d15", "name": "Very large file: learn-greek-easy-backend/tests/unit/api/test_seed.py (1389 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/api/test_seed.py (1389 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-22cf93ac6afc7c55", "name": "Very large file: learn-greek-easy-backend/tests/unit/api/v1/test_billing.py (1779 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/api/v1/test_billing.py (1779 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-81a172030d784bf2", "name": "Very large file: learn-greek-easy-backend/tests/unit/tasks/test_background.py (1817 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/tasks/test_background.py (1817 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-1a25606caad93950", "name": "Very large file: learn-greek-easy-backend/tests/unit/services/test_seed_service.py (2000 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_seed_service.py (2000 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-7e8fd78969d6f945", "name": "Very large file: learn-greek-easy-backend/tests/unit/services/test_local_verification_service.py (1384 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_local_verification_service.py (1384 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-acaa3b6f4a99d46d", "name": "Very large file: learn-greek-easy-backend/tests/unit/services/test_progress_service.py (1468 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_progress_service.py (1468 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-6cc5599ead0ff769", "name": "Very large file: learn-greek-easy-backend/tests/unit/services/test_culture_question_service.py (2512 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_culture_question_service.py (2512 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-f9dd0034bbba0ed8", "name": "Very large file: learn-greek-easy-backend/tests/unit/services/test_webhook_service.py (1327 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_webhook_service.py (1327 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-d0b3d45c3fe8f77e", "name": "Very large file: learn-greek-easy-backend/tests/unit/services/test_card_generator_service.py (2265 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_card_generator_service.py (2265 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-e58b45f4eec51e49", "name": "Very large file: learn-greek-easy-backend/tests/unit/repositories/test_mock_exam.py (1546 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/unit/repositories/test_mock_exam.py (1546 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-618898eebaedbc9a", "name": "Very large file: learn-greek-easy-backend/tests/e2e/scenarios/test_culture_practice.py (2112 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/tests/e2e/scenarios/test_culture_practice.py (2112 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-55760393295d5fa6", "name": "Very large file: learn-greek-easy-backend/src/api/v1/decks.py (1354 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/src/api/v1/decks.py (1354 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-2af2d028fac7a197", "name": "Very large file: learn-greek-easy-backend/src/api/v1/admin.py (6557 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/src/api/v1/admin.py (6557 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-0fe93c155057b692", "name": "Very large file: learn-greek-easy-backend/src/services/seed_grammar_data.py (1443 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/src/services/seed_grammar_data.py (1443 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-57dce116c764b455", "name": "Very large file: learn-greek-easy-backend/src/services/seed_service.py (6023 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/src/services/seed_service.py (6023 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-092d199472aa0c43", "name": "Very large file: learn-greek-easy-backend/src/services/culture_question_service.py (1884 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/src/services/culture_question_service.py (1884 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-9a12f2447999221d", "name": "Very large file: learn-greek-easy-backend/src/db/models.py (3463 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-backend/src/db/models.py (3463 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-886dbca13027ac81", "name": "Very large file: learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts (1510 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts (1510 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-a939317877e866c0", "name": "Very large file: learn-greek-easy-frontend/src/components/culture/__tests__/MCQComponent.test.tsx (1850 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-frontend/src/components/culture/__tests__/MCQComponent.test.tsx (1850 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-f66f918462c1434c", "name": "Very large file: learn-greek-easy-frontend/src/services/adminAPI.ts (1888 lines)", "shortDescription": {"text": "Very large file: learn-greek-easy-frontend/src/services/adminAPI.ts (1888 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-09bad5ab1f174fc5", "name": "34 TODO/FIXME markers", "shortDescription": {"text": "34 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "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 209 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 394 placeholder/mock markers across 136 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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-552dd1e68f4c90a3", "name": "Commented-code block (7 lines) in learn-greek-easy-mobile/tailwind.config.js:48", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-mobile/tailwind.config.js:48"}, "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-a747f99675ba9402", "name": "Commented-code block (8 lines) in learn-greek-easy-mobile/app.config.ts:52", "shortDescription": {"text": "Commented-code block (8 lines) in learn-greek-easy-mobile/app.config.ts:52"}, "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-100661f1c3af462f", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/scripts/check-token-opacity.mjs:98", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/scripts/check-token-opacity.mjs:98"}, "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-60ac2b69e6e39f9c", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/scripts/__tests__/check-token-opacity.test.ts:260", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/scripts/__tests__/check-token-opacity.test.ts:260"}, "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-319154d0d2a152f9", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/__mocks__/react-native-css-interop.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/__mocks__/react-native-css-interop.js: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-0bcf9f416e1a9f6a", "name": "Commented-code block (8 lines) in learn-greek-easy-mobile/src/types/deck.ts:40", "shortDescription": {"text": "Commented-code block (8 lines) in learn-greek-easy-mobile/src/types/deck.ts:40"}, "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-37012d67e3bae0cd", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/components/auth/__tests__/login.test.tsx:15", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/components/auth/__tests__/login.test.tsx:15"}, "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-7389ff50a3dbb754", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/components/onboarding/__tests__/onboarding.test.tsx:187", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/components/onboarding/__tests__/onboarding.test.tsx:187"}, "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-feaab23559cbab58", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/_layout.tsx:50", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/_layout.tsx: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-ee8d6a4b7d5f773e", "name": "Commented-code block (6 lines) in learn-greek-easy-mobile/src/app/situations/[situationId].tsx:124", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-mobile/src/app/situations/[situationId].tsx:124"}, "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-e9f9ed1a6b16bd01", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/(app)/__tests__/culture-screen.test.tsx:138", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/(app)/__tests__/culture-screen.test.tsx:138"}, "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-3f9b5856d75efccc", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/(app)/__tests__/home-analytics.test.tsx:285", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/(app)/__tests__/home-analytics.test.tsx:285"}, "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-3ebdecb89530f1e0", "name": "Commented-code block (6 lines) in learn-greek-easy-mobile/src/app/(auth)/login.tsx:59", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-mobile/src/app/(auth)/login.tsx:59"}, "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-401ad8cb85a36be2", "name": "Legacy-named symbol `reviews_v2` in learn-greek-easy-mobile/src/hooks/use-submit-review.ts:3", "shortDescription": {"text": "Legacy-named symbol `reviews_v2` in learn-greek-easy-mobile/src/hooks/use-submit-review.ts:3"}, "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-6b3f064550ff1572", "name": "Legacy-named symbol `study_v2` in learn-greek-easy-mobile/src/hooks/use-study-queue.ts:3", "shortDescription": {"text": "Legacy-named symbol `study_v2` in learn-greek-easy-mobile/src/hooks/use-study-queue.ts:3"}, "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-ce7bbcb7e28850ab", "name": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/hooks/use-dashboard.ts:116", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/hooks/use-dashboard.ts:116"}, "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-aa494d146f725ee2", "name": "Legacy-named symbol `t_old` in learn-greek-easy-backend/tests/integration/api/test_admin_exercises_list.py:729", "shortDescription": {"text": "Legacy-named symbol `t_old` in learn-greek-easy-backend/tests/integration/api/test_admin_exercises_list.py:729"}, "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-866a903aac0ea671", "name": "Legacy-named symbol `test_replace_avatar_deletes_old` in learn-greek-easy-backend/tests/integration/api/test_auth_avatar", "shortDescription": {"text": "Legacy-named symbol `test_replace_avatar_deletes_old` in learn-greek-easy-backend/tests/integration/api/test_auth_avatar.py:342"}, "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-2c3de067e499ba6e", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/tests/integration/services/test_progress_dashboard_batching.p", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/tests/integration/services/test_progress_dashboard_batching.py:89"}, "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-78936e143e387f36", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/integration/migrations/test_unaccent_migration.py:146", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/integration/migrations/test_unaccent_migration.py:146"}, "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-d1bdd8bd7e916833", "name": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/test_forced_alignment.py:57", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/test_forced_alignment.py:57"}, "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-8ecabaf2ad125c7f", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/test_redistribute_timing.py:62", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/test_redistribute_timing.py:62"}, "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-b8ce6eb5f9236a90", "name": "Legacy-named symbol `reviews_v2` in learn-greek-easy-backend/tests/unit/api/test_reviews_v2.py:59", "shortDescription": {"text": "Legacy-named symbol `reviews_v2` in learn-greek-easy-backend/tests/unit/api/test_reviews_v2.py:59"}, "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-9f43f9bcfea8c936", "name": "Legacy-named symbol `study_v2` in learn-greek-easy-backend/tests/unit/api/test_study_v2.py:28", "shortDescription": {"text": "Legacy-named symbol `study_v2` in learn-greek-easy-backend/tests/unit/api/test_study_v2.py:28"}, "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-a8ebf224542bb504", "name": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/tests/unit/scripts/test_backfill_s3_cache_control.py:6", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/tests/unit/scripts/test_backfill_s3_cache_control.py:61"}, "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-40611631769a41af", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/scripts/test_backfill_s3_cache_control.py:407", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/scripts/test_backfill_s3_cache_control.py:407"}, "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-5fd0333718e2de86", "name": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/tests/unit/scripts/test_backfill_image_derivatives.py:", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/tests/unit/scripts/test_backfill_image_derivatives.py:53"}, "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-4fcd4557688258eb", "name": "Commented-code block (10 lines) in learn-greek-easy-backend/tests/unit/tasks/test_session_cleanup_monitor.py:38", "shortDescription": {"text": "Commented-code block (10 lines) in learn-greek-easy-backend/tests/unit/tasks/test_session_cleanup_monitor.py:38"}, "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-b655c709cb81e8f7", "name": "Legacy-named symbol `test_single_achievement_renders_singular_copy` in learn-greek-easy-backend/tests/unit/services/test", "shortDescription": {"text": "Legacy-named symbol `test_single_achievement_renders_singular_copy` in learn-greek-easy-backend/tests/unit/services/test_notification_service.py:387"}, "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-022c22280ba22035", "name": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/tests/unit/services/test_v2_sm2_service.py:809", "shortDescription": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/tests/unit/services/test_v2_sm2_service.py:809"}, "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-471cce390412de16", "name": "Legacy-named symbol `svc_old` in learn-greek-easy-backend/tests/unit/services/test_s3_service.py:553", "shortDescription": {"text": "Legacy-named symbol `svc_old` in learn-greek-easy-backend/tests/unit/services/test_s3_service.py:553"}, "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-5fb92c3b8b003259", "name": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/services/test_elevenlabs_service.py:", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/services/test_elevenlabs_service.py:36"}, "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-2a6d36ba691876b9", "name": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/tests/unit/services/test_v2_sm2_service_review.py:111", "shortDescription": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/tests/unit/services/test_v2_sm2_service_review.py:111"}, "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-28a9807f4c0e115c", "name": "Legacy-named symbol `test_total_reviews_matches_legacy` in learn-greek-easy-backend/tests/unit/services/test_sqlcon03_pr", "shortDescription": {"text": "Legacy-named symbol `test_total_reviews_matches_legacy` in learn-greek-easy-backend/tests/unit/services/test_sqlcon03_projection_review_aggregates.py:215"}, "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-d8c3e54376ea66ac", "name": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/tests/unit/services/test_verification_tier.py", "shortDescription": {"text": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/tests/unit/services/test_verification_tier.py:5"}, "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-09b797cef419b422", "name": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/services/test_elevenlabs_dialog.py:3", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/services/test_elevenlabs_dialog.py:36"}, "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-452ccec94b7441c9", "name": "Legacy-named symbol `sub_old` in learn-greek-easy-backend/tests/unit/services/test_webhook_service.py:1233", "shortDescription": {"text": "Legacy-named symbol `sub_old` in learn-greek-easy-backend/tests/unit/services/test_webhook_service.py:1233"}, "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-3e246ad55c6c8903", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/services/gamification/test_invariants.py:359", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/services/gamification/test_invariants.py:359"}, "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-02580695116b3b0b", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/repositories/test_culture_question_stats.py:202", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/repositories/test_culture_question_stats.py:202"}, "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-c131fcce6c2621a5", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/tests/unit/repositories/test_deck_repository.py:877", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/tests/unit/repositories/test_deck_repository.py:877"}, "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-a59c371316ea60b6", "name": "Legacy-named symbol `TestMergedAggregatesMatchLegacy` in learn-greek-easy-backend/tests/unit/repositories/test_sqlcon04_", "shortDescription": {"text": "Legacy-named symbol `TestMergedAggregatesMatchLegacy` in learn-greek-easy-backend/tests/unit/repositories/test_sqlcon04_culture_daily_aggregates.py:101"}, "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-683cc4ee23c1128f", "name": "Commented-code block (7 lines) in learn-greek-easy-backend/tests/unit/core/test_dependencies.py:366", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-backend/tests/unit/core/test_dependencies.py:366"}, "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-f945fd7e8526e26c", "name": "Legacy-named symbol `test_stripe_params_carry_new_email_not_old` in learn-greek-easy-backend/tests/unit/core/test_billin", "shortDescription": {"text": "Legacy-named symbol `test_stripe_params_carry_new_email_not_old` in learn-greek-easy-backend/tests/unit/core/test_billing_utils_email_propagation_adversarial.py:278"}, "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-64df3465c50d0c7e", "name": "Legacy-named symbol `test_consolidated_query_matches_legacy` in learn-greek-easy-backend/tests/fixtures/golden.py:28", "shortDescription": {"text": "Legacy-named symbol `test_consolidated_query_matches_legacy` in learn-greek-easy-backend/tests/fixtures/golden.py:28"}, "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-bc0bc1dc62b32b59", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/fixtures/golden.py:140", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/fixtures/golden.py:140"}, "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-9ca0ab59bac0e0ba", "name": "Legacy-named symbol `model_legacy` in learn-greek-easy-backend/tests/schemas/test_situation_schemas.py:136", "shortDescription": {"text": "Legacy-named symbol `model_legacy` in learn-greek-easy-backend/tests/schemas/test_situation_schemas.py:136"}, "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-f82a9e7f4e87609a", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260222_1400_delet", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260222_1400_delete_legacy_cards_basic_greek_nouns.py:22"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0673aba42c301717", "name": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260526_admin2_26_00", "shortDescription": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260526_admin2_26_00_merge_heads.py:23"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50b4205edb73780f", "name": "Legacy-named symbol `dialog_status_old` in learn-greek-easy-backend/alembic/versions/20260312_1200_drop_text_approved_an", "shortDescription": {"text": "Legacy-named symbol `dialog_status_old` in learn-greek-easy-backend/alembic/versions/20260312_1200_drop_text_approved_and_voice_name.py:45"}, "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-8662ee0422cd16a6", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260225_1636_2a50e", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260225_1636_2a50e76fd433_fix_stuck_generating_audio_entries.py:66"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb27a9e4b563693d", "name": "Legacy-named symbol `situationstatus_old` in learn-greek-easy-backend/alembic/versions/20260503_sitst_01_drop_partial_re", "shortDescription": {"text": "Legacy-named symbol `situationstatus_old` in learn-greek-easy-backend/alembic/versions/20260503_sitst_01_drop_partial_ready.py:25"}, "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-fba93d2dcf57c8da", "name": "Legacy-named symbol `dialog_status_old` in learn-greek-easy-backend/alembic/versions/20260313_1700_drop_published_from_d", "shortDescription": {"text": "Legacy-named symbol `dialog_status_old` in learn-greek-easy-backend/alembic/versions/20260313_1700_drop_published_from_dialog_status.py:26"}, "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-d7e047aefc4d713c", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/alembic/versions/20260121_1205_7b0abae73df7_add_vector_embedd", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/alembic/versions/20260121_1205_7b0abae73df7_add_vector_embedding_columns_to_culture_questions.py:69"}, "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-b27792f8745fe2df", "name": "Legacy-named symbol `decklevel_old` in learn-greek-easy-backend/alembic/versions/20260324_1000_drop_c1_c2_from_decklevel", "shortDescription": {"text": "Legacy-named symbol `decklevel_old` in learn-greek-easy-backend/alembic/versions/20260324_1000_drop_c1_c2_from_decklevel_enum.py:37"}, "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-f96c6ff52ea44140", "name": "Legacy-named symbol `change_deck_card_system_default_to_v2` in learn-greek-easy-backend/alembic/versions/change_deck_car", "shortDescription": {"text": "Legacy-named symbol `change_deck_card_system_default_to_v2` in learn-greek-easy-backend/alembic/versions/change_deck_card_system_default_to_v2.py:1"}, "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-47a897bcd28a7726", "name": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260330_1300_esm2_me", "shortDescription": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260330_1300_esm2_merge_heads.py:18"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5cd18e5f8fcfb85c", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260128_1145_5208d", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260128_1145_5208d6f4ad95_fix_level_up_notification_url.py:28"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e285509522cd473", "name": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/src/config.py:531", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/src/config.py:531"}, "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-ababe46ca55cfea0", "name": "Legacy-named symbol `reviews_v2` in learn-greek-easy-backend/src/api/v1/router.py:38", "shortDescription": {"text": "Legacy-named symbol `reviews_v2` in learn-greek-easy-backend/src/api/v1/router.py:38"}, "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-37a9621c02f871fe", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/src/api/v1/xp.py:69", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/api/v1/xp.py:69"}, "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-135695ea7252feef", "name": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/src/api/v1/admin.py:229", "shortDescription": {"text": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/src/api/v1/admin.py:229"}, "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-aaf19a1a3500b53f", "name": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/api/v1/culture/router.py:1127", "shortDescription": {"text": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/api/v1/culture/router.py:1127"}, "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-38073d3800e18e4b", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/src/scripts/perf10_diagnosis.py:242", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/scripts/perf10_diagnosis.py:242"}, "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-c6ebadb6684af020", "name": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/src/scripts/backfill_image_derivatives.py:164", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/src/scripts/backfill_image_derivatives.py:164"}, "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-f8881edac81f10ea", "name": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/src/scripts/backfill_s3_cache_control.py:146", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/src/scripts/backfill_s3_cache_control.py:146"}, "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-5e2b83f520a8be94", "name": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/src/tasks/background.py:437", "shortDescription": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/src/tasks/background.py:437"}, "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-ec399486599ed3d3", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/picture_match_exercise_service.py:176", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/picture_match_exercise_service.py:176"}, "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-d1b7271ea401ec67", "name": "Commented-code block (7 lines) in learn-greek-easy-backend/src/services/seed_service.py:5270", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-backend/src/services/seed_service.py:5270"}, "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-36651619152b1dea", "name": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/src/services/elevenlabs_service.py:11", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/src/services/elevenlabs_service.py:11"}, "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-2aff318204314185", "name": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/services/culture_question_service.py:1032", "shortDescription": {"text": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/services/culture_question_service.py:1032"}, "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-9dd19cceaced9d4a", "name": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/src/services/v2_sm2_service.py:365", "shortDescription": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/src/services/v2_sm2_service.py:365"}, "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-fe20a99327ad39e3", "name": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/src/services/verification_tier.py:67", "shortDescription": {"text": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/src/services/verification_tier.py:67"}, "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-f172928ecc462a97", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/src/services/progress_service.py:97", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/services/progress_service.py:97"}, "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-1428457cb8912738", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/s3_service.py:66", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/s3_service.py:66"}, "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-eeeb9cda42265ec3", "name": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/services/local_verification_service.py:44", "shortDescription": {"text": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/services/local_verification_service.py:44"}, "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-3babc1412d7d40c9", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/gamification/projection.py:272", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/gamification/projection.py:272"}, "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-aa9cdc82c8efe5ba", "name": "Commented-code block (7 lines) in learn-greek-easy-backend/src/services/gamification/streak.py:107", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-backend/src/services/gamification/streak.py:107"}, "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-8ebdbea329b7703f", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/src/db/session.py:161", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/db/session.py:161"}, "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-3b9142f71d5b1bb7", "name": "Commented-code block (6 lines) in learn-greek-easy-backend/src/repositories/culture_question_stats.py:84", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/repositories/culture_question_stats.py:84"}, "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-6aa167a80614d7ea", "name": "Commented-code block (5 lines) in learn-greek-easy-backend/src/repositories/culture_question.py:15", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/repositories/culture_question.py:15"}, "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-b8cd689d567157a4", "name": "Commented-code block (9 lines) in learn-greek-easy-backend/src/repositories/card_record_statistics.py:471", "shortDescription": {"text": "Commented-code block (9 lines) in learn-greek-easy-backend/src/repositories/card_record_statistics.py:471"}, "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-9470858cc803de37", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/playwright.config.ts:114", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/playwright.config.ts:114"}, "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-80e8242a5286d2e0", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/lighthouserc.cjs:43", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/lighthouserc.cjs: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-15458985ad4a7707", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/lighthouserc.mobile.cjs:56", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/lighthouserc.mobile.cjs:56"}, "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-1f0e258c594c9292", "name": "Commented-code block (9 lines) in learn-greek-easy-frontend/tests/visual/v2-practice.visual.spec.ts:336", "shortDescription": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/tests/visual/v2-practice.visual.spec.ts:336"}, "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-250832da6a5afc0f", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts:176", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts:176"}, "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-1d8cf80a898b3eb5", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/gamification-reconcile-self-heal.spec.ts:101", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/gamification-reconcile-self-heal.spec.ts:101"}, "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-a210ddfdf9459d03", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/admin-exercises-a11y.spec.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/admin-exercises-a11y.spec.ts:31"}, "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-e027988aca6f0c63", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/card-audio-playback.spec.ts:528", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/card-audio-playback.spec.ts:528"}, "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-52112b47ba6d64b5", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/news-feed.spec.ts:67", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/news-feed.spec.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-a60fdfa122894f79", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/tests/e2e/admin-exercises.spec.ts:187", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/tests/e2e/admin-exercises.spec.ts:187"}, "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-9c92a4a5f41b00f7", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/culture-deck-detail.spec.ts:122", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/culture-deck-detail.spec.ts:122"}, "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-58e2630adcfc29f4", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/admin-decks.spec.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/admin-decks.spec.ts:28"}, "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-b93b9f777b0a69b9", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/changelog.spec.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/changelog.spec.ts:182"}, "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-4091e913d4b33394", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/gamification-immediate-toast.spec.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/gamification-immediate-toast.spec.ts:92"}, "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-1de39df24d68582c", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/dark-mode.spec.ts:29", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/dark-mode.spec.ts:29"}, "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-c7ae23ff60d23530", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/news-country-filter.spec.ts:141", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/news-country-filter.spec.ts:141"}, "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-43f5fe4960a3caff", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/i18n/admin-translations.spec.ts:16", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/i18n/admin-translations.spec.ts:16"}, "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-f29b6eeb67c10253", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/App.tsx:25", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/App.tsx:25"}, "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-8e138925ee03bd42", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/authStore.ts:349", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/authStore.ts:349"}, "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-f2fad316f23f3f70", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/deckStore.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/deckStore.ts:41"}, "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-8eac08b679a23fdb", "name": "Legacy-named symbol `card_reviewed_v2` in learn-greek-easy-frontend/src/stores/__tests__/v2PracticeStore.test.ts:763", "shortDescription": {"text": "Legacy-named symbol `card_reviewed_v2` in learn-greek-easy-frontend/src/stores/__tests__/v2PracticeStore.test.ts:763"}, "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-1153b1f11c246391", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/__tests__/deckStore.test.ts:337", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/__tests__/deckStore.test.ts:337"}, "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-c8753c3e75c96cae", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/__tests__/authStore.test.ts:196", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/__tests__/authStore.test.ts:196"}, "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-efba6894d5d5d065", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/init.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/init.ts:182"}, "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-a496d212a7d41b6a", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/i18next.d.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/i18next.d.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-1afc0bffc25cd6a0", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/i18n/__tests__/i18n.test.ts:209", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/i18n/__tests__/i18n.test.ts:209"}, "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-0ead691c9f079034", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/i18n/__tests__/missingKeyHandler.test.ts:72", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/i18n/__tests__/missingKeyHandler.test.ts:72"}, "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-920092bb3c8fef3f", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/__tests__/i18n-adversarial.test.ts:132", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/__tests__/i18n-adversarial.test.ts:132"}, "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-c676ece27229446b", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/layout/__tests__/Header.test.tsx:415", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/layout/__tests__/Header.test.tsx:415"}, "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-af67e88f4ef0382c", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/charts/__tests__/StageDistributionChart.test.", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/charts/__tests__/StageDistributionChart.test.tsx:8"}, "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-6bd5e18f4552cb5e", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/navigation/index.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/navigation/index.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-f9dd65745e252260", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/LandingRoute.test.tsx:199", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/LandingRoute.test.tsx:199"}, "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-16f810ce5003a224", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/PERF-09-02.adversarial.test.ts", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/PERF-09-02.adversarial.test.tsx:133"}, "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-72970ff816d6ae19", "name": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/RouteGuard.test.tsx:273", "shortDescription": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/RouteGuard.test.tsx:273"}, "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-e0af381d1f90cf24", "name": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.tes", "shortDescription": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx:504"}, "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-8390fa21e8551400", "name": "Commented-code block (8 lines) in learn-greek-easy-frontend/src/components/achievements/AchievementCategory.tsx:45", "shortDescription": {"text": "Commented-code block (8 lines) in learn-greek-easy-frontend/src/components/achievements/AchievementCategory.tsx:45"}, "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-471808f28183ecc5", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/CardErrorDrawer.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/CardErrorDrawer.tsx: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-688869e587243ddf", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/FeedbackDrawer.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/FeedbackDrawer.tsx: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-863b2eec1b2ff15c", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/__tests__/AdminFeedbackDelete.test.tsx:", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/__tests__/AdminFeedbackDelete.test.tsx: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-2278d7a4e5488042", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/__tests__/DeckDetailModal.searchFilterS", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/__tests__/DeckDetailModal.searchFilterSort.test.tsx:271"}, "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-b456bfc985750433", "name": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/components/admin/__tests__/DeckDetailModal.s", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/components/admin/__tests__/DeckDetailModal.searchFilterSort.test.tsx:254"}, "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-3f075dcaa01ec11a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/components/admin/exercises/AdminExercisesSec", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/components/admin/exercises/AdminExercisesSection.tsx:85"}, "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-88a396714589f9a9", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/VocabWordDetail.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/VocabWordDetail.tsx:6"}, "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-6a5f4219dcb8fd2a", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/CultureQuestionDetail.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/CultureQuestionDetail.tsx:6"}, "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-eb974e2b4327bb4e", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/__tests__/DeckSettingsTab.test.ts", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/__tests__/DeckSettingsTab.test.tsx:213"}, "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-6dd6f21d011fe783", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/changelog/ChangelogTab.tsx:82", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/changelog/ChangelogTab.tsx:82"}, "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-70a64291ee681ebd", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/changelog/__tests__/ChangelogEditorDraw", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/changelog/__tests__/ChangelogEditorDrawer.test.tsx:1057"}, "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-0f5a442650ead810", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/announcements/__tests__/AnnouncementsTa", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/announcements/__tests__/AnnouncementsTab.test.tsx:44"}, "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-19d489b09d5dff17", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/vocabulary/__tests__/EnrichmentChips.te", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/vocabulary/__tests__/EnrichmentChips.test.tsx:456"}, "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-fd6075b59f8f73af", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/news/newsThumbs.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/news/newsThumbs.ts:6"}, "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-611bad85cfea5352", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.image.tes", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.image.test.tsx: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-547dbf951109e6b8", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.test.tsx:", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.test.tsx:464"}, "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-9e3a65c604c1ee79", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.audio.tes", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.audio.test.tsx: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-ad358e67670448be", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.linkedSit", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.linkedSituation.test.tsx:594"}, "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-83e8ceae28ef4e31", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/profile/PersonalInfoSection.tsx:105", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/profile/PersonalInfoSection.tsx:105"}, "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-2947afea1e95cb9b", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/news/__tests__/NewsCard.eager.adversarial.tes", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/news/__tests__/NewsCard.eager.adversarial.test.tsx:94"}, "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-f0b71cfe1add13d6", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/interactive/index.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/interactive/index.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-b316d5677942a991", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/cefrColors.ts:49", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/cefrColors.ts:49"}, "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-7c2def91a4a5da87", "name": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/lib/sseTestUtils.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/lib/sseTestUtils.ts:15"}, "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-b9a673c90ba54219", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/lib/__tests__/supabaseClient.test.ts:108", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/lib/__tests__/supabaseClient.test.ts:108"}, "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-45b4bede29088fe6", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/__tests__/retryUtils.test.ts:266", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/__tests__/retryUtils.test.ts:266"}, "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-7b020c559c763cf4", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/__tests__/sentry-queue.test.ts:25", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/__tests__/sentry-queue.test.ts:25"}, "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-cd104cc9722b9cee", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/V2FlashcardPracticePage.tsx:366", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/V2FlashcardPracticePage.tsx:366"}, "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-c7f15e3daad579c8", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/Dashboard.metrics.test.tsx:126", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/Dashboard.metrics.test.tsx:126"}, "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-4ab9c24281774451", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/AdminPage.test.tsx:62", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/AdminPage.test.tsx:62"}, "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-744b6e76e2c624a8", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/pages/__tests__/Statistics.learnedCount.test.tsx:43", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/pages/__tests__/Statistics.learnedCount.test.tsx: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-3ff58b13f61d34cb", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/pages/__tests__/V2FlashcardPracticePage.test.tsx:483", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/pages/__tests__/V2FlashcardPracticePage.test.tsx:483"}, "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-d4cc4428d347371a", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/SituationsPage.test.tsx:130", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/SituationsPage.test.tsx: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-08f73a04da5c7097", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePage.test.tsx:245", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePage.test.tsx: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-bd0ecb8a49498288", "name": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/hooks/useSSE.ts:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/hooks/useSSE.ts:2"}, "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-6beea866ffc90d0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/services/authAPI.ts:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/services/authAPI.ts:151"}, "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-b47c9c7f07600739", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/DxResumeHero.tsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/DxResumeHero.tsx:10"}, "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-9d4c60a3573dfda9", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/__tests__/DxMetricS", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/__tests__/DxMetricStrip.test.tsx:267"}, "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-a035d7d05a9338b5", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/__tests__/DxResumeH", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/__tests__/DxResumeHero.test.tsx:346"}, "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-69417169894bba37", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/decks/dx/DxCover.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/decks/dx/DxCover.tsx:6"}, "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-57131aa8263e2894", "name": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/features/words/hooks/__tests__/useWordEntry.", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/features/words/hooks/__tests__/useWordEntry.sse.test.ts:54"}, "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-096f29681144b600", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/judge.ts:223", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/judge.ts:223"}, "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-613342212dc2e4d2", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/Done.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/Done.tsx:11"}, "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-bfa05676482fe117", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/Answer.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/Answer.tsx:5"}, "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-fe2f5cef50b760ca", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/AudioSurface.tsx:5", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/AudioSurface.tsx:5"}, "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-fea2e27617018736", "name": "Commented-code block (8 lines) in learn-greek-easy-frontend/src/features/practice/pf/Card.tsx:5", "shortDescription": {"text": "Commented-code block (8 lines) in learn-greek-easy-frontend/src/features/practice/pf/Card.tsx:5"}, "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-272dded55210a94e", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/RatingRow.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/RatingRow.tsx:5"}, "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-ce6f9dd1d01c8dd2", "name": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/TypedInput.test.tsx:5", "shortDescription": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/TypedInput.test.tsx:5"}, "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-fd1c5c7e1067a80e", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/RatingRow.test.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/RatingRow.test.tsx: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-0ef08d8bf1317ca3", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/judge.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/judge.test.ts:5"}, "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-2a0b7fe3c2e5e543", "name": "Commented-code block (12 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Answer.test.tsx:3", "shortDescription": {"text": "Commented-code block (12 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Answer.test.tsx: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-ec4e36238da554ae", "name": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Toast.test.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Toast.test.tsx: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-90e63fcbac28773d", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Done.test.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Done.test.tsx:5"}, "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-3dbabf8340dbb2b7", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Declension.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Declension.tsx: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-9e5ed6cc4f6459cf", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Sentence.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Sentence.tsx: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-39e1c0a148e00ff0", "name": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Grammar.tsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Grammar.tsx:8"}, "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-21345978527a5636", "name": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Translation.tsx:8", "shortDescription": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Translation.tsx:8"}, "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-ef22fd58bfde6f76", "name": "51 env vars used in code but missing from .env.example", "shortDescription": {"text": "51 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `API_URL`, `APP_VARIANT`, `CHROMATIC_BUILD_URL`, `CHROMATIC_CHANGE_COUNT`, `CHROMATIC_ERROR_COUNT`, `CHROMATIC_STORYBOOK_URL`, `CI`, `CI_DEV_LAUNCH_URL` + 43 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nlearn-greek-easy-backend/alembic/versions/20260213_0502_9822ff96fec6_add_audio_columns_to_news_items.py:upgrade, learn-greek-easy-backend/alembic/versions/20260301_0837_bbfda52f7a72_add_a2_columns_to_news_items.py:upgrade\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nlearn-greek-easy-backend/alembic/versions/20260222_1400_delete_legacy_cards_basic_greek_nouns.py:downgrade, learn-greek-easy-backend/alembic/versions/20260526_admin2_26_00_merge_heads.py:downgrade, learn-greek-easy-backend/alembic/versions/20260225_1636_2a50e76fd433_fix_stuck_generating_audio_entries.py:downgrade, learn-greek-easy-backend/alembic/versions/20260330_1300_esm2_merge_heads.py:downgrade\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nlearn-greek-easy-backend/src/scripts/load_translations_kaikki.py:get_connection, learn-greek-easy-backend/src/scripts/load_translations_pivot.py:get_connection, learn-greek-easy-backend/src/scripts/load_translations_freedict.py:get_connection\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nlearn-greek-easy-backend/src/services/exercise_sm2_service.py:get_study_queue, learn-greek-easy-backend/src/repositories/exercise_record.py:get_due_exercises, learn-greek-easy-backend/src/repositories/exercise_record.py:get_new_exercises, learn-greek-easy-backend/src/repositories/exercise_record.py:get_early_practice_exercises\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bca72bb0f429f900", "name": "Frontend route `/callback` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/callback` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-947b257cb847ad6f", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99a5d61f008cc690", "name": "Frontend route `:id` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `:id` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-524b86d8f403620d", "name": "Frontend route `/decks/:deckId/words/:wordId` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/decks/:deckId/words/:wordId` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65adc1e8fab9d46e", "name": "Frontend route `/decks/:deckId/words/:wordId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.ts", "shortDescription": {"text": "Frontend route `/decks/:deckId/words/:wordId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f68be474591cbdee", "name": "Frontend route `/stats` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/stats` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b76de722fb2ad8c8", "name": "Frontend route `/activity-feed-test` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/activity-feed-test` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ddb70cf104a8a55", "name": "Frontend route `/decks/:deckId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/decks/:deckId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39222739fc027f9b", "name": "Frontend route `/culture/decks/:id` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/culture/decks/:id` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0263d4b2cf0f8e1", "name": "Frontend route `/culture/:deckId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/culture/:deckId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1282f28485d1ab86", "name": "Frontend route `/culture/:deckId/summary` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/culture/:deckId/summary` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8d600cb59fe48ff", "name": "Frontend route `/practice/exercises/session` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/practice/exercises/session` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85924db5fc41e8e2", "name": "Frontend route `/checkout/success` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/checkout/success` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23e101ded0e8b62d", "name": "Frontend route `/checkout/cancel` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/checkout/cancel` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a5c218ef2b3ea2b", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/pages/__tests__/AdminPage.test.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/pages/__tests__/AdminPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8d7b52ade89549cb", "name": "Frontend route `/premium` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/PERF-09-0", "shortDescription": {"text": "Frontend route `/premium` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/PERF-09-02.adversarial.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-549ffb1a558f687c", "name": "Frontend route `/custom` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/PublicRout", "shortDescription": {"text": "Frontend route `/custom` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/PublicRoute.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc4ae26e5170cb56", "name": "Frontend route `/custom-login` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/Prot", "shortDescription": {"text": "Frontend route `/custom-login` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6edb0dcfeeb8af57", "name": "Frontend route `/protected` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/Protect", "shortDescription": {"text": "Frontend route `/protected` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac0cc047f3d012d5", "name": "Frontend route `/free-content` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/Prot", "shortDescription": {"text": "Frontend route `/free-content` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b36422c40eec9814", "name": "Frontend route `/premium-content` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/P", "shortDescription": {"text": "Frontend route `/premium-content` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db22934676046cd8", "name": "Frontend route `/app` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRout", "shortDescription": {"text": "Frontend route `/app` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-56709c93ec9ebbe5", "name": "Frontend route `profile` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedR", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5f74bdf24c6d173", "name": "Frontend route `settings` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/Protected", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4082876262fcc89", "name": "FastAPI POST `trigger_sentry_test` without auth dependency \u2014 learn-greek-easy-backend/src/main.py:482", "shortDescription": {"text": "FastAPI POST `trigger_sentry_test` without auth dependency \u2014 learn-greek-easy-backend/src/main.py:482"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7664f074a99c26cb", "name": "FastAPI POST `subscribe` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/waitlist.py:31", "shortDescription": {"text": "FastAPI POST `subscribe` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/waitlist.py:31"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-049089c2db4671a5", "name": "FastAPI POST `confirm` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/waitlist.py:55", "shortDescription": {"text": "FastAPI POST `confirm` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/waitlist.py:55"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-371c3b32da3eb75a", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:262", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:262"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7de8f1fcc8cf3a06", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:881", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:881"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-008d72b3e6482d97", "name": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1017", "shortDescription": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1017"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d376a2a5ccad8dc", "name": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1146", "shortDescription": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1146"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b565119b6030d65", "name": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1282", "shortDescription": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1282"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b319c23f093fd84f", "name": "FastAPI POST `create_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:153", "shortDescription": {"text": "FastAPI POST `create_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:153"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-669442c7ae9375a6", "name": "FastAPI PUT `update_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:240", "shortDescription": {"text": "FastAPI PUT `update_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:240"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e9cdfeae20a60076", "name": "FastAPI DELETE `delete_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:295", "shortDescription": {"text": "FastAPI DELETE `delete_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:295"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12a41e1ef2980ddf", "name": "FastAPI POST `vote_on_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:338", "shortDescription": {"text": "FastAPI POST `vote_on_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:338"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d11a8d62a7ad55d7", "name": "FastAPI DELETE `remove_vote` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:395", "shortDescription": {"text": "FastAPI DELETE `remove_vote` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:395"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a2a74d39457f351", "name": "FastAPI POST `create_card_error` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/card_errors.py:21", "shortDescription": {"text": "FastAPI POST `create_card_error` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/card_errors.py:21"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df8b02a2a362c965", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:101", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:101"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ee32d8e317bf51ef", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:150", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:150"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-10a1795703c318dd", "name": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:329", "shortDescription": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:329"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-10070624775a2589", "name": "FastAPI POST `get_avatar_upload_url` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:453", "shortDescription": {"text": "FastAPI POST `get_avatar_upload_url` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:453"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c53bae4d4178a859", "name": "FastAPI POST `stripe_webhook` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/webhooks.py:23", "shortDescription": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/webhooks.py:23"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0bd7aade83c3ce74", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/users.py:30", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/users.py:30"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-90961c2152beb050", "name": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/users.py:101", "shortDescription": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/users.py:101"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-adb57eb7208ddf7c", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:507", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:507"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b2ab25e1a33a158", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:754", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:754"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-055f01d1dea61dba", "name": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:815", "shortDescription": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:815"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-afe43b0f99e89611", "name": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:869", "shortDescription": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:869"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4d7083b08072f490", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1045", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1045"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d1d6b5b2de7462f", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1142", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1142"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bb54c22e4de92e2b", "name": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1209", "shortDescription": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1209"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-325bdd8055021463", "name": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1264", "shortDescription": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1264"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e6114214b4602e1b", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:149", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:149"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a6086d1dc409a3fa", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:269", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:269"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53d5fd36e8340a67", "name": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:571", "shortDescription": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:571"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-86e90d085fa4ecca", "name": "Dangling fetch: GET /api/v1/data (learn-greek-easy-frontend/src/lib/versionCheck.ts:39)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/data (learn-greek-easy-frontend/src/lib/versionCheck.ts:39)"}, "fullDescription": {"text": "`learn-greek-easy-frontend/src/lib/versionCheck.ts:39` calls `GET /api/v1/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/data`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff50c7a8256ea165", "name": "Unused endpoint: GET /debug/settings", "shortDescription": {"text": "Unused endpoint: GET /debug/settings"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/main.py` declares `GET /debug/settings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-882efcc1e6801453", "name": "Unused endpoint: POST /debug/sentry-test", "shortDescription": {"text": "Unused endpoint: POST /debug/sentry-test"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/main.py` declares `POST /debug/sentry-test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1de80da0b27387f7", "name": "Unused endpoint: GET /unread-count", "shortDescription": {"text": "Unused endpoint: GET /unread-count"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/notifications.py` declares `GET /unread-count` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35a741079ddc6fcc", "name": "Unused endpoint: GET /stream", "shortDescription": {"text": "Unused endpoint: GET /stream"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/notifications.py` declares `GET /stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0535da675f219221", "name": "Unused endpoint: PUT /read-all", "shortDescription": {"text": "Unused endpoint: PUT /read-all"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/notifications.py` declares `PUT /read-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02300358e6ee6fb2", "name": "Unused endpoint: DELETE /clear", "shortDescription": {"text": "Unused endpoint: DELETE /clear"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/notifications.py` declares `DELETE /clear` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a40211c2378ea55", "name": "Unused endpoint: PUT /{notification_id}/read", "shortDescription": {"text": "Unused endpoint: PUT /{notification_id}/read"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/notifications.py` declares `PUT /{notification_id}/read` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74d4355e2f1b0909", "name": "Unused endpoint: DELETE /{notification_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{notification_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/notifications.py` declares `DELETE /{notification_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-365f0986d17746b8", "name": "Unused endpoint: POST /subscribe", "shortDescription": {"text": "Unused endpoint: POST /subscribe"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/waitlist.py` declares `POST /subscribe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e26074453f93d403", "name": "Unused endpoint: POST /confirm", "shortDescription": {"text": "Unused endpoint: POST /confirm"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/waitlist.py` declares `POST /confirm` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/xp.py` declares `GET /stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3792b8bde6ca387b", "name": "Unused endpoint: GET /achievements", "shortDescription": {"text": "Unused endpoint: GET /achievements"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/xp.py` declares `GET /achievements` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d16e4fa529c520e9", "name": "Unused endpoint: GET /search", "shortDescription": {"text": "Unused endpoint: GET /search"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `GET /search` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8456eca76070a1a7", "name": "Unused endpoint: GET /mine", "shortDescription": {"text": "Unused endpoint: GET /mine"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `GET /mine` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8af577ed7d71b177", "name": "Unused endpoint: GET /{deck_id}", "shortDescription": {"text": "Unused endpoint: GET /{deck_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `GET /{deck_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2475af34a8ca29f", "name": "Unused endpoint: GET /{deck_id}/word-entries", "shortDescription": {"text": "Unused endpoint: GET /{deck_id}/word-entries"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `GET /{deck_id}/word-entries` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b3057f520d5c2dba", "name": "Unused endpoint: POST /{deck_id}/word-entries/{word_entry_id}", "shortDescription": {"text": "Unused endpoint: POST /{deck_id}/word-entries/{word_entry_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `POST /{deck_id}/word-entries/{word_entry_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e11e5ba417f56ca", "name": "Unused endpoint: DELETE /{deck_id}/word-entries/{word_entry_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{deck_id}/word-entries/{word_entry_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `DELETE /{deck_id}/word-entries/{word_entry_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-28a2c7612804f042", "name": "Unused endpoint: GET /{deck_id}/word-mastery", "shortDescription": {"text": "Unused endpoint: GET /{deck_id}/word-mastery"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `GET /{deck_id}/word-mastery` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4dc18fc0b20f11b8", "name": "Unused endpoint: GET /{deck_id}/word-heatmap/{word_entry_id}", "shortDescription": {"text": "Unused endpoint: GET /{deck_id}/word-heatmap/{word_entry_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `GET /{deck_id}/word-heatmap/{word_entry_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46d26880f5708297", "name": "Unused endpoint: PATCH /{deck_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{deck_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `PATCH /{deck_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00768ba89d1d8df1", "name": "Unused endpoint: DELETE /{deck_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{deck_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/decks.py` declares `DELETE /{deck_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d6d412ba6647f6cc", "name": "Unused endpoint: GET /live", "shortDescription": {"text": "Unused endpoint: GET /live"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/health.py` declares `GET /live` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c236625afb6a8cb", "name": "Unused endpoint: GET /ready", "shortDescription": {"text": "Unused endpoint: GET /ready"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/health.py` declares `GET /ready` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87f57a8d4cb18a60", "name": "Unused endpoint: GET /{feedback_id}", "shortDescription": {"text": "Unused endpoint: GET /{feedback_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/feedback.py` declares `GET /{feedback_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83de702c513e5e9e", "name": "Unused endpoint: PUT /{feedback_id}", "shortDescription": {"text": "Unused endpoint: PUT /{feedback_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/feedback.py` declares `PUT /{feedback_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7bb1d16c58754d6a", "name": "Unused endpoint: DELETE /{feedback_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{feedback_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/feedback.py` declares `DELETE /{feedback_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e443f0dd73846575", "name": "Unused endpoint: POST /{feedback_id}/vote", "shortDescription": {"text": "Unused endpoint: POST /{feedback_id}/vote"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/feedback.py` declares `POST /{feedback_id}/vote` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a6dbe2bff145cf5", "name": "Unused endpoint: DELETE /{feedback_id}/vote", "shortDescription": {"text": "Unused endpoint: DELETE /{feedback_id}/vote"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/feedback.py` declares `DELETE /{feedback_id}/vote` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c92dfeb7d445cda", "name": "Unused endpoint: GET /queue", "shortDescription": {"text": "Unused endpoint: GET /queue"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/exercises.py` declares `GET /queue` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-695f81f1e96c2565", "name": "Unused endpoint: POST /review", "shortDescription": {"text": "Unused endpoint: POST /review"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/exercises.py` declares `POST /review` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38f511ef2280a9c8", "name": "Unused endpoint: GET /{exercise_id}", "shortDescription": {"text": "Unused endpoint: GET /{exercise_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/exercises.py` declares `GET /{exercise_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/auth.py` declares `POST /logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fbf81638546ba119", "name": "Unused endpoint: POST /logout-all", "shortDescription": {"text": "Unused endpoint: POST /logout-all"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/auth.py` declares `POST /logout-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/auth.py` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea575b61c121b733", "name": "Unused endpoint: PATCH /me", "shortDescription": {"text": "Unused endpoint: PATCH /me"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/auth.py` declares `PATCH /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b29dc7973118c44", "name": "Unused endpoint: POST /avatar/upload-url", "shortDescription": {"text": "Unused endpoint: POST /avatar/upload-url"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/auth.py` declares `POST /avatar/upload-url` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-def1c4677f533a77", "name": "Unused endpoint: DELETE /avatar", "shortDescription": {"text": "Unused endpoint: DELETE /avatar"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/auth.py` declares `DELETE /avatar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618edc3066cfb8f2", "name": "Unused endpoint: GET /queue/v2", "shortDescription": {"text": "Unused endpoint: GET /queue/v2"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/study_v2.py` declares `GET /queue/v2` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82660403cd2e303b", "name": "Unused endpoint: POST /v2", "shortDescription": {"text": "Unused endpoint: POST /v2"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/reviews_v2.py` declares `POST /v2` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2083a87719497893", "name": "Unused endpoint: POST /stripe", "shortDescription": {"text": "Unused endpoint: POST /stripe"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/webhooks.py` declares `POST /stripe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65ae11b57112357a", "name": "Unused endpoint: GET /tab-counts", "shortDescription": {"text": "Unused endpoint: GET /tab-counts"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `GET /tab-counts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-584997a8afd7a69c", "name": "Unused endpoint: GET /decks", "shortDescription": {"text": "Unused endpoint: GET /decks"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `GET /decks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e76813327fc813ef", "name": "Unused endpoint: GET /decks/{deck_id}", "shortDescription": {"text": "Unused endpoint: GET /decks/{deck_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `GET /decks/{deck_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f47d015c30775b35", "name": "Unused endpoint: POST /decks/{deck_id}/cover-image", "shortDescription": {"text": "Unused endpoint: POST /decks/{deck_id}/cover-image"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `POST /decks/{deck_id}/cover-image` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd8b93e644b9928a", "name": "Unused endpoint: DELETE /decks/{deck_id}/cover-image", "shortDescription": {"text": "Unused endpoint: DELETE /decks/{deck_id}/cover-image"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `DELETE /decks/{deck_id}/cover-image` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5766b6a628042997", "name": "Unused endpoint: GET /feedback", "shortDescription": {"text": "Unused endpoint: GET /feedback"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `GET /feedback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26b0b5e4f47ce397", "name": "Unused endpoint: PATCH /feedback/{feedback_id}", "shortDescription": {"text": "Unused endpoint: PATCH /feedback/{feedback_id}"}, "fullDescription": {"text": "`learn-greek-easy-backend/src/api/v1/admin.py` declares `PATCH /feedback/{feedback_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19708"}, "properties": {"repository": "SimonOsipov/learn-greek-easy", "repoUrl": "https://github.com/SimonOsipov/learn-greek-easy", "branch": "main"}, "results": [{"ruleId": "scanner-a9b62b831cb4c259", "level": "note", "message": {"text": "Possibly dead Python function: include_object"}, "properties": {"repobilityId": "425a5e67292c778e", "scanner": "scanner-primary", "fingerprint": "a9b62b831cb4c259", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/env.py:126"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1215426fa451aa99", "level": "note", "message": {"text": "Possibly dead Python function: include_name"}, "properties": {"repobilityId": "94169ab26d9acd2e", "scanner": "scanner-primary", "fingerprint": "1215426fa451aa99", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/env.py:141"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f7e9ff2751b0b158", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "f7e9ff2751b0b158", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260108_1705_1aef63b5f6f5_add_auth0_id_to_users.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-46342a48a952be9f", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "46342a48a952be9f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260108_1705_1aef63b5f6f5_add_auth0_id_to_users.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a30f1095355b9d3", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "7a30f1095355b9d3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260314_1000_add_reverse_lookup_lower_index.py:17"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb21f717885c2100", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "cb21f717885c2100", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260314_1000_add_reverse_lookup_lower_index.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-86bab9de586c4ca5", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "86bab9de586c4ca5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260309_1000_add_audio_a2_s3_key_to_culture_questions.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6c0627e1f8acd2de", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "6c0627e1f8acd2de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260309_1000_add_audio_a2_s3_key_to_culture_questions.py:52"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-988142e3a8f77f34", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "988142e3a8f77f34", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260213_0502_9822ff96fec6_add_audio_columns_to_news_items.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bd9982838bdbe7f3", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "bd9982838bdbe7f3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260213_0502_9822ff96fec6_add_audio_columns_to_news_items.py:64"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e44c28bbca24b6d1", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "e44c28bbca24b6d1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260330_1200_sca_01_select_correct_answer.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-099f607e18947a53", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "099f607e18947a53", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260330_1200_sca_01_select_correct_answer.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-edaf9198c0055332", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "edaf9198c0055332", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260127_1345_f1d6e4ac4839_fix_admin_announcement_enum_case.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-70a491a003a56a28", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "70a491a003a56a28", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260127_1345_f1d6e4ac4839_fix_admin_announcement_enum_case.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c88ff697ab6de0d8", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "c88ff697ab6de0d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260226_0836_897ffd7f7e1e_add_country_column_to_news_items.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f27a00582e59744a", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "f27a00582e59744a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260226_0836_897ffd7f7e1e_add_country_column_to_news_items.py:47"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b0e7661c6ea4d236", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "b0e7661c6ea4d236", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260329_0700_sit_07_02_add_word_timestamps_to_descriptions.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-76d1fa914b123f72", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "76d1fa914b123f72", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260329_0700_sit_07_02_add_word_timestamps_to_descriptions.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2df65bf27f60b8c1", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "2df65bf27f60b8c1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20251126_1831_d606f59197e7_add_last_login_at_and_last_login_ip_.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f09ef6f48e278ad", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "7f09ef6f48e278ad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20251126_1831_d606f59197e7_add_last_login_at_and_last_login_ip_.py:47"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ec00ca96f5ad5e7b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "ec00ca96f5ad5e7b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260207_2018_41e6707eccbd_update_word_entries_examples_comment.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d382c17c0c0ca33f", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "d382c17c0c0ca33f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260207_2018_41e6707eccbd_update_word_entries_examples_comment.py:38"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7ec3bd9db684b7f5", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "7ec3bd9db684b7f5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20251224_1940_9b42371754b7_make_owner_superuser.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ff5f101a73f2fca6", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "ff5f101a73f2fca6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20251224_1940_9b42371754b7_make_owner_superuser.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8a7b9657c092784c", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "8a7b9657c092784c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260129_1129_14c4b1b4a7a8_remove_difficulty_and_order_index_from_.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ecd9897f350218c", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "0ecd9897f350218c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260129_1129_14c4b1b4a7a8_remove_difficulty_and_order_index_from_.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1b45261661b2cbfb", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "1b45261661b2cbfb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260110_2216_a1b2c3d4e5f6_add_admin_feedback_response_fields.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-30bbe8c368944c22", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "30bbe8c368944c22", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260110_2216_a1b2c3d4e5f6_add_admin_feedback_response_fields.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-851255e7643f7bd5", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "851255e7643f7bd5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260209_1745_d0bf063e5db5_add_translation_ru_plural_to_word_.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d94b31a41e27cf10", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "d94b31a41e27cf10", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/alembic/versions/20260209_1745_d0bf063e5db5_add_translation_ru_plural_to_word_.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-975715e4bf6fc2bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-mobile/scripts/reset-project.js:55"}, "properties": {"repobilityId": "dde494407765bf25", "scanner": "scanner-primary", "fingerprint": "975715e4bf6fc2bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1ee3ce8f0545b60", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-mobile/src/app/(auth)/login.tsx:335"}, "properties": {"repobilityId": "2a5d116389a4cd62", "scanner": "scanner-primary", "fingerprint": "c1ee3ce8f0545b60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-910f19a35ced1087", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 k6/scripts/verify-config.js:19"}, "properties": {"repobilityId": "25d7049bc7c3880d", "scanner": "scanner-primary", "fingerprint": "910f19a35ced1087", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20ccd6076df15da8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 k6/scenarios/dashboard.js:253"}, "properties": {"repobilityId": "aa94503c8fbcad9a", "scanner": "scanner-primary", "fingerprint": "20ccd6076df15da8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4019232a5952511", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 k6/scenarios/auth.js:145"}, "properties": {"repobilityId": "7eb96579a1bc6e6f", "scanner": "scanner-primary", "fingerprint": "a4019232a5952511", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e86116f905a00a4c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/vite.config.ts:140"}, "properties": {"repobilityId": "7d11b1bf60f37285", "scanner": "scanner-primary", "fingerprint": "e86116f905a00a4c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90d3435375dc87b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts:131"}, "properties": {"repobilityId": "f17a0da229d10658", "scanner": "scanner-primary", "fingerprint": "90d3435375dc87b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e045ff5d2e72315", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/premium-badge.spec.ts:125"}, "properties": {"repobilityId": "f5de5cb515ef0a79", "scanner": "scanner-primary", "fingerprint": "0e045ff5d2e72315", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6544f4ac4c7fd069", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/card-audio-playback.spec.ts:131"}, "properties": {"repobilityId": "6f5de7c350167200", "scanner": "scanner-primary", "fingerprint": "6544f4ac4c7fd069", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c3a8f79ad5631a9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/admin-decks.spec.ts:74"}, "properties": {"repobilityId": "84a60075971618c2", "scanner": "scanner-primary", "fingerprint": "6c3a8f79ad5631a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bc81e713e75e30ab", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/changelog.spec.ts:182"}, "properties": {"repobilityId": "6874242d3b34012d", "scanner": "scanner-primary", "fingerprint": "bc81e713e75e30ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1008e619c51d4efd", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/card-error-reporting.spec.ts:328"}, "properties": {"repobilityId": "052c16ff6c3594cd", "scanner": "scanner-primary", "fingerprint": "1008e619c51d4efd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-931d50a3c1e53219", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/card-error-reporting.spec.ts:154"}, "properties": {"repobilityId": "ce80bdfa4d9839b2", "scanner": "scanner-primary", "fingerprint": "931d50a3c1e53219", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9dd2138de0f6a352", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/analytics.spec.ts:20"}, "properties": {"repobilityId": "e14726b515e0059d", "scanner": "scanner-primary", "fingerprint": "9dd2138de0f6a352", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fee1264e1376fcbb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/gamification-immediate-toast.spec.ts:188"}, "properties": {"repobilityId": "6822714d785627a8", "scanner": "scanner-primary", "fingerprint": "fee1264e1376fcbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c386532911771024", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/my-decks.spec.ts:237"}, "properties": {"repobilityId": "4e89107ea7b0e920", "scanner": "scanner-primary", "fingerprint": "c386532911771024", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67198193f5806c00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/auth.setup.ts:47"}, "properties": {"repobilityId": "807839a4ba91dcf2", "scanner": "scanner-primary", "fingerprint": "67198193f5806c00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bdb83e5f37cfb26f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/lcp-baseline.spec.ts:117"}, "properties": {"repobilityId": "e01c3fdd0b1dfb5b", "scanner": "scanner-primary", "fingerprint": "bdb83e5f37cfb26f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4aeff749573bb184", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/i18n/admin-translations.spec.ts:16"}, "properties": {"repobilityId": "856f1ed63b180b5a", "scanner": "scanner-primary", "fingerprint": "4aeff749573bb184", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8b11240a66ae934a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/tests/e2e/auth/logout.spec.ts:34"}, "properties": {"repobilityId": "0d3ddb5f986fee3d", "scanner": "scanner-primary", "fingerprint": "8b11240a66ae934a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5d8c3f1ff95ceff3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/helpers/auth-helpers.ts:191"}, "properties": {"repobilityId": "f36926e8594e637a", "scanner": "scanner-primary", "fingerprint": "5d8c3f1ff95ceff3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e7c740164ffe5aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/tests/e2e/helpers/diagnostics.ts:19"}, "properties": {"repobilityId": "74af704e874a438f", "scanner": "scanner-primary", "fingerprint": "2e7c740164ffe5aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e56304af3c9b2b1", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/stores/adminCardErrorStore.ts:112"}, "properties": {"repobilityId": "266032ef7d281758", "scanner": "scanner-primary", "fingerprint": "5e56304af3c9b2b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5db37b8042bf4f09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/analytics/ActivityFeedItem.tsx:112"}, "properties": {"repobilityId": "5b5ed7392898f384", "scanner": "scanner-primary", "fingerprint": "5db37b8042bf4f09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7accc7a915c7acc", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/review/grammar/TenseTabs.tsx:37"}, "properties": {"repobilityId": "61c86840f0c26cc1", "scanner": "scanner-primary", "fingerprint": "b7accc7a915c7acc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-40a007419ad42c99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/decks/DeckSelectorModal.tsx:71"}, "properties": {"repobilityId": "b9fabd2705f6d1af", "scanner": "scanner-primary", "fingerprint": "40a007419ad42c99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77643a0f4abcfde0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/decks/DeckCard.tsx:155"}, "properties": {"repobilityId": "ba1efe6850cbcf87", "scanner": "scanner-primary", "fingerprint": "77643a0f4abcfde0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1c190c155acfc5c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 learn-greek-easy-frontend/src/components/ui/chart.tsx:77"}, "properties": {"repobilityId": "8c9e299315705fb4", "scanner": "scanner-primary", "fingerprint": "e1c190c155acfc5c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f34ae5225c2d4f66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/DeckDetailModal.tsx:943"}, "properties": {"repobilityId": "488af4a502a96fc6", "scanner": "scanner-primary", "fingerprint": "f34ae5225c2d4f66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4be32c60e0e48709", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/AdminCardErrorCard.tsx:197"}, "properties": {"repobilityId": "a95e7b53e6fa045b", "scanner": "scanner-primary", "fingerprint": "4be32c60e0e48709", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-970cf96ea2c21e52", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/admin/CardErrorDrawer.tsx:33"}, "properties": {"repobilityId": "99edef61905e2532", "scanner": "scanner-primary", "fingerprint": "970cf96ea2c21e52", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-95329b3c8074e54b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/UnifiedVerificationTable.tsx:204"}, "properties": {"repobilityId": "7b2b51da18cde740", "scanner": "scanner-primary", "fingerprint": "95329b3c8074e54b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d58aeeb246846e9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/admin/FeedbackDrawer.tsx:301"}, "properties": {"repobilityId": "f28132cfc730176a", "scanner": "scanner-primary", "fingerprint": "2d58aeeb246846e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-902eb7f11f3a333d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/exercises/AdminExerciseRow.tsx:52"}, "properties": {"repobilityId": "01876bfc35b0166c", "scanner": "scanner-primary", "fingerprint": "902eb7f11f3a333d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84035d9bab94813b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/decks/DeckRow.tsx:93"}, "properties": {"repobilityId": "38bd3c5c21e41d29", "scanner": "scanner-primary", "fingerprint": "84035d9bab94813b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4cdc01e18b00170", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/admin/situations/SituationDrawer.linkedNews.tsx:121"}, "properties": {"repobilityId": "d4d0bcc7e89abf71", "scanner": "scanner-primary", "fingerprint": "e4cdc01e18b00170", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4ddbd36e88c2b5f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/components/practice/LanguageToggle.tsx:10"}, "properties": {"repobilityId": "4641f8e7dec0444a", "scanner": "scanner-primary", "fingerprint": "d4ddbd36e88c2b5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-eb4383c84dc3ded7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/components/statistics/AchievementsGrid.tsx:62"}, "properties": {"repobilityId": "4a081b252f0ffff0", "scanner": "scanner-primary", "fingerprint": "eb4383c84dc3ded7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4b89214c10387ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 learn-greek-easy-frontend/src/lib/markdown-inline.ts:10"}, "properties": {"repobilityId": "137e011f7bc9a0d7", "scanner": "scanner-primary", "fingerprint": "a4b89214c10387ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ccb2d69d8750db66", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/hooks/useDashboard.ts:3"}, "properties": {"repobilityId": "6d35ee6c03039359", "scanner": "scanner-primary", "fingerprint": "ccb2d69d8750db66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d1147a39cdc916fb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 learn-greek-easy-frontend/src/hooks/useDecks.ts:3"}, "properties": {"repobilityId": "ace10538e44699e8", "scanner": "scanner-primary", "fingerprint": "d1147a39cdc916fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ef575781c967bd4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learn-greek-easy-frontend/src/services/adminAPI.ts:1600"}, "properties": {"repobilityId": "b7673990796bb5d0", "scanner": "scanner-primary", "fingerprint": "ef575781c967bd4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7e14a970c63f801", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/V2DeckPage.tsx:130"}, "properties": {"repobilityId": "1ba8225d72be0bd2", "scanner": "scanner-primary", "fingerprint": "b7e14a970c63f801", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc0e0ddb9f292870", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 learn-greek-easy-frontend/src/features/words/components/AddToDeckModal.tsx:235"}, "properties": {"repobilityId": "1ecbb43f51399e1b", "scanner": "scanner-primary", "fingerprint": "fc0e0ddb9f292870", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9b42fd948925041", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim"}, "properties": {"repobilityId": "e074184c953e1b3e", "scanner": "scanner-primary", "fingerprint": "f9b42fd948925041", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/Dockerfile"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-f9b42fd948925041", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim"}, "properties": {"repobilityId": "8fe818a7a84b055c", "scanner": "scanner-primary", "fingerprint": "f9b42fd948925041", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/Dockerfile"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-9da994d89afaaa1f", "level": "warning", "message": {"text": "Dockerfile runs as root: learn-greek-easy-frontend/Dockerfile"}, "properties": {"repobilityId": "879427e05ac0a39b", "scanner": "scanner-primary", "fingerprint": "9da994d89afaaa1f", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-5260d0912d9b728a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "2aed81aaab17fd01", "scanner": "scanner-primary", "fingerprint": "5260d0912d9b728a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-09878a533bd99436", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: caddy:alpine"}, "properties": {"repobilityId": "0e2820eab1661a96", "scanner": "scanner-primary", "fingerprint": "09878a533bd99436", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/Dockerfile"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-ca1bd2cdeb636ee5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/Design-System-v2.4.html:3962"}, "properties": {"repobilityId": "331df96cddcf16f9", "scanner": "scanner-primary", "fingerprint": "ca1bd2cdeb636ee5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design-system/Design-System-v2.4.html"}, "region": {"startLine": 3962}}}]}, {"ruleId": "scanner-f2666b877ab4c383", "level": "error", "message": {"text": "Possible secret in learn-greek-easy-backend/src/constants.py"}, "properties": {"repobilityId": "99d9f0af838b193e", "scanner": "scanner-primary", "fingerprint": "f2666b877ab4c383", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/constants.py"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-6ef533379e822970", "level": "error", "message": {"text": "Possible secret in learn-greek-easy-backend/src/api/v1/test/seed.py"}, "properties": {"repobilityId": "f360fffcf60198a9", "scanner": "scanner-primary", "fingerprint": "6ef533379e822970", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/test/seed.py"}, "region": {"startLine": 529}}}]}, {"ruleId": "scanner-256f9e51d742e350", "level": "error", "message": {"text": "Possible secret in learn-greek-easy-backend/src/services/seed_service.py"}, "properties": {"repobilityId": "571e616ff4452d85", "scanner": "scanner-primary", "fingerprint": "256f9e51d742e350", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/services/seed_service.py"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-5f0702742d816ca7", "level": "error", "message": {"text": "Possible secret in learn-greek-easy-frontend/scripts/release-web-verify.cjs"}, "properties": {"repobilityId": "dfdfeb3175171470", "scanner": "scanner-primary", "fingerprint": "5f0702742d816ca7", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/scripts/release-web-verify.cjs"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-4389ea2158543969", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in learn-greek-easy-frontend/src/components/ui/chart.tsx:77"}, "properties": {"repobilityId": "d048a3edc62864fa", "scanner": "scanner-primary", "fingerprint": "4389ea2158543969", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/src/components/ui/chart.tsx"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-4f2e7507bec20ff2", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in learn-greek-easy-frontend/src/lib/__tests__/versionCheck.test.ts:103"}, "properties": {"repobilityId": "a5ac90fcd3a4bf02", "scanner": "scanner-primary", "fingerprint": "4f2e7507bec20ff2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/src/lib/__tests__/versionCheck.test.ts"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-41383a2554c0bfb6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in learn-greek-easy-frontend/src/lib/tour/__tests__/tourUtils.test.ts:7"}, "properties": {"repobilityId": "fb7afaf9eb06daaa", "scanner": "scanner-primary", "fingerprint": "41383a2554c0bfb6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/src/lib/tour/__tests__/tourUtils.test.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-b7c369f2fcfce22a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePracticePage.test.tsx:473"}, "properties": {"repobilityId": "bba024868b9e94ab", "scanner": "scanner-primary", "fingerprint": "b7c369f2fcfce22a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePracticePage.test.tsx"}, "region": {"startLine": 473}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6545ecb71fb97e12", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c9b08e85a4eaf8b1", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6545ecb71fb97e12", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c6c1ac40757b3dc5", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 273}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 333}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24fc5469de47eab4", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 356}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ec7ebb8499138", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "556d2dda8be37861", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ec7ebb8499138", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "556d2dda8be37861", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ec7ebb8499138", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cd843b74d3963b06", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e3d349ff7d977632", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "507f093d9448ab49", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ec7ebb8499138", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cd843b74d3963b06", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e3d349ff7d977632", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 206}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "507f093d9448ab49", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 214}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ec7ebb8499138", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 293}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cd843b74d3963b06", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 297}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e3d349ff7d977632", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 302}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "507f093d9448ab49", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 310}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "556d2dda8be37861", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 408}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d8f8ba9161e1a9f4", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ec7ebb8499138", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 473}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "556d2dda8be37861", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 477}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "725e85bfaabbe4a4", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 309}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "afc449606c8f2de1", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 353}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "db783b2eec44574a", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 364}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 392}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d85e277d8642935d", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9f4e434ea64acff1", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 400}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "06302da08c498261", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 428}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4ed9d804a82c5e86", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 515}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d85e277d8642935d", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 530}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "35a3490bd8451a4b", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 573}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "afc449606c8f2de1", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 736}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 762}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d85e277d8642935d", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 764}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "afc449606c8f2de1", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 783}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "50baa0a84bd59499", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 812}}}]}, {"ruleId": "scanner-83c2a23772997a49", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c357c78d4acf5e39", "scanner": "scanner-primary", "fingerprint": "83c2a23772997a49", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-verify.yml"}, "region": {"startLine": 815}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e3ade2c59bd285c6", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ff4be374dda6ee58", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8a79d27086cb4e35", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ff4be374dda6ee58", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 212}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae06124a85583cc8", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 215}}}]}, {"ruleId": "scanner-530c06de4af2bfb8", "level": "error", "message": {"text": "GitHub Action tracks a moving branch"}, "properties": {"repobilityId": "89aca0c60ba306de", "scanner": "scanner-primary", "fingerprint": "530c06de4af2bfb8", "layer": "cicd", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 221}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0f923b4ff718985c", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-523eb16acdca66a2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "784b8a2321237c07", "scanner": "scanner-primary", "fingerprint": "523eb16acdca66a2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview.yml"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-1de10718c91369cb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eb3e696fe5494cc9", "scanner": "scanner-primary", "fingerprint": "1de10718c91369cb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview-cleanup.yml"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-1de10718c91369cb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eb3e696fe5494cc9", "scanner": "scanner-primary", "fingerprint": "1de10718c91369cb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview-cleanup.yml"}, "region": {"startLine": 223}}}]}, {"ruleId": "scanner-1fa7854d020cdf93", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ef96b38773c209d8", "scanner": "scanner-primary", "fingerprint": "1fa7854d020cdf93", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview-cleanup-scheduled.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-57b27cf6040b979d", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/integration/api/test_admin_exercises_list.py (1455 lines)"}, "properties": {"repobilityId": "d3c90a3b03e5ad14", "scanner": "scanner-primary", "fingerprint": "57b27cf6040b979d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-668ddcbb342046da", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/integration/api/test_decks.py (2818 lines)"}, "properties": {"repobilityId": "85f4849014701f22", "scanner": "scanner-primary", "fingerprint": "668ddcbb342046da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af258d4db8cfe68a", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/middleware/test_logging_middleware.py (1598 lines)"}, "properties": {"repobilityId": "7e082fa4de96bd02", "scanner": "scanner-primary", "fingerprint": "af258d4db8cfe68a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-29f98b3dd2016929", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/api/test_admin_generate_word_entry.py (1465 lines)"}, "properties": {"repobilityId": "56565d259b2760ef", "scanner": "scanner-primary", "fingerprint": "29f98b3dd2016929", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5ab301f8d18f2d15", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/api/test_seed.py (1389 lines)"}, "properties": {"repobilityId": "f0b2f276de74fc6c", "scanner": "scanner-primary", "fingerprint": "5ab301f8d18f2d15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-22cf93ac6afc7c55", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/api/v1/test_billing.py (1779 lines)"}, "properties": {"repobilityId": "a5fb2641024e9967", "scanner": "scanner-primary", "fingerprint": "22cf93ac6afc7c55", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-81a172030d784bf2", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/tasks/test_background.py (1817 lines)"}, "properties": {"repobilityId": "586ea39d20ccf5af", "scanner": "scanner-primary", "fingerprint": "81a172030d784bf2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1a25606caad93950", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_seed_service.py (2000 lines)"}, "properties": {"repobilityId": "04a4e6327ebf940c", "scanner": "scanner-primary", "fingerprint": "1a25606caad93950", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7e8fd78969d6f945", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_local_verification_service.py (1384 lines)"}, "properties": {"repobilityId": "f6a0a27f6fe7b4bc", "scanner": "scanner-primary", "fingerprint": "7e8fd78969d6f945", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-acaa3b6f4a99d46d", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_progress_service.py (1468 lines)"}, "properties": {"repobilityId": "6af983d615c3ad6d", "scanner": "scanner-primary", "fingerprint": "acaa3b6f4a99d46d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6cc5599ead0ff769", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_culture_question_service.py (2512 lines)"}, "properties": {"repobilityId": "155e41372315980f", "scanner": "scanner-primary", "fingerprint": "6cc5599ead0ff769", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f9dd0034bbba0ed8", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_webhook_service.py (1327 lines)"}, "properties": {"repobilityId": "ad58ce8c8173847d", "scanner": "scanner-primary", "fingerprint": "f9dd0034bbba0ed8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d0b3d45c3fe8f77e", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/services/test_card_generator_service.py (2265 lines)"}, "properties": {"repobilityId": "cf3f8549c923319a", "scanner": "scanner-primary", "fingerprint": "d0b3d45c3fe8f77e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e58b45f4eec51e49", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/unit/repositories/test_mock_exam.py (1546 lines)"}, "properties": {"repobilityId": "483e7d786f7ea9fd", "scanner": "scanner-primary", "fingerprint": "e58b45f4eec51e49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-618898eebaedbc9a", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/tests/e2e/scenarios/test_culture_practice.py (2112 lines)"}, "properties": {"repobilityId": "9ad868781a0ee558", "scanner": "scanner-primary", "fingerprint": "618898eebaedbc9a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-55760393295d5fa6", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/src/api/v1/decks.py (1354 lines)"}, "properties": {"repobilityId": "f8159eaf3229b129", "scanner": "scanner-primary", "fingerprint": "55760393295d5fa6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2af2d028fac7a197", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/src/api/v1/admin.py (6557 lines)"}, "properties": {"repobilityId": "36d19679bb970e00", "scanner": "scanner-primary", "fingerprint": "2af2d028fac7a197", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0fe93c155057b692", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/src/services/seed_grammar_data.py (1443 lines)"}, "properties": {"repobilityId": "55b8ad6ca374c15d", "scanner": "scanner-primary", "fingerprint": "0fe93c155057b692", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-57dce116c764b455", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/src/services/seed_service.py (6023 lines)"}, "properties": {"repobilityId": "755a02d2c70d7950", "scanner": "scanner-primary", "fingerprint": "57dce116c764b455", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-092d199472aa0c43", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/src/services/culture_question_service.py (1884 lines)"}, "properties": {"repobilityId": "0d26229317b2ba38", "scanner": "scanner-primary", "fingerprint": "092d199472aa0c43", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9a12f2447999221d", "level": "note", "message": {"text": "Very large file: learn-greek-easy-backend/src/db/models.py (3463 lines)"}, "properties": {"repobilityId": "7bfbd663410085ac", "scanner": "scanner-primary", "fingerprint": "9a12f2447999221d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-886dbca13027ac81", "level": "note", "message": {"text": "Very large file: learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts (1510 lines)"}, "properties": {"repobilityId": "11c32a5317a98d6b", "scanner": "scanner-primary", "fingerprint": "886dbca13027ac81", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a939317877e866c0", "level": "note", "message": {"text": "Very large file: learn-greek-easy-frontend/src/components/culture/__tests__/MCQComponent.test.tsx (1850 lines)"}, "properties": {"repobilityId": "397208ee61d1d7e9", "scanner": "scanner-primary", "fingerprint": "a939317877e866c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f66f918462c1434c", "level": "note", "message": {"text": "Very large file: learn-greek-easy-frontend/src/services/adminAPI.ts (1888 lines)"}, "properties": {"repobilityId": "d732aa4569894fdf", "scanner": "scanner-primary", "fingerprint": "f66f918462c1434c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-09bad5ab1f174fc5", "level": "note", "message": {"text": "34 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "09bad5ab1f174fc5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f66cb7f2c9e156fc", "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": "80f9682c8003a610", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "49c02ed66db267bb", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "aa4a9157e58839d0", "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": "19194965c8ab3ef3", "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": "c9a92d080e066e0d", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-552dd1e68f4c90a3", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-mobile/tailwind.config.js:48"}, "properties": {"repobilityId": "671d8e4d609498e7", "scanner": "scanner-primary", "fingerprint": "552dd1e68f4c90a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a747f99675ba9402", "level": "none", "message": {"text": "Commented-code block (8 lines) in learn-greek-easy-mobile/app.config.ts:52"}, "properties": {"repobilityId": "a9af9dbbafe00703", "scanner": "scanner-primary", "fingerprint": "a747f99675ba9402", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-100661f1c3af462f", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/scripts/check-token-opacity.mjs:98"}, "properties": {"repobilityId": "32d657b78d1a8e40", "scanner": "scanner-primary", "fingerprint": "100661f1c3af462f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60ac2b69e6e39f9c", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/scripts/__tests__/check-token-opacity.test.ts:260"}, "properties": {"repobilityId": "916696f726ecc948", "scanner": "scanner-primary", "fingerprint": "60ac2b69e6e39f9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-319154d0d2a152f9", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/__mocks__/react-native-css-interop.js:1"}, "properties": {"repobilityId": "2eea626ff3014e29", "scanner": "scanner-primary", "fingerprint": "319154d0d2a152f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bcf9f416e1a9f6a", "level": "none", "message": {"text": "Commented-code block (8 lines) in learn-greek-easy-mobile/src/types/deck.ts:40"}, "properties": {"repobilityId": "4a72f30364149f6a", "scanner": "scanner-primary", "fingerprint": "0bcf9f416e1a9f6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37012d67e3bae0cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/components/auth/__tests__/login.test.tsx:15"}, "properties": {"repobilityId": "31e4e5236f1b51a8", "scanner": "scanner-primary", "fingerprint": "37012d67e3bae0cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7389ff50a3dbb754", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/components/onboarding/__tests__/onboarding.test.tsx:187"}, "properties": {"repobilityId": "44e83f715437f284", "scanner": "scanner-primary", "fingerprint": "7389ff50a3dbb754", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-feaab23559cbab58", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/_layout.tsx:50"}, "properties": {"repobilityId": "44d95145337ee851", "scanner": "scanner-primary", "fingerprint": "feaab23559cbab58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee8d6a4b7d5f773e", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-mobile/src/app/situations/[situationId].tsx:124"}, "properties": {"repobilityId": "56ff372ecf11601d", "scanner": "scanner-primary", "fingerprint": "ee8d6a4b7d5f773e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9f9ed1a6b16bd01", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/(app)/__tests__/culture-screen.test.tsx:138"}, "properties": {"repobilityId": "c894f59200bbcc95", "scanner": "scanner-primary", "fingerprint": "e9f9ed1a6b16bd01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f9b5856d75efccc", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/app/(app)/__tests__/home-analytics.test.tsx:285"}, "properties": {"repobilityId": "16626464e55790ce", "scanner": "scanner-primary", "fingerprint": "3f9b5856d75efccc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ebdecb89530f1e0", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-mobile/src/app/(auth)/login.tsx:59"}, "properties": {"repobilityId": "45f1e8a336472def", "scanner": "scanner-primary", "fingerprint": "3ebdecb89530f1e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-401ad8cb85a36be2", "level": "note", "message": {"text": "Legacy-named symbol `reviews_v2` in learn-greek-easy-mobile/src/hooks/use-submit-review.ts:3"}, "properties": {"repobilityId": "43b6b787f057886c", "scanner": "scanner-primary", "fingerprint": "401ad8cb85a36be2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6b3f064550ff1572", "level": "note", "message": {"text": "Legacy-named symbol `study_v2` in learn-greek-easy-mobile/src/hooks/use-study-queue.ts:3"}, "properties": {"repobilityId": "a9d8bd74fad369ac", "scanner": "scanner-primary", "fingerprint": "6b3f064550ff1572", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ce7bbcb7e28850ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-mobile/src/hooks/use-dashboard.ts:116"}, "properties": {"repobilityId": "6a85a48f738d7a77", "scanner": "scanner-primary", "fingerprint": "ce7bbcb7e28850ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa494d146f725ee2", "level": "note", "message": {"text": "Legacy-named symbol `t_old` in learn-greek-easy-backend/tests/integration/api/test_admin_exercises_list.py:729"}, "properties": {"repobilityId": "9691871c01ea4280", "scanner": "scanner-primary", "fingerprint": "aa494d146f725ee2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-866a903aac0ea671", "level": "note", "message": {"text": "Legacy-named symbol `test_replace_avatar_deletes_old` in learn-greek-easy-backend/tests/integration/api/test_auth_avatar.py:342"}, "properties": {"repobilityId": "983e98603d559917", "scanner": "scanner-primary", "fingerprint": "866a903aac0ea671", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c3de067e499ba6e", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/tests/integration/services/test_progress_dashboard_batching.py:89"}, "properties": {"repobilityId": "1ad6610e75cf4c20", "scanner": "scanner-primary", "fingerprint": "2c3de067e499ba6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78936e143e387f36", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/integration/migrations/test_unaccent_migration.py:146"}, "properties": {"repobilityId": "7ad249efd8631646", "scanner": "scanner-primary", "fingerprint": "78936e143e387f36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1bdd8bd7e916833", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/test_forced_alignment.py:57"}, "properties": {"repobilityId": "76e6462dc3f4c7b4", "scanner": "scanner-primary", "fingerprint": "d1bdd8bd7e916833", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ecabaf2ad125c7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/test_redistribute_timing.py:62"}, "properties": {"repobilityId": "7e3cef68625227e9", "scanner": "scanner-primary", "fingerprint": "8ecabaf2ad125c7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8ce6eb5f9236a90", "level": "note", "message": {"text": "Legacy-named symbol `reviews_v2` in learn-greek-easy-backend/tests/unit/api/test_reviews_v2.py:59"}, "properties": {"repobilityId": "a0943aa55af65880", "scanner": "scanner-primary", "fingerprint": "b8ce6eb5f9236a90", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9f43f9bcfea8c936", "level": "note", "message": {"text": "Legacy-named symbol `study_v2` in learn-greek-easy-backend/tests/unit/api/test_study_v2.py:28"}, "properties": {"repobilityId": "aea42085a0390b27", "scanner": "scanner-primary", "fingerprint": "9f43f9bcfea8c936", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a8ebf224542bb504", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/tests/unit/scripts/test_backfill_s3_cache_control.py:61"}, "properties": {"repobilityId": "4877c0a043654fa4", "scanner": "scanner-primary", "fingerprint": "a8ebf224542bb504", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-40611631769a41af", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/scripts/test_backfill_s3_cache_control.py:407"}, "properties": {"repobilityId": "c0626699e87f8086", "scanner": "scanner-primary", "fingerprint": "40611631769a41af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fd0333718e2de86", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/tests/unit/scripts/test_backfill_image_derivatives.py:53"}, "properties": {"repobilityId": "5d50cc66a8e9732d", "scanner": "scanner-primary", "fingerprint": "5fd0333718e2de86", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4fcd4557688258eb", "level": "none", "message": {"text": "Commented-code block (10 lines) in learn-greek-easy-backend/tests/unit/tasks/test_session_cleanup_monitor.py:38"}, "properties": {"repobilityId": "1040012fa475bfa5", "scanner": "scanner-primary", "fingerprint": "4fcd4557688258eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b655c709cb81e8f7", "level": "note", "message": {"text": "Legacy-named symbol `test_single_achievement_renders_singular_copy` in learn-greek-easy-backend/tests/unit/services/test_notification_service.py:387"}, "properties": {"repobilityId": "8788d65c335d7580", "scanner": "scanner-primary", "fingerprint": "b655c709cb81e8f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-022c22280ba22035", "level": "note", "message": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/tests/unit/services/test_v2_sm2_service.py:809"}, "properties": {"repobilityId": "f0dceec12f029637", "scanner": "scanner-primary", "fingerprint": "022c22280ba22035", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-471cce390412de16", "level": "note", "message": {"text": "Legacy-named symbol `svc_old` in learn-greek-easy-backend/tests/unit/services/test_s3_service.py:553"}, "properties": {"repobilityId": "d1976afea3508af7", "scanner": "scanner-primary", "fingerprint": "471cce390412de16", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5fb92c3b8b003259", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/services/test_elevenlabs_service.py:36"}, "properties": {"repobilityId": "21195b31f6a2296e", "scanner": "scanner-primary", "fingerprint": "5fb92c3b8b003259", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2a6d36ba691876b9", "level": "note", "message": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/tests/unit/services/test_v2_sm2_service_review.py:111"}, "properties": {"repobilityId": "e5d1e7210770e442", "scanner": "scanner-primary", "fingerprint": "2a6d36ba691876b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-28a9807f4c0e115c", "level": "note", "message": {"text": "Legacy-named symbol `test_total_reviews_matches_legacy` in learn-greek-easy-backend/tests/unit/services/test_sqlcon03_projection_review_aggregates.py:215"}, "properties": {"repobilityId": "3e544dc30722290b", "scanner": "scanner-primary", "fingerprint": "28a9807f4c0e115c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d8c3e54376ea66ac", "level": "note", "message": {"text": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/tests/unit/services/test_verification_tier.py:5"}, "properties": {"repobilityId": "5de33a90c31b8d31", "scanner": "scanner-primary", "fingerprint": "d8c3e54376ea66ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-09b797cef419b422", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/tests/unit/services/test_elevenlabs_dialog.py:36"}, "properties": {"repobilityId": "9eb38a719437ac3f", "scanner": "scanner-primary", "fingerprint": "09b797cef419b422", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-452ccec94b7441c9", "level": "note", "message": {"text": "Legacy-named symbol `sub_old` in learn-greek-easy-backend/tests/unit/services/test_webhook_service.py:1233"}, "properties": {"repobilityId": "f49ee823dd970bf8", "scanner": "scanner-primary", "fingerprint": "452ccec94b7441c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3e246ad55c6c8903", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/services/gamification/test_invariants.py:359"}, "properties": {"repobilityId": "273870fed9ea9177", "scanner": "scanner-primary", "fingerprint": "3e246ad55c6c8903", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02580695116b3b0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/unit/repositories/test_culture_question_stats.py:202"}, "properties": {"repobilityId": "7ca8d5db3ea54804", "scanner": "scanner-primary", "fingerprint": "02580695116b3b0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c131fcce6c2621a5", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/tests/unit/repositories/test_deck_repository.py:877"}, "properties": {"repobilityId": "b091200e855f6229", "scanner": "scanner-primary", "fingerprint": "c131fcce6c2621a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a59c371316ea60b6", "level": "note", "message": {"text": "Legacy-named symbol `TestMergedAggregatesMatchLegacy` in learn-greek-easy-backend/tests/unit/repositories/test_sqlcon04_culture_daily_aggregates.py:101"}, "properties": {"repobilityId": "69dd45b9ecfa07ba", "scanner": "scanner-primary", "fingerprint": "a59c371316ea60b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-683cc4ee23c1128f", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-backend/tests/unit/core/test_dependencies.py:366"}, "properties": {"repobilityId": "ccbfb1f580381441", "scanner": "scanner-primary", "fingerprint": "683cc4ee23c1128f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f945fd7e8526e26c", "level": "note", "message": {"text": "Legacy-named symbol `test_stripe_params_carry_new_email_not_old` in learn-greek-easy-backend/tests/unit/core/test_billing_utils_email_propagation_adversarial.py:278"}, "properties": {"repobilityId": "44a7f14c7449ea6f", "scanner": "scanner-primary", "fingerprint": "f945fd7e8526e26c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-64df3465c50d0c7e", "level": "note", "message": {"text": "Legacy-named symbol `test_consolidated_query_matches_legacy` in learn-greek-easy-backend/tests/fixtures/golden.py:28"}, "properties": {"repobilityId": "2fff6599bbb72fd2", "scanner": "scanner-primary", "fingerprint": "64df3465c50d0c7e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bc0bc1dc62b32b59", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/tests/fixtures/golden.py:140"}, "properties": {"repobilityId": "e1ea13ebc56d8588", "scanner": "scanner-primary", "fingerprint": "bc0bc1dc62b32b59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ca0ab59bac0e0ba", "level": "note", "message": {"text": "Legacy-named symbol `model_legacy` in learn-greek-easy-backend/tests/schemas/test_situation_schemas.py:136"}, "properties": {"repobilityId": "5255dfa90b394ee8", "scanner": "scanner-primary", "fingerprint": "9ca0ab59bac0e0ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f82a9e7f4e87609a", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260222_1400_delete_legacy_cards_basic_greek_nouns.py:22"}, "properties": {"repobilityId": "93850444f07f73ea", "scanner": "scanner-primary", "fingerprint": "f82a9e7f4e87609a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-0673aba42c301717", "level": "note", "message": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260526_admin2_26_00_merge_heads.py:23"}, "properties": {"repobilityId": "10b5db74ac68f9a0", "scanner": "scanner-primary", "fingerprint": "0673aba42c301717", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-50b4205edb73780f", "level": "note", "message": {"text": "Legacy-named symbol `dialog_status_old` in learn-greek-easy-backend/alembic/versions/20260312_1200_drop_text_approved_and_voice_name.py:45"}, "properties": {"repobilityId": "4bf128efb071045f", "scanner": "scanner-primary", "fingerprint": "50b4205edb73780f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8662ee0422cd16a6", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260225_1636_2a50e76fd433_fix_stuck_generating_audio_entries.py:66"}, "properties": {"repobilityId": "8685095a22302bcd", "scanner": "scanner-primary", "fingerprint": "8662ee0422cd16a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-bb27a9e4b563693d", "level": "note", "message": {"text": "Legacy-named symbol `situationstatus_old` in learn-greek-easy-backend/alembic/versions/20260503_sitst_01_drop_partial_ready.py:25"}, "properties": {"repobilityId": "8c80af4947fea8f8", "scanner": "scanner-primary", "fingerprint": "bb27a9e4b563693d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fba93d2dcf57c8da", "level": "note", "message": {"text": "Legacy-named symbol `dialog_status_old` in learn-greek-easy-backend/alembic/versions/20260313_1700_drop_published_from_dialog_status.py:26"}, "properties": {"repobilityId": "728bc88fcdf29f89", "scanner": "scanner-primary", "fingerprint": "fba93d2dcf57c8da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d7e047aefc4d713c", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/alembic/versions/20260121_1205_7b0abae73df7_add_vector_embedding_columns_to_culture_questions.py:69"}, "properties": {"repobilityId": "bf0b26fece9b78e0", "scanner": "scanner-primary", "fingerprint": "d7e047aefc4d713c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b27792f8745fe2df", "level": "note", "message": {"text": "Legacy-named symbol `decklevel_old` in learn-greek-easy-backend/alembic/versions/20260324_1000_drop_c1_c2_from_decklevel_enum.py:37"}, "properties": {"repobilityId": "9d2aab9efbbf819e", "scanner": "scanner-primary", "fingerprint": "b27792f8745fe2df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f96c6ff52ea44140", "level": "note", "message": {"text": "Legacy-named symbol `change_deck_card_system_default_to_v2` in learn-greek-easy-backend/alembic/versions/change_deck_card_system_default_to_v2.py:1"}, "properties": {"repobilityId": "e9e032b5257c45a6", "scanner": "scanner-primary", "fingerprint": "f96c6ff52ea44140", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-47a897bcd28a7726", "level": "note", "message": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260330_1300_esm2_merge_heads.py:18"}, "properties": {"repobilityId": "7b4561e5d2d2a1d6", "scanner": "scanner-primary", "fingerprint": "47a897bcd28a7726", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-5cd18e5f8fcfb85c", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 learn-greek-easy-backend/alembic/versions/20260128_1145_5208d6f4ad95_fix_level_up_notification_url.py:28"}, "properties": {"repobilityId": "ebafff870f320f20", "scanner": "scanner-primary", "fingerprint": "5cd18e5f8fcfb85c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-1e285509522cd473", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/src/config.py:531"}, "properties": {"repobilityId": "f2eb5bcc63c63985", "scanner": "scanner-primary", "fingerprint": "1e285509522cd473", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ababe46ca55cfea0", "level": "note", "message": {"text": "Legacy-named symbol `reviews_v2` in learn-greek-easy-backend/src/api/v1/router.py:38"}, "properties": {"repobilityId": "e188285f216518a7", "scanner": "scanner-primary", "fingerprint": "ababe46ca55cfea0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-37a9621c02f871fe", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/api/v1/xp.py:69"}, "properties": {"repobilityId": "dee4feb568fc3a52", "scanner": "scanner-primary", "fingerprint": "37a9621c02f871fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-135695ea7252feef", "level": "note", "message": {"text": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/src/api/v1/admin.py:229"}, "properties": {"repobilityId": "14809dc895f6646b", "scanner": "scanner-primary", "fingerprint": "135695ea7252feef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aaf19a1a3500b53f", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/api/v1/culture/router.py:1127"}, "properties": {"repobilityId": "d0b514e29572b69d", "scanner": "scanner-primary", "fingerprint": "aaf19a1a3500b53f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-38073d3800e18e4b", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/scripts/perf10_diagnosis.py:242"}, "properties": {"repobilityId": "b0d0c5ad48f99476", "scanner": "scanner-primary", "fingerprint": "38073d3800e18e4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6ebadb6684af020", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/src/scripts/backfill_image_derivatives.py:164"}, "properties": {"repobilityId": "31b7d7b8cf27cd7a", "scanner": "scanner-primary", "fingerprint": "c6ebadb6684af020", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f8881edac81f10ea", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in learn-greek-easy-backend/src/scripts/backfill_s3_cache_control.py:146"}, "properties": {"repobilityId": "fd7e8db689e03d65", "scanner": "scanner-primary", "fingerprint": "f8881edac81f10ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e2b83f520a8be94", "level": "note", "message": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/src/tasks/background.py:437"}, "properties": {"repobilityId": "73fa1ff250f3941b", "scanner": "scanner-primary", "fingerprint": "5e2b83f520a8be94", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ec399486599ed3d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/picture_match_exercise_service.py:176"}, "properties": {"repobilityId": "4e3be5c78d041564", "scanner": "scanner-primary", "fingerprint": "ec399486599ed3d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1b7271ea401ec67", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-backend/src/services/seed_service.py:5270"}, "properties": {"repobilityId": "68b6696a874ddd05", "scanner": "scanner-primary", "fingerprint": "d1b7271ea401ec67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36651619152b1dea", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in learn-greek-easy-backend/src/services/elevenlabs_service.py:11"}, "properties": {"repobilityId": "e1c579ca5f0e8324", "scanner": "scanner-primary", "fingerprint": "36651619152b1dea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2aff318204314185", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/services/culture_question_service.py:1032"}, "properties": {"repobilityId": "056da0d8ba691094", "scanner": "scanner-primary", "fingerprint": "2aff318204314185", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9dd19cceaced9d4a", "level": "note", "message": {"text": "Legacy-named symbol `card_mastered_v2` in learn-greek-easy-backend/src/services/v2_sm2_service.py:365"}, "properties": {"repobilityId": "777a9238fef45f88", "scanner": "scanner-primary", "fingerprint": "9dd19cceaced9d4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fe20a99327ad39e3", "level": "note", "message": {"text": "Legacy-named symbol `compute_combined_tier_v2` in learn-greek-easy-backend/src/services/verification_tier.py:67"}, "properties": {"repobilityId": "fe4229acd4755841", "scanner": "scanner-primary", "fingerprint": "fe20a99327ad39e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f172928ecc462a97", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/services/progress_service.py:97"}, "properties": {"repobilityId": "2c4537027f5b46f5", "scanner": "scanner-primary", "fingerprint": "f172928ecc462a97", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1428457cb8912738", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/s3_service.py:66"}, "properties": {"repobilityId": "ecd7ee6c91955134", "scanner": "scanner-primary", "fingerprint": "1428457cb8912738", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eeeb9cda42265ec3", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in learn-greek-easy-backend/src/services/local_verification_service.py:44"}, "properties": {"repobilityId": "ce5460d7e1e56855", "scanner": "scanner-primary", "fingerprint": "eeeb9cda42265ec3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3babc1412d7d40c9", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/services/gamification/projection.py:272"}, "properties": {"repobilityId": "768a91a1ec9d297d", "scanner": "scanner-primary", "fingerprint": "3babc1412d7d40c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa9cdc82c8efe5ba", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-backend/src/services/gamification/streak.py:107"}, "properties": {"repobilityId": "5d4317f587d239fe", "scanner": "scanner-primary", "fingerprint": "aa9cdc82c8efe5ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ebdbea329b7703f", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/db/session.py:161"}, "properties": {"repobilityId": "53726e135d42afbb", "scanner": "scanner-primary", "fingerprint": "8ebdbea329b7703f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b9142f71d5b1bb7", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-backend/src/repositories/culture_question_stats.py:84"}, "properties": {"repobilityId": "71258f3068ec4653", "scanner": "scanner-primary", "fingerprint": "3b9142f71d5b1bb7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6aa167a80614d7ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-backend/src/repositories/culture_question.py:15"}, "properties": {"repobilityId": "2713789e656d7945", "scanner": "scanner-primary", "fingerprint": "6aa167a80614d7ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8cd689d567157a4", "level": "none", "message": {"text": "Commented-code block (9 lines) in learn-greek-easy-backend/src/repositories/card_record_statistics.py:471"}, "properties": {"repobilityId": "131121020678fa5d", "scanner": "scanner-primary", "fingerprint": "b8cd689d567157a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9470858cc803de37", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/playwright.config.ts:114"}, "properties": {"repobilityId": "51309d03d960fd26", "scanner": "scanner-primary", "fingerprint": "9470858cc803de37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80e8242a5286d2e0", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/lighthouserc.cjs:43"}, "properties": {"repobilityId": "394de65e6be7f110", "scanner": "scanner-primary", "fingerprint": "80e8242a5286d2e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15458985ad4a7707", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/lighthouserc.mobile.cjs:56"}, "properties": {"repobilityId": "7c7fe9ac1f5f4bee", "scanner": "scanner-primary", "fingerprint": "15458985ad4a7707", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f0e258c594c9292", "level": "none", "message": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/tests/visual/v2-practice.visual.spec.ts:336"}, "properties": {"repobilityId": "3a3f255b8c7309af", "scanner": "scanner-primary", "fingerprint": "1f0e258c594c9292", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-250832da6a5afc0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/flashcard-review-v2.spec.ts:176"}, "properties": {"repobilityId": "8d8d5cdd8f6cc288", "scanner": "scanner-primary", "fingerprint": "250832da6a5afc0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d8cf80a898b3eb5", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/gamification-reconcile-self-heal.spec.ts:101"}, "properties": {"repobilityId": "10dab84396faaa02", "scanner": "scanner-primary", "fingerprint": "1d8cf80a898b3eb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a210ddfdf9459d03", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/admin-exercises-a11y.spec.ts:31"}, "properties": {"repobilityId": "2da55d0d42a88c8f", "scanner": "scanner-primary", "fingerprint": "a210ddfdf9459d03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e027988aca6f0c63", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/card-audio-playback.spec.ts:528"}, "properties": {"repobilityId": "0dc8eb33234ce213", "scanner": "scanner-primary", "fingerprint": "e027988aca6f0c63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52112b47ba6d64b5", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/news-feed.spec.ts:67"}, "properties": {"repobilityId": "8460fc10a4df1d02", "scanner": "scanner-primary", "fingerprint": "52112b47ba6d64b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a60fdfa122894f79", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/tests/e2e/admin-exercises.spec.ts:187"}, "properties": {"repobilityId": "943d0fa7918bfe35", "scanner": "scanner-primary", "fingerprint": "a60fdfa122894f79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c92a4a5f41b00f7", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/culture-deck-detail.spec.ts:122"}, "properties": {"repobilityId": "4fb25ac58fdb0c11", "scanner": "scanner-primary", "fingerprint": "9c92a4a5f41b00f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58e2630adcfc29f4", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/admin-decks.spec.ts:28"}, "properties": {"repobilityId": "f29cf3599f36ae4f", "scanner": "scanner-primary", "fingerprint": "58e2630adcfc29f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b93b9f777b0a69b9", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/changelog.spec.ts:182"}, "properties": {"repobilityId": "c596e2110e457c60", "scanner": "scanner-primary", "fingerprint": "b93b9f777b0a69b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4091e913d4b33394", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/gamification-immediate-toast.spec.ts:92"}, "properties": {"repobilityId": "5ac04f9cb961399d", "scanner": "scanner-primary", "fingerprint": "4091e913d4b33394", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1de39df24d68582c", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/tests/e2e/dark-mode.spec.ts:29"}, "properties": {"repobilityId": "1af0bace41bd8681", "scanner": "scanner-primary", "fingerprint": "1de39df24d68582c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7ae23ff60d23530", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/news-country-filter.spec.ts:141"}, "properties": {"repobilityId": "3e5712f9f8726562", "scanner": "scanner-primary", "fingerprint": "c7ae23ff60d23530", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43f5fe4960a3caff", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/tests/e2e/i18n/admin-translations.spec.ts:16"}, "properties": {"repobilityId": "27188cd0d0774ea0", "scanner": "scanner-primary", "fingerprint": "43f5fe4960a3caff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f29b6eeb67c10253", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/App.tsx:25"}, "properties": {"repobilityId": "90d1a563bcf2754b", "scanner": "scanner-primary", "fingerprint": "f29b6eeb67c10253", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e138925ee03bd42", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/authStore.ts:349"}, "properties": {"repobilityId": "e5444a4b87fa6d5c", "scanner": "scanner-primary", "fingerprint": "8e138925ee03bd42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2fad316f23f3f70", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/deckStore.ts:41"}, "properties": {"repobilityId": "644bc8f05ae4402d", "scanner": "scanner-primary", "fingerprint": "f2fad316f23f3f70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8eac08b679a23fdb", "level": "note", "message": {"text": "Legacy-named symbol `card_reviewed_v2` in learn-greek-easy-frontend/src/stores/__tests__/v2PracticeStore.test.ts:763"}, "properties": {"repobilityId": "bb8cf5a36e6f5d76", "scanner": "scanner-primary", "fingerprint": "8eac08b679a23fdb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1153b1f11c246391", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/__tests__/deckStore.test.ts:337"}, "properties": {"repobilityId": "864aa6c0e124a800", "scanner": "scanner-primary", "fingerprint": "1153b1f11c246391", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8753c3e75c96cae", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/stores/__tests__/authStore.test.ts:196"}, "properties": {"repobilityId": "5f08066b886a635b", "scanner": "scanner-primary", "fingerprint": "c8753c3e75c96cae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efba6894d5d5d065", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/init.ts:182"}, "properties": {"repobilityId": "1a94d22b9b3dd70a", "scanner": "scanner-primary", "fingerprint": "efba6894d5d5d065", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a496d212a7d41b6a", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/i18next.d.ts:1"}, "properties": {"repobilityId": "609322b7d02b9f38", "scanner": "scanner-primary", "fingerprint": "a496d212a7d41b6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1afc0bffc25cd6a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/i18n/__tests__/i18n.test.ts:209"}, "properties": {"repobilityId": "af223b7917751a4e", "scanner": "scanner-primary", "fingerprint": "1afc0bffc25cd6a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ead691c9f079034", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/i18n/__tests__/missingKeyHandler.test.ts:72"}, "properties": {"repobilityId": "e50afd3ec76c967e", "scanner": "scanner-primary", "fingerprint": "0ead691c9f079034", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-920092bb3c8fef3f", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/i18n/__tests__/i18n-adversarial.test.ts:132"}, "properties": {"repobilityId": "142ab7ef29efd9fa", "scanner": "scanner-primary", "fingerprint": "920092bb3c8fef3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c676ece27229446b", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/layout/__tests__/Header.test.tsx:415"}, "properties": {"repobilityId": "d49fe62c05e409fb", "scanner": "scanner-primary", "fingerprint": "c676ece27229446b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af67e88f4ef0382c", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/charts/__tests__/StageDistributionChart.test.tsx:8"}, "properties": {"repobilityId": "98f50fb96904d30d", "scanner": "scanner-primary", "fingerprint": "af67e88f4ef0382c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bd5e18f4552cb5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/navigation/index.ts:3"}, "properties": {"repobilityId": "c6f07564bb2ed9ce", "scanner": "scanner-primary", "fingerprint": "6bd5e18f4552cb5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9dd65745e252260", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/LandingRoute.test.tsx:199"}, "properties": {"repobilityId": "6d44fb929e9e840b", "scanner": "scanner-primary", "fingerprint": "f9dd65745e252260", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16f810ce5003a224", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/PERF-09-02.adversarial.test.tsx:133"}, "properties": {"repobilityId": "9ac09d60cda41752", "scanner": "scanner-primary", "fingerprint": "16f810ce5003a224", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72970ff816d6ae19", "level": "none", "message": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/RouteGuard.test.tsx:273"}, "properties": {"repobilityId": "2396afba3dab103c", "scanner": "scanner-primary", "fingerprint": "72970ff816d6ae19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0af381d1f90cf24", "level": "none", "message": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx:504"}, "properties": {"repobilityId": "69debffb12a99672", "scanner": "scanner-primary", "fingerprint": "e0af381d1f90cf24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8390fa21e8551400", "level": "none", "message": {"text": "Commented-code block (8 lines) in learn-greek-easy-frontend/src/components/achievements/AchievementCategory.tsx:45"}, "properties": {"repobilityId": "b8bf00dba1634d14", "scanner": "scanner-primary", "fingerprint": "8390fa21e8551400", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-471808f28183ecc5", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/CardErrorDrawer.tsx:3"}, "properties": {"repobilityId": "a25aa875c6eb9e0c", "scanner": "scanner-primary", "fingerprint": "471808f28183ecc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-688869e587243ddf", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/FeedbackDrawer.tsx:3"}, "properties": {"repobilityId": "c5ececf4189c77cd", "scanner": "scanner-primary", "fingerprint": "688869e587243ddf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-863b2eec1b2ff15c", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/__tests__/AdminFeedbackDelete.test.tsx:3"}, "properties": {"repobilityId": "af13ec8c2ffdfc9e", "scanner": "scanner-primary", "fingerprint": "863b2eec1b2ff15c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2278d7a4e5488042", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/__tests__/DeckDetailModal.searchFilterSort.test.tsx:271"}, "properties": {"repobilityId": "d469d04896b60b93", "scanner": "scanner-primary", "fingerprint": "2278d7a4e5488042", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b456bfc985750433", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/components/admin/__tests__/DeckDetailModal.searchFilterSort.test.tsx:254"}, "properties": {"repobilityId": "c54a3ec95f9336bc", "scanner": "scanner-primary", "fingerprint": "b456bfc985750433", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f075dcaa01ec11a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/components/admin/exercises/AdminExercisesSection.tsx:85"}, "properties": {"repobilityId": "c5430942c59bd9f8", "scanner": "scanner-primary", "fingerprint": "3f075dcaa01ec11a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88a396714589f9a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/VocabWordDetail.tsx:6"}, "properties": {"repobilityId": "40a81cc824d34daa", "scanner": "scanner-primary", "fingerprint": "88a396714589f9a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a5f4219dcb8fd2a", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/CultureQuestionDetail.tsx:6"}, "properties": {"repobilityId": "33941fd8a97787e3", "scanner": "scanner-primary", "fingerprint": "6a5f4219dcb8fd2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb974e2b4327bb4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/decks/__tests__/DeckSettingsTab.test.tsx:213"}, "properties": {"repobilityId": "0946a25ff91d9e3c", "scanner": "scanner-primary", "fingerprint": "eb974e2b4327bb4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dd6f21d011fe783", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/changelog/ChangelogTab.tsx:82"}, "properties": {"repobilityId": "fd68fc116e5931b5", "scanner": "scanner-primary", "fingerprint": "6dd6f21d011fe783", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70a64291ee681ebd", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/changelog/__tests__/ChangelogEditorDrawer.test.tsx:1057"}, "properties": {"repobilityId": "b6923811457163e1", "scanner": "scanner-primary", "fingerprint": "70a64291ee681ebd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f5a442650ead810", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/announcements/__tests__/AnnouncementsTab.test.tsx:44"}, "properties": {"repobilityId": "41480e5e002aacc0", "scanner": "scanner-primary", "fingerprint": "0f5a442650ead810", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19d489b09d5dff17", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/vocabulary/__tests__/EnrichmentChips.test.tsx:456"}, "properties": {"repobilityId": "ddfeebcb62354355", "scanner": "scanner-primary", "fingerprint": "19d489b09d5dff17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd6075b59f8f73af", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/news/newsThumbs.ts:6"}, "properties": {"repobilityId": "fdc5766562c2f3fa", "scanner": "scanner-primary", "fingerprint": "fd6075b59f8f73af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-611bad85cfea5352", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.image.test.tsx:3"}, "properties": {"repobilityId": "40c18e1438204b63", "scanner": "scanner-primary", "fingerprint": "611bad85cfea5352", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-547dbf951109e6b8", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.test.tsx:464"}, "properties": {"repobilityId": "8021cdf55d300935", "scanner": "scanner-primary", "fingerprint": "547dbf951109e6b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e3a65c604c1ee79", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.audio.test.tsx:3"}, "properties": {"repobilityId": "ef189e76232c3ce0", "scanner": "scanner-primary", "fingerprint": "9e3a65c604c1ee79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad358e67670448be", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/admin/news/__tests__/NewsEditDrawer.linkedSituation.test.tsx:594"}, "properties": {"repobilityId": "12d08990d625dec6", "scanner": "scanner-primary", "fingerprint": "ad358e67670448be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83e8ceae28ef4e31", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/profile/PersonalInfoSection.tsx:105"}, "properties": {"repobilityId": "814d911ecb36954f", "scanner": "scanner-primary", "fingerprint": "83e8ceae28ef4e31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2947afea1e95cb9b", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/components/news/__tests__/NewsCard.eager.adversarial.test.tsx:94"}, "properties": {"repobilityId": "197378808a214d93", "scanner": "scanner-primary", "fingerprint": "2947afea1e95cb9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0b71cfe1add13d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/components/interactive/index.ts:3"}, "properties": {"repobilityId": "6c748c44804554d3", "scanner": "scanner-primary", "fingerprint": "f0b71cfe1add13d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b316d5677942a991", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/cefrColors.ts:49"}, "properties": {"repobilityId": "57b6b3e3d2e949b0", "scanner": "scanner-primary", "fingerprint": "b316d5677942a991", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c2def91a4a5da87", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/lib/sseTestUtils.ts:15"}, "properties": {"repobilityId": "fb6cbfcc446a478f", "scanner": "scanner-primary", "fingerprint": "7c2def91a4a5da87", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b9a673c90ba54219", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/lib/__tests__/supabaseClient.test.ts:108"}, "properties": {"repobilityId": "521bc4ce83d39de3", "scanner": "scanner-primary", "fingerprint": "b9a673c90ba54219", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45b4bede29088fe6", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/__tests__/retryUtils.test.ts:266"}, "properties": {"repobilityId": "5439bf4e079c43dc", "scanner": "scanner-primary", "fingerprint": "45b4bede29088fe6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b020c559c763cf4", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/lib/__tests__/sentry-queue.test.ts:25"}, "properties": {"repobilityId": "df17b2316b78f375", "scanner": "scanner-primary", "fingerprint": "7b020c559c763cf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd104cc9722b9cee", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/V2FlashcardPracticePage.tsx:366"}, "properties": {"repobilityId": "d55fff61b6aa638c", "scanner": "scanner-primary", "fingerprint": "cd104cc9722b9cee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7f15e3daad579c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/Dashboard.metrics.test.tsx:126"}, "properties": {"repobilityId": "c334e674f191703b", "scanner": "scanner-primary", "fingerprint": "c7f15e3daad579c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ab9c24281774451", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/AdminPage.test.tsx:62"}, "properties": {"repobilityId": "0e3e3e1a63fa1558", "scanner": "scanner-primary", "fingerprint": "4ab9c24281774451", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-744b6e76e2c624a8", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/pages/__tests__/Statistics.learnedCount.test.tsx:43"}, "properties": {"repobilityId": "bb0f7bcc0283afe4", "scanner": "scanner-primary", "fingerprint": "744b6e76e2c624a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ff58b13f61d34cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/pages/__tests__/V2FlashcardPracticePage.test.tsx:483"}, "properties": {"repobilityId": "6073f61eaca01484", "scanner": "scanner-primary", "fingerprint": "3ff58b13f61d34cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4cc4428d347371a", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/pages/__tests__/SituationsPage.test.tsx:130"}, "properties": {"repobilityId": "410686b9417a0bb8", "scanner": "scanner-primary", "fingerprint": "d4cc4428d347371a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08f73a04da5c7097", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/pages/culture/__tests__/CulturePage.test.tsx:245"}, "properties": {"repobilityId": "551893b1303335dc", "scanner": "scanner-primary", "fingerprint": "08f73a04da5c7097", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd0ecb8a49498288", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/hooks/useSSE.ts:2"}, "properties": {"repobilityId": "3e0ba00d52348926", "scanner": "scanner-primary", "fingerprint": "bd0ecb8a49498288", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6beea866ffc90d0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/services/authAPI.ts:151"}, "properties": {"repobilityId": "72769a9c1ff86461", "scanner": "scanner-primary", "fingerprint": "6beea866ffc90d0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b47c9c7f07600739", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/DxResumeHero.tsx:10"}, "properties": {"repobilityId": "c0795bbf0f401fec", "scanner": "scanner-primary", "fingerprint": "b47c9c7f07600739", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d4c60a3573dfda9", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/__tests__/DxMetricStrip.test.tsx:267"}, "properties": {"repobilityId": "cadc8807a44d6a93", "scanner": "scanner-primary", "fingerprint": "9d4c60a3573dfda9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a035d7d05a9338b5", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/decks/components/V2DeckPage/__tests__/DxResumeHero.test.tsx:346"}, "properties": {"repobilityId": "cc94114f677e78f9", "scanner": "scanner-primary", "fingerprint": "a035d7d05a9338b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69417169894bba37", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/decks/dx/DxCover.tsx:6"}, "properties": {"repobilityId": "113e776245cff557", "scanner": "scanner-primary", "fingerprint": "69417169894bba37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57131aa8263e2894", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 learn-greek-easy-frontend/src/features/words/hooks/__tests__/useWordEntry.sse.test.ts:54"}, "properties": {"repobilityId": "0e2f977d791a18cf", "scanner": "scanner-primary", "fingerprint": "57131aa8263e2894", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-096f29681144b600", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/judge.ts:223"}, "properties": {"repobilityId": "093a82aae1a41c8a", "scanner": "scanner-primary", "fingerprint": "096f29681144b600", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-613342212dc2e4d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/Done.tsx:11"}, "properties": {"repobilityId": "54311ed9d7efe838", "scanner": "scanner-primary", "fingerprint": "613342212dc2e4d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfa05676482fe117", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/Answer.tsx:5"}, "properties": {"repobilityId": "38e4d1cc8b62bdaf", "scanner": "scanner-primary", "fingerprint": "bfa05676482fe117", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe2f5cef50b760ca", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/AudioSurface.tsx:5"}, "properties": {"repobilityId": "c496b9a28aa942d4", "scanner": "scanner-primary", "fingerprint": "fe2f5cef50b760ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fea2e27617018736", "level": "none", "message": {"text": "Commented-code block (8 lines) in learn-greek-easy-frontend/src/features/practice/pf/Card.tsx:5"}, "properties": {"repobilityId": "76f08c6e7ca9c80f", "scanner": "scanner-primary", "fingerprint": "fea2e27617018736", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-272dded55210a94e", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/RatingRow.tsx:5"}, "properties": {"repobilityId": "3bebff4eda13ced1", "scanner": "scanner-primary", "fingerprint": "272dded55210a94e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce6f9dd1d01c8dd2", "level": "none", "message": {"text": "Commented-code block (9 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/TypedInput.test.tsx:5"}, "properties": {"repobilityId": "f8db418ce0d0ce62", "scanner": "scanner-primary", "fingerprint": "ce6f9dd1d01c8dd2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd1c5c7e1067a80e", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/RatingRow.test.tsx:3"}, "properties": {"repobilityId": "da7c3ad6ab7393b5", "scanner": "scanner-primary", "fingerprint": "fd1c5c7e1067a80e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ef08d8bf1317ca3", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/judge.test.ts:5"}, "properties": {"repobilityId": "1fb9200beb679091", "scanner": "scanner-primary", "fingerprint": "0ef08d8bf1317ca3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a0b7fe3c2e5e543", "level": "none", "message": {"text": "Commented-code block (12 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Answer.test.tsx:3"}, "properties": {"repobilityId": "136b804704be9d09", "scanner": "scanner-primary", "fingerprint": "2a0b7fe3c2e5e543", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec4e36238da554ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Toast.test.tsx:3"}, "properties": {"repobilityId": "b281064dd9b43596", "scanner": "scanner-primary", "fingerprint": "ec4e36238da554ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90e63fcbac28773d", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/__tests__/Done.test.tsx:5"}, "properties": {"repobilityId": "f831805d712dd4f4", "scanner": "scanner-primary", "fingerprint": "90e63fcbac28773d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3dbabf8340dbb2b7", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Declension.tsx:18"}, "properties": {"repobilityId": "8fea5963b850eb82", "scanner": "scanner-primary", "fingerprint": "3dbabf8340dbb2b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e5ed6cc4f6459cf", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Sentence.tsx:3"}, "properties": {"repobilityId": "346fccd219de5f43", "scanner": "scanner-primary", "fingerprint": "9e5ed6cc4f6459cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39e1c0a148e00ff0", "level": "none", "message": {"text": "Commented-code block (6 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Grammar.tsx:8"}, "properties": {"repobilityId": "0502092a8e3c11b2", "scanner": "scanner-primary", "fingerprint": "39e1c0a148e00ff0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21345978527a5636", "level": "none", "message": {"text": "Commented-code block (7 lines) in learn-greek-easy-frontend/src/features/practice/pf/questions/Translation.tsx:8"}, "properties": {"repobilityId": "bb41311e50226eb6", "scanner": "scanner-primary", "fingerprint": "21345978527a5636", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef22fd58bfde6f76", "level": "note", "message": {"text": "51 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3022eac3b673b267", "scanner": "scanner-primary", "fingerprint": "ef22fd58bfde6f76", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4d5ee2df42f841f0", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4bdee5bcaaae0b0f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "8a7967f81cfc6270", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "433f75ed9a6defbb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "405f69a9a185737d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b0bdb2d5ccc99b9b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2c508dece569c131", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0c6947730fb21eef", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4a318e60445a06a5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7907de6a367f12a1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6879b646a0ac9211", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7fc6dcd30054c16c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5e67a05a1f9c15b1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c3ba8d9df5497172", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1da0a88e4f42bb03", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "04775434e73c3eaa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "d060353b42fd569b", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "9f4f19aa4698a390", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "8854282d11731ef5", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "24782b6ae5b384b8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-bca72bb0f429f900", "level": "warning", "message": {"text": "Frontend route `/callback` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "f39642cc44138fdd", "scanner": "scanner-primary", "fingerprint": "bca72bb0f429f900", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-947b257cb847ad6f", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "044cce7dbc9489f3", "scanner": "scanner-primary", "fingerprint": "947b257cb847ad6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-99a5d61f008cc690", "level": "warning", "message": {"text": "Frontend route `:id` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "a0f27525e07cdf97", "scanner": "scanner-primary", "fingerprint": "99a5d61f008cc690", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-524b86d8f403620d", "level": "warning", "message": {"text": "Frontend route `/decks/:deckId/words/:wordId` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "ab9eeeca8ae47642", "scanner": "scanner-primary", "fingerprint": "524b86d8f403620d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-65adc1e8fab9d46e", "level": "warning", "message": {"text": "Frontend route `/decks/:deckId/words/:wordId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "93734f49b2ca06ba", "scanner": "scanner-primary", "fingerprint": "65adc1e8fab9d46e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f68be474591cbdee", "level": "warning", "message": {"text": "Frontend route `/stats` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "869685f732c3b099", "scanner": "scanner-primary", "fingerprint": "f68be474591cbdee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b76de722fb2ad8c8", "level": "warning", "message": {"text": "Frontend route `/activity-feed-test` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "f6eb7ff092073d17", "scanner": "scanner-primary", "fingerprint": "b76de722fb2ad8c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8ddb70cf104a8a55", "level": "warning", "message": {"text": "Frontend route `/decks/:deckId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "0f76efb044445cb6", "scanner": "scanner-primary", "fingerprint": "8ddb70cf104a8a55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-39222739fc027f9b", "level": "warning", "message": {"text": "Frontend route `/culture/decks/:id` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "c1a4a1d96330bc60", "scanner": "scanner-primary", "fingerprint": "39222739fc027f9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d0263d4b2cf0f8e1", "level": "warning", "message": {"text": "Frontend route `/culture/:deckId/practice` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "9479c7b05bfbc513", "scanner": "scanner-primary", "fingerprint": "d0263d4b2cf0f8e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1282f28485d1ab86", "level": "warning", "message": {"text": "Frontend route `/culture/:deckId/summary` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "091487a5a5f46b44", "scanner": "scanner-primary", "fingerprint": "1282f28485d1ab86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d8d600cb59fe48ff", "level": "warning", "message": {"text": "Frontend route `/practice/exercises/session` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "95c7d1381aeb9293", "scanner": "scanner-primary", "fingerprint": "d8d600cb59fe48ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-85924db5fc41e8e2", "level": "warning", "message": {"text": "Frontend route `/checkout/success` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "ad0755d814881443", "scanner": "scanner-primary", "fingerprint": "85924db5fc41e8e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-23e101ded0e8b62d", "level": "warning", "message": {"text": "Frontend route `/checkout/cancel` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/App.tsx"}, "properties": {"repobilityId": "2fc9bf518ea3a737", "scanner": "scanner-primary", "fingerprint": "23e101ded0e8b62d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2a5c218ef2b3ea2b", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/pages/__tests__/AdminPage.test.tsx"}, "properties": {"repobilityId": "88890e9e4287b64c", "scanner": "scanner-primary", "fingerprint": "2a5c218ef2b3ea2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8d7b52ade89549cb", "level": "warning", "message": {"text": "Frontend route `/premium` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/PERF-09-02.adversarial.test.tsx"}, "properties": {"repobilityId": "174ddfe6d1b50d1a", "scanner": "scanner-primary", "fingerprint": "8d7b52ade89549cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-549ffb1a558f687c", "level": "warning", "message": {"text": "Frontend route `/custom` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/PublicRoute.test.tsx"}, "properties": {"repobilityId": "23a8d31ef55e6138", "scanner": "scanner-primary", "fingerprint": "549ffb1a558f687c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bc4ae26e5170cb56", "level": "warning", "message": {"text": "Frontend route `/custom-login` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "f12bb8b26d2e65cd", "scanner": "scanner-primary", "fingerprint": "bc4ae26e5170cb56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6edb0dcfeeb8af57", "level": "warning", "message": {"text": "Frontend route `/protected` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "cc9650e19d10193d", "scanner": "scanner-primary", "fingerprint": "6edb0dcfeeb8af57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ac0cc047f3d012d5", "level": "warning", "message": {"text": "Frontend route `/free-content` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "620a26684e7db3e0", "scanner": "scanner-primary", "fingerprint": "ac0cc047f3d012d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b36422c40eec9814", "level": "warning", "message": {"text": "Frontend route `/premium-content` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "aefd553a01f2dea7", "scanner": "scanner-primary", "fingerprint": "b36422c40eec9814", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-db22934676046cd8", "level": "warning", "message": {"text": "Frontend route `/app` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "9730f3572b41cbb9", "scanner": "scanner-primary", "fingerprint": "db22934676046cd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-56709c93ec9ebbe5", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "3d4310243db8c6f6", "scanner": "scanner-primary", "fingerprint": "56709c93ec9ebbe5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b5f74bdf24c6d173", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 learn-greek-easy-frontend/src/components/auth/__tests__/ProtectedRoute.integration.test.tsx"}, "properties": {"repobilityId": "7ef1c33ad7343ef0", "scanner": "scanner-primary", "fingerprint": "b5f74bdf24c6d173", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e4082876262fcc89", "level": "error", "message": {"text": "FastAPI POST `trigger_sentry_test` without auth dependency \u2014 learn-greek-easy-backend/src/main.py:482"}, "properties": {"repobilityId": "11b04feb43fbbb4e", "scanner": "scanner-primary", "fingerprint": "e4082876262fcc89", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/main.py"}, "region": {"startLine": 482}}}]}, {"ruleId": "scanner-7664f074a99c26cb", "level": "error", "message": {"text": "FastAPI POST `subscribe` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/waitlist.py:31"}, "properties": {"repobilityId": "07916f5c60c3a854", "scanner": "scanner-primary", "fingerprint": "7664f074a99c26cb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/waitlist.py"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-049089c2db4671a5", "level": "error", "message": {"text": "FastAPI POST `confirm` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/waitlist.py:55"}, "properties": {"repobilityId": "277616a750ed6134", "scanner": "scanner-primary", "fingerprint": "049089c2db4671a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/waitlist.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-371c3b32da3eb75a", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:262"}, "properties": {"repobilityId": "ef1dfb4a66305fa3", "scanner": "scanner-primary", "fingerprint": "371c3b32da3eb75a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/decks.py"}, "region": {"startLine": 262}}}]}, {"ruleId": "scanner-7de8f1fcc8cf3a06", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:881"}, "properties": {"repobilityId": "751f138f7b83beec", "scanner": "scanner-primary", "fingerprint": "7de8f1fcc8cf3a06", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/decks.py"}, "region": {"startLine": 881}}}]}, {"ruleId": "scanner-008d72b3e6482d97", "level": "error", "message": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1017"}, "properties": {"repobilityId": "13897ef21303af15", "scanner": "scanner-primary", "fingerprint": "008d72b3e6482d97", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/decks.py"}, "region": {"startLine": 1017}}}]}, {"ruleId": "scanner-7d376a2a5ccad8dc", "level": "error", "message": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1146"}, "properties": {"repobilityId": "06b87d1d796b14f4", "scanner": "scanner-primary", "fingerprint": "7d376a2a5ccad8dc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/decks.py"}, "region": {"startLine": 1146}}}]}, {"ruleId": "scanner-4b565119b6030d65", "level": "error", "message": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/decks.py:1282"}, "properties": {"repobilityId": "54916d4bcd2c52b4", "scanner": "scanner-primary", "fingerprint": "4b565119b6030d65", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/decks.py"}, "region": {"startLine": 1282}}}]}, {"ruleId": "scanner-b319c23f093fd84f", "level": "error", "message": {"text": "FastAPI POST `create_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:153"}, "properties": {"repobilityId": "9fd4af47147b1e5e", "scanner": "scanner-primary", "fingerprint": "b319c23f093fd84f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/feedback.py"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-669442c7ae9375a6", "level": "error", "message": {"text": "FastAPI PUT `update_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:240"}, "properties": {"repobilityId": "9d9ec3cb81f65497", "scanner": "scanner-primary", "fingerprint": "669442c7ae9375a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/feedback.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-e9cdfeae20a60076", "level": "error", "message": {"text": "FastAPI DELETE `delete_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:295"}, "properties": {"repobilityId": "462604f7b25f699f", "scanner": "scanner-primary", "fingerprint": "e9cdfeae20a60076", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/feedback.py"}, "region": {"startLine": 295}}}]}, {"ruleId": "scanner-12a41e1ef2980ddf", "level": "error", "message": {"text": "FastAPI POST `vote_on_feedback` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:338"}, "properties": {"repobilityId": "c66ba0a3d7d207f9", "scanner": "scanner-primary", "fingerprint": "12a41e1ef2980ddf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/feedback.py"}, "region": {"startLine": 338}}}]}, {"ruleId": "scanner-d11a8d62a7ad55d7", "level": "error", "message": {"text": "FastAPI DELETE `remove_vote` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/feedback.py:395"}, "properties": {"repobilityId": "09aed3187dc7a297", "scanner": "scanner-primary", "fingerprint": "d11a8d62a7ad55d7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/feedback.py"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-7a2a74d39457f351", "level": "error", "message": {"text": "FastAPI POST `create_card_error` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/card_errors.py:21"}, "properties": {"repobilityId": "7e5347f3b6be9dcc", "scanner": "scanner-primary", "fingerprint": "7a2a74d39457f351", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/card_errors.py"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-df8b02a2a362c965", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:101"}, "properties": {"repobilityId": "1625c4363b72889e", "scanner": "scanner-primary", "fingerprint": "df8b02a2a362c965", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/auth.py"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-ee32d8e317bf51ef", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:150"}, "properties": {"repobilityId": "01d9a2a43b91b076", "scanner": "scanner-primary", "fingerprint": "ee32d8e317bf51ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/auth.py"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-10a1795703c318dd", "level": "error", "message": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:329"}, "properties": {"repobilityId": "988e565abc06eb8c", "scanner": "scanner-primary", "fingerprint": "10a1795703c318dd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/auth.py"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-10070624775a2589", "level": "error", "message": {"text": "FastAPI POST `get_avatar_upload_url` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/auth.py:453"}, "properties": {"repobilityId": "c85c6d4dbfb6981b", "scanner": "scanner-primary", "fingerprint": "10070624775a2589", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/auth.py"}, "region": {"startLine": 453}}}]}, {"ruleId": "scanner-c53bae4d4178a859", "level": "error", "message": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/webhooks.py:23"}, "properties": {"repobilityId": "1b875e7fc4144710", "scanner": "scanner-primary", "fingerprint": "c53bae4d4178a859", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/webhooks.py"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-0bd7aade83c3ce74", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/users.py:30"}, "properties": {"repobilityId": "8cfc5b289fca0860", "scanner": "scanner-primary", "fingerprint": "0bd7aade83c3ce74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/users.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-90961c2152beb050", "level": "error", "message": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/users.py:101"}, "properties": {"repobilityId": "7b50db2994f2bd8a", "scanner": "scanner-primary", "fingerprint": "90961c2152beb050", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/users.py"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-adb57eb7208ddf7c", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:507"}, "properties": {"repobilityId": "526fdb632c7f0e9b", "scanner": "scanner-primary", "fingerprint": "adb57eb7208ddf7c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 507}}}]}, {"ruleId": "scanner-4b2ab25e1a33a158", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:754"}, "properties": {"repobilityId": "2b820a1efcf1aaba", "scanner": "scanner-primary", "fingerprint": "4b2ab25e1a33a158", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 754}}}]}, {"ruleId": "scanner-055f01d1dea61dba", "level": "error", "message": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:815"}, "properties": {"repobilityId": "e9076ec75167fe98", "scanner": "scanner-primary", "fingerprint": "055f01d1dea61dba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 815}}}]}, {"ruleId": "scanner-afe43b0f99e89611", "level": "error", "message": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:869"}, "properties": {"repobilityId": "3634883eeeb68ece", "scanner": "scanner-primary", "fingerprint": "afe43b0f99e89611", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 869}}}]}, {"ruleId": "scanner-4d7083b08072f490", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1045"}, "properties": {"repobilityId": "7dbf83502436b6eb", "scanner": "scanner-primary", "fingerprint": "4d7083b08072f490", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 1045}}}]}, {"ruleId": "scanner-8d1d6b5b2de7462f", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1142"}, "properties": {"repobilityId": "78743cc645e00222", "scanner": "scanner-primary", "fingerprint": "8d1d6b5b2de7462f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 1142}}}]}, {"ruleId": "scanner-bb54c22e4de92e2b", "level": "error", "message": {"text": "FastAPI PATCH `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1209"}, "properties": {"repobilityId": "1a7cdcca63e26584", "scanner": "scanner-primary", "fingerprint": "bb54c22e4de92e2b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 1209}}}]}, {"ruleId": "scanner-325bdd8055021463", "level": "error", "message": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/router.py:1264"}, "properties": {"repobilityId": "e1ba073b69d7d8ba", "scanner": "scanner-primary", "fingerprint": "325bdd8055021463", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/router.py"}, "region": {"startLine": 1264}}}]}, {"ruleId": "scanner-e6114214b4602e1b", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:149"}, "properties": {"repobilityId": "56065f0287119816", "scanner": "scanner-primary", "fingerprint": "e6114214b4602e1b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/mock_exam.py"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-a6086d1dc409a3fa", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:269"}, "properties": {"repobilityId": "dc663b24bddbed08", "scanner": "scanner-primary", "fingerprint": "a6086d1dc409a3fa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/mock_exam.py"}, "region": {"startLine": 269}}}]}, {"ruleId": "scanner-53d5fd36e8340a67", "level": "error", "message": {"text": "FastAPI DELETE `<anonymous>` without auth dependency \u2014 learn-greek-easy-backend/src/api/v1/culture/mock_exam.py:571"}, "properties": {"repobilityId": "9a80b22abea47823", "scanner": "scanner-primary", "fingerprint": "53d5fd36e8340a67", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learn-greek-easy-backend/src/api/v1/culture/mock_exam.py"}, "region": {"startLine": 571}}}]}, {"ruleId": "scanner-86e90d085fa4ecca", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/data (learn-greek-easy-frontend/src/lib/versionCheck.ts:39)"}, "properties": {"repobilityId": "46395fd4f58fc5e9", "scanner": "scanner-primary", "fingerprint": "86e90d085fa4ecca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "233c9d54e555a757", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff50c7a8256ea165", "level": "note", "message": {"text": "Unused endpoint: GET /debug/settings"}, "properties": {"repobilityId": "4ff16940cdd7bc24", "scanner": "scanner-primary", "fingerprint": "ff50c7a8256ea165", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-882efcc1e6801453", "level": "note", "message": {"text": "Unused endpoint: POST /debug/sentry-test"}, "properties": {"repobilityId": "7e7a544c34220a5e", "scanner": "scanner-primary", "fingerprint": "882efcc1e6801453", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1de80da0b27387f7", "level": "note", "message": {"text": "Unused endpoint: GET /unread-count"}, "properties": {"repobilityId": "f570ff6b57ef2406", "scanner": "scanner-primary", "fingerprint": "1de80da0b27387f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35a741079ddc6fcc", "level": "note", "message": {"text": "Unused endpoint: GET /stream"}, "properties": {"repobilityId": "a8dbebb44b0a169e", "scanner": "scanner-primary", "fingerprint": "35a741079ddc6fcc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0535da675f219221", "level": "note", "message": {"text": "Unused endpoint: PUT /read-all"}, "properties": {"repobilityId": "5ac7ab0fd842746e", "scanner": "scanner-primary", "fingerprint": "0535da675f219221", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02300358e6ee6fb2", "level": "note", "message": {"text": "Unused endpoint: DELETE /clear"}, "properties": {"repobilityId": "cf00e6145400bdc5", "scanner": "scanner-primary", "fingerprint": "02300358e6ee6fb2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a40211c2378ea55", "level": "note", "message": {"text": "Unused endpoint: PUT /{notification_id}/read"}, "properties": {"repobilityId": "54248047c8c9e647", "scanner": "scanner-primary", "fingerprint": "9a40211c2378ea55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74d4355e2f1b0909", "level": "note", "message": {"text": "Unused endpoint: DELETE /{notification_id}"}, "properties": {"repobilityId": "dbb348ac6846a822", "scanner": "scanner-primary", "fingerprint": "74d4355e2f1b0909", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-365f0986d17746b8", "level": "note", "message": {"text": "Unused endpoint: POST /subscribe"}, "properties": {"repobilityId": "0e262df1167ab7d6", "scanner": "scanner-primary", "fingerprint": "365f0986d17746b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e26074453f93d403", "level": "note", "message": {"text": "Unused endpoint: POST /confirm"}, "properties": {"repobilityId": "4aa23a67747de607", "scanner": "scanner-primary", "fingerprint": "e26074453f93d403", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "7aa83c1cd79d7d55", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3792b8bde6ca387b", "level": "note", "message": {"text": "Unused endpoint: GET /achievements"}, "properties": {"repobilityId": "2116569246bc6953", "scanner": "scanner-primary", "fingerprint": "3792b8bde6ca387b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "719a796776c09a1b", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d16e4fa529c520e9", "level": "note", "message": {"text": "Unused endpoint: GET /search"}, "properties": {"repobilityId": "d32ca2c2094b7193", "scanner": "scanner-primary", "fingerprint": "d16e4fa529c520e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8456eca76070a1a7", "level": "note", "message": {"text": "Unused endpoint: GET /mine"}, "properties": {"repobilityId": "3984c74762916baf", "scanner": "scanner-primary", "fingerprint": "8456eca76070a1a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8af577ed7d71b177", "level": "note", "message": {"text": "Unused endpoint: GET /{deck_id}"}, "properties": {"repobilityId": "633c1aaec6360095", "scanner": "scanner-primary", "fingerprint": "8af577ed7d71b177", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c2475af34a8ca29f", "level": "note", "message": {"text": "Unused endpoint: GET /{deck_id}/word-entries"}, "properties": {"repobilityId": "57d6f6e6eea4ea34", "scanner": "scanner-primary", "fingerprint": "c2475af34a8ca29f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b3057f520d5c2dba", "level": "note", "message": {"text": "Unused endpoint: POST /{deck_id}/word-entries/{word_entry_id}"}, "properties": {"repobilityId": "bd7c69b5285167c2", "scanner": "scanner-primary", "fingerprint": "b3057f520d5c2dba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e11e5ba417f56ca", "level": "note", "message": {"text": "Unused endpoint: DELETE /{deck_id}/word-entries/{word_entry_id}"}, "properties": {"repobilityId": "3b7b97086ca39774", "scanner": "scanner-primary", "fingerprint": "9e11e5ba417f56ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28a2c7612804f042", "level": "note", "message": {"text": "Unused endpoint: GET /{deck_id}/word-mastery"}, "properties": {"repobilityId": "890918bfc79c154d", "scanner": "scanner-primary", "fingerprint": "28a2c7612804f042", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4dc18fc0b20f11b8", "level": "note", "message": {"text": "Unused endpoint: GET /{deck_id}/word-heatmap/{word_entry_id}"}, "properties": {"repobilityId": "863d3efd4fd77ff5", "scanner": "scanner-primary", "fingerprint": "4dc18fc0b20f11b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46d26880f5708297", "level": "note", "message": {"text": "Unused endpoint: PATCH /{deck_id}"}, "properties": {"repobilityId": "748137777eee59b9", "scanner": "scanner-primary", "fingerprint": "46d26880f5708297", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00768ba89d1d8df1", "level": "note", "message": {"text": "Unused endpoint: DELETE /{deck_id}"}, "properties": {"repobilityId": "380250a1647b3733", "scanner": "scanner-primary", "fingerprint": "00768ba89d1d8df1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6d412ba6647f6cc", "level": "note", "message": {"text": "Unused endpoint: GET /live"}, "properties": {"repobilityId": "441a394a932d955e", "scanner": "scanner-primary", "fingerprint": "d6d412ba6647f6cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c236625afb6a8cb", "level": "note", "message": {"text": "Unused endpoint: GET /ready"}, "properties": {"repobilityId": "f53d11f9fe3873e6", "scanner": "scanner-primary", "fingerprint": "8c236625afb6a8cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87f57a8d4cb18a60", "level": "note", "message": {"text": "Unused endpoint: GET /{feedback_id}"}, "properties": {"repobilityId": "c49e1f117d66664c", "scanner": "scanner-primary", "fingerprint": "87f57a8d4cb18a60", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83de702c513e5e9e", "level": "note", "message": {"text": "Unused endpoint: PUT /{feedback_id}"}, "properties": {"repobilityId": "5e74600410274f55", "scanner": "scanner-primary", "fingerprint": "83de702c513e5e9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7bb1d16c58754d6a", "level": "note", "message": {"text": "Unused endpoint: DELETE /{feedback_id}"}, "properties": {"repobilityId": "e7ca3cb245ee6da0", "scanner": "scanner-primary", "fingerprint": "7bb1d16c58754d6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e443f0dd73846575", "level": "note", "message": {"text": "Unused endpoint: POST /{feedback_id}/vote"}, "properties": {"repobilityId": "1830c9e0e0560cc8", "scanner": "scanner-primary", "fingerprint": "e443f0dd73846575", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a6dbe2bff145cf5", "level": "note", "message": {"text": "Unused endpoint: DELETE /{feedback_id}/vote"}, "properties": {"repobilityId": "84b4ab946c862b80", "scanner": "scanner-primary", "fingerprint": "2a6dbe2bff145cf5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c92dfeb7d445cda", "level": "note", "message": {"text": "Unused endpoint: GET /queue"}, "properties": {"repobilityId": "095e93381a0fc347", "scanner": "scanner-primary", "fingerprint": "2c92dfeb7d445cda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-695f81f1e96c2565", "level": "note", "message": {"text": "Unused endpoint: POST /review"}, "properties": {"repobilityId": "01746056948ab95f", "scanner": "scanner-primary", "fingerprint": "695f81f1e96c2565", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f511ef2280a9c8", "level": "note", "message": {"text": "Unused endpoint: GET /{exercise_id}"}, "properties": {"repobilityId": "d0fffb497202f074", "scanner": "scanner-primary", "fingerprint": "38f511ef2280a9c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "40276766119e94d1", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fbf81638546ba119", "level": "note", "message": {"text": "Unused endpoint: POST /logout-all"}, "properties": {"repobilityId": "9bc9fe020889fb17", "scanner": "scanner-primary", "fingerprint": "fbf81638546ba119", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "55e6e865874ae689", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea575b61c121b733", "level": "note", "message": {"text": "Unused endpoint: PATCH /me"}, "properties": {"repobilityId": "f2f163e20509e78a", "scanner": "scanner-primary", "fingerprint": "ea575b61c121b733", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b29dc7973118c44", "level": "note", "message": {"text": "Unused endpoint: POST /avatar/upload-url"}, "properties": {"repobilityId": "861352b04d524908", "scanner": "scanner-primary", "fingerprint": "0b29dc7973118c44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-def1c4677f533a77", "level": "note", "message": {"text": "Unused endpoint: DELETE /avatar"}, "properties": {"repobilityId": "1c4e784ead3cfdf3", "scanner": "scanner-primary", "fingerprint": "def1c4677f533a77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618edc3066cfb8f2", "level": "note", "message": {"text": "Unused endpoint: GET /queue/v2"}, "properties": {"repobilityId": "f1bafbc1db07d48b", "scanner": "scanner-primary", "fingerprint": "618edc3066cfb8f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82660403cd2e303b", "level": "note", "message": {"text": "Unused endpoint: POST /v2"}, "properties": {"repobilityId": "05cab4f97bf7536f", "scanner": "scanner-primary", "fingerprint": "82660403cd2e303b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2083a87719497893", "level": "note", "message": {"text": "Unused endpoint: POST /stripe"}, "properties": {"repobilityId": "f559625204628523", "scanner": "scanner-primary", "fingerprint": "2083a87719497893", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-65ae11b57112357a", "level": "note", "message": {"text": "Unused endpoint: GET /tab-counts"}, "properties": {"repobilityId": "31e083fb0d3e3d9b", "scanner": "scanner-primary", "fingerprint": "65ae11b57112357a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-584997a8afd7a69c", "level": "note", "message": {"text": "Unused endpoint: GET /decks"}, "properties": {"repobilityId": "638c9b1520498597", "scanner": "scanner-primary", "fingerprint": "584997a8afd7a69c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e76813327fc813ef", "level": "note", "message": {"text": "Unused endpoint: GET /decks/{deck_id}"}, "properties": {"repobilityId": "67461beaec2f77b4", "scanner": "scanner-primary", "fingerprint": "e76813327fc813ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f47d015c30775b35", "level": "note", "message": {"text": "Unused endpoint: POST /decks/{deck_id}/cover-image"}, "properties": {"repobilityId": "9bee9ba87a55f12b", "scanner": "scanner-primary", "fingerprint": "f47d015c30775b35", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd8b93e644b9928a", "level": "note", "message": {"text": "Unused endpoint: DELETE /decks/{deck_id}/cover-image"}, "properties": {"repobilityId": "e0679615f5ee8f58", "scanner": "scanner-primary", "fingerprint": "dd8b93e644b9928a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5766b6a628042997", "level": "note", "message": {"text": "Unused endpoint: GET /feedback"}, "properties": {"repobilityId": "5dbc7ae6dd8ab927", "scanner": "scanner-primary", "fingerprint": "5766b6a628042997", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26b0b5e4f47ce397", "level": "note", "message": {"text": "Unused endpoint: PATCH /feedback/{feedback_id}"}, "properties": {"repobilityId": "917fab43fbfc42b3", "scanner": "scanner-primary", "fingerprint": "26b0b5e4f47ce397", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}