{"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-168c673d7a79200c", "name": "Possibly dead Python function: warmup", "shortDescription": {"text": "Possibly dead Python function: warmup"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 37 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 5 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-3ea91c99e5384718", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:14"}, "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-624480bb6c2ad61c", "name": "Network/subprocess call without timeout or try/except \u2014 server/seedvc.py:39", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 server/seedvc.py:39"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a2969069676a816e", "name": "Legacy-named symbol `api_v2` in server/gsv.py:1", "shortDescription": {"text": "Legacy-named symbol `api_v2` in server/gsv.py:1"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a208cb7a36e41bfb", "name": "Network/subprocess call without timeout or try/except \u2014 server/gsv.py:71", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 server/gsv.py:71"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-697e8ecf990ef348", "name": "Network/subprocess call without timeout or try/except \u2014 server/audio.py:19", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 server/audio.py:19"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a182ea01b1597623", "name": "Legacy-named symbol `logs_s2_v2` in server/finetune.py:154", "shortDescription": {"text": "Legacy-named symbol `logs_s2_v2` in server/finetune.py:154"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb60d0991ccb948f", "name": "Network/subprocess call without timeout or try/except \u2014 server/finetune.py:89", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 server/finetune.py:89"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f487fd1c01dccb8", "name": "Network/subprocess call without timeout or try/except \u2014 server/dataset.py:65", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 server/dataset.py:65"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ebe7126319b88e02", "name": "Legacy-named symbol `make_music_v2` in promo/make_music_v2.py:5", "shortDescription": {"text": "Legacy-named symbol `make_music_v2` in promo/make_music_v2.py:5"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f6bdadb31fe730f", "name": "Legacy-named symbol `music_v2` in promo/src/Root.tsx:11", "shortDescription": {"text": "Legacy-named symbol `music_v2` in promo/src/Root.tsx:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/app.py:convert_status, server/app.py:convert\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\npromo/make_music_v3.py:place, promo/make_music.py:place, promo/make_music_v2.py:place\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8421b3b389b3ea1e", "name": "FastAPI POST `warmup` without auth dependency \u2014 server/app.py:36", "shortDescription": {"text": "FastAPI POST `warmup` without auth dependency \u2014 server/app.py:36"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-88467e74d558d889", "name": "FastAPI POST `create_voice` without auth dependency \u2014 server/app.py:61", "shortDescription": {"text": "FastAPI POST `create_voice` without auth dependency \u2014 server/app.py:61"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fb6f95f525dac4da", "name": "FastAPI DELETE `delete_voice` without auth dependency \u2014 server/app.py:138", "shortDescription": {"text": "FastAPI DELETE `delete_voice` without auth dependency \u2014 server/app.py:138"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3a3e70a51614ed0", "name": "FastAPI POST `generate` without auth dependency \u2014 server/app.py:176", "shortDescription": {"text": "FastAPI POST `generate` without auth dependency \u2014 server/app.py:176"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-279e531cdb78eb61", "name": "FastAPI POST `convert_warmup` without auth dependency \u2014 server/app.py:269", "shortDescription": {"text": "FastAPI POST `convert_warmup` without auth dependency \u2014 server/app.py:269"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67f62aa329a90c1a", "name": "FastAPI POST `convert` without auth dependency \u2014 server/app.py:277", "shortDescription": {"text": "FastAPI POST `convert` without auth dependency \u2014 server/app.py:277"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-796367edf5116f45", "name": "FastAPI DELETE `delete_conversion` without auth dependency \u2014 server/app.py:389", "shortDescription": {"text": "FastAPI DELETE `delete_conversion` without auth dependency \u2014 server/app.py:389"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fae2f4776589008a", "name": "FastAPI POST `create_take` without auth dependency \u2014 server/app.py:427", "shortDescription": {"text": "FastAPI POST `create_take` without auth dependency \u2014 server/app.py:427"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc39beea3781c626", "name": "FastAPI DELETE `delete_take` without auth dependency \u2014 server/app.py:487", "shortDescription": {"text": "FastAPI DELETE `delete_take` without auth dependency \u2014 server/app.py:487"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99421d6c0306a7e3", "name": "FastAPI POST `dataset_build` without auth dependency \u2014 server/app.py:510", "shortDescription": {"text": "FastAPI POST `dataset_build` without auth dependency \u2014 server/app.py:510"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8cd6decc18c8e6d8", "name": "FastAPI POST `train_start` without auth dependency \u2014 server/app.py:544", "shortDescription": {"text": "FastAPI POST `train_start` without auth dependency \u2014 server/app.py:544"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-939314f54693093e", "name": "FastAPI DELETE `delete_generation` without auth dependency \u2014 server/app.py:559", "shortDescription": {"text": "FastAPI DELETE `delete_generation` without auth dependency \u2014 server/app.py:559"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0b6e377c52eb88f8", "name": "Unused endpoint: GET /api/docs/{name}", "shortDescription": {"text": "Unused endpoint: GET /api/docs/{name}"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/docs/{name}` 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-921202594df26f63", "name": "Unused endpoint: GET /api/voices/{voice_id}", "shortDescription": {"text": "Unused endpoint: GET /api/voices/{voice_id}"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/voices/{voice_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61281793d5ffb3b6", "name": "Unused endpoint: GET /api/voices/{voice_id}/reference", "shortDescription": {"text": "Unused endpoint: GET /api/voices/{voice_id}/reference"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/voices/{voice_id}/reference` 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-8b1547f30a42b911", "name": "Unused endpoint: GET /api/generations", "shortDescription": {"text": "Unused endpoint: GET /api/generations"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/generations` 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-bf58073f3747d9d3", "name": "Unused endpoint: GET /api/generations/{gen_id}", "shortDescription": {"text": "Unused endpoint: GET /api/generations/{gen_id}"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/generations/{gen_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-442030bfebb52848", "name": "Unused endpoint: GET /api/generations/{gen_id}/audio", "shortDescription": {"text": "Unused endpoint: GET /api/generations/{gen_id}/audio"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/generations/{gen_id}/audio` 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-74748ecabc2b381f", "name": "Unused endpoint: GET /api/conversions", "shortDescription": {"text": "Unused endpoint: GET /api/conversions"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/conversions` 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-261e431d5de3fb42", "name": "Unused endpoint: GET /api/conversions/{conv_id}", "shortDescription": {"text": "Unused endpoint: GET /api/conversions/{conv_id}"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/conversions/{conv_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7abb90ae2039a034", "name": "Unused endpoint: GET /api/conversions/{conv_id}/audio", "shortDescription": {"text": "Unused endpoint: GET /api/conversions/{conv_id}/audio"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/conversions/{conv_id}/audio` 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-d310067bd211b784", "name": "Unused endpoint: GET /api/studio/takes/{take_id}", "shortDescription": {"text": "Unused endpoint: GET /api/studio/takes/{take_id}"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/studio/takes/{take_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1552ca1cb0772ef", "name": "Unused endpoint: GET /api/studio/takes/{take_id}/audio", "shortDescription": {"text": "Unused endpoint: GET /api/studio/takes/{take_id}/audio"}, "fullDescription": {"text": "`server/app.py` declares `GET /api/studio/takes/{take_id}/audio` 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/19078"}, "properties": {"repository": "scottboyd83-dev/voice-clone-studio", "repoUrl": "https://github.com/scottboyd83-dev/voice-clone-studio", "branch": "main"}, "results": [{"ruleId": "scanner-168c673d7a79200c", "level": "note", "message": {"text": "Possibly dead Python function: warmup"}, "properties": {"repobilityId": "bd781fc7723196a5", "scanner": "scanner-primary", "fingerprint": "168c673d7a79200c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/engine.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-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-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "33e41a4e09724d65", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "4c8c09db2a00c8e1", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "deb5a0af72fe4041", "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": "6621f0d5e51d674f", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ea91c99e5384718", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:14"}, "properties": {"repobilityId": "d1652a32ca20c329", "scanner": "scanner-primary", "fingerprint": "3ea91c99e5384718", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-624480bb6c2ad61c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 server/seedvc.py:39"}, "properties": {"repobilityId": "01e8b66b560e5437", "scanner": "scanner-primary", "fingerprint": "624480bb6c2ad61c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2969069676a816e", "level": "note", "message": {"text": "Legacy-named symbol `api_v2` in server/gsv.py:1"}, "properties": {"repobilityId": "16b91a3b6808ba8d", "scanner": "scanner-primary", "fingerprint": "a2969069676a816e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a208cb7a36e41bfb", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 server/gsv.py:71"}, "properties": {"repobilityId": "3ea9b89fa5a0d11b", "scanner": "scanner-primary", "fingerprint": "a208cb7a36e41bfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-697e8ecf990ef348", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 server/audio.py:19"}, "properties": {"repobilityId": "4ffb8db638e8925c", "scanner": "scanner-primary", "fingerprint": "697e8ecf990ef348", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a182ea01b1597623", "level": "note", "message": {"text": "Legacy-named symbol `logs_s2_v2` in server/finetune.py:154"}, "properties": {"repobilityId": "6315de97d1841d24", "scanner": "scanner-primary", "fingerprint": "a182ea01b1597623", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bb60d0991ccb948f", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 server/finetune.py:89"}, "properties": {"repobilityId": "b779bbb5121a87fb", "scanner": "scanner-primary", "fingerprint": "bb60d0991ccb948f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f487fd1c01dccb8", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 server/dataset.py:65"}, "properties": {"repobilityId": "5145d14d8f8f63af", "scanner": "scanner-primary", "fingerprint": "8f487fd1c01dccb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ebe7126319b88e02", "level": "note", "message": {"text": "Legacy-named symbol `make_music_v2` in promo/make_music_v2.py:5"}, "properties": {"repobilityId": "6cd6697dba053844", "scanner": "scanner-primary", "fingerprint": "ebe7126319b88e02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6f6bdadb31fe730f", "level": "note", "message": {"text": "Legacy-named symbol `music_v2` in promo/src/Root.tsx:11"}, "properties": {"repobilityId": "69ca7713e86fc64f", "scanner": "scanner-primary", "fingerprint": "6f6bdadb31fe730f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "19f5390707fc6f13", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5fe771a62c6853f2", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a0f95f4dac1fd7df", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5d2df7381613393b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-8421b3b389b3ea1e", "level": "error", "message": {"text": "FastAPI POST `warmup` without auth dependency \u2014 server/app.py:36"}, "properties": {"repobilityId": "2d29fb9c91d5a6aa", "scanner": "scanner-primary", "fingerprint": "8421b3b389b3ea1e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-88467e74d558d889", "level": "error", "message": {"text": "FastAPI POST `create_voice` without auth dependency \u2014 server/app.py:61"}, "properties": {"repobilityId": "f813a8d9a762d816", "scanner": "scanner-primary", "fingerprint": "88467e74d558d889", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-fb6f95f525dac4da", "level": "error", "message": {"text": "FastAPI DELETE `delete_voice` without auth dependency \u2014 server/app.py:138"}, "properties": {"repobilityId": "683e69489695b228", "scanner": "scanner-primary", "fingerprint": "fb6f95f525dac4da", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-d3a3e70a51614ed0", "level": "error", "message": {"text": "FastAPI POST `generate` without auth dependency \u2014 server/app.py:176"}, "properties": {"repobilityId": "450dcf716de805e2", "scanner": "scanner-primary", "fingerprint": "d3a3e70a51614ed0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-279e531cdb78eb61", "level": "error", "message": {"text": "FastAPI POST `convert_warmup` without auth dependency \u2014 server/app.py:269"}, "properties": {"repobilityId": "0d15e82e196058df", "scanner": "scanner-primary", "fingerprint": "279e531cdb78eb61", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 269}}}]}, {"ruleId": "scanner-67f62aa329a90c1a", "level": "error", "message": {"text": "FastAPI POST `convert` without auth dependency \u2014 server/app.py:277"}, "properties": {"repobilityId": "c82e29a86c588039", "scanner": "scanner-primary", "fingerprint": "67f62aa329a90c1a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 277}}}]}, {"ruleId": "scanner-796367edf5116f45", "level": "error", "message": {"text": "FastAPI DELETE `delete_conversion` without auth dependency \u2014 server/app.py:389"}, "properties": {"repobilityId": "5ef218e419669beb", "scanner": "scanner-primary", "fingerprint": "796367edf5116f45", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 389}}}]}, {"ruleId": "scanner-fae2f4776589008a", "level": "error", "message": {"text": "FastAPI POST `create_take` without auth dependency \u2014 server/app.py:427"}, "properties": {"repobilityId": "d5d1d17ef34b1beb", "scanner": "scanner-primary", "fingerprint": "fae2f4776589008a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 427}}}]}, {"ruleId": "scanner-dc39beea3781c626", "level": "error", "message": {"text": "FastAPI DELETE `delete_take` without auth dependency \u2014 server/app.py:487"}, "properties": {"repobilityId": "edf407265033c776", "scanner": "scanner-primary", "fingerprint": "dc39beea3781c626", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 487}}}]}, {"ruleId": "scanner-99421d6c0306a7e3", "level": "error", "message": {"text": "FastAPI POST `dataset_build` without auth dependency \u2014 server/app.py:510"}, "properties": {"repobilityId": "217429ccc634c290", "scanner": "scanner-primary", "fingerprint": "99421d6c0306a7e3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 510}}}]}, {"ruleId": "scanner-8cd6decc18c8e6d8", "level": "error", "message": {"text": "FastAPI POST `train_start` without auth dependency \u2014 server/app.py:544"}, "properties": {"repobilityId": "1b35589974577d1c", "scanner": "scanner-primary", "fingerprint": "8cd6decc18c8e6d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 544}}}]}, {"ruleId": "scanner-939314f54693093e", "level": "error", "message": {"text": "FastAPI DELETE `delete_generation` without auth dependency \u2014 server/app.py:559"}, "properties": {"repobilityId": "d37ce45eebe75399", "scanner": "scanner-primary", "fingerprint": "939314f54693093e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/app.py"}, "region": {"startLine": 559}}}]}, {"ruleId": "scanner-0b6e377c52eb88f8", "level": "note", "message": {"text": "Unused endpoint: GET /api/docs/{name}"}, "properties": {"repobilityId": "6261406c0da94cfe", "scanner": "scanner-primary", "fingerprint": "0b6e377c52eb88f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-921202594df26f63", "level": "note", "message": {"text": "Unused endpoint: GET /api/voices/{voice_id}"}, "properties": {"repobilityId": "127678d4d37d7ed8", "scanner": "scanner-primary", "fingerprint": "921202594df26f63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61281793d5ffb3b6", "level": "note", "message": {"text": "Unused endpoint: GET /api/voices/{voice_id}/reference"}, "properties": {"repobilityId": "379fddb16e41dc1f", "scanner": "scanner-primary", "fingerprint": "61281793d5ffb3b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b1547f30a42b911", "level": "note", "message": {"text": "Unused endpoint: GET /api/generations"}, "properties": {"repobilityId": "714cf08640ab9d0b", "scanner": "scanner-primary", "fingerprint": "8b1547f30a42b911", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf58073f3747d9d3", "level": "note", "message": {"text": "Unused endpoint: GET /api/generations/{gen_id}"}, "properties": {"repobilityId": "b16b5e27124d766c", "scanner": "scanner-primary", "fingerprint": "bf58073f3747d9d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-442030bfebb52848", "level": "note", "message": {"text": "Unused endpoint: GET /api/generations/{gen_id}/audio"}, "properties": {"repobilityId": "5537cc5b71fc9de1", "scanner": "scanner-primary", "fingerprint": "442030bfebb52848", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74748ecabc2b381f", "level": "note", "message": {"text": "Unused endpoint: GET /api/conversions"}, "properties": {"repobilityId": "ec300edaa47d7b8b", "scanner": "scanner-primary", "fingerprint": "74748ecabc2b381f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-261e431d5de3fb42", "level": "note", "message": {"text": "Unused endpoint: GET /api/conversions/{conv_id}"}, "properties": {"repobilityId": "6fe659ff41026a84", "scanner": "scanner-primary", "fingerprint": "261e431d5de3fb42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7abb90ae2039a034", "level": "note", "message": {"text": "Unused endpoint: GET /api/conversions/{conv_id}/audio"}, "properties": {"repobilityId": "f345c929867c97d8", "scanner": "scanner-primary", "fingerprint": "7abb90ae2039a034", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d310067bd211b784", "level": "note", "message": {"text": "Unused endpoint: GET /api/studio/takes/{take_id}"}, "properties": {"repobilityId": "41ce3527401695b3", "scanner": "scanner-primary", "fingerprint": "d310067bd211b784", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1552ca1cb0772ef", "level": "note", "message": {"text": "Unused endpoint: GET /api/studio/takes/{take_id}/audio"}, "properties": {"repobilityId": "06dfb8610b927364", "scanner": "scanner-primary", "fingerprint": "f1552ca1cb0772ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}