{"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-eef96d830275dff9", "name": "Stray `console.log` in TS/JS \u2014 scripts/format-existing-v2.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/format-existing-v2.ts:40"}, "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-fb7636c92962b1ad", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-diarize-batch.ts:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-diarize-batch.ts:112"}, "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-65732d9e2e1461dc", "name": "Stray `console.log` in TS/JS \u2014 scripts/format-existing.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/format-existing.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-170720ccdcc9203b", "name": "Stray `console.log` in TS/JS \u2014 app/api/recordings/route.ts:260", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/recordings/route.ts:260"}, "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-0eea4824cc4ab415", "name": "Stray `console.log` in TS/JS \u2014 app/api/import/plaud/route.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/import/plaud/route.ts:58"}, "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-4f09487c77e71a77", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/diarize/route.ts:233", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/diarize/route.ts:233"}, "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-b80a4a28d9b8f6ec", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/plaud/route.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/plaud/route.ts:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e9e6799570b1f0d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/invites/page.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/invites/page.tsx:108"}, "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-0c873c4ec7cb8c90", "name": "Stray `console.log` in TS/JS \u2014 lib/import-plaud.ts:191", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/import-plaud.ts:191"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f46829ab2c19a2d", "name": "Stray `console.log` in TS/JS \u2014 lib/transcribe.ts:372", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/transcribe.ts:372"}, "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-c40b3ba0515d161f", "name": "Stray `console.log` in TS/JS \u2014 lib/resume-pipelines.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/resume-pipelines.ts:40"}, "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-3ca7237d5eee661f", "name": "Stray `console.log` in TS/JS \u2014 lib/db.ts:374", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/db.ts:374"}, "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-a8b9284d353905f2", "name": "Stray `console.log` in TS/JS \u2014 lib/pipeline.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/pipeline.ts:117"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0977cca8ba31adb0", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36a6a9f9d5ab6f40", "name": "Insecure pattern 'node_child_process' in lib/transcribe.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in lib/transcribe.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-93b7924c38983486", "name": "Insecure pattern 'node_child_process' in lib/vad.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in lib/vad.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-ed7e0d049877a7fd", "name": "Very large file: app/ajustes/[[...section]]/page.tsx (2413 lines)", "shortDescription": {"text": "Very large file: app/ajustes/[[...section]]/page.tsx (2413 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": "0 test file(s) for 99 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 54 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 38 placeholder/mock markers across 9 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca64b206b8b00c25", "name": "Legacy-named symbol `transcript_v2` in scripts/format-existing-v2.ts:20", "shortDescription": {"text": "Legacy-named symbol `transcript_v2` in scripts/format-existing-v2.ts:20"}, "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-b1399cbb22d04fa1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-diarize-batch.ts:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-diarize-batch.ts:62"}, "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-e51390d7cec34379", "name": "Legacy-named symbol `lira_recordings_list_cache_v1` in components/RecordingList.tsx:26", "shortDescription": {"text": "Legacy-named symbol `lira_recordings_list_cache_v1` in components/RecordingList.tsx:26"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0953fa133f5e0567", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/RecordingList.tsx:267", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/RecordingList.tsx:267"}, "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-7645c7cb1e3a07e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/SpeakerPanel.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/SpeakerPanel.tsx:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b6a647fe9079028", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/PasskeyLoginButton.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/PasskeyLoginButton.tsx:18"}, "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-9698540c691d2d93", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/grabacion/[id]/page.tsx:148", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/grabacion/[id]/page.tsx:148"}, "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-7f9ecf8f9fb65b09", "name": "Commented-code block (5 lines) in app/api/login/route.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/login/route.ts:9"}, "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-7e92765a34e240a7", "name": "Commented-code block (6 lines) in app/api/recordings/route.ts:224", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/recordings/route.ts: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-559b9db0dd827623", "name": "Commented-code block (5 lines) in app/api/cron/diarize/route.ts:58", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/diarize/route.ts:58"}, "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-e403843d73bf1232", "name": "Commented-code block (5 lines) in app/api/cron/plaud/route.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/plaud/route.ts:38"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d94dc3d847fab5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/ajustes/[[...section]]/page.tsx:675", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/ajustes/[[...section]]/page.tsx:675"}, "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-8de9d5a65d62ab80", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/page.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/page.tsx:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08610fc49f2bdc60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/invites/page.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/invites/page.tsx: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-17274242cb2dcaa9", "name": "Commented-code block (5 lines) in lib/import-plaud.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in lib/import-plaud.ts:63"}, "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-24775eb5648d8910", "name": "Commented-code block (5 lines) in lib/plaud.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in lib/plaud.ts:41"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-08ee277eb2099140", "name": "Commented-code block (7 lines) in lib/local-backup.ts:269", "shortDescription": {"text": "Commented-code block (7 lines) in lib/local-backup.ts:269"}, "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-0c2d0bc02de4b6bc", "name": "Commented-code block (7 lines) in lib/transcribe.ts:240", "shortDescription": {"text": "Commented-code block (7 lines) in lib/transcribe.ts:240"}, "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-d153a8cdc668e994", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/diarize.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/diarize.ts:33"}, "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-8556a21adcd64dd6", "name": "Commented-code block (5 lines) in lib/watchdog.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in lib/watchdog.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-e136bb5de13e5655", "name": "Commented-code block (5 lines) in lib/cleanup.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in lib/cleanup.ts:55"}, "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-06bda7f991a5e15a", "name": "Legacy-named symbol `transcript_v1` in lib/db.ts:60", "shortDescription": {"text": "Legacy-named symbol `transcript_v1` in lib/db.ts:60"}, "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-700cab360de03cf0", "name": "Commented-code block (6 lines) in lib/pipeline.ts:265", "shortDescription": {"text": "Commented-code block (6 lines) in lib/pipeline.ts:265"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be72565d71d0ee2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/mail.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/mail.ts:18"}, "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-e942f00d65075794", "name": "Network/subprocess call without timeout or try/except \u2014 modal/diarize.py:56", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 modal/diarize.py:56"}, "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-00b0e6cb426afaf4", "name": "Blocking `requests.get(...)` inside `async def handle` \u2014 modal/diarize.py:106", "shortDescription": {"text": "Blocking `requests.get(...)` inside `async def handle` \u2014 modal/diarize.py:106"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `requests.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APP_PASSWORD`, `CAP_SERVER_URL`, `CRON_SECRET`, `NEXT_RUNTIME`, `NODE_ENV`, `TRANSCRIPT_PATH`. 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-fd4433ca43d30c31", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/run-diarize-batch.ts:77)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/run-diarize-batch.ts:77)"}, "fullDescription": {"text": "`scripts/run-diarize-batch.ts:77` 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-a3176667b8b25284", "name": "Dangling fetch: GET /api/settings (components/RecordButton.tsx:94)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (components/RecordButton.tsx:94)"}, "fullDescription": {"text": "`components/RecordButton.tsx:94` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-2ca111b5bdcfd345", "name": "Dangling fetch: GET /api/recordings/${recordingId}/speakers (components/DetailTabs.tsx:280)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${recordingId}/speakers (components/DetailTabs.tsx:280)"}, "fullDescription": {"text": "`components/DetailTabs.tsx:280` calls `GET /api/recordings/${recordingId}/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/speakers`\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-7685c99a3e9bb55f", "name": "Dangling fetch: PATCH /api/recordings/${recordingId}/speakers (components/DetailTabs.tsx:347)", "shortDescription": {"text": "Dangling fetch: PATCH /api/recordings/${recordingId}/speakers (components/DetailTabs.tsx:347)"}, "fullDescription": {"text": "`components/DetailTabs.tsx:347` calls `PATCH /api/recordings/${recordingId}/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/speakers`\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-748ee72e011e5285", "name": "Dangling fetch: GET /api/recordings/${recordingId}/speakers (components/SpeakerPanel.tsx:72)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${recordingId}/speakers (components/SpeakerPanel.tsx:72)"}, "fullDescription": {"text": "`components/SpeakerPanel.tsx:72` calls `GET /api/recordings/${recordingId}/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/speakers`\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-afd9e535d4be2ea7", "name": "Dangling fetch: PATCH /api/recordings/${recordingId}/speakers (components/SpeakerPanel.tsx:111)", "shortDescription": {"text": "Dangling fetch: PATCH /api/recordings/${recordingId}/speakers (components/SpeakerPanel.tsx:111)"}, "fullDescription": {"text": "`components/SpeakerPanel.tsx:111` calls `PATCH /api/recordings/${recordingId}/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/speakers`\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-29d2a00fdd260ecc", "name": "Dangling fetch: POST /api/auth/passkey/authenticate-options (components/PasskeyLoginButton.tsx:11)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/passkey/authenticate-options (components/PasskeyLoginButton.tsx:11)"}, "fullDescription": {"text": "`components/PasskeyLoginButton.tsx:11` calls `POST /api/auth/passkey/authenticate-options` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/passkey/authenticate-options`\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-6d0a0e2494809c7a", "name": "Dangling fetch: POST /api/auth/passkey/authenticate-verify (components/PasskeyLoginButton.tsx:18)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/passkey/authenticate-verify (components/PasskeyLoginButton.tsx:18)"}, "fullDescription": {"text": "`components/PasskeyLoginButton.tsx:18` calls `POST /api/auth/passkey/authenticate-verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/passkey/authenticate-verify`\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-0474bf1f626d534d", "name": "Dangling fetch: GET /api/recordings/${recordingId}/share (components/ShareDialog.tsx:24)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${recordingId}/share (components/ShareDialog.tsx:24)"}, "fullDescription": {"text": "`components/ShareDialog.tsx:24` calls `GET /api/recordings/${recordingId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/share`\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-34fdb99e66efec81", "name": "Dangling fetch: GET /api/speakers (components/ShareDialog.tsx:34)", "shortDescription": {"text": "Dangling fetch: GET /api/speakers (components/ShareDialog.tsx:34)"}, "fullDescription": {"text": "`components/ShareDialog.tsx:34` calls `GET /api/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers`\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-8d02defcadc722c5", "name": "Dangling fetch: GET /api/account (components/ShareDialog.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/account (components/ShareDialog.tsx:35)"}, "fullDescription": {"text": "`components/ShareDialog.tsx:35` calls `GET /api/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/account`\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-21d8c7a1e60435e8", "name": "Dangling fetch: POST /api/recordings/${recordingId}/share (components/ShareDialog.tsx:84)", "shortDescription": {"text": "Dangling fetch: POST /api/recordings/${recordingId}/share (components/ShareDialog.tsx:84)"}, "fullDescription": {"text": "`components/ShareDialog.tsx:84` calls `POST /api/recordings/${recordingId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/share`\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-069319b37f743d31", "name": "Dangling fetch: DELETE /api/recordings/${recordingId}/share (components/ShareDialog.tsx:110)", "shortDescription": {"text": "Dangling fetch: DELETE /api/recordings/${recordingId}/share (components/ShareDialog.tsx:110)"}, "fullDescription": {"text": "`components/ShareDialog.tsx:110` calls `DELETE /api/recordings/${recordingId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/share`\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-b62974d8d943fca6", "name": "Dangling fetch: PATCH /api/speakers/${id} (components/ShareDialog.tsx:129)", "shortDescription": {"text": "Dangling fetch: PATCH /api/speakers/${id} (components/ShareDialog.tsx:129)"}, "fullDescription": {"text": "`components/ShareDialog.tsx:129` calls `PATCH /api/speakers/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers/<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-78e169233d5895e5", "name": "Dangling fetch: POST /api/forgot-password/resend (app/reset-password/page.tsx:99)", "shortDescription": {"text": "Dangling fetch: POST /api/forgot-password/resend (app/reset-password/page.tsx:99)"}, "fullDescription": {"text": "`app/reset-password/page.tsx:99` calls `POST /api/forgot-password/resend` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/forgot-password/resend`\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-991a754961e2d531", "name": "Dangling fetch: GET /api/reset-password?token=${encodeURIComponent(token)} (app/reset-password/page.tsx:113)", "shortDescription": {"text": "Dangling fetch: GET /api/reset-password?token=${encodeURIComponent(token)} (app/reset-password/page.tsx:113)"}, "fullDescription": {"text": "`app/reset-password/page.tsx:113` calls `GET /api/reset-password?token=${encodeURIComponent(token)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reset-password`\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-3298cbb17e6f81d8", "name": "Dangling fetch: POST /api/reset-password (app/reset-password/page.tsx:135)", "shortDescription": {"text": "Dangling fetch: POST /api/reset-password (app/reset-password/page.tsx:135)"}, "fullDescription": {"text": "`app/reset-password/page.tsx:135` calls `POST /api/reset-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reset-password`\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-5b489992ff80dff8", "name": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:148)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:148)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:148` calls `GET /api/recordings/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<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-9bfd87355e6f3bec", "name": "Dangling fetch: DELETE /api/recordings/${id} (app/grabacion/[id]/page.tsx:179)", "shortDescription": {"text": "Dangling fetch: DELETE /api/recordings/${id} (app/grabacion/[id]/page.tsx:179)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:179` calls `DELETE /api/recordings/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<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-8dc303bd7f97c282", "name": "Dangling fetch: POST /api/recordings/${id}/retry (app/grabacion/[id]/page.tsx:190)", "shortDescription": {"text": "Dangling fetch: POST /api/recordings/${id}/retry (app/grabacion/[id]/page.tsx:190)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:190` calls `POST /api/recordings/${id}/retry` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/retry`\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-1050fbd365ce2666", "name": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:196)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:196)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:196` calls `GET /api/recordings/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<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-7bb1238953f900c3", "name": "Dangling fetch: POST /api/recordings/${id}/regenerate (app/grabacion/[id]/page.tsx:204)", "shortDescription": {"text": "Dangling fetch: POST /api/recordings/${id}/regenerate (app/grabacion/[id]/page.tsx:204)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:204` calls `POST /api/recordings/${id}/regenerate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/regenerate`\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-7592bdaf8be5af4e", "name": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:209)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:209)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:209` calls `GET /api/recordings/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<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-d0431b722dbaac32", "name": "Dangling fetch: POST /api/recordings/${id}/regenerate-transcript (app/grabacion/[id]/page.tsx:214)", "shortDescription": {"text": "Dangling fetch: POST /api/recordings/${id}/regenerate-transcript (app/grabacion/[id]/page.tsx:214)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:214` calls `POST /api/recordings/${id}/regenerate-transcript` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/regenerate-transcript`\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-421cdd6a8e6060b2", "name": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:220)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:220)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:220` calls `GET /api/recordings/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<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-7c10e24b9bc027e4", "name": "Dangling fetch: POST /api/recordings/${id}/regenerate-transcript (app/grabacion/[id]/page.tsx:225)", "shortDescription": {"text": "Dangling fetch: POST /api/recordings/${id}/regenerate-transcript (app/grabacion/[id]/page.tsx:225)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:225` calls `POST /api/recordings/${id}/regenerate-transcript` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<p>/regenerate-transcript`\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-10abde61abc5c30c", "name": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:234)", "shortDescription": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:234)"}, "fullDescription": {"text": "`app/grabacion/[id]/page.tsx:234` calls `GET /api/recordings/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recordings/<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-d59ef03ee56c4ccf", "name": "Dangling fetch: POST /api/login (app/login/page.tsx:25)", "shortDescription": {"text": "Dangling fetch: POST /api/login (app/login/page.tsx:25)"}, "fullDescription": {"text": "`app/login/page.tsx:25` calls `POST /api/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/login`\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-171417f41306433e", "name": "Dangling fetch: POST /api/auth/totp/verify (app/login/mfa/page.tsx:17)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/totp/verify (app/login/mfa/page.tsx:17)"}, "fullDescription": {"text": "`app/login/mfa/page.tsx:17` calls `POST /api/auth/totp/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/totp/verify`\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-6b06e4907b5b5cba", "name": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (app/api/login/route.ts:23)", "shortDescription": {"text": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (app/api/login/route.ts:23)"}, "fullDescription": {"text": "`app/api/login/route.ts:23` calls `POST https://challenges.cloudflare.com/turnstile/v0/siteverify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/challenges.cloudflare.com/turnstile/v0/siteverify`\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-eaa15aa38a894464", "name": "Dangling fetch: GET /api/auth/totp/status (app/ajustes/[[...section]]/page.tsx:675)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/totp/status (app/ajustes/[[...section]]/page.tsx:675)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:675` calls `GET /api/auth/totp/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/totp/status`\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-c331d7aff0a69006", "name": "Dangling fetch: GET /api/auth/passkeys (app/ajustes/[[...section]]/page.tsx:676)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/passkeys (app/ajustes/[[...section]]/page.tsx:676)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:676` calls `GET /api/auth/passkeys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/passkeys`\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-ba8567f91ce6d287", "name": "Dangling fetch: GET /api/speakers (app/ajustes/[[...section]]/page.tsx:694)", "shortDescription": {"text": "Dangling fetch: GET /api/speakers (app/ajustes/[[...section]]/page.tsx:694)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:694` calls `GET /api/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers`\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-551430c02b9b8db0", "name": "Dangling fetch: POST /api/speakers (app/ajustes/[[...section]]/page.tsx:710)", "shortDescription": {"text": "Dangling fetch: POST /api/speakers (app/ajustes/[[...section]]/page.tsx:710)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:710` calls `POST /api/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers`\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-995def527a45937d", "name": "Dangling fetch: DELETE /api/speakers/${id} (app/ajustes/[[...section]]/page.tsx:725)", "shortDescription": {"text": "Dangling fetch: DELETE /api/speakers/${id} (app/ajustes/[[...section]]/page.tsx:725)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:725` calls `DELETE /api/speakers/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers/<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-4eea09c2c93b5b29", "name": "Dangling fetch: POST /api/speakers (app/ajustes/[[...section]]/page.tsx:738)", "shortDescription": {"text": "Dangling fetch: POST /api/speakers (app/ajustes/[[...section]]/page.tsx:738)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:738` calls `POST /api/speakers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers`\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-316dc1da20987e34", "name": "Dangling fetch: PATCH /api/speakers/${id} (app/ajustes/[[...section]]/page.tsx:755)", "shortDescription": {"text": "Dangling fetch: PATCH /api/speakers/${id} (app/ajustes/[[...section]]/page.tsx:755)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:755` calls `PATCH /api/speakers/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speakers/<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-8b4fe163be4c8cca", "name": "Dangling fetch: GET /api/auth/totp/setup (app/ajustes/[[...section]]/page.tsx:767)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/totp/setup (app/ajustes/[[...section]]/page.tsx:767)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:767` calls `GET /api/auth/totp/setup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/totp/setup`\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-65f4481eae5f3227", "name": "Dangling fetch: POST /api/auth/totp/enable (app/ajustes/[[...section]]/page.tsx:781)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/totp/enable (app/ajustes/[[...section]]/page.tsx:781)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:781` calls `POST /api/auth/totp/enable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/totp/enable`\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-8f7e881e37d61df4", "name": "Dangling fetch: DELETE /api/auth/totp/disable (app/ajustes/[[...section]]/page.tsx:802)", "shortDescription": {"text": "Dangling fetch: DELETE /api/auth/totp/disable (app/ajustes/[[...section]]/page.tsx:802)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:802` calls `DELETE /api/auth/totp/disable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/totp/disable`\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-25cd712f770a511a", "name": "Dangling fetch: POST /api/auth/passkey/register-options (app/ajustes/[[...section]]/page.tsx:824)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/passkey/register-options (app/ajustes/[[...section]]/page.tsx:824)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:824` calls `POST /api/auth/passkey/register-options` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/passkey/register-options`\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-6a66188d4649a419", "name": "Dangling fetch: POST /api/auth/passkey/register-verify (app/ajustes/[[...section]]/page.tsx:830)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/passkey/register-verify (app/ajustes/[[...section]]/page.tsx:830)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:830` calls `POST /api/auth/passkey/register-verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/passkey/register-verify`\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-7134348f537c6e69", "name": "Dangling fetch: DELETE /api/auth/passkeys (app/ajustes/[[...section]]/page.tsx:851)", "shortDescription": {"text": "Dangling fetch: DELETE /api/auth/passkeys (app/ajustes/[[...section]]/page.tsx:851)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:851` calls `DELETE /api/auth/passkeys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/passkeys`\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-85417bc95a4c6280", "name": "Dangling fetch: GET /api/facts (app/ajustes/[[...section]]/page.tsx:870)", "shortDescription": {"text": "Dangling fetch: GET /api/facts (app/ajustes/[[...section]]/page.tsx:870)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:870` calls `GET /api/facts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/facts`\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-daf90c95a669b801", "name": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:879)", "shortDescription": {"text": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:879)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:879` calls `PATCH /api/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/account`\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-d5f850399448f4b4", "name": "Dangling fetch: POST /api/facts (app/ajustes/[[...section]]/page.tsx:883)", "shortDescription": {"text": "Dangling fetch: POST /api/facts (app/ajustes/[[...section]]/page.tsx:883)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:883` calls `POST /api/facts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/facts`\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-1779a0aa3ecadbfc", "name": "Dangling fetch: DELETE /api/facts (app/ajustes/[[...section]]/page.tsx:887)", "shortDescription": {"text": "Dangling fetch: DELETE /api/facts (app/ajustes/[[...section]]/page.tsx:887)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:887` calls `DELETE /api/facts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/facts`\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-7254a61d6ccf5508", "name": "Dangling fetch: POST /api/facts (app/ajustes/[[...section]]/page.tsx:896)", "shortDescription": {"text": "Dangling fetch: POST /api/facts (app/ajustes/[[...section]]/page.tsx:896)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:896` calls `POST /api/facts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/facts`\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-5b0bc24c7fa2f70c", "name": "Dangling fetch: GET /api/import/plaud (app/ajustes/[[...section]]/page.tsx:905)", "shortDescription": {"text": "Dangling fetch: GET /api/import/plaud (app/ajustes/[[...section]]/page.tsx:905)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:905` calls `GET /api/import/plaud` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/import/plaud`\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-0f6cc49b9b97c244", "name": "Dangling fetch: POST /api/import/plaud (app/ajustes/[[...section]]/page.tsx:915)", "shortDescription": {"text": "Dangling fetch: POST /api/import/plaud (app/ajustes/[[...section]]/page.tsx:915)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:915` calls `POST /api/import/plaud` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/import/plaud`\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-947e41b9c96efbd4", "name": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:944)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:944)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:944` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-4295086306d8ff36", "name": "Dangling fetch: DELETE /api/account (app/ajustes/[[...section]]/page.tsx:957)", "shortDescription": {"text": "Dangling fetch: DELETE /api/account (app/ajustes/[[...section]]/page.tsx:957)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:957` calls `DELETE /api/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/account`\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-fe9ba1e753b63501", "name": "Dangling fetch: GET /api/settings (app/ajustes/[[...section]]/page.tsx:976)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (app/ajustes/[[...section]]/page.tsx:976)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:976` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-e9814d1c528f8e0f", "name": "Dangling fetch: GET /api/account (app/ajustes/[[...section]]/page.tsx:977)", "shortDescription": {"text": "Dangling fetch: GET /api/account (app/ajustes/[[...section]]/page.tsx:977)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:977` calls `GET /api/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/account`\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-a15200b012bf9fa7", "name": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1030)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1030)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1030` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-386e2580eae5f6ec", "name": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1040)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1040)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1040` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-c4b737ede155938c", "name": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1056)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1056)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1056` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-55c8bc0dd44a6a6b", "name": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1067)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1067)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1067` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-9727a0e700fcfce4", "name": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1083)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1083)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1083` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-e19858338b414ef5", "name": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:1124)", "shortDescription": {"text": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:1124)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1124` calls `PATCH /api/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/account`\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-23994ef6ea1682bf", "name": "Dangling fetch: POST /api/logout (app/ajustes/[[...section]]/page.tsx:1167)", "shortDescription": {"text": "Dangling fetch: POST /api/logout (app/ajustes/[[...section]]/page.tsx:1167)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1167` calls `POST /api/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/logout`\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-edea5a5573c108f0", "name": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:1174)", "shortDescription": {"text": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:1174)"}, "fullDescription": {"text": "`app/ajustes/[[...section]]/page.tsx:1174` calls `PATCH /api/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/account`\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-d008276a848cf175", "name": "Dangling fetch: POST /api/forgot-password (app/forgot-password/page.tsx:24)", "shortDescription": {"text": "Dangling fetch: POST /api/forgot-password (app/forgot-password/page.tsx:24)"}, "fullDescription": {"text": "`app/forgot-password/page.tsx:24` calls `POST /api/forgot-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/forgot-password`\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-38f5a3acd39401d7", "name": "Dangling fetch: GET /api/admin/users (app/admin/users/page.tsx:48)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users (app/admin/users/page.tsx:48)"}, "fullDescription": {"text": "`app/admin/users/page.tsx:48` calls `GET /api/admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\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-56735377e59eda86", "name": "Dangling fetch: POST /api/admin/users (app/admin/users/page.tsx:58)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users (app/admin/users/page.tsx:58)"}, "fullDescription": {"text": "`app/admin/users/page.tsx:58` calls `POST /api/admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\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-f98d575ae6bdf9ae", "name": "Dangling fetch: PATCH /api/admin/users/${id} (app/admin/users/page.tsx:71)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/users/${id} (app/admin/users/page.tsx:71)"}, "fullDescription": {"text": "`app/admin/users/page.tsx:71` calls `PATCH /api/admin/users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-9a2557abfce8db3e", "name": "Dangling fetch: DELETE /api/admin/users/${id} (app/admin/users/page.tsx:84)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/users/${id} (app/admin/users/page.tsx:84)"}, "fullDescription": {"text": "`app/admin/users/page.tsx:84` calls `DELETE /api/admin/users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-7bf849b114ed9287", "name": "Dangling fetch: GET /api/admin/invites (app/admin/invites/page.tsx:26)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/invites (app/admin/invites/page.tsx:26)"}, "fullDescription": {"text": "`app/admin/invites/page.tsx:26` calls `GET /api/admin/invites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/invites`\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-59c3dafa640facfe", "name": "Dangling fetch: POST /api/admin/invites (app/admin/invites/page.tsx:35)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/invites (app/admin/invites/page.tsx:35)"}, "fullDescription": {"text": "`app/admin/invites/page.tsx:35` calls `POST /api/admin/invites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/invites`\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-3dbad488b5ad1b80", "name": "Dangling fetch: DELETE /api/admin/invites/${id} (app/admin/invites/page.tsx:49)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/invites/${id} (app/admin/invites/page.tsx:49)"}, "fullDescription": {"text": "`app/admin/invites/page.tsx:49` calls `DELETE /api/admin/invites/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/invites/<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-81668572bc845cfa", "name": "Dangling fetch: POST /api/solicitar (app/solicitar/page.tsx:21)", "shortDescription": {"text": "Dangling fetch: POST /api/solicitar (app/solicitar/page.tsx:21)"}, "fullDescription": {"text": "`app/solicitar/page.tsx:21` calls `POST /api/solicitar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/solicitar`\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-f41bb7a6e3e3fff8", "name": "Dangling fetch: POST /api/register (app/register/page.tsx:91)", "shortDescription": {"text": "Dangling fetch: POST /api/register (app/register/page.tsx:91)"}, "fullDescription": {"text": "`app/register/page.tsx:91` calls `POST /api/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/register`\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-316403d66c2c6c22", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/diarize.ts:196)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/diarize.ts:196)"}, "fullDescription": {"text": "`lib/diarize.ts:196` 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-148ba250f6cbf7de", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/diarize.ts:308)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/diarize.ts:308)"}, "fullDescription": {"text": "`lib/diarize.ts:308` 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-007514e4e48b1cd0", "name": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (lib/pipeline.ts:458)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (lib/pipeline.ts:458)"}, "fullDescription": {"text": "`lib/pipeline.ts:458` calls `POST https://api.telegram.org/bot${token}/sendMessage` 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.telegram.org/bot/<p>/sendmessage`\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-22d3971daa99784d", "name": "Dangling fetch: POST https://api.mailgun.net/v3/${MAILGUN_DOMAIN}/messages (lib/mail.ts:18)", "shortDescription": {"text": "Dangling fetch: POST https://api.mailgun.net/v3/${MAILGUN_DOMAIN}/messages (lib/mail.ts:18)"}, "fullDescription": {"text": "`lib/mail.ts:18` calls `POST https://api.mailgun.net/v3/${MAILGUN_DOMAIN}/messages` 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.mailgun.net/v3/<p>/messages`\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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`modal/diarize.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22329"}, "properties": {"repository": "visualpharm/lira", "repoUrl": "https://github.com/visualpharm/lira", "branch": "main"}, "results": [{"ruleId": "scanner-eef96d830275dff9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/format-existing-v2.ts:40"}, "properties": {"repobilityId": "7c855338fd3733fb", "scanner": "scanner-primary", "fingerprint": "eef96d830275dff9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb7636c92962b1ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-diarize-batch.ts:112"}, "properties": {"repobilityId": "b3f090bf8ba0d369", "scanner": "scanner-primary", "fingerprint": "fb7636c92962b1ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-65732d9e2e1461dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/format-existing.ts:41"}, "properties": {"repobilityId": "2e9e00fc0c9844f1", "scanner": "scanner-primary", "fingerprint": "65732d9e2e1461dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-170720ccdcc9203b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/recordings/route.ts:260"}, "properties": {"repobilityId": "0aec0ec039a6f327", "scanner": "scanner-primary", "fingerprint": "170720ccdcc9203b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0eea4824cc4ab415", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/import/plaud/route.ts:58"}, "properties": {"repobilityId": "53098614824edad9", "scanner": "scanner-primary", "fingerprint": "0eea4824cc4ab415", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f09487c77e71a77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/diarize/route.ts:233"}, "properties": {"repobilityId": "645626d3154e94da", "scanner": "scanner-primary", "fingerprint": "4f09487c77e71a77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b80a4a28d9b8f6ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/plaud/route.ts:49"}, "properties": {"repobilityId": "e1f4b89a8872a685", "scanner": "scanner-primary", "fingerprint": "b80a4a28d9b8f6ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e9e6799570b1f0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/invites/page.tsx:108"}, "properties": {"repobilityId": "2c6351e518479fab", "scanner": "scanner-primary", "fingerprint": "8e9e6799570b1f0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c873c4ec7cb8c90", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/import-plaud.ts:191"}, "properties": {"repobilityId": "c29cb894ed60f578", "scanner": "scanner-primary", "fingerprint": "0c873c4ec7cb8c90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f46829ab2c19a2d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/transcribe.ts:372"}, "properties": {"repobilityId": "ed1de8d2c281a067", "scanner": "scanner-primary", "fingerprint": "6f46829ab2c19a2d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c40b3ba0515d161f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/resume-pipelines.ts:40"}, "properties": {"repobilityId": "62646c785ef78b2d", "scanner": "scanner-primary", "fingerprint": "c40b3ba0515d161f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ca7237d5eee661f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/db.ts:374"}, "properties": {"repobilityId": "9eab514567f8f4c1", "scanner": "scanner-primary", "fingerprint": "3ca7237d5eee661f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8b9284d353905f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/pipeline.ts:117"}, "properties": {"repobilityId": "ea97d7ad88b2bc83", "scanner": "scanner-primary", "fingerprint": "a8b9284d353905f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-0977cca8ba31adb0", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "fb73c16494d1f1e0", "scanner": "scanner-primary", "fingerprint": "0977cca8ba31adb0", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-0977cca8ba31adb0", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "67e81975a9f8e47e", "scanner": "scanner-primary", "fingerprint": "0977cca8ba31adb0", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-0977cca8ba31adb0", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "0ecb21472f091a04", "scanner": "scanner-primary", "fingerprint": "0977cca8ba31adb0", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-36a6a9f9d5ab6f40", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in lib/transcribe.ts:2"}, "properties": {"repobilityId": "478cee618d708e19", "scanner": "scanner-primary", "fingerprint": "36a6a9f9d5ab6f40", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/transcribe.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-93b7924c38983486", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in lib/vad.ts:1"}, "properties": {"repobilityId": "4c169e60202e4b2b", "scanner": "scanner-primary", "fingerprint": "93b7924c38983486", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/vad.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-ed7e0d049877a7fd", "level": "note", "message": {"text": "Very large file: app/ajustes/[[...section]]/page.tsx (2413 lines)"}, "properties": {"repobilityId": "7d813bdb10d25b69", "scanner": "scanner-primary", "fingerprint": "ed7e0d049877a7fd", "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-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "972350105491070f", "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": "1aebfce7722d3bab", "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": "60f2857b76f500da", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "fb9797aab4cb82ee", "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": "2dfc95aaf7e5eac0", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ca64b206b8b00c25", "level": "note", "message": {"text": "Legacy-named symbol `transcript_v2` in scripts/format-existing-v2.ts:20"}, "properties": {"repobilityId": "fee0dc25da777989", "scanner": "scanner-primary", "fingerprint": "ca64b206b8b00c25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b1399cbb22d04fa1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-diarize-batch.ts:62"}, "properties": {"repobilityId": "9fbd9515966da7e2", "scanner": "scanner-primary", "fingerprint": "b1399cbb22d04fa1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e51390d7cec34379", "level": "note", "message": {"text": "Legacy-named symbol `lira_recordings_list_cache_v1` in components/RecordingList.tsx:26"}, "properties": {"repobilityId": "1bcecb82f6dafe64", "scanner": "scanner-primary", "fingerprint": "e51390d7cec34379", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0953fa133f5e0567", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/RecordingList.tsx:267"}, "properties": {"repobilityId": "5d67cee4b1120144", "scanner": "scanner-primary", "fingerprint": "0953fa133f5e0567", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7645c7cb1e3a07e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/SpeakerPanel.tsx:72"}, "properties": {"repobilityId": "93ee12a3e40f5fb9", "scanner": "scanner-primary", "fingerprint": "7645c7cb1e3a07e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b6a647fe9079028", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/PasskeyLoginButton.tsx:18"}, "properties": {"repobilityId": "7d6c26141bdee130", "scanner": "scanner-primary", "fingerprint": "2b6a647fe9079028", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9698540c691d2d93", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/grabacion/[id]/page.tsx:148"}, "properties": {"repobilityId": "6f249e4ce2a88b00", "scanner": "scanner-primary", "fingerprint": "9698540c691d2d93", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f9ecf8f9fb65b09", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/login/route.ts:9"}, "properties": {"repobilityId": "448a960b8cac2bd3", "scanner": "scanner-primary", "fingerprint": "7f9ecf8f9fb65b09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e92765a34e240a7", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/recordings/route.ts:224"}, "properties": {"repobilityId": "b2a0192510806a2e", "scanner": "scanner-primary", "fingerprint": "7e92765a34e240a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-559b9db0dd827623", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/diarize/route.ts:58"}, "properties": {"repobilityId": "d2757b75754a122f", "scanner": "scanner-primary", "fingerprint": "559b9db0dd827623", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e403843d73bf1232", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/plaud/route.ts:38"}, "properties": {"repobilityId": "81814b6c903433d4", "scanner": "scanner-primary", "fingerprint": "e403843d73bf1232", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d94dc3d847fab5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/ajustes/[[...section]]/page.tsx:675"}, "properties": {"repobilityId": "53d76968dac5713e", "scanner": "scanner-primary", "fingerprint": "5d94dc3d847fab5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8de9d5a65d62ab80", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/page.tsx:48"}, "properties": {"repobilityId": "d1900e0004ae3333", "scanner": "scanner-primary", "fingerprint": "8de9d5a65d62ab80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08610fc49f2bdc60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/invites/page.tsx:26"}, "properties": {"repobilityId": "6b83222f4caba593", "scanner": "scanner-primary", "fingerprint": "08610fc49f2bdc60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-17274242cb2dcaa9", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/import-plaud.ts:63"}, "properties": {"repobilityId": "6bffb997ee826695", "scanner": "scanner-primary", "fingerprint": "17274242cb2dcaa9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24775eb5648d8910", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/plaud.ts:41"}, "properties": {"repobilityId": "568a1ed6c9a2fe15", "scanner": "scanner-primary", "fingerprint": "24775eb5648d8910", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08ee277eb2099140", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/local-backup.ts:269"}, "properties": {"repobilityId": "15745fc037a8e39d", "scanner": "scanner-primary", "fingerprint": "08ee277eb2099140", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c2d0bc02de4b6bc", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/transcribe.ts:240"}, "properties": {"repobilityId": "ebddfa5323976024", "scanner": "scanner-primary", "fingerprint": "0c2d0bc02de4b6bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d153a8cdc668e994", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/diarize.ts:33"}, "properties": {"repobilityId": "2797403098b26787", "scanner": "scanner-primary", "fingerprint": "d153a8cdc668e994", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8556a21adcd64dd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/watchdog.ts:4"}, "properties": {"repobilityId": "d97d21dd2af736fe", "scanner": "scanner-primary", "fingerprint": "8556a21adcd64dd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e136bb5de13e5655", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/cleanup.ts:55"}, "properties": {"repobilityId": "cc7551eb7cf683c7", "scanner": "scanner-primary", "fingerprint": "e136bb5de13e5655", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06bda7f991a5e15a", "level": "note", "message": {"text": "Legacy-named symbol `transcript_v1` in lib/db.ts:60"}, "properties": {"repobilityId": "8171833bd40da90b", "scanner": "scanner-primary", "fingerprint": "06bda7f991a5e15a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-700cab360de03cf0", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/pipeline.ts:265"}, "properties": {"repobilityId": "3c3b2790890de608", "scanner": "scanner-primary", "fingerprint": "700cab360de03cf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be72565d71d0ee2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/mail.ts:18"}, "properties": {"repobilityId": "8449fd8cdb5fc4aa", "scanner": "scanner-primary", "fingerprint": "be72565d71d0ee2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e942f00d65075794", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 modal/diarize.py:56"}, "properties": {"repobilityId": "9baee033165228c6", "scanner": "scanner-primary", "fingerprint": "e942f00d65075794", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00b0e6cb426afaf4", "level": "error", "message": {"text": "Blocking `requests.get(...)` inside `async def handle` \u2014 modal/diarize.py:106"}, "properties": {"repobilityId": "c6110796d957c5d4", "scanner": "scanner-primary", "fingerprint": "00b0e6cb426afaf4", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modal/diarize.py"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-fd4433ca43d30c31", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/run-diarize-batch.ts:77)"}, "properties": {"repobilityId": "3c0892b1a481e2ef", "scanner": "scanner-primary", "fingerprint": "fd4433ca43d30c31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a3176667b8b25284", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (components/RecordButton.tsx:94)"}, "properties": {"repobilityId": "3f1b4c187bf1820c", "scanner": "scanner-primary", "fingerprint": "a3176667b8b25284", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ca111b5bdcfd345", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${recordingId}/speakers (components/DetailTabs.tsx:280)"}, "properties": {"repobilityId": "a65d25f856358f45", "scanner": "scanner-primary", "fingerprint": "2ca111b5bdcfd345", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7685c99a3e9bb55f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/recordings/${recordingId}/speakers (components/DetailTabs.tsx:347)"}, "properties": {"repobilityId": "57f8324b7612d121", "scanner": "scanner-primary", "fingerprint": "7685c99a3e9bb55f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-748ee72e011e5285", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${recordingId}/speakers (components/SpeakerPanel.tsx:72)"}, "properties": {"repobilityId": "b0e1cea4d330438e", "scanner": "scanner-primary", "fingerprint": "748ee72e011e5285", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-afd9e535d4be2ea7", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/recordings/${recordingId}/speakers (components/SpeakerPanel.tsx:111)"}, "properties": {"repobilityId": "e3b588de19c17d98", "scanner": "scanner-primary", "fingerprint": "afd9e535d4be2ea7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29d2a00fdd260ecc", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/passkey/authenticate-options (components/PasskeyLoginButton.tsx:11)"}, "properties": {"repobilityId": "a94063874cd0dce5", "scanner": "scanner-primary", "fingerprint": "29d2a00fdd260ecc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d0a0e2494809c7a", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/passkey/authenticate-verify (components/PasskeyLoginButton.tsx:18)"}, "properties": {"repobilityId": "ca4cb0a3fdaf5bac", "scanner": "scanner-primary", "fingerprint": "6d0a0e2494809c7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0474bf1f626d534d", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${recordingId}/share (components/ShareDialog.tsx:24)"}, "properties": {"repobilityId": "7ff255830d27b1c6", "scanner": "scanner-primary", "fingerprint": "0474bf1f626d534d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34fdb99e66efec81", "level": "error", "message": {"text": "Dangling fetch: GET /api/speakers (components/ShareDialog.tsx:34)"}, "properties": {"repobilityId": "5821a0abaad3771a", "scanner": "scanner-primary", "fingerprint": "34fdb99e66efec81", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d02defcadc722c5", "level": "error", "message": {"text": "Dangling fetch: GET /api/account (components/ShareDialog.tsx:35)"}, "properties": {"repobilityId": "9cf87c7f6f7edc1c", "scanner": "scanner-primary", "fingerprint": "8d02defcadc722c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21d8c7a1e60435e8", "level": "error", "message": {"text": "Dangling fetch: POST /api/recordings/${recordingId}/share (components/ShareDialog.tsx:84)"}, "properties": {"repobilityId": "f138ee5a2b9633c9", "scanner": "scanner-primary", "fingerprint": "21d8c7a1e60435e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-069319b37f743d31", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/recordings/${recordingId}/share (components/ShareDialog.tsx:110)"}, "properties": {"repobilityId": "e285180c290fa1f3", "scanner": "scanner-primary", "fingerprint": "069319b37f743d31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b62974d8d943fca6", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/speakers/${id} (components/ShareDialog.tsx:129)"}, "properties": {"repobilityId": "b3f3a82d98e5245c", "scanner": "scanner-primary", "fingerprint": "b62974d8d943fca6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-78e169233d5895e5", "level": "error", "message": {"text": "Dangling fetch: POST /api/forgot-password/resend (app/reset-password/page.tsx:99)"}, "properties": {"repobilityId": "cb686af726e46e91", "scanner": "scanner-primary", "fingerprint": "78e169233d5895e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-991a754961e2d531", "level": "error", "message": {"text": "Dangling fetch: GET /api/reset-password?token=${encodeURIComponent(token)} (app/reset-password/page.tsx:113)"}, "properties": {"repobilityId": "e069dfdeb85a8444", "scanner": "scanner-primary", "fingerprint": "991a754961e2d531", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3298cbb17e6f81d8", "level": "error", "message": {"text": "Dangling fetch: POST /api/reset-password (app/reset-password/page.tsx:135)"}, "properties": {"repobilityId": "314a49302adc15bf", "scanner": "scanner-primary", "fingerprint": "3298cbb17e6f81d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b489992ff80dff8", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:148)"}, "properties": {"repobilityId": "86408df6ec882819", "scanner": "scanner-primary", "fingerprint": "5b489992ff80dff8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9bfd87355e6f3bec", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/recordings/${id} (app/grabacion/[id]/page.tsx:179)"}, "properties": {"repobilityId": "4e2acaa81eb13304", "scanner": "scanner-primary", "fingerprint": "9bfd87355e6f3bec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8dc303bd7f97c282", "level": "error", "message": {"text": "Dangling fetch: POST /api/recordings/${id}/retry (app/grabacion/[id]/page.tsx:190)"}, "properties": {"repobilityId": "7d1d1f02bf91d28d", "scanner": "scanner-primary", "fingerprint": "8dc303bd7f97c282", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1050fbd365ce2666", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:196)"}, "properties": {"repobilityId": "e68f90469568c830", "scanner": "scanner-primary", "fingerprint": "1050fbd365ce2666", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bb1238953f900c3", "level": "error", "message": {"text": "Dangling fetch: POST /api/recordings/${id}/regenerate (app/grabacion/[id]/page.tsx:204)"}, "properties": {"repobilityId": "77e8957ff25339f0", "scanner": "scanner-primary", "fingerprint": "7bb1238953f900c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7592bdaf8be5af4e", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:209)"}, "properties": {"repobilityId": "0b239c3af2a4c69a", "scanner": "scanner-primary", "fingerprint": "7592bdaf8be5af4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d0431b722dbaac32", "level": "error", "message": {"text": "Dangling fetch: POST /api/recordings/${id}/regenerate-transcript (app/grabacion/[id]/page.tsx:214)"}, "properties": {"repobilityId": "fdb0c730ff7c6e7b", "scanner": "scanner-primary", "fingerprint": "d0431b722dbaac32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-421cdd6a8e6060b2", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:220)"}, "properties": {"repobilityId": "ef4bdbdf95d92acc", "scanner": "scanner-primary", "fingerprint": "421cdd6a8e6060b2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7c10e24b9bc027e4", "level": "error", "message": {"text": "Dangling fetch: POST /api/recordings/${id}/regenerate-transcript (app/grabacion/[id]/page.tsx:225)"}, "properties": {"repobilityId": "aa997345eef0b3f4", "scanner": "scanner-primary", "fingerprint": "7c10e24b9bc027e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10abde61abc5c30c", "level": "error", "message": {"text": "Dangling fetch: GET /api/recordings/${id} (app/grabacion/[id]/page.tsx:234)"}, "properties": {"repobilityId": "721ab8cf19bbb520", "scanner": "scanner-primary", "fingerprint": "10abde61abc5c30c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d59ef03ee56c4ccf", "level": "error", "message": {"text": "Dangling fetch: POST /api/login (app/login/page.tsx:25)"}, "properties": {"repobilityId": "097fa699e9565c93", "scanner": "scanner-primary", "fingerprint": "d59ef03ee56c4ccf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-171417f41306433e", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/totp/verify (app/login/mfa/page.tsx:17)"}, "properties": {"repobilityId": "ee363e3b74f2debd", "scanner": "scanner-primary", "fingerprint": "171417f41306433e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b06e4907b5b5cba", "level": "error", "message": {"text": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (app/api/login/route.ts:23)"}, "properties": {"repobilityId": "925de215f28453ff", "scanner": "scanner-primary", "fingerprint": "6b06e4907b5b5cba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eaa15aa38a894464", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/totp/status (app/ajustes/[[...section]]/page.tsx:675)"}, "properties": {"repobilityId": "cf48b9370435ab82", "scanner": "scanner-primary", "fingerprint": "eaa15aa38a894464", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c331d7aff0a69006", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/passkeys (app/ajustes/[[...section]]/page.tsx:676)"}, "properties": {"repobilityId": "3a8a8365452174ff", "scanner": "scanner-primary", "fingerprint": "c331d7aff0a69006", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba8567f91ce6d287", "level": "error", "message": {"text": "Dangling fetch: GET /api/speakers (app/ajustes/[[...section]]/page.tsx:694)"}, "properties": {"repobilityId": "d0f596c358425f04", "scanner": "scanner-primary", "fingerprint": "ba8567f91ce6d287", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-551430c02b9b8db0", "level": "error", "message": {"text": "Dangling fetch: POST /api/speakers (app/ajustes/[[...section]]/page.tsx:710)"}, "properties": {"repobilityId": "2c8039bc5e67f6d5", "scanner": "scanner-primary", "fingerprint": "551430c02b9b8db0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-995def527a45937d", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/speakers/${id} (app/ajustes/[[...section]]/page.tsx:725)"}, "properties": {"repobilityId": "0a16ba9c60fc929f", "scanner": "scanner-primary", "fingerprint": "995def527a45937d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4eea09c2c93b5b29", "level": "error", "message": {"text": "Dangling fetch: POST /api/speakers (app/ajustes/[[...section]]/page.tsx:738)"}, "properties": {"repobilityId": "7a02a4cc505c61d6", "scanner": "scanner-primary", "fingerprint": "4eea09c2c93b5b29", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-316dc1da20987e34", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/speakers/${id} (app/ajustes/[[...section]]/page.tsx:755)"}, "properties": {"repobilityId": "d0d6122ce4353933", "scanner": "scanner-primary", "fingerprint": "316dc1da20987e34", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b4fe163be4c8cca", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/totp/setup (app/ajustes/[[...section]]/page.tsx:767)"}, "properties": {"repobilityId": "b9d90af17a748506", "scanner": "scanner-primary", "fingerprint": "8b4fe163be4c8cca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65f4481eae5f3227", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/totp/enable (app/ajustes/[[...section]]/page.tsx:781)"}, "properties": {"repobilityId": "9eb459a7b3ab24b3", "scanner": "scanner-primary", "fingerprint": "65f4481eae5f3227", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f7e881e37d61df4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/auth/totp/disable (app/ajustes/[[...section]]/page.tsx:802)"}, "properties": {"repobilityId": "a1b431f2338ed1e5", "scanner": "scanner-primary", "fingerprint": "8f7e881e37d61df4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-25cd712f770a511a", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/passkey/register-options (app/ajustes/[[...section]]/page.tsx:824)"}, "properties": {"repobilityId": "fbe4086e3ad9bda1", "scanner": "scanner-primary", "fingerprint": "25cd712f770a511a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a66188d4649a419", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/passkey/register-verify (app/ajustes/[[...section]]/page.tsx:830)"}, "properties": {"repobilityId": "008244853a1c8c7a", "scanner": "scanner-primary", "fingerprint": "6a66188d4649a419", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7134348f537c6e69", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/auth/passkeys (app/ajustes/[[...section]]/page.tsx:851)"}, "properties": {"repobilityId": "7c606d8ab5b84f03", "scanner": "scanner-primary", "fingerprint": "7134348f537c6e69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-85417bc95a4c6280", "level": "error", "message": {"text": "Dangling fetch: GET /api/facts (app/ajustes/[[...section]]/page.tsx:870)"}, "properties": {"repobilityId": "9d07d1ee692e17b6", "scanner": "scanner-primary", "fingerprint": "85417bc95a4c6280", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-daf90c95a669b801", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:879)"}, "properties": {"repobilityId": "f62b70bff984ab39", "scanner": "scanner-primary", "fingerprint": "daf90c95a669b801", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d5f850399448f4b4", "level": "error", "message": {"text": "Dangling fetch: POST /api/facts (app/ajustes/[[...section]]/page.tsx:883)"}, "properties": {"repobilityId": "745118a6bbd83703", "scanner": "scanner-primary", "fingerprint": "d5f850399448f4b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1779a0aa3ecadbfc", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/facts (app/ajustes/[[...section]]/page.tsx:887)"}, "properties": {"repobilityId": "5da2290afcff268b", "scanner": "scanner-primary", "fingerprint": "1779a0aa3ecadbfc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7254a61d6ccf5508", "level": "error", "message": {"text": "Dangling fetch: POST /api/facts (app/ajustes/[[...section]]/page.tsx:896)"}, "properties": {"repobilityId": "f5d1c9b48f37b9eb", "scanner": "scanner-primary", "fingerprint": "7254a61d6ccf5508", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b0bc24c7fa2f70c", "level": "error", "message": {"text": "Dangling fetch: GET /api/import/plaud (app/ajustes/[[...section]]/page.tsx:905)"}, "properties": {"repobilityId": "2f911f1d5a87a815", "scanner": "scanner-primary", "fingerprint": "5b0bc24c7fa2f70c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f6cc49b9b97c244", "level": "error", "message": {"text": "Dangling fetch: POST /api/import/plaud (app/ajustes/[[...section]]/page.tsx:915)"}, "properties": {"repobilityId": "301c4dc804e8b3af", "scanner": "scanner-primary", "fingerprint": "0f6cc49b9b97c244", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-947e41b9c96efbd4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:944)"}, "properties": {"repobilityId": "2a70cf41a4bde7bf", "scanner": "scanner-primary", "fingerprint": "947e41b9c96efbd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4295086306d8ff36", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/account (app/ajustes/[[...section]]/page.tsx:957)"}, "properties": {"repobilityId": "22de0845839ca3fa", "scanner": "scanner-primary", "fingerprint": "4295086306d8ff36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe9ba1e753b63501", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (app/ajustes/[[...section]]/page.tsx:976)"}, "properties": {"repobilityId": "af8e03ac110d54a9", "scanner": "scanner-primary", "fingerprint": "fe9ba1e753b63501", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e9814d1c528f8e0f", "level": "error", "message": {"text": "Dangling fetch: GET /api/account (app/ajustes/[[...section]]/page.tsx:977)"}, "properties": {"repobilityId": "45e532da2802331f", "scanner": "scanner-primary", "fingerprint": "e9814d1c528f8e0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a15200b012bf9fa7", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1030)"}, "properties": {"repobilityId": "ad1fb87e21518187", "scanner": "scanner-primary", "fingerprint": "a15200b012bf9fa7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-386e2580eae5f6ec", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1040)"}, "properties": {"repobilityId": "8447958b8ba09abf", "scanner": "scanner-primary", "fingerprint": "386e2580eae5f6ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4b737ede155938c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1056)"}, "properties": {"repobilityId": "258a486ba9dd0864", "scanner": "scanner-primary", "fingerprint": "c4b737ede155938c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-55c8bc0dd44a6a6b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1067)"}, "properties": {"repobilityId": "14c30c1e2f9141af", "scanner": "scanner-primary", "fingerprint": "55c8bc0dd44a6a6b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9727a0e700fcfce4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (app/ajustes/[[...section]]/page.tsx:1083)"}, "properties": {"repobilityId": "ce5f2a319d8ee81d", "scanner": "scanner-primary", "fingerprint": "9727a0e700fcfce4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e19858338b414ef5", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:1124)"}, "properties": {"repobilityId": "bc0a288f22881f43", "scanner": "scanner-primary", "fingerprint": "e19858338b414ef5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-23994ef6ea1682bf", "level": "error", "message": {"text": "Dangling fetch: POST /api/logout (app/ajustes/[[...section]]/page.tsx:1167)"}, "properties": {"repobilityId": "86f5970b66144534", "scanner": "scanner-primary", "fingerprint": "23994ef6ea1682bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-edea5a5573c108f0", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/account (app/ajustes/[[...section]]/page.tsx:1174)"}, "properties": {"repobilityId": "70c82cecca43ad1b", "scanner": "scanner-primary", "fingerprint": "edea5a5573c108f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d008276a848cf175", "level": "error", "message": {"text": "Dangling fetch: POST /api/forgot-password (app/forgot-password/page.tsx:24)"}, "properties": {"repobilityId": "b8cd96fcd5286b0a", "scanner": "scanner-primary", "fingerprint": "d008276a848cf175", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38f5a3acd39401d7", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users (app/admin/users/page.tsx:48)"}, "properties": {"repobilityId": "59c4bda30501d616", "scanner": "scanner-primary", "fingerprint": "38f5a3acd39401d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-56735377e59eda86", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users (app/admin/users/page.tsx:58)"}, "properties": {"repobilityId": "a1f8b7f1415bf1e3", "scanner": "scanner-primary", "fingerprint": "56735377e59eda86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f98d575ae6bdf9ae", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/users/${id} (app/admin/users/page.tsx:71)"}, "properties": {"repobilityId": "c8a03e429ae90071", "scanner": "scanner-primary", "fingerprint": "f98d575ae6bdf9ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a2557abfce8db3e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/users/${id} (app/admin/users/page.tsx:84)"}, "properties": {"repobilityId": "56ee2b342042cebe", "scanner": "scanner-primary", "fingerprint": "9a2557abfce8db3e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bf849b114ed9287", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/invites (app/admin/invites/page.tsx:26)"}, "properties": {"repobilityId": "aac377fbe5e03a11", "scanner": "scanner-primary", "fingerprint": "7bf849b114ed9287", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59c3dafa640facfe", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/invites (app/admin/invites/page.tsx:35)"}, "properties": {"repobilityId": "9707e8b31322f8db", "scanner": "scanner-primary", "fingerprint": "59c3dafa640facfe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3dbad488b5ad1b80", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/invites/${id} (app/admin/invites/page.tsx:49)"}, "properties": {"repobilityId": "ae8293a74d3adb70", "scanner": "scanner-primary", "fingerprint": "3dbad488b5ad1b80", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81668572bc845cfa", "level": "error", "message": {"text": "Dangling fetch: POST /api/solicitar (app/solicitar/page.tsx:21)"}, "properties": {"repobilityId": "788744746dfcd044", "scanner": "scanner-primary", "fingerprint": "81668572bc845cfa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f41bb7a6e3e3fff8", "level": "error", "message": {"text": "Dangling fetch: POST /api/register (app/register/page.tsx:91)"}, "properties": {"repobilityId": "f2ddcba418391d8d", "scanner": "scanner-primary", "fingerprint": "f41bb7a6e3e3fff8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-316403d66c2c6c22", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/diarize.ts:196)"}, "properties": {"repobilityId": "0413d180da2cfc22", "scanner": "scanner-primary", "fingerprint": "316403d66c2c6c22", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-148ba250f6cbf7de", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/diarize.ts:308)"}, "properties": {"repobilityId": "a0fc5d18eb38893f", "scanner": "scanner-primary", "fingerprint": "148ba250f6cbf7de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-007514e4e48b1cd0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (lib/pipeline.ts:458)"}, "properties": {"repobilityId": "caa948a6f4b640f7", "scanner": "scanner-primary", "fingerprint": "007514e4e48b1cd0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-22d3971daa99784d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mailgun.net/v3/${MAILGUN_DOMAIN}/messages (lib/mail.ts:18)"}, "properties": {"repobilityId": "6cdcb58370b74373", "scanner": "scanner-primary", "fingerprint": "22d3971daa99784d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "f954519d892e5495", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}