{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b62faaca5c0645a", "name": "Stray `console.log` in TS/JS \u2014 test_supabase.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_supabase.js:12"}, "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-2b39ddce813293cc", "name": "Stray `console.log` in TS/JS \u2014 check_supabase.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_supabase.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d227830eddc59609", "name": "Stray `console.log` in TS/JS \u2014 test_token.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_token.js:16"}, "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-5cdbcafe8bd22b8f", "name": "Stray `console.log` in TS/JS \u2014 apply-migrations.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apply-migrations.js:27"}, "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-9c2a3126fe0cf0de", "name": "Stray `console.log` in TS/JS \u2014 migrate.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 migrate.js:18"}, "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-d2d2615f587785a1", "name": "Stray `console.log` in TS/JS \u2014 app/api/strava/debug/route.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/strava/debug/route.ts:45"}, "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-54e4e3faf92448c2", "name": "Stray `console.log` in TS/JS \u2014 app/api/strava/sync-history/route.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/strava/sync-history/route.ts:49"}, "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-3b9452846d1fa43a", "name": "Stray `console.log` in TS/JS \u2014 app/api/calendar/cron/route.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/calendar/cron/route.ts:49"}, "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-dd1f70faa703e23b", "name": "Stray `console.log` in TS/JS \u2014 hooks/useTimeEntries.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useTimeEntries.ts:36"}, "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-658e9fb63e835ca7", "name": "Stray `console.log` in TS/JS \u2014 lib/strava.ts:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/strava.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-f850f87b105beea2", "name": "Stray `console.log` in TS/JS \u2014 lib/demo-mode.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/demo-mode.ts:26"}, "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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0e1894b9a766a29", "name": "Very large file: app/(app)/sport/page.tsx (1003 lines)", "shortDescription": {"text": "Very large file: app/(app)/sport/page.tsx (1003 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-1073f1772762e734", "name": "Very large file: app/(app)/rapports/page.tsx (1001 lines)", "shortDescription": {"text": "Very large file: app/(app)/rapports/page.tsx (1001 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-ba0f451276f0e587", "name": "Very large file: app/(app)/health/page.tsx (853 lines)", "shortDescription": {"text": "Very large file: app/(app)/health/page.tsx (853 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-ab1c959300348bd4", "name": "Very large file: app/(app)/courses/page.tsx (1082 lines)", "shortDescription": {"text": "Very large file: app/(app)/courses/page.tsx (1082 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-af97d254c152841b", "name": "Very large file: app/(app)/time-tracker/page.tsx (1176 lines)", "shortDescription": {"text": "Very large file: app/(app)/time-tracker/page.tsx (1176 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-87bfbc80ba197706", "name": "Very large file: app/(app)/calendrier/page.tsx (1404 lines)", "shortDescription": {"text": "Very large file: app/(app)/calendrier/page.tsx (1404 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-e8fb1e036bb63dbe", "name": "Very large file: app/(app)/projets/page.tsx (1105 lines)", "shortDescription": {"text": "Very large file: app/(app)/projets/page.tsx (1105 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-21b414eeda348cdf", "name": "Very large file: app/(app)/budget/page.tsx (1281 lines)", "shortDescription": {"text": "Very large file: app/(app)/budget/page.tsx (1281 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 95 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "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 70 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 95 placeholder/mock markers across 23 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca19c98b352ea323", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/agent/chat/route.ts:139", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/agent/chat/route.ts:139"}, "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-3b3b4f60a12ab7fa", "name": "Commented-code block (5 lines) in app/api/strava/sync/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/strava/sync/route.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-18f77ff0ce426cbd", "name": "Commented-code block (5 lines) in app/api/strava/callback/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/strava/callback/route.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-8e1aca8659818d0e", "name": "Commented-code block (5 lines) in app/api/calendar/cron/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/calendar/cron/route.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-eccca90a75c4ca39", "name": "Commented-code block (5 lines) in app/api/calendar/apple/push/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/calendar/apple/push/route.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-82e5204260bc8afb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/courses/page.tsx:158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/courses/page.tsx:158"}, "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-b92bf643a7894d92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/calendrier/page.tsx:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/calendrier/page.tsx:147"}, "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-5357dbfd508da35d", "name": "Legacy-named symbol `nysa_comptes_v2` in app/(app)/budget/page.tsx:198", "shortDescription": {"text": "Legacy-named symbol `nysa_comptes_v2` in app/(app)/budget/page.tsx:198"}, "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-b649d03e3a29bdd0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useDashboard.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useDashboard.ts:72"}, "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-1a9c740d51478127", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useTimeEntries.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useTimeEntries.ts:47"}, "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-effa8f51e47347b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useHealth.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useHealth.ts:23"}, "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-45f99cda4582795a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjects.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjects.ts:23"}, "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-6ac198258dd44697", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useBudget.ts:301", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useBudget.ts:301"}, "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-ce4fb6de78219e84", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useTasks.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useTasks.ts:26"}, "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-cc5612144bffc81d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjectSettings.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjectSettings.ts:37"}, "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-e88e44af29895435", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjectNotes.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjectNotes.ts:34"}, "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-ef7c66a38a287aee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/openFoodFacts.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/openFoodFacts.ts:42"}, "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-6d574e427cca3e6d", "name": "Commented-code block (5 lines) in lib/parseGpx.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/parseGpx.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-3daa75477b0b456c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/strava.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/strava.ts:39"}, "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-b496daa0a40a5719", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/caldav.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/caldav.ts:24"}, "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}}]}}, "automationDetails": {"id": "repobility/25494"}, "properties": {"repository": "Dotmody-X/nysa", "repoUrl": "https://github.com/Dotmody-X/nysa", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-8b62faaca5c0645a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_supabase.js:12"}, "properties": {"repobilityId": "921a5278d241a58e", "scanner": "scanner-primary", "fingerprint": "8b62faaca5c0645a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b39ddce813293cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_supabase.js:13"}, "properties": {"repobilityId": "9511b8c1fa2fc554", "scanner": "scanner-primary", "fingerprint": "2b39ddce813293cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d227830eddc59609", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_token.js:16"}, "properties": {"repobilityId": "f105f513d1d54afa", "scanner": "scanner-primary", "fingerprint": "d227830eddc59609", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cdbcafe8bd22b8f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apply-migrations.js:27"}, "properties": {"repobilityId": "8469431cc398ced0", "scanner": "scanner-primary", "fingerprint": "5cdbcafe8bd22b8f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c2a3126fe0cf0de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 migrate.js:18"}, "properties": {"repobilityId": "f580ec3fff813ef6", "scanner": "scanner-primary", "fingerprint": "9c2a3126fe0cf0de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2d2615f587785a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/strava/debug/route.ts:45"}, "properties": {"repobilityId": "3d502e91dd7b9f90", "scanner": "scanner-primary", "fingerprint": "d2d2615f587785a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54e4e3faf92448c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/strava/sync-history/route.ts:49"}, "properties": {"repobilityId": "83642b52be4dca7d", "scanner": "scanner-primary", "fingerprint": "54e4e3faf92448c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b9452846d1fa43a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/calendar/cron/route.ts:49"}, "properties": {"repobilityId": "4cae5f825e9cb98f", "scanner": "scanner-primary", "fingerprint": "3b9452846d1fa43a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd1f70faa703e23b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useTimeEntries.ts:36"}, "properties": {"repobilityId": "5a2ce5a242b1fb66", "scanner": "scanner-primary", "fingerprint": "dd1f70faa703e23b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-658e9fb63e835ca7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/strava.ts:154"}, "properties": {"repobilityId": "bafe4ffacd5a4a0d", "scanner": "scanner-primary", "fingerprint": "658e9fb63e835ca7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f850f87b105beea2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/demo-mode.ts:26"}, "properties": {"repobilityId": "35b0d537bb49c6e8", "scanner": "scanner-primary", "fingerprint": "f850f87b105beea2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-e0e1894b9a766a29", "level": "note", "message": {"text": "Very large file: app/(app)/sport/page.tsx (1003 lines)"}, "properties": {"repobilityId": "b7c46e0b8a97744f", "scanner": "scanner-primary", "fingerprint": "e0e1894b9a766a29", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1073f1772762e734", "level": "note", "message": {"text": "Very large file: app/(app)/rapports/page.tsx (1001 lines)"}, "properties": {"repobilityId": "74e7993ae0383603", "scanner": "scanner-primary", "fingerprint": "1073f1772762e734", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ba0f451276f0e587", "level": "note", "message": {"text": "Very large file: app/(app)/health/page.tsx (853 lines)"}, "properties": {"repobilityId": "9f9cbf8f9adfa813", "scanner": "scanner-primary", "fingerprint": "ba0f451276f0e587", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab1c959300348bd4", "level": "note", "message": {"text": "Very large file: app/(app)/courses/page.tsx (1082 lines)"}, "properties": {"repobilityId": "dc3a1456e89cdfd4", "scanner": "scanner-primary", "fingerprint": "ab1c959300348bd4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af97d254c152841b", "level": "note", "message": {"text": "Very large file: app/(app)/time-tracker/page.tsx (1176 lines)"}, "properties": {"repobilityId": "028afbd7045d57ae", "scanner": "scanner-primary", "fingerprint": "af97d254c152841b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-87bfbc80ba197706", "level": "note", "message": {"text": "Very large file: app/(app)/calendrier/page.tsx (1404 lines)"}, "properties": {"repobilityId": "9653c315cfe233bd", "scanner": "scanner-primary", "fingerprint": "87bfbc80ba197706", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e8fb1e036bb63dbe", "level": "note", "message": {"text": "Very large file: app/(app)/projets/page.tsx (1105 lines)"}, "properties": {"repobilityId": "281750043c93f06f", "scanner": "scanner-primary", "fingerprint": "e8fb1e036bb63dbe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-21b414eeda348cdf", "level": "note", "message": {"text": "Very large file: app/(app)/budget/page.tsx (1281 lines)"}, "properties": {"repobilityId": "1b15478828637482", "scanner": "scanner-primary", "fingerprint": "21b414eeda348cdf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "fd2c23edf6ebb5a4", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "03ffbfb3ac8c2656", "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": "ba797467f15658c9", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "9e89c453eeb559e7", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "abb67f09c1c69be9", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ca19c98b352ea323", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/agent/chat/route.ts:139"}, "properties": {"repobilityId": "1344f28427d29fa4", "scanner": "scanner-primary", "fingerprint": "ca19c98b352ea323", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b3b4f60a12ab7fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/strava/sync/route.ts:1"}, "properties": {"repobilityId": "5a755feac745d7cb", "scanner": "scanner-primary", "fingerprint": "3b3b4f60a12ab7fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18f77ff0ce426cbd", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/strava/callback/route.ts:1"}, "properties": {"repobilityId": "4bd7045b4efcdde9", "scanner": "scanner-primary", "fingerprint": "18f77ff0ce426cbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e1aca8659818d0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/calendar/cron/route.ts:1"}, "properties": {"repobilityId": "367b2849f13598e1", "scanner": "scanner-primary", "fingerprint": "8e1aca8659818d0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eccca90a75c4ca39", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/calendar/apple/push/route.ts:1"}, "properties": {"repobilityId": "c75c6171eaeece7e", "scanner": "scanner-primary", "fingerprint": "eccca90a75c4ca39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82e5204260bc8afb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/courses/page.tsx:158"}, "properties": {"repobilityId": "1d1a140ef0554da9", "scanner": "scanner-primary", "fingerprint": "82e5204260bc8afb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b92bf643a7894d92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/calendrier/page.tsx:147"}, "properties": {"repobilityId": "0baafb36fad05cad", "scanner": "scanner-primary", "fingerprint": "b92bf643a7894d92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5357dbfd508da35d", "level": "note", "message": {"text": "Legacy-named symbol `nysa_comptes_v2` in app/(app)/budget/page.tsx:198"}, "properties": {"repobilityId": "e6a0c6bf4d201afa", "scanner": "scanner-primary", "fingerprint": "5357dbfd508da35d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b649d03e3a29bdd0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useDashboard.ts:72"}, "properties": {"repobilityId": "110d732ce66306e2", "scanner": "scanner-primary", "fingerprint": "b649d03e3a29bdd0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a9c740d51478127", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useTimeEntries.ts:47"}, "properties": {"repobilityId": "e5f9193e30d2c7c3", "scanner": "scanner-primary", "fingerprint": "1a9c740d51478127", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-effa8f51e47347b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useHealth.ts:23"}, "properties": {"repobilityId": "f89226f6d5207b80", "scanner": "scanner-primary", "fingerprint": "effa8f51e47347b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45f99cda4582795a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjects.ts:23"}, "properties": {"repobilityId": "4faa66a4bdc05df2", "scanner": "scanner-primary", "fingerprint": "45f99cda4582795a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ac198258dd44697", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useBudget.ts:301"}, "properties": {"repobilityId": "845a8789076ab535", "scanner": "scanner-primary", "fingerprint": "6ac198258dd44697", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce4fb6de78219e84", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useTasks.ts:26"}, "properties": {"repobilityId": "caf2b07ba4a6ebf5", "scanner": "scanner-primary", "fingerprint": "ce4fb6de78219e84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc5612144bffc81d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjectSettings.ts:37"}, "properties": {"repobilityId": "9ae05494abec5616", "scanner": "scanner-primary", "fingerprint": "cc5612144bffc81d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e88e44af29895435", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useProjectNotes.ts:34"}, "properties": {"repobilityId": "2a66672a9b8c9d91", "scanner": "scanner-primary", "fingerprint": "e88e44af29895435", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef7c66a38a287aee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/openFoodFacts.ts:42"}, "properties": {"repobilityId": "46bc49d76ff23921", "scanner": "scanner-primary", "fingerprint": "ef7c66a38a287aee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d574e427cca3e6d", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/parseGpx.ts:1"}, "properties": {"repobilityId": "74de2adef7c5b35d", "scanner": "scanner-primary", "fingerprint": "6d574e427cca3e6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3daa75477b0b456c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/strava.ts:39"}, "properties": {"repobilityId": "e1926112052b612c", "scanner": "scanner-primary", "fingerprint": "3daa75477b0b456c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b496daa0a40a5719", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/caldav.ts:24"}, "properties": {"repobilityId": "9b66e4f517635b8d", "scanner": "scanner-primary", "fingerprint": "b496daa0a40a5719", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}