{"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-ea29e6f3f8b5f766", "name": "Stray `console.log` in TS/JS \u2014 frontend/electron/main.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/electron/main.ts:66"}, "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-784f0216b8a7867d", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/sw-custom.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/sw-custom.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-858b310d01f6c8e5", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/socket-hub/handlers/messageHandlers.ts:34", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/socket-hub/handlers/messageHandlers.ts:34"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-74d50eb55bb5b106", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7df633eb6fa8a58d", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Mobile/Panels/MobileChannelsPanel.tsx:69", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Mobile/Panels/MobileChannelsPanel.tsx:69"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c08fac1b903c12d0", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Mobile/Panels/MobileChatPanel.tsx:101", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Mobile/Panels/MobileChatPanel.tsx:101"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a327f8ff2d27a37", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/CreateCommunityPage.tsx:43", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/CreateCommunityPage.tsx:43"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2bf622ef79f4c2d7", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed.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-3cbfd04e7f893687", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/migrate-instance-roles.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/migrate-instance-roles.ts:31"}, "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-70e8e77c3f89b740", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-e2e.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-e2e.ts:93"}, "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-e74f3e264425feff", "name": "Stray `console.log` in TS/JS \u2014 backend/src/generate-openapi.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/generate-openapi.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f48e3ba4236b5ade", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/notifications/notifications.service.ts:342", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/notifications/notifications.service.ts:342"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60427b03771411b6", "name": "Dockerfile runs as root: frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: frontend/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-a3d5b4eeaed71b0f", "name": "Docker base image is tag-pinned but not digest-pinned: node:24-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-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-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/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-614ec4421bd69ab3", "name": "Docker base image is tag-pinned but not digest-pinned: node:24-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-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-17ef51905baff3cb", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/utils/tokenService.test.ts:76", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/utils/tokenService.test.ts:76"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f76122faab8aa1e0", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/utils/tokenService.electron.test.ts:47", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/utils/tokenService.electron.test.ts:47"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f3c9a6bef2fe6a8", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/components/AuthGate.test.tsx:383", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/components/AuthGate.test.tsx:383"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ecfb31fffb58ade4", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/tokenService.ts:174", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/tokenService.ts:174"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dd8ad22cf02816e6", "name": "Possible secret in frontend/src/components/Onboarding/AdminSetupStep.tsx", "shortDescription": {"text": "Possible secret in frontend/src/components/Onboarding/AdminSetupStep.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-c9bbb09b1e384789", "name": "Possible secret in backend/test/community-messaging.e2e-spec.ts", "shortDescription": {"text": "Possible secret in backend/test/community-messaging.e2e-spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7757ad7a9ded8066", "name": "Possible secret in backend/test/security.e2e-spec.ts", "shortDescription": {"text": "Possible secret in backend/test/security.e2e-spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-d1d661a21c6afe19", "name": "Possible secret in backend/test/auth.e2e-spec.ts", "shortDescription": {"text": "Possible secret in backend/test/auth.e2e-spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ab13578344d7ecb5", "name": "Possible secret in backend/prisma/seed-e2e.ts", "shortDescription": {"text": "Possible secret in backend/prisma/seed-e2e.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-1a597487ef121cce", "name": "Possible secret in backend/src/adapters/redis-io.adapter.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/adapters/redis-io.adapter.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-16a4c31e31788400", "name": "Insecure pattern 'cors_wildcard' in backend/src/adapters/redis-io.adapter.spec.ts:258", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in backend/src/adapters/redis-io.adapter.spec.ts:258"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f5d42ecc92bc4f6a", "name": "Possible secret in backend/src/auth/auth.service.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/auth/auth.service.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-44dc9322939518bb", "name": "Insecure pattern 'node_child_process' in backend/src/storage-quota/storage-quota.service.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/storage-quota/storage-quota.service.ts:4"}, "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-903d437660184587", "name": "Possible secret in backend/src/onboarding/onboarding.controller.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/onboarding/onboarding.controller.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4753876a458c5906", "name": "Possible secret in backend/src/onboarding/onboarding.service.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/onboarding/onboarding.service.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-08bf4ca075cfbc7f", "name": "Possible secret in backend/src/user/user.controller.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/user/user.controller.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e7a3c76c8a7c8428", "name": "Possible secret in backend/src/user/user.service.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/user/user.service.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4fec8f78ad672278", "name": "Possible secret in backend/src/user/dto/admin-user-response.dto.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/user/dto/admin-user-response.dto.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-93b931305f99e793", "name": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-efc2824b1f94c8ec", "name": "Possible secret in helm/semaphore-chat/README.md", "shortDescription": {"text": "Possible secret in helm/semaphore-chat/README.md"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-64365cc61d5b35d2", "name": "Possible secret in helm/semaphore-chat/values.yaml", "shortDescription": {"text": "Possible secret in helm/semaphore-chat/values.yaml"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-5f1367acd3721aef", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-740b88ab8dd23d2f", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dependabot/fetch-metadata@v2 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-768e8f28c1850d98", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad4f2b4575fd028a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-af4dc7547c72d4db", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b790b5dff379733e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-b841c61fdfcff569", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-076b03a16e76601d", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf95dca2d4eb0c34", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-3b6ed3454e901a05", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b917ea4f99ff5741", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-d02401118859b968", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3345532e49ae8640", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4ed826cb24da92e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-02d762f619f90599", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae6d7eeb05603f40", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-71bf1f215fb78ab6", "name": "Very large file: backend/src/notifications/notifications.service.spec.ts (1738 lines)", "shortDescription": {"text": "Very large file: backend/src/notifications/notifications.service.spec.ts (1738 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-b00cca48e8f1d6e9", "name": "Very large file: backend/src/roles/roles.service.spec.ts (2035 lines)", "shortDescription": {"text": "Very large file: backend/src/roles/roles.service.spec.ts (2035 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "168 tests / 802 src (ratio 0.21)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e8a76eb13fd3249", "name": "Node manifest has dependencies but no lockfile: frontend/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: frontend/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-3a092b5c39e242a1", "name": "Node manifest has dependencies but no lockfile: backend/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: backend/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 64 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 128 placeholder/mock markers across 46 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-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 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-2bb47a3998621444", "name": "Commented-code block (6 lines) in frontend/playwright.config.ts:67", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/playwright.config.ts:67"}, "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-bb1baab13c8cb6ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api-client-config.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api-client-config.ts:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-990e45d7ef5baf74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/__tests__/integration/queryHooks.test.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/__tests__/integration/queryHooks.test.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f3d8c0fd0c8e240", "name": "Commented-code block (5 lines) in frontend/src/utils/tokenService.ts:24", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/utils/tokenService.ts:24"}, "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-285850f24425df85", "name": "Commented-code block (5 lines) in frontend/src/contexts/RoomContext.tsx:69", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/contexts/RoomContext.tsx:69"}, "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-2d52926c7daab08b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useAuthenticatedFile.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useAuthenticatedFile.ts:73"}, "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-a29b8ba909c9849f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useDebugPanel.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useDebugPanel.ts:20"}, "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-b1c8a0d8b0923bd0", "name": "Commented-code block (6 lines) in frontend/src/features/voice/VoiceTestHooks.tsx:58", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/voice/VoiceTestHooks.tsx: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-8d3568f5359ba284", "name": "Commented-code block (7 lines) in frontend/src/features/voice/voiceActions.ts:208", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/features/voice/voiceActions.ts:208"}, "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-1603ae46520fceb7", "name": "Commented-code block (5 lines) in frontend/e2e/fixtures/voice.fixture.ts:205", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/e2e/fixtures/voice.fixture.ts:205"}, "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-8bf67dd3f2c8b843", "name": "Commented-code block (6 lines) in frontend/e2e/voice/mute.spec.ts:68", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/e2e/voice/mute.spec.ts:68"}, "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-fd49c79d460a1bbd", "name": "Commented-code block (5 lines) in backend/src/config/env.validation.ts:100", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/config/env.validation.ts:100"}, "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-2c44c84d2b4432f8", "name": "Commented-code block (5 lines) in backend/src/storage/storage.service.ts:100", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/storage/storage.service.ts:100"}, "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-a0fb0aab750e4d0f", "name": "Frontend route `/join/:inviteCode` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/join/:inviteCode` has no Link/navigate to it \u2014 frontend/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-f5d01723e673f7aa", "name": "Frontend route `debug/pwa` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `debug/pwa` has no Link/navigate to it \u2014 frontend/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-f706263b3a0427e1", "name": "Frontend route `direct-messages` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `direct-messages` has no Link/navigate to it \u2014 frontend/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-390ec5e6561347a8", "name": "Frontend route `friends` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `friends` has no Link/navigate to it \u2014 frontend/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-17bacb17f6efb788", "name": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/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-1beaedb392ed19e5", "name": "Frontend route `admin` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `admin` has no Link/navigate to it \u2014 frontend/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-ad96af978bb7b1be", "name": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `users` has no Link/navigate to it \u2014 frontend/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-5c46330d7f856bdc", "name": "Frontend route `communities` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `communities` has no Link/navigate to it \u2014 frontend/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-5eb197416e534e06", "name": "Frontend route `invites` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `invites` has no Link/navigate to it \u2014 frontend/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-862ca3874c5e2d76", "name": "Frontend route `roles` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `roles` has no Link/navigate to it \u2014 frontend/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-284186f609910d10", "name": "Frontend route `storage` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `storage` has no Link/navigate to it \u2014 frontend/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-981653b693c41aff", "name": "Frontend route `debug` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `debug` has no Link/navigate to it \u2014 frontend/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-259362a86c934189", "name": "Frontend route `debug/notifications` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `debug/notifications` has no Link/navigate to it \u2014 frontend/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-e247485c822a2b1c", "name": "Frontend route `profile/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `profile/edit` has no Link/navigate to it \u2014 frontend/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-a72a14dd54efda29", "name": "Frontend route `profile/:userId` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `profile/:userId` has no Link/navigate to it \u2014 frontend/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-383efe87d7195aa9", "name": "Frontend route `community/create` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `community/create` has no Link/navigate to it \u2014 frontend/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-710eb609b1858fd5", "name": "Frontend route `community/:communityId` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `community/:communityId` has no Link/navigate to it \u2014 frontend/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-8bfe32c4c4c0e0d0", "name": "Frontend route `edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `edit` has no Link/navigate to it \u2014 frontend/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-12638a017eba6e3d", "name": "Frontend route `channel/:channelId` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `channel/:channelId` has no Link/navigate to it \u2014 frontend/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-44112c4a93546d0c", "name": "Frontend route `/community/:communityId/channel/:channelId` has no Link/navigate to it \u2014 frontend/src/__tests__/componen", "shortDescription": {"text": "Frontend route `/community/:communityId/channel/:channelId` has no Link/navigate to it \u2014 frontend/src/__tests__/components/AuthGate.test.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-e637b9ee98c0a278", "name": "Dangling fetch: GET http://localhost:3000/api/messages/channel/ch-msw?limit=25&continuationToken= (frontend/src/__tests_", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3000/api/messages/channel/ch-msw?limit=25&continuationToken= (frontend/src/__tests__/integration/queryHooks.test.ts:24)"}, "fullDescription": {"text": "`frontend/src/__tests__/integration/queryHooks.test.ts:24` calls `GET http://localhost:3000/api/messages/channel/ch-msw?limit=25&continuationToken=` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3000/api/messages/channel/ch-msw`\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-669beca1e4849562", "name": "Dangling fetch: GET http://localhost:3000/api/messages/channel/ch-err (frontend/src/__tests__/integration/queryHooks.tes", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3000/api/messages/channel/ch-err (frontend/src/__tests__/integration/queryHooks.test.ts:44)"}, "fullDescription": {"text": "`frontend/src/__tests__/integration/queryHooks.test.ts:44` calls `GET http://localhost:3000/api/messages/channel/ch-err` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3000/api/messages/channel/ch-err`\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-fdc4dbdd5b5de1e0", "name": "Dangling fetch: GET http://localhost:3000/api/messages/group/dm-msw?limit=25&continuationToken= (frontend/src/__tests__/", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3000/api/messages/group/dm-msw?limit=25&continuationToken= (frontend/src/__tests__/integration/queryHooks.test.ts:58)"}, "fullDescription": {"text": "`frontend/src/__tests__/integration/queryHooks.test.ts:58` calls `GET http://localhost:3000/api/messages/group/dm-msw?limit=25&continuationToken=` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3000/api/messages/group/dm-msw`\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-1c65945fc6f42b3d", "name": "Dangling fetch: GET http://localhost:3000/api/threads/parent-msw/replies (frontend/src/__tests__/integration/queryHooks.", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3000/api/threads/parent-msw/replies (frontend/src/__tests__/integration/queryHooks.test.ts:73)"}, "fullDescription": {"text": "`frontend/src/__tests__/integration/queryHooks.test.ts:73` calls `GET http://localhost:3000/api/threads/parent-msw/replies` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3000/api/threads/parent-msw/replies`\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-9e33c2c31ed18e71", "name": "Unused endpoint: POST /channels/:channelId/voice-presence/refresh", "shortDescription": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/refresh"}, "fullDescription": {"text": "`backend/src/voice-presence/voice-presence.controller.ts` declares `POST /channels/:channelId/voice-presence/refresh` 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-347b63779b277a8d", "name": "Unused endpoint: POST /channels/:channelId/voice-presence/join", "shortDescription": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/join"}, "fullDescription": {"text": "`backend/src/voice-presence/voice-presence.controller.ts` declares `POST /channels/:channelId/voice-presence/join` 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-ba4b9be9f77691dc", "name": "Unused endpoint: POST /channels/:channelId/voice-presence/leave", "shortDescription": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/leave"}, "fullDescription": {"text": "`backend/src/voice-presence/voice-presence.controller.ts` declares `POST /channels/:channelId/voice-presence/leave` 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-b33765e1ff7d9336", "name": "Unused endpoint: POST /channels/:channelId/voice-presence/deafen", "shortDescription": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/deafen"}, "fullDescription": {"text": "`backend/src/voice-presence/voice-presence.controller.ts` declares `POST /channels/:channelId/voice-presence/deafen` 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-a39ed9e52262f81e", "name": "Unused endpoint: GET /channels/:channelId/voice-presence/me", "shortDescription": {"text": "Unused endpoint: GET /channels/:channelId/voice-presence/me"}, "fullDescription": {"text": "`backend/src/voice-presence/voice-presence.controller.ts` declares `GET /channels/:channelId/voice-presence/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-8a58be234783c1bf", "name": "Unused endpoint: GET /push/vapid-public-key", "shortDescription": {"text": "Unused endpoint: GET /push/vapid-public-key"}, "fullDescription": {"text": "`backend/src/push-notifications/push-notifications.controller.ts` declares `GET /push/vapid-public-key` 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-e22b17c985c6cfea", "name": "Unused endpoint: POST /push/subscribe", "shortDescription": {"text": "Unused endpoint: POST /push/subscribe"}, "fullDescription": {"text": "`backend/src/push-notifications/push-notifications.controller.ts` declares `POST /push/subscribe` 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-50895a9d89526973", "name": "Unused endpoint: DELETE /push/unsubscribe", "shortDescription": {"text": "Unused endpoint: DELETE /push/unsubscribe"}, "fullDescription": {"text": "`backend/src/push-notifications/push-notifications.controller.ts` declares `DELETE /push/unsubscribe` 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-ccc5cfac1a2a9cf1", "name": "Unused endpoint: GET /push/status", "shortDescription": {"text": "Unused endpoint: GET /push/status"}, "fullDescription": {"text": "`backend/src/push-notifications/push-notifications.controller.ts` declares `GET /push/status` 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-8e49fa415b0d3b84", "name": "Unused endpoint: POST /push/test", "shortDescription": {"text": "Unused endpoint: POST /push/test"}, "fullDescription": {"text": "`backend/src/push-notifications/push-notifications.controller.ts` declares `POST /push/test` 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-14106b32ad98ed5e", "name": "Unused endpoint: POST /push/debug/send-test", "shortDescription": {"text": "Unused endpoint: POST /push/debug/send-test"}, "fullDescription": {"text": "`backend/src/push-notifications/push-notifications.controller.ts` declares `POST /push/debug/send-test` 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-995dae05d67aa85a", "name": "Unused endpoint: GET /notifications/unread-count", "shortDescription": {"text": "Unused endpoint: GET /notifications/unread-count"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `GET /notifications/unread-count` 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-7ae443c3d8d30b78", "name": "Unused endpoint: POST /notifications/:id/read", "shortDescription": {"text": "Unused endpoint: POST /notifications/:id/read"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `POST /notifications/:id/read` 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-1b93f5ab485027b7", "name": "Unused endpoint: POST /notifications/read-all", "shortDescription": {"text": "Unused endpoint: POST /notifications/read-all"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `POST /notifications/read-all` 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-73b1da36050e0965", "name": "Unused endpoint: POST /notifications/:id/dismiss", "shortDescription": {"text": "Unused endpoint: POST /notifications/:id/dismiss"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `POST /notifications/:id/dismiss` 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-b474d0720252b2fc", "name": "Unused endpoint: DELETE /notifications/:id", "shortDescription": {"text": "Unused endpoint: DELETE /notifications/:id"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `DELETE /notifications/: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-9259b8e2524bc53c", "name": "Unused endpoint: GET /notifications/settings", "shortDescription": {"text": "Unused endpoint: GET /notifications/settings"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `GET /notifications/settings` 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-f968c256db279a87", "name": "Unused endpoint: PUT /notifications/settings", "shortDescription": {"text": "Unused endpoint: PUT /notifications/settings"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `PUT /notifications/settings` 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-ab936be2e27e9ea2", "name": "Unused endpoint: GET /notifications/channels/:channelId/override", "shortDescription": {"text": "Unused endpoint: GET /notifications/channels/:channelId/override"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `GET /notifications/channels/:channelId/override` 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-e66725270be5311a", "name": "Unused endpoint: PUT /notifications/channels/:channelId/override", "shortDescription": {"text": "Unused endpoint: PUT /notifications/channels/:channelId/override"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `PUT /notifications/channels/:channelId/override` 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-c8dced06fd0c87c9", "name": "Unused endpoint: DELETE /notifications/channels/:channelId/override", "shortDescription": {"text": "Unused endpoint: DELETE /notifications/channels/:channelId/override"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `DELETE /notifications/channels/:channelId/override` 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-a5a63b0b958e7b89", "name": "Unused endpoint: POST /notifications/debug/send-test", "shortDescription": {"text": "Unused endpoint: POST /notifications/debug/send-test"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `POST /notifications/debug/send-test` 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-0491ba286d1e683c", "name": "Unused endpoint: GET /notifications/debug/subscriptions", "shortDescription": {"text": "Unused endpoint: GET /notifications/debug/subscriptions"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `GET /notifications/debug/subscriptions` 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-8d8687323c97a527", "name": "Unused endpoint: DELETE /notifications/debug/clear-all", "shortDescription": {"text": "Unused endpoint: DELETE /notifications/debug/clear-all"}, "fullDescription": {"text": "`backend/src/notifications/notifications.controller.ts` declares `DELETE /notifications/debug/clear-all` 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-337ef3a36b9ecb12", "name": "Unused endpoint: GET /alias-groups/community/:communityId", "shortDescription": {"text": "Unused endpoint: GET /alias-groups/community/:communityId"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `GET /alias-groups/community/:communityId` 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-ab1aac204f983b5d", "name": "Unused endpoint: POST /alias-groups/community/:communityId", "shortDescription": {"text": "Unused endpoint: POST /alias-groups/community/:communityId"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `POST /alias-groups/community/:communityId` 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-ff022f09c5367390", "name": "Unused endpoint: GET /alias-groups/:groupId", "shortDescription": {"text": "Unused endpoint: GET /alias-groups/:groupId"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `GET /alias-groups/:groupId` 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-85040424afecc0bf", "name": "Unused endpoint: PUT /alias-groups/:groupId", "shortDescription": {"text": "Unused endpoint: PUT /alias-groups/:groupId"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `PUT /alias-groups/:groupId` 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-b6afb86b8e91b02b", "name": "Unused endpoint: DELETE /alias-groups/:groupId", "shortDescription": {"text": "Unused endpoint: DELETE /alias-groups/:groupId"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `DELETE /alias-groups/:groupId` 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-35badaf18fb4db3e", "name": "Unused endpoint: POST /alias-groups/:groupId/members", "shortDescription": {"text": "Unused endpoint: POST /alias-groups/:groupId/members"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `POST /alias-groups/:groupId/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-38b286641ea36dd0", "name": "Unused endpoint: DELETE /alias-groups/:groupId/members/:userId", "shortDescription": {"text": "Unused endpoint: DELETE /alias-groups/:groupId/members/:userId"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `DELETE /alias-groups/:groupId/members/:userId` 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-42ce6654f5a2f4d7", "name": "Unused endpoint: PUT /alias-groups/:groupId/members", "shortDescription": {"text": "Unused endpoint: PUT /alias-groups/:groupId/members"}, "fullDescription": {"text": "`backend/src/alias-groups/alias-groups.controller.ts` declares `PUT /alias-groups/:groupId/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-db36d590123f5f1d", "name": "Unused endpoint: POST /threads/:parentMessageId/replies", "shortDescription": {"text": "Unused endpoint: POST /threads/:parentMessageId/replies"}, "fullDescription": {"text": "`backend/src/threads/threads.controller.ts` declares `POST /threads/:parentMessageId/replies` 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-d1043fd51b7b40e7", "name": "Unused endpoint: GET /threads/:parentMessageId/replies", "shortDescription": {"text": "Unused endpoint: GET /threads/:parentMessageId/replies"}, "fullDescription": {"text": "`backend/src/threads/threads.controller.ts` declares `GET /threads/:parentMessageId/replies` 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-fcd12e16a4e31eee", "name": "Unused endpoint: GET /threads/:parentMessageId/metadata", "shortDescription": {"text": "Unused endpoint: GET /threads/:parentMessageId/metadata"}, "fullDescription": {"text": "`backend/src/threads/threads.controller.ts` declares `GET /threads/:parentMessageId/metadata` 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-4f4d2eef750c294a", "name": "Unused endpoint: POST /threads/:parentMessageId/subscribe", "shortDescription": {"text": "Unused endpoint: POST /threads/:parentMessageId/subscribe"}, "fullDescription": {"text": "`backend/src/threads/threads.controller.ts` declares `POST /threads/:parentMessageId/subscribe` 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-b5c8005221cf0f9d", "name": "Unused endpoint: DELETE /threads/:parentMessageId/subscribe", "shortDescription": {"text": "Unused endpoint: DELETE /threads/:parentMessageId/subscribe"}, "fullDescription": {"text": "`backend/src/threads/threads.controller.ts` declares `DELETE /threads/:parentMessageId/subscribe` 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-8fdbacfe9430a6ed", "name": "Unused endpoint: POST /auth/login", "shortDescription": {"text": "Unused endpoint: POST /auth/login"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/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-b36892106ecdc9aa", "name": "Unused endpoint: POST /auth/refresh", "shortDescription": {"text": "Unused endpoint: POST /auth/refresh"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/refresh` 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-c059f57186114027", "name": "Unused endpoint: POST /auth/logout", "shortDescription": {"text": "Unused endpoint: POST /auth/logout"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/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-d27d9656224c1a06", "name": "Unused endpoint: GET /auth/sessions", "shortDescription": {"text": "Unused endpoint: GET /auth/sessions"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `GET /auth/sessions` 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-7f68a0f475387a68", "name": "Unused endpoint: DELETE /auth/sessions/:sessionId", "shortDescription": {"text": "Unused endpoint: DELETE /auth/sessions/:sessionId"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `DELETE /auth/sessions/:sessionId` 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-a578745246f2e74a", "name": "Unused endpoint: DELETE /auth/sessions", "shortDescription": {"text": "Unused endpoint: DELETE /auth/sessions"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `DELETE /auth/sessions` 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-137c28eabf611b77", "name": "Unused endpoint: GET /instance/settings/public", "shortDescription": {"text": "Unused endpoint: GET /instance/settings/public"}, "fullDescription": {"text": "`backend/src/instance/instance.controller.ts` declares `GET /instance/settings/public` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-997492c9a7cc39b4", "name": "Unused endpoint: GET /instance/settings", "shortDescription": {"text": "Unused endpoint: GET /instance/settings"}, "fullDescription": {"text": "`backend/src/instance/instance.controller.ts` declares `GET /instance/settings` 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-34a58b61ad738672", "name": "Unused endpoint: PATCH /instance/settings", "shortDescription": {"text": "Unused endpoint: PATCH /instance/settings"}, "fullDescription": {"text": "`backend/src/instance/instance.controller.ts` declares `PATCH /instance/settings` 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-47bbe95b9492a727", "name": "Unused endpoint: GET /instance/stats", "shortDescription": {"text": "Unused endpoint: GET /instance/stats"}, "fullDescription": {"text": "`backend/src/instance/instance.controller.ts` declares `GET /instance/stats` 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-528393c0583ca96b", "name": "Unused endpoint: GET /invite/public/:code", "shortDescription": {"text": "Unused endpoint: GET /invite/public/:code"}, "fullDescription": {"text": "`backend/src/invite/invite.controller.ts` declares `GET /invite/public/:code` 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-e138c460b03bbd16", "name": "Unused endpoint: GET /invite/:code", "shortDescription": {"text": "Unused endpoint: GET /invite/:code"}, "fullDescription": {"text": "`backend/src/invite/invite.controller.ts` declares `GET /invite/:code` 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-2e350b16e9963518", "name": "Unused endpoint: DELETE /invite/:code", "shortDescription": {"text": "Unused endpoint: DELETE /invite/:code"}, "fullDescription": {"text": "`backend/src/invite/invite.controller.ts` declares `DELETE /invite/:code` 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/19232"}, "properties": {"repository": "semaphore-chat/semaphore-chat", "repoUrl": "https://github.com/semaphore-chat/semaphore-chat", "branch": "main"}, "results": [{"ruleId": "scanner-ea29e6f3f8b5f766", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/electron/main.ts:66"}, "properties": {"repobilityId": "9b2b98fdce74d735", "scanner": "scanner-primary", "fingerprint": "ea29e6f3f8b5f766", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-784f0216b8a7867d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/sw-custom.ts:67"}, "properties": {"repobilityId": "17c81b8a7615476c", "scanner": "scanner-primary", "fingerprint": "784f0216b8a7867d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-858b310d01f6c8e5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/socket-hub/handlers/messageHandlers.ts:34"}, "properties": {"repobilityId": "19a1beadb3f40e51", "scanner": "scanner-primary", "fingerprint": "858b310d01f6c8e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-74d50eb55bb5b106", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.ts:20"}, "properties": {"repobilityId": "f9c60806668fd185", "scanner": "scanner-primary", "fingerprint": "74d50eb55bb5b106", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7df633eb6fa8a58d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Mobile/Panels/MobileChannelsPanel.tsx:69"}, "properties": {"repobilityId": "a89c6b1f6be52039", "scanner": "scanner-primary", "fingerprint": "7df633eb6fa8a58d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c08fac1b903c12d0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Mobile/Panels/MobileChatPanel.tsx:101"}, "properties": {"repobilityId": "da598885f3a07b11", "scanner": "scanner-primary", "fingerprint": "c08fac1b903c12d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5a327f8ff2d27a37", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/CreateCommunityPage.tsx:43"}, "properties": {"repobilityId": "b636e2ab7a02ecc3", "scanner": "scanner-primary", "fingerprint": "5a327f8ff2d27a37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2bf622ef79f4c2d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed.ts:58"}, "properties": {"repobilityId": "be513322403f615b", "scanner": "scanner-primary", "fingerprint": "2bf622ef79f4c2d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cbfd04e7f893687", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/migrate-instance-roles.ts:31"}, "properties": {"repobilityId": "392eea89b6b09343", "scanner": "scanner-primary", "fingerprint": "3cbfd04e7f893687", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70e8e77c3f89b740", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-e2e.ts:93"}, "properties": {"repobilityId": "41c8103f57256a66", "scanner": "scanner-primary", "fingerprint": "70e8e77c3f89b740", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e74f3e264425feff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/generate-openapi.ts:25"}, "properties": {"repobilityId": "e95b6e39e2db70b5", "scanner": "scanner-primary", "fingerprint": "e74f3e264425feff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f48e3ba4236b5ade", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/notifications/notifications.service.ts:342"}, "properties": {"repobilityId": "d9bd156a33c91b71", "scanner": "scanner-primary", "fingerprint": "f48e3ba4236b5ade", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-60427b03771411b6", "level": "warning", "message": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "properties": {"repobilityId": "735c01d8531dfd2c", "scanner": "scanner-primary", "fingerprint": "60427b03771411b6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a3d5b4eeaed71b0f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "381da6f1a4003905", "scanner": "scanner-primary", "fingerprint": "a3d5b4eeaed71b0f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-614ec4421bd69ab3", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "e7f2eb78e2f5a218", "scanner": "scanner-primary", "fingerprint": "614ec4421bd69ab3", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-17ef51905baff3cb", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/utils/tokenService.test.ts:76"}, "properties": {"repobilityId": "aa58dbf58b350dd8", "scanner": "scanner-primary", "fingerprint": "17ef51905baff3cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/__tests__/utils/tokenService.test.ts"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-f76122faab8aa1e0", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/utils/tokenService.electron.test.ts:47"}, "properties": {"repobilityId": "f74452d4fc035881", "scanner": "scanner-primary", "fingerprint": "f76122faab8aa1e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/__tests__/utils/tokenService.electron.test.ts"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-8f3c9a6bef2fe6a8", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/__tests__/components/AuthGate.test.tsx:383"}, "properties": {"repobilityId": "a49b4dc22a0763d5", "scanner": "scanner-primary", "fingerprint": "8f3c9a6bef2fe6a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/__tests__/components/AuthGate.test.tsx"}, "region": {"startLine": 383}}}]}, {"ruleId": "scanner-ecfb31fffb58ade4", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/tokenService.ts:174"}, "properties": {"repobilityId": "d5d2345182492ef9", "scanner": "scanner-primary", "fingerprint": "ecfb31fffb58ade4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/utils/tokenService.ts"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-dd8ad22cf02816e6", "level": "error", "message": {"text": "Possible secret in frontend/src/components/Onboarding/AdminSetupStep.tsx"}, "properties": {"repobilityId": "d17c49a00b119df5", "scanner": "scanner-primary", "fingerprint": "dd8ad22cf02816e6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/Onboarding/AdminSetupStep.tsx"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-dd8ad22cf02816e6", "level": "error", "message": {"text": "Possible secret in frontend/src/components/Onboarding/AdminSetupStep.tsx"}, "properties": {"repobilityId": "d17c49a00b119df5", "scanner": "scanner-primary", "fingerprint": "dd8ad22cf02816e6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/Onboarding/AdminSetupStep.tsx"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-c9bbb09b1e384789", "level": "error", "message": {"text": "Possible secret in backend/test/community-messaging.e2e-spec.ts"}, "properties": {"repobilityId": "abc7bc6380e596e0", "scanner": "scanner-primary", "fingerprint": "c9bbb09b1e384789", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/test/community-messaging.e2e-spec.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-c9bbb09b1e384789", "level": "error", "message": {"text": "Possible secret in backend/test/community-messaging.e2e-spec.ts"}, "properties": {"repobilityId": "abc7bc6380e596e0", "scanner": "scanner-primary", "fingerprint": "c9bbb09b1e384789", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/test/community-messaging.e2e-spec.ts"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-7757ad7a9ded8066", "level": "error", "message": {"text": "Possible secret in backend/test/security.e2e-spec.ts"}, "properties": {"repobilityId": "b2a11c69bf8faba7", "scanner": "scanner-primary", "fingerprint": "7757ad7a9ded8066", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/test/security.e2e-spec.ts"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-7757ad7a9ded8066", "level": "error", "message": {"text": "Possible secret in backend/test/security.e2e-spec.ts"}, "properties": {"repobilityId": "b2a11c69bf8faba7", "scanner": "scanner-primary", "fingerprint": "7757ad7a9ded8066", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/test/security.e2e-spec.ts"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-d1d661a21c6afe19", "level": "error", "message": {"text": "Possible secret in backend/test/auth.e2e-spec.ts"}, "properties": {"repobilityId": "2146aac5178d0110", "scanner": "scanner-primary", "fingerprint": "d1d661a21c6afe19", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/test/auth.e2e-spec.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-d1d661a21c6afe19", "level": "error", "message": {"text": "Possible secret in backend/test/auth.e2e-spec.ts"}, "properties": {"repobilityId": "2146aac5178d0110", "scanner": "scanner-primary", "fingerprint": "d1d661a21c6afe19", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/test/auth.e2e-spec.ts"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-ab13578344d7ecb5", "level": "error", "message": {"text": "Possible secret in backend/prisma/seed-e2e.ts"}, "properties": {"repobilityId": "5df461265a79441f", "scanner": "scanner-primary", "fingerprint": "ab13578344d7ecb5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prisma/seed-e2e.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-ab13578344d7ecb5", "level": "error", "message": {"text": "Possible secret in backend/prisma/seed-e2e.ts"}, "properties": {"repobilityId": "5df461265a79441f", "scanner": "scanner-primary", "fingerprint": "ab13578344d7ecb5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prisma/seed-e2e.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-ab13578344d7ecb5", "level": "error", "message": {"text": "Possible secret in backend/prisma/seed-e2e.ts"}, "properties": {"repobilityId": "5df461265a79441f", "scanner": "scanner-primary", "fingerprint": "ab13578344d7ecb5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prisma/seed-e2e.ts"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-ab13578344d7ecb5", "level": "error", "message": {"text": "Possible secret in backend/prisma/seed-e2e.ts"}, "properties": {"repobilityId": "5df461265a79441f", "scanner": "scanner-primary", "fingerprint": "ab13578344d7ecb5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prisma/seed-e2e.ts"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-ab13578344d7ecb5", "level": "error", "message": {"text": "Possible secret in backend/prisma/seed-e2e.ts"}, "properties": {"repobilityId": "5df461265a79441f", "scanner": "scanner-primary", "fingerprint": "ab13578344d7ecb5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prisma/seed-e2e.ts"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-1a597487ef121cce", "level": "error", "message": {"text": "Possible secret in backend/src/adapters/redis-io.adapter.spec.ts"}, "properties": {"repobilityId": "cf19171cf0375025", "scanner": "scanner-primary", "fingerprint": "1a597487ef121cce", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/adapters/redis-io.adapter.spec.ts"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-1a597487ef121cce", "level": "error", "message": {"text": "Possible secret in backend/src/adapters/redis-io.adapter.spec.ts"}, "properties": {"repobilityId": "cf19171cf0375025", "scanner": "scanner-primary", "fingerprint": "1a597487ef121cce", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/adapters/redis-io.adapter.spec.ts"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-16a4c31e31788400", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in backend/src/adapters/redis-io.adapter.spec.ts:258"}, "properties": {"repobilityId": "d77906833375a9ad", "scanner": "scanner-primary", "fingerprint": "16a4c31e31788400", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/adapters/redis-io.adapter.spec.ts"}, "region": {"startLine": 258}}}]}, {"ruleId": "scanner-f5d42ecc92bc4f6a", "level": "error", "message": {"text": "Possible secret in backend/src/auth/auth.service.spec.ts"}, "properties": {"repobilityId": "0b88f7b635dc10a1", "scanner": "scanner-primary", "fingerprint": "f5d42ecc92bc4f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/auth/auth.service.spec.ts"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-f5d42ecc92bc4f6a", "level": "error", "message": {"text": "Possible secret in backend/src/auth/auth.service.spec.ts"}, "properties": {"repobilityId": "0b88f7b635dc10a1", "scanner": "scanner-primary", "fingerprint": "f5d42ecc92bc4f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/auth/auth.service.spec.ts"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-44dc9322939518bb", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/storage-quota/storage-quota.service.ts:4"}, "properties": {"repobilityId": "50e67c4acc9a4f4e", "scanner": "scanner-primary", "fingerprint": "44dc9322939518bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/storage-quota/storage-quota.service.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-903d437660184587", "level": "error", "message": {"text": "Possible secret in backend/src/onboarding/onboarding.controller.spec.ts"}, "properties": {"repobilityId": "3a16ebb613ded5c9", "scanner": "scanner-primary", "fingerprint": "903d437660184587", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/onboarding/onboarding.controller.spec.ts"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-4753876a458c5906", "level": "error", "message": {"text": "Possible secret in backend/src/onboarding/onboarding.service.spec.ts"}, "properties": {"repobilityId": "76805fa74e4a71ab", "scanner": "scanner-primary", "fingerprint": "4753876a458c5906", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/onboarding/onboarding.service.spec.ts"}, "region": {"startLine": 175}}}]}, {"ruleId": "scanner-08bf4ca075cfbc7f", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.controller.spec.ts"}, "properties": {"repobilityId": "89f6b8800f92243b", "scanner": "scanner-primary", "fingerprint": "08bf4ca075cfbc7f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.controller.spec.ts"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-08bf4ca075cfbc7f", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.controller.spec.ts"}, "properties": {"repobilityId": "89f6b8800f92243b", "scanner": "scanner-primary", "fingerprint": "08bf4ca075cfbc7f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.controller.spec.ts"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-08bf4ca075cfbc7f", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.controller.spec.ts"}, "properties": {"repobilityId": "89f6b8800f92243b", "scanner": "scanner-primary", "fingerprint": "08bf4ca075cfbc7f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.controller.spec.ts"}, "region": {"startLine": 310}}}]}, {"ruleId": "scanner-e7a3c76c8a7c8428", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.service.spec.ts"}, "properties": {"repobilityId": "f5ff8c0a54a462b6", "scanner": "scanner-primary", "fingerprint": "e7a3c76c8a7c8428", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.service.spec.ts"}, "region": {"startLine": 212}}}]}, {"ruleId": "scanner-e7a3c76c8a7c8428", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.service.spec.ts"}, "properties": {"repobilityId": "f5ff8c0a54a462b6", "scanner": "scanner-primary", "fingerprint": "e7a3c76c8a7c8428", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.service.spec.ts"}, "region": {"startLine": 705}}}]}, {"ruleId": "scanner-e7a3c76c8a7c8428", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.service.spec.ts"}, "properties": {"repobilityId": "f5ff8c0a54a462b6", "scanner": "scanner-primary", "fingerprint": "e7a3c76c8a7c8428", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.service.spec.ts"}, "region": {"startLine": 718}}}]}, {"ruleId": "scanner-e7a3c76c8a7c8428", "level": "error", "message": {"text": "Possible secret in backend/src/user/user.service.spec.ts"}, "properties": {"repobilityId": "f5ff8c0a54a462b6", "scanner": "scanner-primary", "fingerprint": "e7a3c76c8a7c8428", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/user.service.spec.ts"}, "region": {"startLine": 799}}}]}, {"ruleId": "scanner-4fec8f78ad672278", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/admin-user-response.dto.spec.ts"}, "properties": {"repobilityId": "9a568e26a46c6e3e", "scanner": "scanner-primary", "fingerprint": "4fec8f78ad672278", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/admin-user-response.dto.spec.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-4fec8f78ad672278", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/admin-user-response.dto.spec.ts"}, "properties": {"repobilityId": "9a568e26a46c6e3e", "scanner": "scanner-primary", "fingerprint": "4fec8f78ad672278", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/admin-user-response.dto.spec.ts"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-4fec8f78ad672278", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/admin-user-response.dto.spec.ts"}, "properties": {"repobilityId": "9a568e26a46c6e3e", "scanner": "scanner-primary", "fingerprint": "4fec8f78ad672278", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/admin-user-response.dto.spec.ts"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-93b931305f99e793", "level": "error", "message": {"text": "Possible secret in backend/src/user/dto/create-user.dto.spec.ts"}, "properties": {"repobilityId": "9fb809ffcb8dce08", "scanner": "scanner-primary", "fingerprint": "93b931305f99e793", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/user/dto/create-user.dto.spec.ts"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-efc2824b1f94c8ec", "level": "error", "message": {"text": "Possible secret in helm/semaphore-chat/README.md"}, "properties": {"repobilityId": "cac11c4e48e43bad", "scanner": "scanner-primary", "fingerprint": "efc2824b1f94c8ec", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "helm/semaphore-chat/README.md"}, "region": {"startLine": 197}}}]}, {"ruleId": "scanner-64365cc61d5b35d2", "level": "error", "message": {"text": "Possible secret in helm/semaphore-chat/values.yaml"}, "properties": {"repobilityId": "dfa4eed656a9106f", "scanner": "scanner-primary", "fingerprint": "64365cc61d5b35d2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "helm/semaphore-chat/values.yaml"}, "region": {"startLine": 319}}}]}, {"ruleId": "scanner-64365cc61d5b35d2", "level": "error", "message": {"text": "Possible secret in helm/semaphore-chat/values.yaml"}, "properties": {"repobilityId": "dfa4eed656a9106f", "scanner": "scanner-primary", "fingerprint": "64365cc61d5b35d2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "helm/semaphore-chat/values.yaml"}, "region": {"startLine": 320}}}]}, {"ruleId": "scanner-5f1367acd3721aef", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "31e5a0b960e76302", "scanner": "scanner-primary", "fingerprint": "5f1367acd3721aef", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/security-audit.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-5f1367acd3721aef", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "147766672e8ac977", "scanner": "scanner-primary", "fingerprint": "5f1367acd3721aef", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/security-audit.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-5f1367acd3721aef", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "79f5863288294183", "scanner": "scanner-primary", "fingerprint": "5f1367acd3721aef", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/security-audit.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-740b88ab8dd23d2f", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6c22316cfcffbcef", "scanner": "scanner-primary", "fingerprint": "740b88ab8dd23d2f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/dependabot-auto-merge.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-768e8f28c1850d98", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "f3c306ca3743dfa1", "scanner": "scanner-primary", "fingerprint": "768e8f28c1850d98", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/dependabot-auto-merge.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad4f2b4575fd028a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b7c2b05b306a0b45", "scanner": "scanner-primary", "fingerprint": "ad4f2b4575fd028a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-tests.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-ad4f2b4575fd028a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2f922ce2ed207625", "scanner": "scanner-primary", "fingerprint": "ad4f2b4575fd028a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-tests.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-ad4f2b4575fd028a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2fa50eab3f32809a", "scanner": "scanner-primary", "fingerprint": "ad4f2b4575fd028a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-tests.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-af4dc7547c72d4db", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "c3cb74fa3955508d", "scanner": "scanner-primary", "fingerprint": "af4dc7547c72d4db", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-tests.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b4d4b0d91e9c982d", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3a0c9b9d8d6921d3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b4d4b0d91e9c982d", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e6274906af2daa47", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "784947de8ac6c5d3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b299bce0d2d8ad0e", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b9c4858b1331f405", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cbaa204a57fead6f", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 209}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b4d4b0d91e9c982d", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e6274906af2daa47", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "784947de8ac6c5d3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b299bce0d2d8ad0e", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 269}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b9c4858b1331f405", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 288}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cbaa204a57fead6f", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 291}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 362}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "31563e99cfb42423", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "92a252f237fefd54", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9865da7d2b2ff924", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3ced3a497e6628d3", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "81e5f06397892af9", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "81e5f06397892af9", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b150a881b4a580c8", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "31563e99cfb42423", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "92a252f237fefd54", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9865da7d2b2ff924", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3ced3a497e6628d3", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 180}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "81e5f06397892af9", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "81e5f06397892af9", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 214}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b150a881b4a580c8", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 230}}}]}, {"ruleId": "scanner-076b03a16e76601d", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "a42462ccbe3d06f2", "scanner": "scanner-primary", "fingerprint": "076b03a16e76601d", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2ac49086452592db", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "309abf7f3048f675", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e107ba842a73b84d", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2ac49086452592db", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "309abf7f3048f675", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e107ba842a73b84d", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2ac49086452592db", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "309abf7f3048f675", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e107ba842a73b84d", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2ac49086452592db", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 211}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "309abf7f3048f675", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 214}}}]}, {"ruleId": "scanner-cf95dca2d4eb0c34", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e107ba842a73b84d", "scanner": "scanner-primary", "fingerprint": "cf95dca2d4eb0c34", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-3b6ed3454e901a05", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "770ee102dc80a008", "scanner": "scanner-primary", "fingerprint": "3b6ed3454e901a05", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-tests.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b917ea4f99ff5741", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9220b53a513b9bb0", "scanner": "scanner-primary", "fingerprint": "b917ea4f99ff5741", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/helm-publish.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-b917ea4f99ff5741", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1dc837424255e86a", "scanner": "scanner-primary", "fingerprint": "b917ea4f99ff5741", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/helm-publish.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-d02401118859b968", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "98bd95fcde75e14f", "scanner": "scanner-primary", "fingerprint": "d02401118859b968", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/helm-publish.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3345532e49ae8640", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "32c4cca348173c51", "scanner": "scanner-primary", "fingerprint": "3345532e49ae8640", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-docs.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30aa65f4921f7fd2", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "17e93229f1a304b4", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6903772cf55d31f9", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30aa65f4921f7fd2", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "17e93229f1a304b4", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6903772cf55d31f9", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "33762c3194002c12", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30aa65f4921f7fd2", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "17e93229f1a304b4", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 164}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6903772cf55d31f9", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 206}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1a606eb41b766fce", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30aa65f4921f7fd2", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "31a7c3085811c039", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-e4ed826cb24da92e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "31a7c3085811c039", "scanner": "scanner-primary", "fingerprint": "e4ed826cb24da92e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 268}}}]}, {"ruleId": "scanner-02d762f619f90599", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "830bfcc7b460ccd2", "scanner": "scanner-primary", "fingerprint": "02d762f619f90599", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/electron-build.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ae6d7eeb05603f40", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "6305798068f1dbdf", "scanner": "scanner-primary", "fingerprint": "ae6d7eeb05603f40", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-71bf1f215fb78ab6", "level": "note", "message": {"text": "Very large file: backend/src/notifications/notifications.service.spec.ts (1738 lines)"}, "properties": {"repobilityId": "55054eee5e0c09c0", "scanner": "scanner-primary", "fingerprint": "71bf1f215fb78ab6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b00cca48e8f1d6e9", "level": "note", "message": {"text": "Very large file: backend/src/roles/roles.service.spec.ts (2035 lines)"}, "properties": {"repobilityId": "78a8626481a3014e", "scanner": "scanner-primary", "fingerprint": "b00cca48e8f1d6e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-0e8a76eb13fd3249", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: frontend/package.json"}, "properties": {"repobilityId": "d8c65da5b68ee95b", "scanner": "scanner-primary", "fingerprint": "0e8a76eb13fd3249", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/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-3a092b5c39e242a1", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: backend/package.json"}, "properties": {"repobilityId": "fc853e57ce7048c4", "scanner": "scanner-primary", "fingerprint": "3a092b5c39e242a1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5d5e7de897f62477", "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": "f65abba3b3d36b08", "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": "b067e430f7636ed6", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e4a8d7e38b44b713", "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": "061b88da1c761961", "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": "e30382fa92f39e42", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2bb47a3998621444", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/playwright.config.ts:67"}, "properties": {"repobilityId": "46b7e9dd8ed4b57b", "scanner": "scanner-primary", "fingerprint": "2bb47a3998621444", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb1baab13c8cb6ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api-client-config.ts:37"}, "properties": {"repobilityId": "39b791a9a39c1fbb", "scanner": "scanner-primary", "fingerprint": "bb1baab13c8cb6ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-990e45d7ef5baf74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/__tests__/integration/queryHooks.test.ts:24"}, "properties": {"repobilityId": "f737783c0dff69db", "scanner": "scanner-primary", "fingerprint": "990e45d7ef5baf74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f3d8c0fd0c8e240", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/utils/tokenService.ts:24"}, "properties": {"repobilityId": "c992d89f3045faf7", "scanner": "scanner-primary", "fingerprint": "3f3d8c0fd0c8e240", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-285850f24425df85", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/contexts/RoomContext.tsx:69"}, "properties": {"repobilityId": "4987ab35bc7ed304", "scanner": "scanner-primary", "fingerprint": "285850f24425df85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d52926c7daab08b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useAuthenticatedFile.ts:73"}, "properties": {"repobilityId": "791da49e05627b58", "scanner": "scanner-primary", "fingerprint": "2d52926c7daab08b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a29b8ba909c9849f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useDebugPanel.ts:20"}, "properties": {"repobilityId": "eba8f2f61b304b14", "scanner": "scanner-primary", "fingerprint": "a29b8ba909c9849f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1c8a0d8b0923bd0", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/voice/VoiceTestHooks.tsx:58"}, "properties": {"repobilityId": "ded6ffaf8dde5884", "scanner": "scanner-primary", "fingerprint": "b1c8a0d8b0923bd0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d3568f5359ba284", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/features/voice/voiceActions.ts:208"}, "properties": {"repobilityId": "e2d1655b46cd5dc8", "scanner": "scanner-primary", "fingerprint": "8d3568f5359ba284", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1603ae46520fceb7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/e2e/fixtures/voice.fixture.ts:205"}, "properties": {"repobilityId": "883b6b2c21ef3ce6", "scanner": "scanner-primary", "fingerprint": "1603ae46520fceb7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bf67dd3f2c8b843", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/e2e/voice/mute.spec.ts:68"}, "properties": {"repobilityId": "b9214e66ef5df030", "scanner": "scanner-primary", "fingerprint": "8bf67dd3f2c8b843", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd49c79d460a1bbd", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/config/env.validation.ts:100"}, "properties": {"repobilityId": "a32e73d69d0769cb", "scanner": "scanner-primary", "fingerprint": "fd49c79d460a1bbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c44c84d2b4432f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/storage/storage.service.ts:100"}, "properties": {"repobilityId": "d232249202f96057", "scanner": "scanner-primary", "fingerprint": "2c44c84d2b4432f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0fb0aab750e4d0f", "level": "warning", "message": {"text": "Frontend route `/join/:inviteCode` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "71e0bc20f5ea4772", "scanner": "scanner-primary", "fingerprint": "a0fb0aab750e4d0f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f5d01723e673f7aa", "level": "warning", "message": {"text": "Frontend route `debug/pwa` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "286d4ee178c58a7b", "scanner": "scanner-primary", "fingerprint": "f5d01723e673f7aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f706263b3a0427e1", "level": "warning", "message": {"text": "Frontend route `direct-messages` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c5f5cadaa145f707", "scanner": "scanner-primary", "fingerprint": "f706263b3a0427e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-390ec5e6561347a8", "level": "warning", "message": {"text": "Frontend route `friends` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8eb1a07b3b106020", "scanner": "scanner-primary", "fingerprint": "390ec5e6561347a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17bacb17f6efb788", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7a6f6cf42324831f", "scanner": "scanner-primary", "fingerprint": "17bacb17f6efb788", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1beaedb392ed19e5", "level": "warning", "message": {"text": "Frontend route `admin` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8d633842ce26f141", "scanner": "scanner-primary", "fingerprint": "1beaedb392ed19e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ad96af978bb7b1be", "level": "warning", "message": {"text": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "98134b48586e30c9", "scanner": "scanner-primary", "fingerprint": "ad96af978bb7b1be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5c46330d7f856bdc", "level": "warning", "message": {"text": "Frontend route `communities` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "155997927dbf4977", "scanner": "scanner-primary", "fingerprint": "5c46330d7f856bdc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5eb197416e534e06", "level": "warning", "message": {"text": "Frontend route `invites` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0f2e0a559312c290", "scanner": "scanner-primary", "fingerprint": "5eb197416e534e06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-862ca3874c5e2d76", "level": "warning", "message": {"text": "Frontend route `roles` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "fa83494c17f82e0d", "scanner": "scanner-primary", "fingerprint": "862ca3874c5e2d76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-284186f609910d10", "level": "warning", "message": {"text": "Frontend route `storage` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "31d84412801a6303", "scanner": "scanner-primary", "fingerprint": "284186f609910d10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-981653b693c41aff", "level": "warning", "message": {"text": "Frontend route `debug` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2ff762b0e5722985", "scanner": "scanner-primary", "fingerprint": "981653b693c41aff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-259362a86c934189", "level": "warning", "message": {"text": "Frontend route `debug/notifications` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "9e32778b7283ecad", "scanner": "scanner-primary", "fingerprint": "259362a86c934189", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e247485c822a2b1c", "level": "warning", "message": {"text": "Frontend route `profile/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e382d478626d87ff", "scanner": "scanner-primary", "fingerprint": "e247485c822a2b1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a72a14dd54efda29", "level": "warning", "message": {"text": "Frontend route `profile/:userId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f52085c2837587a8", "scanner": "scanner-primary", "fingerprint": "a72a14dd54efda29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-383efe87d7195aa9", "level": "warning", "message": {"text": "Frontend route `community/create` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "009da6d46b1da08e", "scanner": "scanner-primary", "fingerprint": "383efe87d7195aa9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-710eb609b1858fd5", "level": "warning", "message": {"text": "Frontend route `community/:communityId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7faeedb0ffe7f999", "scanner": "scanner-primary", "fingerprint": "710eb609b1858fd5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8bfe32c4c4c0e0d0", "level": "warning", "message": {"text": "Frontend route `edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "ca51638235316808", "scanner": "scanner-primary", "fingerprint": "8bfe32c4c4c0e0d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-12638a017eba6e3d", "level": "warning", "message": {"text": "Frontend route `channel/:channelId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a74a87b60bed39ae", "scanner": "scanner-primary", "fingerprint": "12638a017eba6e3d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-44112c4a93546d0c", "level": "warning", "message": {"text": "Frontend route `/community/:communityId/channel/:channelId` has no Link/navigate to it \u2014 frontend/src/__tests__/components/AuthGate.test.tsx"}, "properties": {"repobilityId": "20977d1ce7833a58", "scanner": "scanner-primary", "fingerprint": "44112c4a93546d0c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e637b9ee98c0a278", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3000/api/messages/channel/ch-msw?limit=25&continuationToken= (frontend/src/__tests__/integration/queryHooks.test.ts:24)"}, "properties": {"repobilityId": "ce25a64c73444c8f", "scanner": "scanner-primary", "fingerprint": "e637b9ee98c0a278", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-669beca1e4849562", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3000/api/messages/channel/ch-err (frontend/src/__tests__/integration/queryHooks.test.ts:44)"}, "properties": {"repobilityId": "d33535cd726fbf53", "scanner": "scanner-primary", "fingerprint": "669beca1e4849562", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fdc4dbdd5b5de1e0", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3000/api/messages/group/dm-msw?limit=25&continuationToken= (frontend/src/__tests__/integration/queryHooks.test.ts:58)"}, "properties": {"repobilityId": "a2f50ea0d62d4dd9", "scanner": "scanner-primary", "fingerprint": "fdc4dbdd5b5de1e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c65945fc6f42b3d", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3000/api/threads/parent-msw/replies (frontend/src/__tests__/integration/queryHooks.test.ts:73)"}, "properties": {"repobilityId": "05bd0273864c3338", "scanner": "scanner-primary", "fingerprint": "1c65945fc6f42b3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e33c2c31ed18e71", "level": "note", "message": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/refresh"}, "properties": {"repobilityId": "2017278496c78acf", "scanner": "scanner-primary", "fingerprint": "9e33c2c31ed18e71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-347b63779b277a8d", "level": "note", "message": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/join"}, "properties": {"repobilityId": "fd2cd79fd66593f1", "scanner": "scanner-primary", "fingerprint": "347b63779b277a8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba4b9be9f77691dc", "level": "note", "message": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/leave"}, "properties": {"repobilityId": "7b3baad93962dfeb", "scanner": "scanner-primary", "fingerprint": "ba4b9be9f77691dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b33765e1ff7d9336", "level": "note", "message": {"text": "Unused endpoint: POST /channels/:channelId/voice-presence/deafen"}, "properties": {"repobilityId": "23dde74a72838fc4", "scanner": "scanner-primary", "fingerprint": "b33765e1ff7d9336", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a39ed9e52262f81e", "level": "note", "message": {"text": "Unused endpoint: GET /channels/:channelId/voice-presence/me"}, "properties": {"repobilityId": "53e8d33989ae97d3", "scanner": "scanner-primary", "fingerprint": "a39ed9e52262f81e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a58be234783c1bf", "level": "note", "message": {"text": "Unused endpoint: GET /push/vapid-public-key"}, "properties": {"repobilityId": "831cf338c1b4eb0b", "scanner": "scanner-primary", "fingerprint": "8a58be234783c1bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e22b17c985c6cfea", "level": "note", "message": {"text": "Unused endpoint: POST /push/subscribe"}, "properties": {"repobilityId": "ab309aad0832d853", "scanner": "scanner-primary", "fingerprint": "e22b17c985c6cfea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50895a9d89526973", "level": "note", "message": {"text": "Unused endpoint: DELETE /push/unsubscribe"}, "properties": {"repobilityId": "ac64cc66830a3bab", "scanner": "scanner-primary", "fingerprint": "50895a9d89526973", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccc5cfac1a2a9cf1", "level": "note", "message": {"text": "Unused endpoint: GET /push/status"}, "properties": {"repobilityId": "cfb9671b2ac0a208", "scanner": "scanner-primary", "fingerprint": "ccc5cfac1a2a9cf1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e49fa415b0d3b84", "level": "note", "message": {"text": "Unused endpoint: POST /push/test"}, "properties": {"repobilityId": "8aaf9e2b71e27c20", "scanner": "scanner-primary", "fingerprint": "8e49fa415b0d3b84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14106b32ad98ed5e", "level": "note", "message": {"text": "Unused endpoint: POST /push/debug/send-test"}, "properties": {"repobilityId": "db738f9b019f7819", "scanner": "scanner-primary", "fingerprint": "14106b32ad98ed5e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-995dae05d67aa85a", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/unread-count"}, "properties": {"repobilityId": "a5b3998c0187693b", "scanner": "scanner-primary", "fingerprint": "995dae05d67aa85a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ae443c3d8d30b78", "level": "note", "message": {"text": "Unused endpoint: POST /notifications/:id/read"}, "properties": {"repobilityId": "9d98be489dc0fa30", "scanner": "scanner-primary", "fingerprint": "7ae443c3d8d30b78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b93f5ab485027b7", "level": "note", "message": {"text": "Unused endpoint: POST /notifications/read-all"}, "properties": {"repobilityId": "04d0da472abc5b72", "scanner": "scanner-primary", "fingerprint": "1b93f5ab485027b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-73b1da36050e0965", "level": "note", "message": {"text": "Unused endpoint: POST /notifications/:id/dismiss"}, "properties": {"repobilityId": "7444e1a78fcc2ea2", "scanner": "scanner-primary", "fingerprint": "73b1da36050e0965", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b474d0720252b2fc", "level": "note", "message": {"text": "Unused endpoint: DELETE /notifications/:id"}, "properties": {"repobilityId": "824d22c99150ba9d", "scanner": "scanner-primary", "fingerprint": "b474d0720252b2fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9259b8e2524bc53c", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/settings"}, "properties": {"repobilityId": "0199e90b64c482d8", "scanner": "scanner-primary", "fingerprint": "9259b8e2524bc53c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f968c256db279a87", "level": "note", "message": {"text": "Unused endpoint: PUT /notifications/settings"}, "properties": {"repobilityId": "7a9583c88829522f", "scanner": "scanner-primary", "fingerprint": "f968c256db279a87", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab936be2e27e9ea2", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/channels/:channelId/override"}, "properties": {"repobilityId": "cb06df640e49810d", "scanner": "scanner-primary", "fingerprint": "ab936be2e27e9ea2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e66725270be5311a", "level": "note", "message": {"text": "Unused endpoint: PUT /notifications/channels/:channelId/override"}, "properties": {"repobilityId": "6220ae19f09f3003", "scanner": "scanner-primary", "fingerprint": "e66725270be5311a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8dced06fd0c87c9", "level": "note", "message": {"text": "Unused endpoint: DELETE /notifications/channels/:channelId/override"}, "properties": {"repobilityId": "3ceac052d2138710", "scanner": "scanner-primary", "fingerprint": "c8dced06fd0c87c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5a63b0b958e7b89", "level": "note", "message": {"text": "Unused endpoint: POST /notifications/debug/send-test"}, "properties": {"repobilityId": "294bb4c822b4afc7", "scanner": "scanner-primary", "fingerprint": "a5a63b0b958e7b89", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0491ba286d1e683c", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/debug/subscriptions"}, "properties": {"repobilityId": "df7c3509636da697", "scanner": "scanner-primary", "fingerprint": "0491ba286d1e683c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d8687323c97a527", "level": "note", "message": {"text": "Unused endpoint: DELETE /notifications/debug/clear-all"}, "properties": {"repobilityId": "737a2a1b9f989d96", "scanner": "scanner-primary", "fingerprint": "8d8687323c97a527", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-337ef3a36b9ecb12", "level": "note", "message": {"text": "Unused endpoint: GET /alias-groups/community/:communityId"}, "properties": {"repobilityId": "67b5b9da3c43d4a2", "scanner": "scanner-primary", "fingerprint": "337ef3a36b9ecb12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab1aac204f983b5d", "level": "note", "message": {"text": "Unused endpoint: POST /alias-groups/community/:communityId"}, "properties": {"repobilityId": "6079891a10c40f18", "scanner": "scanner-primary", "fingerprint": "ab1aac204f983b5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff022f09c5367390", "level": "note", "message": {"text": "Unused endpoint: GET /alias-groups/:groupId"}, "properties": {"repobilityId": "324cf210c8865396", "scanner": "scanner-primary", "fingerprint": "ff022f09c5367390", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85040424afecc0bf", "level": "note", "message": {"text": "Unused endpoint: PUT /alias-groups/:groupId"}, "properties": {"repobilityId": "ea6f8e259f97b332", "scanner": "scanner-primary", "fingerprint": "85040424afecc0bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6afb86b8e91b02b", "level": "note", "message": {"text": "Unused endpoint: DELETE /alias-groups/:groupId"}, "properties": {"repobilityId": "1077e4c5e4cbc875", "scanner": "scanner-primary", "fingerprint": "b6afb86b8e91b02b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35badaf18fb4db3e", "level": "note", "message": {"text": "Unused endpoint: POST /alias-groups/:groupId/members"}, "properties": {"repobilityId": "5941bce7e6222453", "scanner": "scanner-primary", "fingerprint": "35badaf18fb4db3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38b286641ea36dd0", "level": "note", "message": {"text": "Unused endpoint: DELETE /alias-groups/:groupId/members/:userId"}, "properties": {"repobilityId": "397fe6d837259458", "scanner": "scanner-primary", "fingerprint": "38b286641ea36dd0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42ce6654f5a2f4d7", "level": "note", "message": {"text": "Unused endpoint: PUT /alias-groups/:groupId/members"}, "properties": {"repobilityId": "67c830f6b96a200c", "scanner": "scanner-primary", "fingerprint": "42ce6654f5a2f4d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db36d590123f5f1d", "level": "note", "message": {"text": "Unused endpoint: POST /threads/:parentMessageId/replies"}, "properties": {"repobilityId": "aecf2355f700daf5", "scanner": "scanner-primary", "fingerprint": "db36d590123f5f1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1043fd51b7b40e7", "level": "note", "message": {"text": "Unused endpoint: GET /threads/:parentMessageId/replies"}, "properties": {"repobilityId": "e2c6ba9f42afddff", "scanner": "scanner-primary", "fingerprint": "d1043fd51b7b40e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fcd12e16a4e31eee", "level": "note", "message": {"text": "Unused endpoint: GET /threads/:parentMessageId/metadata"}, "properties": {"repobilityId": "03512dbfb3000b0c", "scanner": "scanner-primary", "fingerprint": "fcd12e16a4e31eee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f4d2eef750c294a", "level": "note", "message": {"text": "Unused endpoint: POST /threads/:parentMessageId/subscribe"}, "properties": {"repobilityId": "957b8158097df0a2", "scanner": "scanner-primary", "fingerprint": "4f4d2eef750c294a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b5c8005221cf0f9d", "level": "note", "message": {"text": "Unused endpoint: DELETE /threads/:parentMessageId/subscribe"}, "properties": {"repobilityId": "21dbe818e3c83819", "scanner": "scanner-primary", "fingerprint": "b5c8005221cf0f9d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fdbacfe9430a6ed", "level": "note", "message": {"text": "Unused endpoint: POST /auth/login"}, "properties": {"repobilityId": "743b1ea2f563f80c", "scanner": "scanner-primary", "fingerprint": "8fdbacfe9430a6ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b36892106ecdc9aa", "level": "note", "message": {"text": "Unused endpoint: POST /auth/refresh"}, "properties": {"repobilityId": "a0b243d33b738ce6", "scanner": "scanner-primary", "fingerprint": "b36892106ecdc9aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c059f57186114027", "level": "note", "message": {"text": "Unused endpoint: POST /auth/logout"}, "properties": {"repobilityId": "b934ec61e8e1c247", "scanner": "scanner-primary", "fingerprint": "c059f57186114027", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d27d9656224c1a06", "level": "note", "message": {"text": "Unused endpoint: GET /auth/sessions"}, "properties": {"repobilityId": "b4b349b117a42beb", "scanner": "scanner-primary", "fingerprint": "d27d9656224c1a06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f68a0f475387a68", "level": "note", "message": {"text": "Unused endpoint: DELETE /auth/sessions/:sessionId"}, "properties": {"repobilityId": "e426bd2415c69260", "scanner": "scanner-primary", "fingerprint": "7f68a0f475387a68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a578745246f2e74a", "level": "note", "message": {"text": "Unused endpoint: DELETE /auth/sessions"}, "properties": {"repobilityId": "c25fc7d74a1eab98", "scanner": "scanner-primary", "fingerprint": "a578745246f2e74a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-137c28eabf611b77", "level": "note", "message": {"text": "Unused endpoint: GET /instance/settings/public"}, "properties": {"repobilityId": "55f2a739e3cac4f9", "scanner": "scanner-primary", "fingerprint": "137c28eabf611b77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-997492c9a7cc39b4", "level": "note", "message": {"text": "Unused endpoint: GET /instance/settings"}, "properties": {"repobilityId": "a7ed9ec62d7d7921", "scanner": "scanner-primary", "fingerprint": "997492c9a7cc39b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34a58b61ad738672", "level": "note", "message": {"text": "Unused endpoint: PATCH /instance/settings"}, "properties": {"repobilityId": "1176f0539fef0e06", "scanner": "scanner-primary", "fingerprint": "34a58b61ad738672", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47bbe95b9492a727", "level": "note", "message": {"text": "Unused endpoint: GET /instance/stats"}, "properties": {"repobilityId": "9cad1153608deaac", "scanner": "scanner-primary", "fingerprint": "47bbe95b9492a727", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-528393c0583ca96b", "level": "note", "message": {"text": "Unused endpoint: GET /invite/public/:code"}, "properties": {"repobilityId": "9a6f76ee38d3da0f", "scanner": "scanner-primary", "fingerprint": "528393c0583ca96b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e138c460b03bbd16", "level": "note", "message": {"text": "Unused endpoint: GET /invite/:code"}, "properties": {"repobilityId": "e91ff546c32c076e", "scanner": "scanner-primary", "fingerprint": "e138c460b03bbd16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e350b16e9963518", "level": "note", "message": {"text": "Unused endpoint: DELETE /invite/:code"}, "properties": {"repobilityId": "98f5ac96a6338df5", "scanner": "scanner-primary", "fingerprint": "2e350b16e9963518", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}