{"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-7b2ab84facafbe4f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/seed-landing-pages.ts:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/seed-landing-pages.ts:166"}, "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-9bc4723f06775cbd", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/setup-r2.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/setup-r2.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2199aa59a2b9822", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-groq-whisper.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-groq-whisper.ts:33"}, "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-bcb5cfcd28d3d370", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/inspect-video-job.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/inspect-video-job.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad1bacfea68244e9", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-replicate-wrappers.ts:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-replicate-wrappers.ts:156"}, "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-bc1a44f58752abad", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-fal-wizper.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-fal-wizper.ts:20"}, "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-e08d310b6a11bcbd", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/dump-preview-videos.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/dump-preview-videos.ts:22"}, "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-e34aa3808ff32c0c", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/trace-fast-pipeline.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/trace-fast-pipeline.ts:41"}, "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-9cf777db98488963", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/set-credits.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/set-credits.ts:37"}, "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-c44131b96a48ccdf", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/setup-stripe.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/setup-stripe.ts:67"}, "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-f95375ded6b68be8", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/restructure-song.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/restructure-song.ts:33"}, "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-69886aacdd105cc3", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test-lyric-video.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test-lyric-video.ts:24"}, "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-356a945d36ad91b2", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/backfill-catalog.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/backfill-catalog.ts:25"}, "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-36769a639efffe60", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/run-our-whisperx.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/run-our-whisperx.ts:24"}, "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-8e7d841d0bf0938d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/dump-whisperx-schema.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/dump-whisperx-schema.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-732b2fd99e722a1b", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-fal-stt-models.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-fal-stt-models.ts: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-f5c2123daf99bbba", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test-transcription.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test-transcription.ts:53"}, "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-676aedc75b99ad4e", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/inspect-song.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/inspect-song.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-43a050a58dc2e664", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/set-plan.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/set-plan.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-be8682122ae9a724", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-whisperx-params.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-whisperx-params.ts: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-5f9e85b304a61a5f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/debug-structure.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/debug-structure.ts: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-0b31beeaa44c8982", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/download-song-audio.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/download-song-audio.ts:33"}, "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-a7f700dd6590c269", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/member-card.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/member-card.tsx:43"}, "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-9e2812a1c41235dc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/artist-card.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/artist-card.tsx:36"}, "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-cbe6ea41a0b4cc5b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/music-video-card.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/music-video-card.tsx:57"}, "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-f4673f2c856877e3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/user-card.tsx:26", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/user-card.tsx:26"}, "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-05560f5140fbc355", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/album-card.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/album-card.tsx:36"}, "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-55c6a53924d4bbb4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/song-card.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/song-card.tsx:196"}, "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-7c8ab8f44df10455", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/generate-video-modal.tsx:578", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/generate-video-modal.tsx:578"}, "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-75c7b2cbba04192f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/public-details-modal.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/public-details-modal.tsx:86"}, "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-e90131d9e47f6a27", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/manual-sync-editor.tsx:525", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/manual-sync-editor.tsx:525"}, "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-69f05b3b3b0ce3e6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/lyrics-player.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/lyrics-player.tsx:128"}, "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-451c9c82bffc1b18", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/landing/upload-card.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/landing/upload-card.tsx:303"}, "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-10c13d1c4052c04f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/landing/mode-selector.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/landing/mode-selector.tsx:84"}, "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-e49288843b748d2f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/library-page.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/library-page.tsx:221"}, "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-41714aeb7d689bd2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/public-page.tsx:783", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/public-page.tsx:783"}, "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-90d74679ea14d4fa", "name": "Insecure pattern 'node_child_process' in apps/api/src/scripts/test-lyric-video.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/scripts/test-lyric-video.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3df22726e7a751fb", "name": "Insecure pattern 'node_child_process' in apps/api/src/lib/ffmpeg.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/lib/ffmpeg.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-630bb68eefbf2efe", "name": "Very large file: apps/api/src/scripts/landing/comparison.ts (1483 lines)", "shortDescription": {"text": "Very large file: apps/api/src/scripts/landing/comparison.ts (1483 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-786a29a6cb875cca", "name": "Very large file: apps/api/src/scripts/landing/how-to.ts (2198 lines)", "shortDescription": {"text": "Very large file: apps/api/src/scripts/landing/how-to.ts (2198 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": "3 test file(s) for 208 source file(s) (ratio 0.01). 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-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a355942f9141d7c", "name": "Node manifest has dependencies but no lockfile: packages/lyrics/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/lyrics/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 170 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 76 placeholder/mock markers across 24 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, lockfile. 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": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "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-430615dabbe2fc36", "name": "Commented-code block (6 lines) in apps/api/src/env.ts:46", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/env.ts:46"}, "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-1f75809abb66d4e9", "name": "Commented-code block (7 lines) in apps/api/src/scripts/seed-landing-pages.ts:15", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/scripts/seed-landing-pages.ts: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-d86cb6d0fd78299b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-groq-whisper.ts:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-groq-whisper.ts:97"}, "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-d8888fb6f383ad9f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-fal-wizper.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-fal-wizper.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-324a06204f236070", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/dump-preview-videos.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/dump-preview-videos.ts:30"}, "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-838bf19c228cd4d2", "name": "Commented-code block (5 lines) in apps/api/src/scripts/setup-stripe.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/scripts/setup-stripe.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-816b3037046c5f51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/run-our-whisperx.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/run-our-whisperx.ts:28"}, "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-ebd55d62afeed771", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-fal-stt-models.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-fal-stt-models.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-f896ebbbc0370922", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/test-transcription.ts:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/test-transcription.ts:193"}, "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-98a208ebd143423c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/download-song-audio.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/download-song-audio.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-955409f5e3b29d13", "name": "Commented-code block (5 lines) in apps/api/src/scripts/landing/comparison.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/scripts/landing/comparison.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-824868b0d570405e", "name": "Commented-code block (7 lines) in apps/api/src/lib/replicate.ts:101", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/lib/replicate.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-a10c40c5c6e3dbb5", "name": "Commented-code block (5 lines) in apps/api/src/lib/cover-image.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/lib/cover-image.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-58b32435e885097a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/fal-image.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/fal-image.ts:32"}, "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-748163bc2a72236e", "name": "Commented-code block (5 lines) in apps/api/src/lib/spotify.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/lib/spotify.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-07767169bfab6791", "name": "Commented-code block (6 lines) in apps/api/src/lib/video-pipeline.ts:102", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/lib/video-pipeline.ts:102"}, "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-4d5f04bd9dceb19e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/video-pipeline.ts:226", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/video-pipeline.ts:226"}, "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-c4a36a44e689c221", "name": "Commented-code block (6 lines) in apps/api/src/lib/openrouter-video.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/lib/openrouter-video.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38c9280a2cfdf931", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/fal-stt.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/fal-stt.ts:32"}, "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-e81846ad42ac75d6", "name": "Commented-code block (5 lines) in apps/api/src/lib/openrouter-image.ts:95", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/lib/openrouter-image.ts:95"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52157fb37ed82efc", "name": "Commented-code block (12 lines) in apps/api/src/lib/music-links.ts:4", "shortDescription": {"text": "Commented-code block (12 lines) in apps/api/src/lib/music-links.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f32e60d9cd7418bf", "name": "Commented-code block (6 lines) in apps/api/src/routes/billing.ts:103", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/routes/billing.ts:103"}, "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-439317d81431630b", "name": "Commented-code block (5 lines) in apps/api/src/routes/landing.ts:211", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/landing.ts:211"}, "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-3beaea9dadbb0ed7", "name": "Commented-code block (5 lines) in apps/api/src/routes/songs.ts:372", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/songs.ts:372"}, "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-b58e1ebb7ac30c86", "name": "Commented-code block (5 lines) in apps/api/src/db/schema.ts:89", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/db/schema.ts: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-4fc97ef396a6bb7a", "name": "Commented-code block (8 lines) in apps/api/src/db/client.ts:12", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/db/client.ts:12"}, "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-dde8c1f55b9815bb", "name": "Commented-code block (5 lines) in apps/web/src/components/result/dynamic-lyrics.tsx:224", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/result/dynamic-lyrics.tsx:224"}, "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-a9b08c947b526391", "name": "Commented-code block (6 lines) in apps/web/src/components/result/manual-sync-editor.tsx:179", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/result/manual-sync-editor.tsx:179"}, "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-0e40c744b51024ef", "name": "Commented-code block (9 lines) in apps/web/src/components/result/inline-line-editor.tsx:48", "shortDescription": {"text": "Commented-code block (9 lines) in apps/web/src/components/result/inline-line-editor.tsx: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-60dada335eb18f07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/result/video-tabs.tsx:263", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/result/video-tabs.tsx:263"}, "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-b1c3314d164a5f05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:100"}, "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-93a8ec34a7755e55", "name": "Commented-code block (6 lines) in apps/web/src/lib/plans.ts:36", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/plans.ts:36"}, "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-afb974ce684d47ee", "name": "Commented-code block (5 lines) in packages/shared/src/video-plan.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/src/video-plan.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-64da52f323a56285", "name": "Commented-code block (5 lines) in packages/shared/src/landing.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/src/landing.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-cdf9a6cb7022db2d", "name": "Commented-code block (5 lines) in packages/shared/src/account.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/src/account.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-7220e253924dd238", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seo-worker/src/worker.ts:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seo-worker/src/worker.ts:106"}, "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-d0b17c8c07a7421d", "name": "8 env vars used in code but missing from .env.example", "shortDescription": {"text": "8 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DB_POOL_MAX`, `FAL_API_KEY`, `FAL_KEY`, `FFMPEG_PATH`, `GROG_API_KEY`, `GROQ_API_KEY`, `MODE`, `RENDER_GIT_COMMIT`. 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-2b238474d3f142ab", "name": "Frontend route `/s/:songId` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/s/:songId` has no Link/navigate to it \u2014 apps/web/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-dd8b6f71e8e79efe", "name": "Frontend route `/p/:songId` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/p/:songId` has no Link/navigate to it \u2014 apps/web/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-f9ff240ca23cf6a1", "name": "Frontend route `/embed/:songId` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/embed/:songId` has no Link/navigate to it \u2014 apps/web/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-ebc610ecd4eb188f", "name": "Frontend route `/convert/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/convert/*` has no Link/navigate to it \u2014 apps/web/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-e0cf32f32530feb8", "name": "Frontend route `/tools/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/tools/*` has no Link/navigate to it \u2014 apps/web/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-d5b05b1527777997", "name": "Frontend route `/compare/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/compare/*` has no Link/navigate to it \u2014 apps/web/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-509777ef6a19aa0b", "name": "Frontend route `/guides/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/guides/*` has no Link/navigate to it \u2014 apps/web/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-e166fe4575a09ca2", "name": "Frontend route `/unsubscribe` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/unsubscribe` has no Link/navigate to it \u2014 apps/web/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-2cd479f2de497f7f", "name": "Frontend route `/sign-in/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/sign-in/*` has no Link/navigate to it \u2014 apps/web/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-838d895df6081cc7", "name": "Frontend route `/sign-up/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/sign-up/*` has no Link/navigate to it \u2014 apps/web/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-b8347a58bfae6736", "name": "Frontend route `/account` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/account` has no Link/navigate to it \u2014 apps/web/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-794472123c700188", "name": "Frontend route `/admin/landing/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/landing/:id` has no Link/navigate to it \u2014 apps/web/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-6263e34bbb5e1a19", "name": "Dangling fetch: POST https://api.groq.com/openai/v1/audio/transcriptions (apps/api/src/scripts/probe-groq-whisper.ts:97)", "shortDescription": {"text": "Dangling fetch: POST https://api.groq.com/openai/v1/audio/transcriptions (apps/api/src/scripts/probe-groq-whisper.ts:97)"}, "fullDescription": {"text": "`apps/api/src/scripts/probe-groq-whisper.ts:97` calls `POST https://api.groq.com/openai/v1/audio/transcriptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.groq.com/openai/v1/audio/transcriptions`\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-91b72d8397a329ca", "name": "Dangling fetch: POST https://rest.alpha.fal.ai/storage/upload/initiate (apps/api/src/scripts/probe-fal-wizper.ts:26)", "shortDescription": {"text": "Dangling fetch: POST https://rest.alpha.fal.ai/storage/upload/initiate (apps/api/src/scripts/probe-fal-wizper.ts:26)"}, "fullDescription": {"text": "`apps/api/src/scripts/probe-fal-wizper.ts:26` calls `POST https://rest.alpha.fal.ai/storage/upload/initiate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/rest.alpha.fal.ai/storage/upload/initiate`\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-04f6df851fc5a1e6", "name": "Dangling fetch: POST https://fal.run/fal-ai/whisper (apps/api/src/scripts/probe-fal-wizper.ts:56)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/fal-ai/whisper (apps/api/src/scripts/probe-fal-wizper.ts:56)"}, "fullDescription": {"text": "`apps/api/src/scripts/probe-fal-wizper.ts:56` calls `POST https://fal.run/fal-ai/whisper` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/fal-ai/whisper`\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-c4f6f8b2a041bd30", "name": "Dangling fetch: GET https://api.replicate.com/v1/models/${MODEL_OWNER}/${MODEL_NAME}/versions (apps/api/src/scripts/run-", "shortDescription": {"text": "Dangling fetch: GET https://api.replicate.com/v1/models/${MODEL_OWNER}/${MODEL_NAME}/versions (apps/api/src/scripts/run-our-whisperx.ts:28)"}, "fullDescription": {"text": "`apps/api/src/scripts/run-our-whisperx.ts:28` calls `GET https://api.replicate.com/v1/models/${MODEL_OWNER}/${MODEL_NAME}/versions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.replicate.com/v1/models/<p>/<p>/versions`\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-8acd9f95842742e1", "name": "Dangling fetch: POST https://api.replicate.com/v1/files (apps/api/src/scripts/run-our-whisperx.ts:49)", "shortDescription": {"text": "Dangling fetch: POST https://api.replicate.com/v1/files (apps/api/src/scripts/run-our-whisperx.ts:49)"}, "fullDescription": {"text": "`apps/api/src/scripts/run-our-whisperx.ts:49` calls `POST https://api.replicate.com/v1/files` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.replicate.com/v1/files`\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-b586158d06237fd1", "name": "Dangling fetch: POST https://api.replicate.com/v1/predictions (apps/api/src/scripts/run-our-whisperx.ts:64)", "shortDescription": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (apps/api/src/scripts/run-our-whisperx.ts:64)"}, "fullDescription": {"text": "`apps/api/src/scripts/run-our-whisperx.ts:64` calls `POST https://api.replicate.com/v1/predictions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.replicate.com/v1/predictions`\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-fc0b35ce1bfdb9c9", "name": "Dangling fetch: POST https://rest.alpha.fal.ai/storage/upload/initiate (apps/api/src/scripts/probe-fal-stt-models.ts:23)", "shortDescription": {"text": "Dangling fetch: POST https://rest.alpha.fal.ai/storage/upload/initiate (apps/api/src/scripts/probe-fal-stt-models.ts:23)"}, "fullDescription": {"text": "`apps/api/src/scripts/probe-fal-stt-models.ts:23` calls `POST https://rest.alpha.fal.ai/storage/upload/initiate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/rest.alpha.fal.ai/storage/upload/initiate`\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-0373d5a77e0a1877", "name": "Dangling fetch: POST https://fal.run/${v.path} (apps/api/src/scripts/probe-fal-stt-models.ts:156)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/${v.path} (apps/api/src/scripts/probe-fal-stt-models.ts:156)"}, "fullDescription": {"text": "`apps/api/src/scripts/probe-fal-stt-models.ts:156` calls `POST https://fal.run/${v.path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/<p>`\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-88d2e104ea33af89", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/scripts/test-transcription.ts:193)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/scripts/test-transcription.ts:193)"}, "fullDescription": {"text": "`apps/api/src/scripts/test-transcription.ts:193` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-faa04279fa2a2624", "name": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/lib/email.ts:60)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/lib/email.ts:60)"}, "fullDescription": {"text": "`apps/api/src/lib/email.ts:60` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\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-3c90cac35525e013", "name": "Dangling fetch: POST https://accounts.spotify.com/api/token (apps/api/src/lib/spotify.ts:19)", "shortDescription": {"text": "Dangling fetch: POST https://accounts.spotify.com/api/token (apps/api/src/lib/spotify.ts:19)"}, "fullDescription": {"text": "`apps/api/src/lib/spotify.ts:19` calls `POST https://accounts.spotify.com/api/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/accounts.spotify.com/api/token`\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-05f4df86438c2a0c", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:30)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:30)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter.ts:30` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-120f98b3347e480c", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:156)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:156)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter.ts:156` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-c7851946070b98e4", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:239)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:239)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter.ts:239` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-a9e4e306179934ef", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:287)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:287)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter.ts:287` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-4daef11508eaaded", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:324)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:324)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter.ts:324` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-746e996c4b222a7f", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/videos (apps/api/src/lib/openrouter-video.ts:62)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/videos (apps/api/src/lib/openrouter-video.ts:62)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter-video.ts:62` calls `POST https://openrouter.ai/api/v1/videos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/videos`\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-459b7ec9cb478401", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter-image.ts:168)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter-image.ts:168)"}, "fullDescription": {"text": "`apps/api/src/lib/openrouter-image.ts:168` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-16d011a6e94412b3", "name": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/routes/contact.ts:61)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/routes/contact.ts:61)"}, "fullDescription": {"text": "`apps/api/src/routes/contact.ts:61` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\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-68e2549afab6a507", "name": "Unused endpoint: GET /artists", "shortDescription": {"text": "Unused endpoint: GET /artists"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `GET /artists` 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-186692de65e847fc", "name": "Unused endpoint: GET /albums", "shortDescription": {"text": "Unused endpoint: GET /albums"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `GET /albums` 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-47b444489ab31b23", "name": "Unused endpoint: POST /catalog/import", "shortDescription": {"text": "Unused endpoint: POST /catalog/import"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `POST /catalog/import` 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-1dfcc9529630142e", "name": "Unused endpoint: POST /webhooks/stripe", "shortDescription": {"text": "Unused endpoint: POST /webhooks/stripe"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /webhooks/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-4c8d3ed31ec8814f", "name": "Unused endpoint: POST /uploads/presign", "shortDescription": {"text": "Unused endpoint: POST /uploads/presign"}, "fullDescription": {"text": "`apps/api/src/routes/uploads.ts` declares `POST /uploads/presign` 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-3e8a0a7b406443bc", "name": "Unused endpoint: GET /members", "shortDescription": {"text": "Unused endpoint: GET /members"}, "fullDescription": {"text": "`apps/api/src/routes/members.ts` declares `GET /members` 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-cbaa8c06323c88f9", "name": "Unused endpoint: POST /members", "shortDescription": {"text": "Unused endpoint: POST /members"}, "fullDescription": {"text": "`apps/api/src/routes/members.ts` declares `POST /members` 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": "`apps/api/src/routes/billing.ts` 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-747d120f647f5364", "name": "Unused endpoint: POST /billing/checkout", "shortDescription": {"text": "Unused endpoint: POST /billing/checkout"}, "fullDescription": {"text": "`apps/api/src/routes/billing.ts` declares `POST /billing/checkout` 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-2b59e52ab036a972", "name": "Unused endpoint: POST /billing/change-plan", "shortDescription": {"text": "Unused endpoint: POST /billing/change-plan"}, "fullDescription": {"text": "`apps/api/src/routes/billing.ts` declares `POST /billing/change-plan` 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-589634278f2427b7", "name": "Unused endpoint: POST /billing/portal", "shortDescription": {"text": "Unused endpoint: POST /billing/portal"}, "fullDescription": {"text": "`apps/api/src/routes/billing.ts` declares `POST /billing/portal` 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-8cc37e976ecee846", "name": "Unused endpoint: POST /admin/landing", "shortDescription": {"text": "Unused endpoint: POST /admin/landing"}, "fullDescription": {"text": "`apps/api/src/routes/landing.ts` declares `POST /admin/landing` 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-dab3fb22b75b75ec", "name": "Unused endpoint: GET /admin/landing/analytics", "shortDescription": {"text": "Unused endpoint: GET /admin/landing/analytics"}, "fullDescription": {"text": "`apps/api/src/routes/landing.ts` declares `GET /admin/landing/analytics` 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-5a8f88b17f3eeba7", "name": "Unused endpoint: GET /songs/public", "shortDescription": {"text": "Unused endpoint: GET /songs/public"}, "fullDescription": {"text": "`apps/api/src/routes/songs.ts` declares `GET /songs/public` 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-b66eb07d40f48c25", "name": "Unused endpoint: GET /songs", "shortDescription": {"text": "Unused endpoint: GET /songs"}, "fullDescription": {"text": "`apps/api/src/routes/songs.ts` declares `GET /songs` 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-c7463f08df14537e", "name": "Unused endpoint: GET /songs/meta-suggestions", "shortDescription": {"text": "Unused endpoint: GET /songs/meta-suggestions"}, "fullDescription": {"text": "`apps/api/src/routes/songs.ts` declares `GET /songs/meta-suggestions` 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-0aec0fadb8e58e17", "name": "Unused endpoint: GET /links/match", "shortDescription": {"text": "Unused endpoint: GET /links/match"}, "fullDescription": {"text": "`apps/api/src/routes/songs.ts` declares `GET /links/match` 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-e146daf4b2d6a74d", "name": "Unused endpoint: POST /tools/summary", "shortDescription": {"text": "Unused endpoint: POST /tools/summary"}, "fullDescription": {"text": "`apps/api/src/routes/tools.ts` declares `POST /tools/summary` 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-17975a1b89100e94", "name": "Unused endpoint: POST /tools/sections", "shortDescription": {"text": "Unused endpoint: POST /tools/sections"}, "fullDescription": {"text": "`apps/api/src/routes/tools.ts` declares `POST /tools/sections` 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-4de13b976fb6ac42", "name": "Unused endpoint: GET /tools/links", "shortDescription": {"text": "Unused endpoint: GET /tools/links"}, "fullDescription": {"text": "`apps/api/src/routes/tools.ts` declares `GET /tools/links` 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-f8e3b1ec38031f42", "name": "Unused endpoint: POST /contact", "shortDescription": {"text": "Unused endpoint: POST /contact"}, "fullDescription": {"text": "`apps/api/src/routes/contact.ts` declares `POST /contact` 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/21155"}, "properties": {"repository": "thesameqad/syllary", "repoUrl": "https://github.com/thesameqad/syllary", "branch": "main"}, "results": [{"ruleId": "scanner-7b2ab84facafbe4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/seed-landing-pages.ts:166"}, "properties": {"repobilityId": "b462a195c8ef57b0", "scanner": "scanner-primary", "fingerprint": "7b2ab84facafbe4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9bc4723f06775cbd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/setup-r2.ts:34"}, "properties": {"repobilityId": "f12cf5352fb83d7a", "scanner": "scanner-primary", "fingerprint": "9bc4723f06775cbd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f2199aa59a2b9822", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-groq-whisper.ts:33"}, "properties": {"repobilityId": "03cff26305f5e606", "scanner": "scanner-primary", "fingerprint": "f2199aa59a2b9822", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bcb5cfcd28d3d370", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/inspect-video-job.ts:15"}, "properties": {"repobilityId": "39cae9c29ed29970", "scanner": "scanner-primary", "fingerprint": "bcb5cfcd28d3d370", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad1bacfea68244e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-replicate-wrappers.ts:156"}, "properties": {"repobilityId": "638a8d16f029ff2c", "scanner": "scanner-primary", "fingerprint": "ad1bacfea68244e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc1a44f58752abad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-fal-wizper.ts:20"}, "properties": {"repobilityId": "5cd68c1afdb2818f", "scanner": "scanner-primary", "fingerprint": "bc1a44f58752abad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e08d310b6a11bcbd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/dump-preview-videos.ts:22"}, "properties": {"repobilityId": "16201d99647ac821", "scanner": "scanner-primary", "fingerprint": "e08d310b6a11bcbd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e34aa3808ff32c0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/trace-fast-pipeline.ts:41"}, "properties": {"repobilityId": "b5a68dee0c718507", "scanner": "scanner-primary", "fingerprint": "e34aa3808ff32c0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9cf777db98488963", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/set-credits.ts:37"}, "properties": {"repobilityId": "6fe5af70faa08369", "scanner": "scanner-primary", "fingerprint": "9cf777db98488963", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c44131b96a48ccdf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/setup-stripe.ts:67"}, "properties": {"repobilityId": "16c861d0cb88afa7", "scanner": "scanner-primary", "fingerprint": "c44131b96a48ccdf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f95375ded6b68be8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/restructure-song.ts:33"}, "properties": {"repobilityId": "58111e32850eba95", "scanner": "scanner-primary", "fingerprint": "f95375ded6b68be8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69886aacdd105cc3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test-lyric-video.ts:24"}, "properties": {"repobilityId": "90ca022fe2b4ddab", "scanner": "scanner-primary", "fingerprint": "69886aacdd105cc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-356a945d36ad91b2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/backfill-catalog.ts:25"}, "properties": {"repobilityId": "2c12bb382d583118", "scanner": "scanner-primary", "fingerprint": "356a945d36ad91b2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36769a639efffe60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/run-our-whisperx.ts:24"}, "properties": {"repobilityId": "3e8cce8d4cc39328", "scanner": "scanner-primary", "fingerprint": "36769a639efffe60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e7d841d0bf0938d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/dump-whisperx-schema.ts:8"}, "properties": {"repobilityId": "42df9bbf20991cec", "scanner": "scanner-primary", "fingerprint": "8e7d841d0bf0938d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-732b2fd99e722a1b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-fal-stt-models.ts:18"}, "properties": {"repobilityId": "6a6bd319c8616d65", "scanner": "scanner-primary", "fingerprint": "732b2fd99e722a1b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5c2123daf99bbba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test-transcription.ts:53"}, "properties": {"repobilityId": "c53c1f4cf7e911b9", "scanner": "scanner-primary", "fingerprint": "f5c2123daf99bbba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-676aedc75b99ad4e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/inspect-song.ts:14"}, "properties": {"repobilityId": "32be3baff6cdb52f", "scanner": "scanner-primary", "fingerprint": "676aedc75b99ad4e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43a050a58dc2e664", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/set-plan.ts:49"}, "properties": {"repobilityId": "5d448388727579ba", "scanner": "scanner-primary", "fingerprint": "43a050a58dc2e664", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be8682122ae9a724", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probe-whisperx-params.ts:55"}, "properties": {"repobilityId": "8469f6f2c07713c5", "scanner": "scanner-primary", "fingerprint": "be8682122ae9a724", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f9e85b304a61a5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/debug-structure.ts:27"}, "properties": {"repobilityId": "02455b31c9087a48", "scanner": "scanner-primary", "fingerprint": "5f9e85b304a61a5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b31beeaa44c8982", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/download-song-audio.ts:33"}, "properties": {"repobilityId": "73d8c4d686721c11", "scanner": "scanner-primary", "fingerprint": "0b31beeaa44c8982", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a7f700dd6590c269", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/member-card.tsx:43"}, "properties": {"repobilityId": "54c9a14a982a95fc", "scanner": "scanner-primary", "fingerprint": "a7f700dd6590c269", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e2812a1c41235dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/artist-card.tsx:36"}, "properties": {"repobilityId": "43f552e8308bcb35", "scanner": "scanner-primary", "fingerprint": "9e2812a1c41235dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbe6ea41a0b4cc5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/music-video-card.tsx:57"}, "properties": {"repobilityId": "e113d26cde1a459f", "scanner": "scanner-primary", "fingerprint": "cbe6ea41a0b4cc5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4673f2c856877e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/user-card.tsx:26"}, "properties": {"repobilityId": "b8cd648818642361", "scanner": "scanner-primary", "fingerprint": "f4673f2c856877e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05560f5140fbc355", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/album-card.tsx:36"}, "properties": {"repobilityId": "0b3717277a977124", "scanner": "scanner-primary", "fingerprint": "05560f5140fbc355", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55c6a53924d4bbb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/dashboard/song-card.tsx:196"}, "properties": {"repobilityId": "5311826508bbcac6", "scanner": "scanner-primary", "fingerprint": "55c6a53924d4bbb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c8ab8f44df10455", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/generate-video-modal.tsx:578"}, "properties": {"repobilityId": "3cf1832022866a35", "scanner": "scanner-primary", "fingerprint": "7c8ab8f44df10455", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75c7b2cbba04192f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/public-details-modal.tsx:86"}, "properties": {"repobilityId": "5bd4f471860dfdf0", "scanner": "scanner-primary", "fingerprint": "75c7b2cbba04192f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e90131d9e47f6a27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/manual-sync-editor.tsx:525"}, "properties": {"repobilityId": "2043cd2947a5f16b", "scanner": "scanner-primary", "fingerprint": "e90131d9e47f6a27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69f05b3b3b0ce3e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/result/lyrics-player.tsx:128"}, "properties": {"repobilityId": "430f4a527c4461dc", "scanner": "scanner-primary", "fingerprint": "69f05b3b3b0ce3e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-451c9c82bffc1b18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/landing/upload-card.tsx:303"}, "properties": {"repobilityId": "29deb295a3329805", "scanner": "scanner-primary", "fingerprint": "451c9c82bffc1b18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10c13d1c4052c04f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/landing/mode-selector.tsx:84"}, "properties": {"repobilityId": "e464956a3ca02e42", "scanner": "scanner-primary", "fingerprint": "10c13d1c4052c04f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e49288843b748d2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/library-page.tsx:221"}, "properties": {"repobilityId": "0018341a78d3a539", "scanner": "scanner-primary", "fingerprint": "e49288843b748d2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41714aeb7d689bd2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/public-page.tsx:783"}, "properties": {"repobilityId": "18b807c85263d131", "scanner": "scanner-primary", "fingerprint": "41714aeb7d689bd2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90d74679ea14d4fa", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/scripts/test-lyric-video.ts:2"}, "properties": {"repobilityId": "ab7757b668497218", "scanner": "scanner-primary", "fingerprint": "90d74679ea14d4fa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/scripts/test-lyric-video.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-3df22726e7a751fb", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/lib/ffmpeg.ts:1"}, "properties": {"repobilityId": "5a59aa7016da4de5", "scanner": "scanner-primary", "fingerprint": "3df22726e7a751fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/lib/ffmpeg.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-630bb68eefbf2efe", "level": "note", "message": {"text": "Very large file: apps/api/src/scripts/landing/comparison.ts (1483 lines)"}, "properties": {"repobilityId": "a4d03ce826aeedb2", "scanner": "scanner-primary", "fingerprint": "630bb68eefbf2efe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-786a29a6cb875cca", "level": "note", "message": {"text": "Very large file: apps/api/src/scripts/landing/how-to.ts (2198 lines)"}, "properties": {"repobilityId": "104e0485ea6d964d", "scanner": "scanner-primary", "fingerprint": "786a29a6cb875cca", "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": "2154341c926d23b6", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6a355942f9141d7c", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/lyrics/package.json"}, "properties": {"repobilityId": "f75138b08ac7ef4a", "scanner": "scanner-primary", "fingerprint": "6a355942f9141d7c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/lyrics/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5b48f0393ce5445a", "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": "7f9265a298bc7e9d", "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": "a6dab08bd4b3d0b5", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "50790071f2d15e3b", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "73b694c199158030", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "e24b3d363334fb40", "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": "0b51095fc5d8081b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-430615dabbe2fc36", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/env.ts:46"}, "properties": {"repobilityId": "dde24883ec5fbc02", "scanner": "scanner-primary", "fingerprint": "430615dabbe2fc36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f75809abb66d4e9", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/scripts/seed-landing-pages.ts:15"}, "properties": {"repobilityId": "d81a1e6285c1a776", "scanner": "scanner-primary", "fingerprint": "1f75809abb66d4e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d86cb6d0fd78299b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-groq-whisper.ts:97"}, "properties": {"repobilityId": "613b9784955fd52e", "scanner": "scanner-primary", "fingerprint": "d86cb6d0fd78299b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8888fb6f383ad9f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-fal-wizper.ts:26"}, "properties": {"repobilityId": "47643755ba850e09", "scanner": "scanner-primary", "fingerprint": "d8888fb6f383ad9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-324a06204f236070", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/dump-preview-videos.ts:30"}, "properties": {"repobilityId": "54950a92b48623e3", "scanner": "scanner-primary", "fingerprint": "324a06204f236070", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-838bf19c228cd4d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/scripts/setup-stripe.ts:5"}, "properties": {"repobilityId": "1e713852594fdd7f", "scanner": "scanner-primary", "fingerprint": "838bf19c228cd4d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-816b3037046c5f51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/run-our-whisperx.ts:28"}, "properties": {"repobilityId": "ebe450f083e9aa93", "scanner": "scanner-primary", "fingerprint": "816b3037046c5f51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ebd55d62afeed771", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probe-fal-stt-models.ts:23"}, "properties": {"repobilityId": "9264d8ba6a07b1da", "scanner": "scanner-primary", "fingerprint": "ebd55d62afeed771", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f896ebbbc0370922", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/test-transcription.ts:193"}, "properties": {"repobilityId": "3686f5b188c33003", "scanner": "scanner-primary", "fingerprint": "f896ebbbc0370922", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98a208ebd143423c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/download-song-audio.ts:34"}, "properties": {"repobilityId": "2a37684d1f640752", "scanner": "scanner-primary", "fingerprint": "98a208ebd143423c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-955409f5e3b29d13", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/scripts/landing/comparison.ts:3"}, "properties": {"repobilityId": "239f6fe55fdcfb2e", "scanner": "scanner-primary", "fingerprint": "955409f5e3b29d13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-824868b0d570405e", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/lib/replicate.ts:101"}, "properties": {"repobilityId": "00ed1583eb0857fa", "scanner": "scanner-primary", "fingerprint": "824868b0d570405e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a10c40c5c6e3dbb5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/lib/cover-image.ts:5"}, "properties": {"repobilityId": "ade5e886c4412f87", "scanner": "scanner-primary", "fingerprint": "a10c40c5c6e3dbb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58b32435e885097a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/fal-image.ts:32"}, "properties": {"repobilityId": "a6955e124f50c15d", "scanner": "scanner-primary", "fingerprint": "58b32435e885097a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-748163bc2a72236e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/lib/spotify.ts:3"}, "properties": {"repobilityId": "18bb15d8fe55ecb0", "scanner": "scanner-primary", "fingerprint": "748163bc2a72236e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07767169bfab6791", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/lib/video-pipeline.ts:102"}, "properties": {"repobilityId": "712a6f105b21cae8", "scanner": "scanner-primary", "fingerprint": "07767169bfab6791", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d5f04bd9dceb19e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/video-pipeline.ts:226"}, "properties": {"repobilityId": "2be41ddd12c67746", "scanner": "scanner-primary", "fingerprint": "4d5f04bd9dceb19e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c4a36a44e689c221", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/lib/openrouter-video.ts:4"}, "properties": {"repobilityId": "031b87c1ec95959e", "scanner": "scanner-primary", "fingerprint": "c4a36a44e689c221", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38c9280a2cfdf931", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/fal-stt.ts:32"}, "properties": {"repobilityId": "a0dbe5c26ffebdde", "scanner": "scanner-primary", "fingerprint": "38c9280a2cfdf931", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e81846ad42ac75d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/lib/openrouter-image.ts:95"}, "properties": {"repobilityId": "eb91c20e66c57ffe", "scanner": "scanner-primary", "fingerprint": "e81846ad42ac75d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52157fb37ed82efc", "level": "none", "message": {"text": "Commented-code block (12 lines) in apps/api/src/lib/music-links.ts:4"}, "properties": {"repobilityId": "4e954693d30b187c", "scanner": "scanner-primary", "fingerprint": "52157fb37ed82efc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f32e60d9cd7418bf", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/routes/billing.ts:103"}, "properties": {"repobilityId": "17f6017a2e86704f", "scanner": "scanner-primary", "fingerprint": "f32e60d9cd7418bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-439317d81431630b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/landing.ts:211"}, "properties": {"repobilityId": "7e7b3282870cb6d8", "scanner": "scanner-primary", "fingerprint": "439317d81431630b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3beaea9dadbb0ed7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/songs.ts:372"}, "properties": {"repobilityId": "b5a5504405c58252", "scanner": "scanner-primary", "fingerprint": "3beaea9dadbb0ed7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b58e1ebb7ac30c86", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/db/schema.ts:89"}, "properties": {"repobilityId": "3ad5a89f51b40783", "scanner": "scanner-primary", "fingerprint": "b58e1ebb7ac30c86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fc97ef396a6bb7a", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/db/client.ts:12"}, "properties": {"repobilityId": "0d0e2f007ef06e7c", "scanner": "scanner-primary", "fingerprint": "4fc97ef396a6bb7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dde8c1f55b9815bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/result/dynamic-lyrics.tsx:224"}, "properties": {"repobilityId": "a18a5ab84efd2010", "scanner": "scanner-primary", "fingerprint": "dde8c1f55b9815bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9b08c947b526391", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/result/manual-sync-editor.tsx:179"}, "properties": {"repobilityId": "eb8df0cf779fe591", "scanner": "scanner-primary", "fingerprint": "a9b08c947b526391", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e40c744b51024ef", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/web/src/components/result/inline-line-editor.tsx:48"}, "properties": {"repobilityId": "74cf6c5854ff7656", "scanner": "scanner-primary", "fingerprint": "0e40c744b51024ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60dada335eb18f07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/result/video-tabs.tsx:263"}, "properties": {"repobilityId": "d44dad71b3ae01c9", "scanner": "scanner-primary", "fingerprint": "60dada335eb18f07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1c3314d164a5f05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:100"}, "properties": {"repobilityId": "78bb25e6e95eee4f", "scanner": "scanner-primary", "fingerprint": "b1c3314d164a5f05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93a8ec34a7755e55", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/plans.ts:36"}, "properties": {"repobilityId": "6d6054fad5cee1de", "scanner": "scanner-primary", "fingerprint": "93a8ec34a7755e55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afb974ce684d47ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/src/video-plan.ts:6"}, "properties": {"repobilityId": "a5ebbd8c132d93de", "scanner": "scanner-primary", "fingerprint": "afb974ce684d47ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64da52f323a56285", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/src/landing.ts:6"}, "properties": {"repobilityId": "7016484d72de18d3", "scanner": "scanner-primary", "fingerprint": "64da52f323a56285", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdf9a6cb7022db2d", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/src/account.ts:3"}, "properties": {"repobilityId": "0e7975f7077c8c2c", "scanner": "scanner-primary", "fingerprint": "cdf9a6cb7022db2d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7220e253924dd238", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seo-worker/src/worker.ts:106"}, "properties": {"repobilityId": "a4d12d55d5749295", "scanner": "scanner-primary", "fingerprint": "7220e253924dd238", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0b17c8c07a7421d", "level": "note", "message": {"text": "8 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "17fe720e8247f9df", "scanner": "scanner-primary", "fingerprint": "d0b17c8c07a7421d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2b238474d3f142ab", "level": "warning", "message": {"text": "Frontend route `/s/:songId` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "837ba437a18b5b35", "scanner": "scanner-primary", "fingerprint": "2b238474d3f142ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dd8b6f71e8e79efe", "level": "warning", "message": {"text": "Frontend route `/p/:songId` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "c9fe3be65bd873a0", "scanner": "scanner-primary", "fingerprint": "dd8b6f71e8e79efe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f9ff240ca23cf6a1", "level": "warning", "message": {"text": "Frontend route `/embed/:songId` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "f65f0f8aa7c23232", "scanner": "scanner-primary", "fingerprint": "f9ff240ca23cf6a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ebc610ecd4eb188f", "level": "warning", "message": {"text": "Frontend route `/convert/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "ca28ce58c4e20ed5", "scanner": "scanner-primary", "fingerprint": "ebc610ecd4eb188f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e0cf32f32530feb8", "level": "warning", "message": {"text": "Frontend route `/tools/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "59f764d667e8d4ca", "scanner": "scanner-primary", "fingerprint": "e0cf32f32530feb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d5b05b1527777997", "level": "warning", "message": {"text": "Frontend route `/compare/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "035418a0a9aee0b7", "scanner": "scanner-primary", "fingerprint": "d5b05b1527777997", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-509777ef6a19aa0b", "level": "warning", "message": {"text": "Frontend route `/guides/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "e396f20b9bfeb747", "scanner": "scanner-primary", "fingerprint": "509777ef6a19aa0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e166fe4575a09ca2", "level": "warning", "message": {"text": "Frontend route `/unsubscribe` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "f0f7b947a9df6d36", "scanner": "scanner-primary", "fingerprint": "e166fe4575a09ca2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2cd479f2de497f7f", "level": "warning", "message": {"text": "Frontend route `/sign-in/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "50dacf7b82856aa0", "scanner": "scanner-primary", "fingerprint": "2cd479f2de497f7f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-838d895df6081cc7", "level": "warning", "message": {"text": "Frontend route `/sign-up/*` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "0b0a6b3b66543963", "scanner": "scanner-primary", "fingerprint": "838d895df6081cc7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b8347a58bfae6736", "level": "warning", "message": {"text": "Frontend route `/account` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "5533a84a03f4e2b6", "scanner": "scanner-primary", "fingerprint": "b8347a58bfae6736", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-794472123c700188", "level": "warning", "message": {"text": "Frontend route `/admin/landing/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "cb981424f722fc67", "scanner": "scanner-primary", "fingerprint": "794472123c700188", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6263e34bbb5e1a19", "level": "error", "message": {"text": "Dangling fetch: POST https://api.groq.com/openai/v1/audio/transcriptions (apps/api/src/scripts/probe-groq-whisper.ts:97)"}, "properties": {"repobilityId": "e0b6beedb806791c", "scanner": "scanner-primary", "fingerprint": "6263e34bbb5e1a19", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91b72d8397a329ca", "level": "error", "message": {"text": "Dangling fetch: POST https://rest.alpha.fal.ai/storage/upload/initiate (apps/api/src/scripts/probe-fal-wizper.ts:26)"}, "properties": {"repobilityId": "53aff91bdaa7b230", "scanner": "scanner-primary", "fingerprint": "91b72d8397a329ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04f6df851fc5a1e6", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/fal-ai/whisper (apps/api/src/scripts/probe-fal-wizper.ts:56)"}, "properties": {"repobilityId": "778634d8723a6107", "scanner": "scanner-primary", "fingerprint": "04f6df851fc5a1e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4f6f8b2a041bd30", "level": "error", "message": {"text": "Dangling fetch: GET https://api.replicate.com/v1/models/${MODEL_OWNER}/${MODEL_NAME}/versions (apps/api/src/scripts/run-our-whisperx.ts:28)"}, "properties": {"repobilityId": "e81df3549b1c4cd1", "scanner": "scanner-primary", "fingerprint": "c4f6f8b2a041bd30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8acd9f95842742e1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.replicate.com/v1/files (apps/api/src/scripts/run-our-whisperx.ts:49)"}, "properties": {"repobilityId": "db80e59a9e2f195e", "scanner": "scanner-primary", "fingerprint": "8acd9f95842742e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b586158d06237fd1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (apps/api/src/scripts/run-our-whisperx.ts:64)"}, "properties": {"repobilityId": "21b9f69f45900334", "scanner": "scanner-primary", "fingerprint": "b586158d06237fd1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc0b35ce1bfdb9c9", "level": "error", "message": {"text": "Dangling fetch: POST https://rest.alpha.fal.ai/storage/upload/initiate (apps/api/src/scripts/probe-fal-stt-models.ts:23)"}, "properties": {"repobilityId": "177666a1412f12d6", "scanner": "scanner-primary", "fingerprint": "fc0b35ce1bfdb9c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0373d5a77e0a1877", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/${v.path} (apps/api/src/scripts/probe-fal-stt-models.ts:156)"}, "properties": {"repobilityId": "5bae9be3e78dc368", "scanner": "scanner-primary", "fingerprint": "0373d5a77e0a1877", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88d2e104ea33af89", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/scripts/test-transcription.ts:193)"}, "properties": {"repobilityId": "8127adb4c0ee0296", "scanner": "scanner-primary", "fingerprint": "88d2e104ea33af89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-faa04279fa2a2624", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/lib/email.ts:60)"}, "properties": {"repobilityId": "1508d9350f89d6a5", "scanner": "scanner-primary", "fingerprint": "faa04279fa2a2624", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c90cac35525e013", "level": "error", "message": {"text": "Dangling fetch: POST https://accounts.spotify.com/api/token (apps/api/src/lib/spotify.ts:19)"}, "properties": {"repobilityId": "f71bb6e6f0b9aa76", "scanner": "scanner-primary", "fingerprint": "3c90cac35525e013", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-05f4df86438c2a0c", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:30)"}, "properties": {"repobilityId": "56fdbaefd126cbc8", "scanner": "scanner-primary", "fingerprint": "05f4df86438c2a0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-120f98b3347e480c", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:156)"}, "properties": {"repobilityId": "a1dc9bc83a041be9", "scanner": "scanner-primary", "fingerprint": "120f98b3347e480c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7851946070b98e4", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:239)"}, "properties": {"repobilityId": "7c4353047ebc8bb3", "scanner": "scanner-primary", "fingerprint": "c7851946070b98e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9e4e306179934ef", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:287)"}, "properties": {"repobilityId": "3004d7e4f3270c12", "scanner": "scanner-primary", "fingerprint": "a9e4e306179934ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4daef11508eaaded", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter.ts:324)"}, "properties": {"repobilityId": "7504fd622d925347", "scanner": "scanner-primary", "fingerprint": "4daef11508eaaded", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-746e996c4b222a7f", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/videos (apps/api/src/lib/openrouter-video.ts:62)"}, "properties": {"repobilityId": "4071fe644388f56c", "scanner": "scanner-primary", "fingerprint": "746e996c4b222a7f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-459b7ec9cb478401", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/lib/openrouter-image.ts:168)"}, "properties": {"repobilityId": "977871bc1dd25105", "scanner": "scanner-primary", "fingerprint": "459b7ec9cb478401", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-16d011a6e94412b3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/routes/contact.ts:61)"}, "properties": {"repobilityId": "6652c19ba6677a07", "scanner": "scanner-primary", "fingerprint": "16d011a6e94412b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68e2549afab6a507", "level": "note", "message": {"text": "Unused endpoint: GET /artists"}, "properties": {"repobilityId": "d1e643b3e74c9cbd", "scanner": "scanner-primary", "fingerprint": "68e2549afab6a507", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-186692de65e847fc", "level": "note", "message": {"text": "Unused endpoint: GET /albums"}, "properties": {"repobilityId": "122f590cb8218530", "scanner": "scanner-primary", "fingerprint": "186692de65e847fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47b444489ab31b23", "level": "note", "message": {"text": "Unused endpoint: POST /catalog/import"}, "properties": {"repobilityId": "d35b40c0bf023b11", "scanner": "scanner-primary", "fingerprint": "47b444489ab31b23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dfcc9529630142e", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/stripe"}, "properties": {"repobilityId": "290d965f27b2e3cf", "scanner": "scanner-primary", "fingerprint": "1dfcc9529630142e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c8d3ed31ec8814f", "level": "note", "message": {"text": "Unused endpoint: POST /uploads/presign"}, "properties": {"repobilityId": "0d04df295a70d50d", "scanner": "scanner-primary", "fingerprint": "4c8d3ed31ec8814f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e8a0a7b406443bc", "level": "note", "message": {"text": "Unused endpoint: GET /members"}, "properties": {"repobilityId": "919f937e5e6def6b", "scanner": "scanner-primary", "fingerprint": "3e8a0a7b406443bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbaa8c06323c88f9", "level": "note", "message": {"text": "Unused endpoint: POST /members"}, "properties": {"repobilityId": "c9cd3812a9949c72", "scanner": "scanner-primary", "fingerprint": "cbaa8c06323c88f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "4e83aea109eb60b1", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-747d120f647f5364", "level": "note", "message": {"text": "Unused endpoint: POST /billing/checkout"}, "properties": {"repobilityId": "57eb4826209d6bdc", "scanner": "scanner-primary", "fingerprint": "747d120f647f5364", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b59e52ab036a972", "level": "note", "message": {"text": "Unused endpoint: POST /billing/change-plan"}, "properties": {"repobilityId": "824bd5cd2000cd7d", "scanner": "scanner-primary", "fingerprint": "2b59e52ab036a972", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-589634278f2427b7", "level": "note", "message": {"text": "Unused endpoint: POST /billing/portal"}, "properties": {"repobilityId": "26bc6296d6788a4e", "scanner": "scanner-primary", "fingerprint": "589634278f2427b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8cc37e976ecee846", "level": "note", "message": {"text": "Unused endpoint: POST /admin/landing"}, "properties": {"repobilityId": "718d77dd9a34fe9d", "scanner": "scanner-primary", "fingerprint": "8cc37e976ecee846", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dab3fb22b75b75ec", "level": "note", "message": {"text": "Unused endpoint: GET /admin/landing/analytics"}, "properties": {"repobilityId": "0fe004688b509b55", "scanner": "scanner-primary", "fingerprint": "dab3fb22b75b75ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a8f88b17f3eeba7", "level": "note", "message": {"text": "Unused endpoint: GET /songs/public"}, "properties": {"repobilityId": "c70f8574f63731fb", "scanner": "scanner-primary", "fingerprint": "5a8f88b17f3eeba7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b66eb07d40f48c25", "level": "note", "message": {"text": "Unused endpoint: GET /songs"}, "properties": {"repobilityId": "22862da384b7ba1e", "scanner": "scanner-primary", "fingerprint": "b66eb07d40f48c25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7463f08df14537e", "level": "note", "message": {"text": "Unused endpoint: GET /songs/meta-suggestions"}, "properties": {"repobilityId": "a01b9d13aededac2", "scanner": "scanner-primary", "fingerprint": "c7463f08df14537e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0aec0fadb8e58e17", "level": "note", "message": {"text": "Unused endpoint: GET /links/match"}, "properties": {"repobilityId": "a428d7f541b3ba35", "scanner": "scanner-primary", "fingerprint": "0aec0fadb8e58e17", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e146daf4b2d6a74d", "level": "note", "message": {"text": "Unused endpoint: POST /tools/summary"}, "properties": {"repobilityId": "33a14791f2b0ab26", "scanner": "scanner-primary", "fingerprint": "e146daf4b2d6a74d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17975a1b89100e94", "level": "note", "message": {"text": "Unused endpoint: POST /tools/sections"}, "properties": {"repobilityId": "e0b0161677217c57", "scanner": "scanner-primary", "fingerprint": "17975a1b89100e94", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4de13b976fb6ac42", "level": "note", "message": {"text": "Unused endpoint: GET /tools/links"}, "properties": {"repobilityId": "a9cdd75618e72951", "scanner": "scanner-primary", "fingerprint": "4de13b976fb6ac42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8e3b1ec38031f42", "level": "note", "message": {"text": "Unused endpoint: POST /contact"}, "properties": {"repobilityId": "83c1e6af3db78a0d", "scanner": "scanner-primary", "fingerprint": "f8e3b1ec38031f42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}