{"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-4632b36942d99af3", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/AppShell.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/AppShell.tsx:54"}, "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-a2d4a9fe951554bc", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ScheduleList.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ScheduleList.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa953a651d19c0f1", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/UploaderProjects.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/UploaderProjects.tsx:47"}, "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-0ba4360ca8b6e9b8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminProjects.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminProjects.tsx:47"}, "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-192752fbdb45651f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/MemberManage.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/MemberManage.tsx:31"}, "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-a665e246218f9bbb", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/ScheduleDesign.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/ScheduleDesign.tsx:146"}, "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-eb4b1637d0ab6c1a", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/ExportVideo.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/ExportVideo.tsx:200"}, "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-b83385ad09053950", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/StorybookList.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/StorybookList.tsx:213"}, "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-75c89165a8bb73d6", "name": "Stray `console.log` in TS/JS \u2014 server/src/services/ai.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/services/ai.ts:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8de04abe091ccab3", "name": "Stray `console.log` in TS/JS \u2014 server/src/db/seed.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/db/seed.ts:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56dece3c893c1e60", "name": "Stray `console.log` in TS/JS \u2014 server/src/db/migrate.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/db/migrate.ts:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b023b77442ae3dea", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_28/code.html:181", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_28/code.html:181"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12c0c2c041f802c8", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_21/code.html:251", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_21/code.html:251"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc512f2d65cdc5b8", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_27/code.html:278", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_27/code.html:278"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "appleboy/ssh-action@v1.0.3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 71 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a6aeb84f8544549", "name": "Node manifest has dependencies but no lockfile: client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: client/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b3b4131c0cb2eaa", "name": "Node manifest has dependencies but no lockfile: shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7101ca1926e3342", "name": "Node manifest has dependencies but no lockfile: server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 8 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 26 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, tests, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6e207da185bcbe2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/api.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/api.ts:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f50b0181fc8c36c", "name": "Legacy-named symbol `content_copy` in client/src/pages/admin/ShareManage.tsx:57", "shortDescription": {"text": "Legacy-named symbol `content_copy` in client/src/pages/admin/ShareManage.tsx:57"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54b3833caadc79af", "name": "Legacy-named symbol `content_copy` in client/src/pages/admin/InviteManage.tsx:54", "shortDescription": {"text": "Legacy-named symbol `content_copy` in client/src/pages/admin/InviteManage.tsx:54"}, "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-2d0227e16f7f129a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/admin/ExportVideo.tsx:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/admin/ExportVideo.tsx:106"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-700496f47eab4c88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/services/ai.ts:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/services/ai.ts:125"}, "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-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CORS_ORIGIN`, `GEMINI_API_KEY`, `LMSTUDIO_BASE_URL`, `LMSTUDIO_MODEL`, `NODE_ENV`. 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-5cf8efc33d353ae1", "name": "Frontend route `/join/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/join/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4638118113556698", "name": "Frontend route `/share/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/share/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1308fc4ab23ec28f", "name": "Frontend route `/projects/:pid` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:pid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14c22b9a24b90b54", "name": "Frontend route `/projects/:pid/schedules/:sid` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:pid/schedules/:sid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8347a452a0964f23", "name": "Frontend route `/admin/projects/:pid` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/projects/:pid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-419a96bb4e85c353", "name": "Frontend route `/admin/projects/:pid/storybook/scenes/:sid` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/projects/:pid/storybook/scenes/:sid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e01dcaafd112ea8", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent (server/src/servic", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent (server/src/services/ai.ts:125)"}, "fullDescription": {"text": "`server/src/services/ai.ts:125` calls `POST https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/<p>/<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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`server/src/app.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fe9bb486644f008", "name": "Unused endpoint: POST /change-password", "shortDescription": {"text": "Unused endpoint: POST /change-password"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /change-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4da54cd25458a71", "name": "Unused endpoint: POST /bootstrap-admin", "shortDescription": {"text": "Unused endpoint: POST /bootstrap-admin"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /bootstrap-admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c40f64461e765dfc", "name": "Unused endpoint: GET /_authcheck", "shortDescription": {"text": "Unused endpoint: GET /_authcheck"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `GET /_authcheck` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f34613b0a581661", "name": "Unused endpoint: GET /media/:id", "shortDescription": {"text": "Unused endpoint: GET /media/:id"}, "fullDescription": {"text": "`server/src/routes/media.ts` declares `GET /media/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ef97a88fdaa57aa", "name": "Unused endpoint: POST /media/:id/trim", "shortDescription": {"text": "Unused endpoint: POST /media/:id/trim"}, "fullDescription": {"text": "`server/src/routes/media.ts` declares `POST /media/:id/trim` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fddb95595304584", "name": "Unused endpoint: DELETE /media/:id", "shortDescription": {"text": "Unused endpoint: DELETE /media/:id"}, "fullDescription": {"text": "`server/src/routes/media.ts` declares `DELETE /media/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d261b200b9bf6948", "name": "Unused endpoint: GET /projects/:pid/members", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/members"}, "fullDescription": {"text": "`server/src/routes/members.ts` declares `GET /projects/:pid/members` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efc2d1520df7a293", "name": "Unused endpoint: POST /projects/:pid/members/:uid/remove", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/members/:uid/remove"}, "fullDescription": {"text": "`server/src/routes/members.ts` declares `POST /projects/:pid/members/:uid/remove` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-229631d8957b3f1d", "name": "Unused endpoint: POST /projects/:pid/members/:uid/restore", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/members/:uid/restore"}, "fullDescription": {"text": "`server/src/routes/members.ts` declares `POST /projects/:pid/members/:uid/restore` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a99d199ff6e4b328", "name": "Unused endpoint: POST /projects/:pid/members/:uid/temp-password", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/members/:uid/temp-password"}, "fullDescription": {"text": "`server/src/routes/members.ts` declares `POST /projects/:pid/members/:uid/temp-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-920826693cf3c5ae", "name": "Unused endpoint: GET /:token", "shortDescription": {"text": "Unused endpoint: GET /:token"}, "fullDescription": {"text": "`server/src/routes/share.ts` declares `GET /:token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8a07156728d892a", "name": "Unused endpoint: GET /:token/media/:id", "shortDescription": {"text": "Unused endpoint: GET /:token/media/:id"}, "fullDescription": {"text": "`server/src/routes/share.ts` declares `GET /:token/media/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2560d3a51d0fc950", "name": "Unused endpoint: GET /:token/video/:id", "shortDescription": {"text": "Unused endpoint: GET /:token/video/:id"}, "fullDescription": {"text": "`server/src/routes/share.ts` declares `GET /:token/video/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e17464a49c51634", "name": "Unused endpoint: GET /projects/:pid/invites", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/invites"}, "fullDescription": {"text": "`server/src/routes/invites.ts` declares `GET /projects/:pid/invites` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c28dca4ac3a7c1e", "name": "Unused endpoint: POST /projects/:pid/invites", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/invites"}, "fullDescription": {"text": "`server/src/routes/invites.ts` declares `POST /projects/:pid/invites` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77e09a51f9a73312", "name": "Unused endpoint: POST /invites/:id/deactivate", "shortDescription": {"text": "Unused endpoint: POST /invites/:id/deactivate"}, "fullDescription": {"text": "`server/src/routes/invites.ts` declares `POST /invites/:id/deactivate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e42906658796b3de", "name": "Unused endpoint: GET /projects/:pid/export/manifest", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/export/manifest"}, "fullDescription": {"text": "`server/src/routes/export.ts` declares `GET /projects/:pid/export/manifest` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-08c66b8c2275ae09", "name": "Unused endpoint: GET /projects/:pid/videos", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/videos"}, "fullDescription": {"text": "`server/src/routes/videos.ts` declares `GET /projects/:pid/videos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e3e56c254f6ed5a", "name": "Unused endpoint: POST /projects/:pid/videos", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/videos"}, "fullDescription": {"text": "`server/src/routes/videos.ts` declares `POST /projects/:pid/videos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2f855c997570950", "name": "Unused endpoint: PATCH /videos/:id", "shortDescription": {"text": "Unused endpoint: PATCH /videos/:id"}, "fullDescription": {"text": "`server/src/routes/videos.ts` declares `PATCH /videos/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce08182ad8f61b1c", "name": "Unused endpoint: DELETE /videos/:id", "shortDescription": {"text": "Unused endpoint: DELETE /videos/:id"}, "fullDescription": {"text": "`server/src/routes/videos.ts` declares `DELETE /videos/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d427031a5ebf14b", "name": "Unused endpoint: GET /videos/:id", "shortDescription": {"text": "Unused endpoint: GET /videos/:id"}, "fullDescription": {"text": "`server/src/routes/videos.ts` declares `GET /videos/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9854cfb0f447c48", "name": "Unused endpoint: GET /projects/:pid/share-links", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/share-links"}, "fullDescription": {"text": "`server/src/routes/shareLinks.ts` declares `GET /projects/:pid/share-links` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87c012481bc2fd06", "name": "Unused endpoint: POST /projects/:pid/share-links", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/share-links"}, "fullDescription": {"text": "`server/src/routes/shareLinks.ts` declares `POST /projects/:pid/share-links` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-223908013173d386", "name": "Unused endpoint: POST /share-links/:id/deactivate", "shortDescription": {"text": "Unused endpoint: POST /share-links/:id/deactivate"}, "fullDescription": {"text": "`server/src/routes/shareLinks.ts` declares `POST /share-links/:id/deactivate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dafdce076e3dd84", "name": "Unused endpoint: GET /projects/:pid/schedules/:sid/scene", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/schedules/:sid/scene"}, "fullDescription": {"text": "`server/src/routes/contributions.ts` declares `GET /projects/:pid/schedules/:sid/scene` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba2bd68e82e583df", "name": "Unused endpoint: POST /projects/:pid/schedules/:sid/contributions", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/schedules/:sid/contributions"}, "fullDescription": {"text": "`server/src/routes/contributions.ts` declares `POST /projects/:pid/schedules/:sid/contributions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fe1109a9b4663a88", "name": "Unused endpoint: PATCH /contributions/:id", "shortDescription": {"text": "Unused endpoint: PATCH /contributions/:id"}, "fullDescription": {"text": "`server/src/routes/contributions.ts` declares `PATCH /contributions/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-341519338378399d", "name": "Unused endpoint: POST /contributions/:id/media", "shortDescription": {"text": "Unused endpoint: POST /contributions/:id/media"}, "fullDescription": {"text": "`server/src/routes/contributions.ts` declares `POST /contributions/:id/media` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f3bb91b54e45b67", "name": "Unused endpoint: DELETE /contributions/:id", "shortDescription": {"text": "Unused endpoint: DELETE /contributions/:id"}, "fullDescription": {"text": "`server/src/routes/contributions.ts` declares `DELETE /contributions/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a302ce669d6eda3e", "name": "Unused endpoint: GET /projects/:pid/schedules", "shortDescription": {"text": "Unused endpoint: GET /projects/:pid/schedules"}, "fullDescription": {"text": "`server/src/routes/schedules.ts` declares `GET /projects/:pid/schedules` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b6724098ab254701", "name": "Unused endpoint: POST /projects/:pid/schedules", "shortDescription": {"text": "Unused endpoint: POST /projects/:pid/schedules"}, "fullDescription": {"text": "`server/src/routes/schedules.ts` declares `POST /projects/:pid/schedules` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b07b646511070c7b", "name": "Unused endpoint: PATCH /schedules/:id", "shortDescription": {"text": "Unused endpoint: PATCH /schedules/:id"}, "fullDescription": {"text": "`server/src/routes/schedules.ts` declares `PATCH /schedules/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-280d9b931e9592c9", "name": "Unused endpoint: DELETE /schedules/:id", "shortDescription": {"text": "Unused endpoint: DELETE /schedules/:id"}, "fullDescription": {"text": "`server/src/routes/schedules.ts` declares `DELETE /schedules/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`server/src/routes/join.ts` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `GET /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e72f88c8e5490727", "name": "Unused endpoint: GET /:id/feed", "shortDescription": {"text": "Unused endpoint: GET /:id/feed"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `GET /:id/feed` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5fbc954f63526821", "name": "Unused endpoint: PATCH /:id", "shortDescription": {"text": "Unused endpoint: PATCH /:id"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `PATCH /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbf0f4121105a7b3", "name": "Unused endpoint: GET /:id/bgm", "shortDescription": {"text": "Unused endpoint: GET /:id/bgm"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `GET /:id/bgm` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f3dcc0757d8dc80", "name": "Unused endpoint: POST /:id/bgm", "shortDescription": {"text": "Unused endpoint: POST /:id/bgm"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `POST /:id/bgm` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9ee6f91d7daf600", "name": "Unused endpoint: GET /:id/cover", "shortDescription": {"text": "Unused endpoint: GET /:id/cover"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `GET /:id/cover` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0214117329e8e293", "name": "Unused endpoint: POST /:id/cover", "shortDescription": {"text": "Unused endpoint: POST /:id/cover"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `POST /:id/cover` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-342f3c391649cf4b", "name": "Unused endpoint: DELETE /:id/cover", "shortDescription": {"text": "Unused endpoint: DELETE /:id/cover"}, "fullDescription": {"text": "`server/src/routes/projects.ts` declares `DELETE /:id/cover` 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/18010"}, "properties": {"repository": "remge21c/MemoryFlow", "repoUrl": "https://github.com/remge21c/MemoryFlow", "branch": "main"}, "results": [{"ruleId": "scanner-4632b36942d99af3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/AppShell.tsx:54"}, "properties": {"repobilityId": "897539245a68d45d", "scanner": "scanner-primary", "fingerprint": "4632b36942d99af3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2d4a9fe951554bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ScheduleList.tsx:62"}, "properties": {"repobilityId": "40d9812d25e5898e", "scanner": "scanner-primary", "fingerprint": "a2d4a9fe951554bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa953a651d19c0f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/UploaderProjects.tsx:47"}, "properties": {"repobilityId": "77ab14d7b7f46ad7", "scanner": "scanner-primary", "fingerprint": "aa953a651d19c0f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ba4360ca8b6e9b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminProjects.tsx:47"}, "properties": {"repobilityId": "91f78ad5b870a6e5", "scanner": "scanner-primary", "fingerprint": "0ba4360ca8b6e9b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-192752fbdb45651f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/MemberManage.tsx:31"}, "properties": {"repobilityId": "4fc70e2cb249b34c", "scanner": "scanner-primary", "fingerprint": "192752fbdb45651f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a665e246218f9bbb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/ScheduleDesign.tsx:146"}, "properties": {"repobilityId": "19719f87eabfdcd1", "scanner": "scanner-primary", "fingerprint": "a665e246218f9bbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb4b1637d0ab6c1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/ExportVideo.tsx:200"}, "properties": {"repobilityId": "0a4a1d71fbecd80f", "scanner": "scanner-primary", "fingerprint": "eb4b1637d0ab6c1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b83385ad09053950", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/StorybookList.tsx:213"}, "properties": {"repobilityId": "2a873f9a823829fa", "scanner": "scanner-primary", "fingerprint": "b83385ad09053950", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75c89165a8bb73d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/services/ai.ts:67"}, "properties": {"repobilityId": "e8d8b93fdafc0e4d", "scanner": "scanner-primary", "fingerprint": "75c89165a8bb73d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8de04abe091ccab3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/db/seed.ts:27"}, "properties": {"repobilityId": "777f1a7bcffd5332", "scanner": "scanner-primary", "fingerprint": "8de04abe091ccab3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56dece3c893c1e60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/db/migrate.ts:145"}, "properties": {"repobilityId": "70f5a999533eb73c", "scanner": "scanner-primary", "fingerprint": "56dece3c893c1e60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b023b77442ae3dea", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_28/code.html:181"}, "properties": {"repobilityId": "e64b873b92486451", "scanner": "scanner-primary", "fingerprint": "b023b77442ae3dea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design-system/s_28/code.html"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-12c0c2c041f802c8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_21/code.html:251"}, "properties": {"repobilityId": "9ff2b74997bea0c9", "scanner": "scanner-primary", "fingerprint": "12c0c2c041f802c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design-system/s_21/code.html"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-bc512f2d65cdc5b8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/s_27/code.html:278"}, "properties": {"repobilityId": "61b5b2e5d6b18e3a", "scanner": "scanner-primary", "fingerprint": "bc512f2d65cdc5b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design-system/s_27/code.html"}, "region": {"startLine": 278}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0bc463708914950e", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "13f6d8aa9c627b89", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1a6aeb84f8544549", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: client/package.json"}, "properties": {"repobilityId": "289cda4e29a77d84", "scanner": "scanner-primary", "fingerprint": "1a6aeb84f8544549", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2b3b4131c0cb2eaa", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: shared/package.json"}, "properties": {"repobilityId": "310fa61d19fba401", "scanner": "scanner-primary", "fingerprint": "2b3b4131c0cb2eaa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7101ca1926e3342", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "properties": {"repobilityId": "bbcd0a89809ced91", "scanner": "scanner-primary", "fingerprint": "d7101ca1926e3342", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "9370111014bf0843", "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": "73158ca41115b0fc", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "2dbc910b3c60875f", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "afac81d164d14db1", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "88961ae07b6ef278", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "648bd70bac5e2802", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "4a08377213304bee", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "f4fb78e57e43fcc9", "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": "7983e9a19314dfa5", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e6e207da185bcbe2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/api.ts:23"}, "properties": {"repobilityId": "f449b524dc63e6ac", "scanner": "scanner-primary", "fingerprint": "e6e207da185bcbe2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f50b0181fc8c36c", "level": "note", "message": {"text": "Legacy-named symbol `content_copy` in client/src/pages/admin/ShareManage.tsx:57"}, "properties": {"repobilityId": "08210f6f8253ec25", "scanner": "scanner-primary", "fingerprint": "6f50b0181fc8c36c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-54b3833caadc79af", "level": "note", "message": {"text": "Legacy-named symbol `content_copy` in client/src/pages/admin/InviteManage.tsx:54"}, "properties": {"repobilityId": "aa9f252a2fbc7cfe", "scanner": "scanner-primary", "fingerprint": "54b3833caadc79af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2d0227e16f7f129a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/admin/ExportVideo.tsx:106"}, "properties": {"repobilityId": "75e0b743d9a6cf6e", "scanner": "scanner-primary", "fingerprint": "2d0227e16f7f129a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-700496f47eab4c88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/services/ai.ts:125"}, "properties": {"repobilityId": "f24eab4ae1c6d50a", "scanner": "scanner-primary", "fingerprint": "700496f47eab4c88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-5cf8efc33d353ae1", "level": "warning", "message": {"text": "Frontend route `/join/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "d5278c6924d566b5", "scanner": "scanner-primary", "fingerprint": "5cf8efc33d353ae1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4638118113556698", "level": "warning", "message": {"text": "Frontend route `/share/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "f9685ef341b3d6a1", "scanner": "scanner-primary", "fingerprint": "4638118113556698", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1308fc4ab23ec28f", "level": "warning", "message": {"text": "Frontend route `/projects/:pid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "5ceb970449d31e64", "scanner": "scanner-primary", "fingerprint": "1308fc4ab23ec28f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-14c22b9a24b90b54", "level": "warning", "message": {"text": "Frontend route `/projects/:pid/schedules/:sid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "dde3c5f0e70ff7b0", "scanner": "scanner-primary", "fingerprint": "14c22b9a24b90b54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8347a452a0964f23", "level": "warning", "message": {"text": "Frontend route `/admin/projects/:pid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "3b9de2e2721a3e37", "scanner": "scanner-primary", "fingerprint": "8347a452a0964f23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-419a96bb4e85c353", "level": "warning", "message": {"text": "Frontend route `/admin/projects/:pid/storybook/scenes/:sid` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "b1b23bea8de35a3c", "scanner": "scanner-primary", "fingerprint": "419a96bb4e85c353", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0e01dcaafd112ea8", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent (server/src/services/ai.ts:125)"}, "properties": {"repobilityId": "0c9e5737bd39673d", "scanner": "scanner-primary", "fingerprint": "0e01dcaafd112ea8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "183047b8293f0f49", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "e58f66769169477d", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "daeed64d0588332a", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "5121736aa8c77ee5", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "133044d5449eae41", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fe9bb486644f008", "level": "note", "message": {"text": "Unused endpoint: POST /change-password"}, "properties": {"repobilityId": "c587aaed00338c72", "scanner": "scanner-primary", "fingerprint": "4fe9bb486644f008", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4da54cd25458a71", "level": "note", "message": {"text": "Unused endpoint: POST /bootstrap-admin"}, "properties": {"repobilityId": "fbea903958ebff01", "scanner": "scanner-primary", "fingerprint": "b4da54cd25458a71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c40f64461e765dfc", "level": "note", "message": {"text": "Unused endpoint: GET /_authcheck"}, "properties": {"repobilityId": "e82bcd53de7c8d61", "scanner": "scanner-primary", "fingerprint": "c40f64461e765dfc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f34613b0a581661", "level": "note", "message": {"text": "Unused endpoint: GET /media/:id"}, "properties": {"repobilityId": "6de8740049976376", "scanner": "scanner-primary", "fingerprint": "3f34613b0a581661", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ef97a88fdaa57aa", "level": "note", "message": {"text": "Unused endpoint: POST /media/:id/trim"}, "properties": {"repobilityId": "e4a0e8f4eb083508", "scanner": "scanner-primary", "fingerprint": "8ef97a88fdaa57aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0fddb95595304584", "level": "note", "message": {"text": "Unused endpoint: DELETE /media/:id"}, "properties": {"repobilityId": "ed5ea5407966c985", "scanner": "scanner-primary", "fingerprint": "0fddb95595304584", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d261b200b9bf6948", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/members"}, "properties": {"repobilityId": "3cc7fb65bb72a2a1", "scanner": "scanner-primary", "fingerprint": "d261b200b9bf6948", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-efc2d1520df7a293", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/members/:uid/remove"}, "properties": {"repobilityId": "d7a2d2d90ad47d0b", "scanner": "scanner-primary", "fingerprint": "efc2d1520df7a293", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-229631d8957b3f1d", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/members/:uid/restore"}, "properties": {"repobilityId": "d08d6b92d27e56b5", "scanner": "scanner-primary", "fingerprint": "229631d8957b3f1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a99d199ff6e4b328", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/members/:uid/temp-password"}, "properties": {"repobilityId": "553293c68f867e28", "scanner": "scanner-primary", "fingerprint": "a99d199ff6e4b328", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-920826693cf3c5ae", "level": "note", "message": {"text": "Unused endpoint: GET /:token"}, "properties": {"repobilityId": "45803965d3c8dd98", "scanner": "scanner-primary", "fingerprint": "920826693cf3c5ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8a07156728d892a", "level": "note", "message": {"text": "Unused endpoint: GET /:token/media/:id"}, "properties": {"repobilityId": "7a290f30a3dd05c1", "scanner": "scanner-primary", "fingerprint": "d8a07156728d892a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2560d3a51d0fc950", "level": "note", "message": {"text": "Unused endpoint: GET /:token/video/:id"}, "properties": {"repobilityId": "8a0b826c69df6774", "scanner": "scanner-primary", "fingerprint": "2560d3a51d0fc950", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e17464a49c51634", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/invites"}, "properties": {"repobilityId": "22c8cc5734255321", "scanner": "scanner-primary", "fingerprint": "1e17464a49c51634", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c28dca4ac3a7c1e", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/invites"}, "properties": {"repobilityId": "1e2c0116eccef3f7", "scanner": "scanner-primary", "fingerprint": "4c28dca4ac3a7c1e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77e09a51f9a73312", "level": "note", "message": {"text": "Unused endpoint: POST /invites/:id/deactivate"}, "properties": {"repobilityId": "fad5479df0da01e1", "scanner": "scanner-primary", "fingerprint": "77e09a51f9a73312", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e42906658796b3de", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/export/manifest"}, "properties": {"repobilityId": "b066161c2fc87e11", "scanner": "scanner-primary", "fingerprint": "e42906658796b3de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08c66b8c2275ae09", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/videos"}, "properties": {"repobilityId": "e8cddc577e68bdae", "scanner": "scanner-primary", "fingerprint": "08c66b8c2275ae09", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e3e56c254f6ed5a", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/videos"}, "properties": {"repobilityId": "fdae8030b4d51c72", "scanner": "scanner-primary", "fingerprint": "1e3e56c254f6ed5a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2f855c997570950", "level": "note", "message": {"text": "Unused endpoint: PATCH /videos/:id"}, "properties": {"repobilityId": "6ac77c7b3cf83f98", "scanner": "scanner-primary", "fingerprint": "b2f855c997570950", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce08182ad8f61b1c", "level": "note", "message": {"text": "Unused endpoint: DELETE /videos/:id"}, "properties": {"repobilityId": "5b9b173c8cddd550", "scanner": "scanner-primary", "fingerprint": "ce08182ad8f61b1c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d427031a5ebf14b", "level": "note", "message": {"text": "Unused endpoint: GET /videos/:id"}, "properties": {"repobilityId": "1597d73661f089df", "scanner": "scanner-primary", "fingerprint": "0d427031a5ebf14b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9854cfb0f447c48", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/share-links"}, "properties": {"repobilityId": "15beb329675ab643", "scanner": "scanner-primary", "fingerprint": "d9854cfb0f447c48", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87c012481bc2fd06", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/share-links"}, "properties": {"repobilityId": "8e4cff321f5e2879", "scanner": "scanner-primary", "fingerprint": "87c012481bc2fd06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-223908013173d386", "level": "note", "message": {"text": "Unused endpoint: POST /share-links/:id/deactivate"}, "properties": {"repobilityId": "8a31fdaeb5b58ddd", "scanner": "scanner-primary", "fingerprint": "223908013173d386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dafdce076e3dd84", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/schedules/:sid/scene"}, "properties": {"repobilityId": "bd22fce886bdce7c", "scanner": "scanner-primary", "fingerprint": "1dafdce076e3dd84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba2bd68e82e583df", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/schedules/:sid/contributions"}, "properties": {"repobilityId": "ba2c9e5937ec8ae8", "scanner": "scanner-primary", "fingerprint": "ba2bd68e82e583df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe1109a9b4663a88", "level": "note", "message": {"text": "Unused endpoint: PATCH /contributions/:id"}, "properties": {"repobilityId": "10a448b7e0ef28ce", "scanner": "scanner-primary", "fingerprint": "fe1109a9b4663a88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-341519338378399d", "level": "note", "message": {"text": "Unused endpoint: POST /contributions/:id/media"}, "properties": {"repobilityId": "ff798b6729b5258f", "scanner": "scanner-primary", "fingerprint": "341519338378399d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8f3bb91b54e45b67", "level": "note", "message": {"text": "Unused endpoint: DELETE /contributions/:id"}, "properties": {"repobilityId": "6f21009eda4b6e4c", "scanner": "scanner-primary", "fingerprint": "8f3bb91b54e45b67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a302ce669d6eda3e", "level": "note", "message": {"text": "Unused endpoint: GET /projects/:pid/schedules"}, "properties": {"repobilityId": "05cb87d4a193e70a", "scanner": "scanner-primary", "fingerprint": "a302ce669d6eda3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6724098ab254701", "level": "note", "message": {"text": "Unused endpoint: POST /projects/:pid/schedules"}, "properties": {"repobilityId": "07485de645853528", "scanner": "scanner-primary", "fingerprint": "b6724098ab254701", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b07b646511070c7b", "level": "note", "message": {"text": "Unused endpoint: PATCH /schedules/:id"}, "properties": {"repobilityId": "9ae87ab2d3668076", "scanner": "scanner-primary", "fingerprint": "b07b646511070c7b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-280d9b931e9592c9", "level": "note", "message": {"text": "Unused endpoint: DELETE /schedules/:id"}, "properties": {"repobilityId": "dca2cce450e44d33", "scanner": "scanner-primary", "fingerprint": "280d9b931e9592c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "2514a52efb0ed1a7", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "f9a8df760723839a", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "b90d47abea1263db", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e72f88c8e5490727", "level": "note", "message": {"text": "Unused endpoint: GET /:id/feed"}, "properties": {"repobilityId": "7c4dbcc8edafc988", "scanner": "scanner-primary", "fingerprint": "e72f88c8e5490727", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbc954f63526821", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id"}, "properties": {"repobilityId": "4663fc510fae29f8", "scanner": "scanner-primary", "fingerprint": "5fbc954f63526821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "15a38a17da05352d", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbf0f4121105a7b3", "level": "note", "message": {"text": "Unused endpoint: GET /:id/bgm"}, "properties": {"repobilityId": "f417b41162a044e7", "scanner": "scanner-primary", "fingerprint": "bbf0f4121105a7b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f3dcc0757d8dc80", "level": "note", "message": {"text": "Unused endpoint: POST /:id/bgm"}, "properties": {"repobilityId": "b38f99c45d2045e7", "scanner": "scanner-primary", "fingerprint": "9f3dcc0757d8dc80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f9ee6f91d7daf600", "level": "note", "message": {"text": "Unused endpoint: GET /:id/cover"}, "properties": {"repobilityId": "fec1135dbaa39d0a", "scanner": "scanner-primary", "fingerprint": "f9ee6f91d7daf600", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0214117329e8e293", "level": "note", "message": {"text": "Unused endpoint: POST /:id/cover"}, "properties": {"repobilityId": "8e23aa057da3b29d", "scanner": "scanner-primary", "fingerprint": "0214117329e8e293", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-342f3c391649cf4b", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id/cover"}, "properties": {"repobilityId": "bbcfd6969810835d", "scanner": "scanner-primary", "fingerprint": "342f3c391649cf4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}