{"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-75acbafc71ed1da9", "name": "Possibly dead Python function: do_run_migrations", "shortDescription": {"text": "Possibly dead Python function: do_run_migrations"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-582763bc39e9676b", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-96efe24ee1ccf7b7", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7965c3c3796488e", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d77c3f52f31b333", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e37662295484fbec", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-95129c6795f674cc", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5ed32ecb1101cef", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b21335e18c5f79fe", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f25e7c1e5d565030", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc7c7613a108b6e3", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b9b01d769e4ee1b", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6d1604d63e7153f", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f19292ada8bf8c85", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13a1601370ba808c", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73ca1ecda64cb819", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5aa5c54075712f08", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ea11f2bcef3dcf9", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-105678514f4a767f", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1484ede67a64f58f", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4dfaaa6f5de85fcf", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-148ec6bc429277e2", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d617fccfde4354fa", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a6b44e9528294fa", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a416461bd6231547", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31db6fd00dcb247b", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4607a8eda94999d8", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aeb9b52aed8c7a82", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e1f8286b7054f904", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f2174df10a816d1", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1cdd666bea58917f", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/stores/webPush.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/stores/webPush.js:7"}, "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-eb586432d3078c2e", "name": "Dockerfile runs as root: tools/pre-commit/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: tools/pre-commit/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-76a26e92cc977412", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim-trixie", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim-trixie"}, "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-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-64b75c48b44565b2", "name": "Docker base image is tag-pinned but not digest-pinned: node:26-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:26-alpine"}, "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-4c7f68c1bf08a7cb", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:1.31-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:1.31-alpine"}, "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-8a1ac55edccf01f4", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-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-1b68e8b04cb5f25d", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-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-5b54c0de25f0ca1b", "name": "Dockerfile runs as root: mobile/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: mobile/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-1159230cf4a5c79d", "name": "Docker base image is tag-pinned but not digest-pinned: eclipse-temurin:21-jdk-jammy", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: eclipse-temurin:21-jdk-jammy"}, "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-a23fdac1b63d38a4", "name": "Possible secret in .github/workflows/ci.yml", "shortDescription": {"text": "Possible secret in .github/workflows/ci.yml"}, "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-6b5d70a11c3a16cc", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/api/client.js:46", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/api/client.js:46"}, "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-a8fd3b9a1ef3afb4", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/stores/auth.js:40", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/stores/auth.js:40"}, "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-a5ac75833bbb2ee1", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/views/OidcCallbackView.vue:58", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/views/OidcCallbackView.vue:58"}, "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-8c9dc7a3df1592a8", "name": "Insecure pattern 'vue_v_html' in frontend/src/views/IncidentsView.vue:180", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in frontend/src/views/IncidentsView.vue:180"}, "fullDescription": {"text": "Found a known-risky pattern (vue_v_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4465fe64f00a45e2", "name": "Insecure pattern 'vue_v_html' in frontend/src/components/monitors/detail/MonitorRunbookTab.vue:43", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in frontend/src/components/monitors/detail/MonitorRunbookTab.vue:43"}, "fullDescription": {"text": "Found a known-risky pattern (vue_v_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dca0699d40c35092", "name": "Insecure pattern 'direct_innerhtml_assignment' in extension/popup/popup.js:168", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/popup/popup.js:168"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1838a141491ce38c", "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-cbe310f193a6df9f", "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-a1cf019b3a7f500d", "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-400ea89b4420ee9f", "name": "Very large file: frontend/src/i18n/fr.js (1539 lines)", "shortDescription": {"text": "Very large file: frontend/src/i18n/fr.js (1539 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-64858ba1a9e05ca3", "name": "Very large file: frontend/src/i18n/en.js (1572 lines)", "shortDescription": {"text": "Very large file: frontend/src/i18n/en.js (1572 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-e368d738126afdf2", "name": "Very large file: server/whatisup/api/v1/monitors.py (1947 lines)", "shortDescription": {"text": "Very large file: server/whatisup/api/v1/monitors.py (1947 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 15 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 23 placeholder/mock markers across 4 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 license. 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-b7c0ea9ce3bee69d", "name": "Commented-code block (6 lines) in frontend/tests/monitors.test.js:98", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/tests/monitors.test.js:98"}, "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-36304a1980d9f5c4", "name": "Commented-code block (5 lines) in frontend/src/composables/useMonitorTabs.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/composables/useMonitorTabs.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f8f9378e2f4ad5d", "name": "Commented-code block (5 lines) in frontend/src/components/monitors/detail/injectionKeys.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/monitors/detail/injectionKeys.js:1"}, "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-f0fc23d00765fd30", "name": "Commented-code block (5 lines) in frontend/src/lib/pushNotifications.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/pushNotifications.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c0b6b2c67d8db36", "name": "Commented-code block (6 lines) in frontend/src/lib/appVersion.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/appVersion.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7c4b76e1eb330ed", "name": "Legacy-named symbol `inc_old` in server/tests/test_probes.py:352", "shortDescription": {"text": "Legacy-named symbol `inc_old` in server/tests/test_probes.py:352"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e24a619ff73656c5", "name": "Legacy-named symbol `_push_legacy` in server/tests/test_health_engine_legacy_coexistence.py:83", "shortDescription": {"text": "Legacy-named symbol `_push_legacy` in server/tests/test_health_engine_legacy_coexistence.py:83"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7f6014f8cd99def", "name": "Legacy-named symbol `test_incident_default_trigger_kind_is_legacy` in server/tests/test_health_state_model.py:94", "shortDescription": {"text": "Legacy-named symbol `test_incident_default_trigger_kind_is_legacy` in server/tests/test_health_state_model.py:94"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec46aecb2f580892", "name": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/b3c4d5e6f7a8_merge_heads.py:15", "shortDescription": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/b3c4d5e6f7a8_merge_heads.py:15"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27ce5b614280474f", "name": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/394eaf748eaf_merge_v032_features.py:23", "shortDescription": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/394eaf748eaf_merge_v032_features.py:23"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6b313e3dfef9dbf", "name": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/e358d5d5ca4d_merge_v0110.py:23", "shortDescription": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/e358d5d5ca4d_merge_v0110.py:23"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8245827df35771b", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/u6v7w8x9y0z1_drop_uptime_below.py:32", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/u6v7w8x9y0z1_drop_uptime_below.py:32"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4de5c4199baf56a6", "name": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/g0h1i2j3k4l5_merge_heads.py:21", "shortDescription": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/g0h1i2j3k4l5_merge_heads.py:21"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e65e777ef199b89", "name": "Commented-code block (7 lines) in server/whatisup/main.py:247", "shortDescription": {"text": "Commented-code block (7 lines) in server/whatisup/main.py:247"}, "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-0f65e5916523e563", "name": "Commented-code block (5 lines) in server/whatisup/api/v1/monitors.py:173", "shortDescription": {"text": "Commented-code block (5 lines) in server/whatisup/api/v1/monitors.py:173"}, "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-1be792dd52cf35f4", "name": "Commented-code block (5 lines) in server/whatisup/models/probe.py:50", "shortDescription": {"text": "Commented-code block (5 lines) in server/whatisup/models/probe.py:50"}, "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-6cf945b5c9d20635", "name": "Commented-code block (5 lines) in server/whatisup/models/alert.py:100", "shortDescription": {"text": "Commented-code block (5 lines) in server/whatisup/models/alert.py: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-9d3a5d9f832e09d4", "name": "Commented-code block (5 lines) in server/whatisup/services/incident.py:322", "shortDescription": {"text": "Commented-code block (5 lines) in server/whatisup/services/incident.py:322"}, "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-e46e8c02909b8fdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 extension/background.js:240", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 extension/background.js:240"}, "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-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AUTO_REGISTER_PROBE`, `DEV`, `EXTENSION_DIR`, `FCM_SERVICE_ACCOUNT_JSON`, `FCM_SERVICE_ACCOUNT_PATH`, `VITE_API_TARGET`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/alembic/versions/q2r3s4t5u6v7_add_signal_channel_type.py:downgrade, server/alembic/versions/s4t5u6v7w8x9_add_fcm_channel_type.py:downgrade\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/alembic/versions/b3c4d5e6f7a8_merge_heads.py:upgrade, server/alembic/versions/394eaf748eaf_merge_v032_features.py:upgrade, server/alembic/versions/e358d5d5ca4d_merge_v0110.py:upgrade, server/alembic/versions/g0h1i2j3k4l5_merge_heads.py:upgrade\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/alembic/versions/b3c4d5e6f7a8_merge_heads.py:downgrade, server/alembic/versions/394eaf748eaf_merge_v032_features.py:downgrade, server/alembic/versions/e358d5d5ca4d_merge_v0110.py:downgrade, server/alembic/versions/u6v7w8x9y0z1_drop_uptime_below.py:downgrade\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/whatisup/api/v1/incident_updates.py:acknowledge_incident, server/whatisup/api/v1/incident_updates.py:unsnooze_incident, server/whatisup/api/v1/incident_updates.py:unacknowledge_incident\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-380b7cb95b387b9c", "name": "Near-duplicate function bodies in 11 places", "shortDescription": {"text": "Near-duplicate function bodies in 11 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/whatisup/services/channels/teams.py:send, server/whatisup/services/channels/discord.py:send, server/whatisup/services/channels/telegram.py:send, server/whatisup/services/channels/pagerduty.py:send\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-df5f380a71183949", "name": "JS POST `/admin/users` admin endpoint without auth \u2014 frontend/src/api/admin.js:5", "shortDescription": {"text": "JS POST `/admin/users` admin endpoint without auth \u2014 frontend/src/api/admin.js:5"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9d8aab54281130b1", "name": "JS PATCH `/admin/users/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:6", "shortDescription": {"text": "JS PATCH `/admin/users/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:6"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-114ec25ff73e8305", "name": "JS DELETE `/admin/users/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:7", "shortDescription": {"text": "JS DELETE `/admin/users/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:7"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8dae12d9cbc9ba2e", "name": "JS POST `/admin/probe-groups` admin endpoint without auth \u2014 frontend/src/api/admin.js:11", "shortDescription": {"text": "JS POST `/admin/probe-groups` admin endpoint without auth \u2014 frontend/src/api/admin.js:11"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-78aecba785cafc2d", "name": "JS PATCH `/admin/probe-groups/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:12", "shortDescription": {"text": "JS PATCH `/admin/probe-groups/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:12"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-421626699a1a79ee", "name": "JS DELETE `/admin/probe-groups/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:13", "shortDescription": {"text": "JS DELETE `/admin/probe-groups/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:13"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2a6d1f0f51d4a161", "name": "JS POST `/admin/probe-groups/${groupId}/probes` admin endpoint without auth \u2014 frontend/src/api/admin.js:14", "shortDescription": {"text": "JS POST `/admin/probe-groups/${groupId}/probes` admin endpoint without auth \u2014 frontend/src/api/admin.js:14"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f02e535b57719d44", "name": "JS DELETE `/admin/probe-groups/${groupId}/probes/${probeId}` admin endpoint without auth \u2014 frontend/src/api/admin.js:15", "shortDescription": {"text": "JS DELETE `/admin/probe-groups/${groupId}/probes/${probeId}` admin endpoint without auth \u2014 frontend/src/api/admin.js:15"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ce2e05b821431408", "name": "JS POST `/admin/probe-groups/${groupId}/users` admin endpoint without auth \u2014 frontend/src/api/admin.js:16", "shortDescription": {"text": "JS POST `/admin/probe-groups/${groupId}/users` admin endpoint without auth \u2014 frontend/src/api/admin.js:16"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-57c913ecbd54f749", "name": "JS DELETE `/admin/probe-groups/${groupId}/users/${userId}` admin endpoint without auth \u2014 frontend/src/api/admin.js:17", "shortDescription": {"text": "JS DELETE `/admin/probe-groups/${groupId}/users/${userId}` admin endpoint without auth \u2014 frontend/src/api/admin.js:17"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0027c8a1007512cc", "name": "JS PUT `/admin/settings/oidc` admin endpoint without auth \u2014 frontend/src/api/admin.js:20", "shortDescription": {"text": "JS PUT `/admin/settings/oidc` admin endpoint without auth \u2014 frontend/src/api/admin.js:20"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24aa268643d48bb3", "name": "FastAPI POST `heartbeat_ping` without auth dependency \u2014 server/whatisup/api/v1/ping.py:21", "shortDescription": {"text": "FastAPI POST `heartbeat_ping` without auth dependency \u2014 server/whatisup/api/v1/ping.py:21"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-489a632030aca413", "name": "FastAPI POST `verify_totp` without auth dependency \u2014 server/whatisup/api/v1/totp.py:177", "shortDescription": {"text": "FastAPI POST `verify_totp` without auth dependency \u2014 server/whatisup/api/v1/totp.py:177"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e67b1ccce43e3df4", "name": "FastAPI POST `heartbeat` without auth dependency \u2014 server/whatisup/api/v1/probes.py:185", "shortDescription": {"text": "FastAPI POST `heartbeat` without auth dependency \u2014 server/whatisup/api/v1/probes.py:185"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-22b13749fc2a00c9", "name": "FastAPI POST `push_diagnostics` without auth dependency \u2014 server/whatisup/api/v1/probes.py:301", "shortDescription": {"text": "FastAPI POST `push_diagnostics` without auth dependency \u2014 server/whatisup/api/v1/probes.py:301"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a720d3e5d56290c", "name": "FastAPI POST `push_result` without auth dependency \u2014 server/whatisup/api/v1/probes.py:355", "shortDescription": {"text": "FastAPI POST `push_result` without auth dependency \u2014 server/whatisup/api/v1/probes.py:355"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1d3e1fca06ebfad4", "name": "FastAPI POST `subscribe_status` without auth dependency \u2014 server/whatisup/api/v1/public.py:384", "shortDescription": {"text": "FastAPI POST `subscribe_status` without auth dependency \u2014 server/whatisup/api/v1/public.py:384"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-22dcf9343b859ba0", "name": "FastAPI POST `refresh` without auth dependency \u2014 server/whatisup/api/v1/auth.py:127", "shortDescription": {"text": "FastAPI POST `refresh` without auth dependency \u2014 server/whatisup/api/v1/auth.py:127"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24387"}, "properties": {"repository": "AurevLan/WhatIsUp", "repoUrl": "https://github.com/AurevLan/WhatIsUp", "branch": "main"}, "results": [{"ruleId": "scanner-75acbafc71ed1da9", "level": "note", "message": {"text": "Possibly dead Python function: do_run_migrations"}, "properties": {"repobilityId": "087acb17722cfd2f", "scanner": "scanner-primary", "fingerprint": "75acbafc71ed1da9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/env.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-582763bc39e9676b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "582763bc39e9676b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/b2c3d4e5f6a7_v030_scenario.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-96efe24ee1ccf7b7", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "96efe24ee1ccf7b7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/b2c3d4e5f6a7_v030_scenario.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7965c3c3796488e", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "e7965c3c3796488e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/e3f4a5b6c7d8_alert_rule_enabled.py:18"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9d77c3f52f31b333", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "9d77c3f52f31b333", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/e3f4a5b6c7d8_alert_rule_enabled.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e37662295484fbec", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "e37662295484fbec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/c9d0e1f2a3b4_custom_metrics.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-95129c6795f674cc", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "95129c6795f674cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/c9d0e1f2a3b4_custom_metrics.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d5ed32ecb1101cef", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "d5ed32ecb1101cef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/f6a7b8c9d0e1_advanced_assertions.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b21335e18c5f79fe", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "b21335e18c5f79fe", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/f6a7b8c9d0e1_advanced_assertions.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f25e7c1e5d565030", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "f25e7c1e5d565030", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/n7p8q9r0s1t2_add_custom_headers.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc7c7613a108b6e3", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "cc7c7613a108b6e3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/n7p8q9r0s1t2_add_custom_headers.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b9b01d769e4ee1b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "9b9b01d769e4ee1b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/f0a1b2c3d4e5_add_web_push_subscriptions.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a6d1604d63e7153f", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a6d1604d63e7153f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/f0a1b2c3d4e5_add_web_push_subscriptions.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f19292ada8bf8c85", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "f19292ada8bf8c85", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/s5t6u7v8w9x0_add_chat_channels_and_ssl_advanced.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-13a1601370ba808c", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "13a1601370ba808c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/s5t6u7v8w9x0_add_chat_channels_and_ssl_advanced.py:38"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-73ca1ecda64cb819", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "73ca1ecda64cb819", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/j2k3l4m5n6o7_probe_self_reported_ip.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5aa5c54075712f08", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "5aa5c54075712f08", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/j2k3l4m5n6o7_probe_self_reported_ip.py:35"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ea11f2bcef3dcf9", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "5ea11f2bcef3dcf9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/283efc2c973a_add_probe_groups.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-105678514f4a767f", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "105678514f4a767f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/283efc2c973a_add_probe_groups.py:85"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1484ede67a64f58f", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "1484ede67a64f58f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/c1d2e3f4a5b6_monitor_dependencies_incident_groups.py:18"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4dfaaa6f5de85fcf", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "4dfaaa6f5de85fcf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/c1d2e3f4a5b6_monitor_dependencies_incident_groups.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-148ec6bc429277e2", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "148ec6bc429277e2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/o1p2q3r4s5t6_add_dns_nameservers.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d617fccfde4354fa", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "d617fccfde4354fa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/o1p2q3r4s5t6_add_dns_nameservers.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6a6b44e9528294fa", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "6a6b44e9528294fa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/a0b1c2d3e4f5_alertrule_owner_required.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a416461bd6231547", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a416461bd6231547", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/a0b1c2d3e4f5_alertrule_owner_required.py:61"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-31db6fd00dcb247b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "31db6fd00dcb247b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/d6e7f8a9b0c1_add_user_timezone.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4607a8eda94999d8", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "4607a8eda94999d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/d6e7f8a9b0c1_add_user_timezone.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aeb9b52aed8c7a82", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "aeb9b52aed8c7a82", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/i1j2k3l4m5n6_smart_alerts_correlations.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e1f8286b7054f904", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "e1f8286b7054f904", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/i1j2k3l4m5n6_smart_alerts_correlations.py:70"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9f2174df10a816d1", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "9f2174df10a816d1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/alembic/versions/n1o2p3q4r5s6_add_onboarding.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1cdd666bea58917f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/stores/webPush.js:7"}, "properties": {"repobilityId": "a39360571cbb60c6", "scanner": "scanner-primary", "fingerprint": "1cdd666bea58917f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb586432d3078c2e", "level": "warning", "message": {"text": "Dockerfile runs as root: tools/pre-commit/Dockerfile"}, "properties": {"repobilityId": "7188e5ce59bf94b9", "scanner": "scanner-primary", "fingerprint": "eb586432d3078c2e", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-76a26e92cc977412", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim-trixie"}, "properties": {"repobilityId": "7ae72832bec1044e", "scanner": "scanner-primary", "fingerprint": "76a26e92cc977412", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/pre-commit/Dockerfile"}, "region": {"startLine": 8}}}]}, {"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-64b75c48b44565b2", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:26-alpine"}, "properties": {"repobilityId": "a7abc4bffdac3ab6", "scanner": "scanner-primary", "fingerprint": "64b75c48b44565b2", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c7f68c1bf08a7cb", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:1.31-alpine"}, "properties": {"repobilityId": "ec3af050c3ca3eaf", "scanner": "scanner-primary", "fingerprint": "4c7f68c1bf08a7cb", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-8a1ac55edccf01f4", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim"}, "properties": {"repobilityId": "7b5c812753a67bd9", "scanner": "scanner-primary", "fingerprint": "8a1ac55edccf01f4", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-8a1ac55edccf01f4", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim"}, "properties": {"repobilityId": "f03088e2aa86e0e8", "scanner": "scanner-primary", "fingerprint": "8a1ac55edccf01f4", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/Dockerfile"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-1b68e8b04cb5f25d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim"}, "properties": {"repobilityId": "b5076d08f1f82daa", "scanner": "scanner-primary", "fingerprint": "1b68e8b04cb5f25d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "probe/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-1b68e8b04cb5f25d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim"}, "properties": {"repobilityId": "84d4209cdb75d461", "scanner": "scanner-primary", "fingerprint": "1b68e8b04cb5f25d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "probe/Dockerfile"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-5b54c0de25f0ca1b", "level": "warning", "message": {"text": "Dockerfile runs as root: mobile/Dockerfile"}, "properties": {"repobilityId": "96fc9685edf3c1e6", "scanner": "scanner-primary", "fingerprint": "5b54c0de25f0ca1b", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-1159230cf4a5c79d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: eclipse-temurin:21-jdk-jammy"}, "properties": {"repobilityId": "d8d420c3d33dc867", "scanner": "scanner-primary", "fingerprint": "1159230cf4a5c79d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mobile/Dockerfile"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-a23fdac1b63d38a4", "level": "error", "message": {"text": "Possible secret in .github/workflows/ci.yml"}, "properties": {"repobilityId": "f537e33a05dd0cf9", "scanner": "scanner-primary", "fingerprint": "a23fdac1b63d38a4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-6b5d70a11c3a16cc", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/api/client.js:46"}, "properties": {"repobilityId": "df17428e3abfab2d", "scanner": "scanner-primary", "fingerprint": "6b5d70a11c3a16cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/client.js"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-a8fd3b9a1ef3afb4", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/stores/auth.js:40"}, "properties": {"repobilityId": "e2af3f000598ddcd", "scanner": "scanner-primary", "fingerprint": "a8fd3b9a1ef3afb4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/stores/auth.js"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-a5ac75833bbb2ee1", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/views/OidcCallbackView.vue:58"}, "properties": {"repobilityId": "94159e3f0c314113", "scanner": "scanner-primary", "fingerprint": "a5ac75833bbb2ee1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/views/OidcCallbackView.vue"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-8c9dc7a3df1592a8", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in frontend/src/views/IncidentsView.vue:180"}, "properties": {"repobilityId": "71636d9909d05692", "scanner": "scanner-primary", "fingerprint": "8c9dc7a3df1592a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/views/IncidentsView.vue"}, "region": {"startLine": 180}}}]}, {"ruleId": "scanner-4465fe64f00a45e2", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in frontend/src/components/monitors/detail/MonitorRunbookTab.vue:43"}, "properties": {"repobilityId": "4eda99a11e784869", "scanner": "scanner-primary", "fingerprint": "4465fe64f00a45e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/monitors/detail/MonitorRunbookTab.vue"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-dca0699d40c35092", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/popup/popup.js:168"}, "properties": {"repobilityId": "bd6a0de99d5d1487", "scanner": "scanner-primary", "fingerprint": "dca0699d40c35092", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/popup/popup.js"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cbe310f193a6df9f", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "573212e145c44806", "scanner": "scanner-primary", "fingerprint": "cbe310f193a6df9f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-please.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a1cf019b3a7f500d", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "e726ccb9b3ea29ba", "scanner": "scanner-primary", "fingerprint": "a1cf019b3a7f500d", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mobile-release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-400ea89b4420ee9f", "level": "note", "message": {"text": "Very large file: frontend/src/i18n/fr.js (1539 lines)"}, "properties": {"repobilityId": "09fc34716252a404", "scanner": "scanner-primary", "fingerprint": "400ea89b4420ee9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-64858ba1a9e05ca3", "level": "note", "message": {"text": "Very large file: frontend/src/i18n/en.js (1572 lines)"}, "properties": {"repobilityId": "019e4c70ba9a9035", "scanner": "scanner-primary", "fingerprint": "64858ba1a9e05ca3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e368d738126afdf2", "level": "note", "message": {"text": "Very large file: server/whatisup/api/v1/monitors.py (1947 lines)"}, "properties": {"repobilityId": "4fe233c46ee8b100", "scanner": "scanner-primary", "fingerprint": "e368d738126afdf2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "224a4d0389a2724b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "1f65bd9410875182", "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": "be6008527992887b", "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": "862c6502eff48da9", "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": "6ecba6e7bbd19079", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b7c0ea9ce3bee69d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/tests/monitors.test.js:98"}, "properties": {"repobilityId": "4301066be3cec8f7", "scanner": "scanner-primary", "fingerprint": "b7c0ea9ce3bee69d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36304a1980d9f5c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/composables/useMonitorTabs.js:3"}, "properties": {"repobilityId": "b0a5c65290b487b8", "scanner": "scanner-primary", "fingerprint": "36304a1980d9f5c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f8f9378e2f4ad5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/monitors/detail/injectionKeys.js:1"}, "properties": {"repobilityId": "2e77275dc9f647ca", "scanner": "scanner-primary", "fingerprint": "2f8f9378e2f4ad5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0fc23d00765fd30", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/pushNotifications.js:6"}, "properties": {"repobilityId": "bd8ccdfe82f10a18", "scanner": "scanner-primary", "fingerprint": "f0fc23d00765fd30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c0b6b2c67d8db36", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/appVersion.js:3"}, "properties": {"repobilityId": "54873408c3ee8a44", "scanner": "scanner-primary", "fingerprint": "1c0b6b2c67d8db36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7c4b76e1eb330ed", "level": "note", "message": {"text": "Legacy-named symbol `inc_old` in server/tests/test_probes.py:352"}, "properties": {"repobilityId": "2d87ced87da61058", "scanner": "scanner-primary", "fingerprint": "f7c4b76e1eb330ed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e24a619ff73656c5", "level": "note", "message": {"text": "Legacy-named symbol `_push_legacy` in server/tests/test_health_engine_legacy_coexistence.py:83"}, "properties": {"repobilityId": "3b24f6be75b664f4", "scanner": "scanner-primary", "fingerprint": "e24a619ff73656c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f7f6014f8cd99def", "level": "note", "message": {"text": "Legacy-named symbol `test_incident_default_trigger_kind_is_legacy` in server/tests/test_health_state_model.py:94"}, "properties": {"repobilityId": "b89adfad7d698e25", "scanner": "scanner-primary", "fingerprint": "f7f6014f8cd99def", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ec46aecb2f580892", "level": "note", "message": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/b3c4d5e6f7a8_merge_heads.py:15"}, "properties": {"repobilityId": "f877f9244d15571e", "scanner": "scanner-primary", "fingerprint": "ec46aecb2f580892", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-27ce5b614280474f", "level": "note", "message": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/394eaf748eaf_merge_v032_features.py:23"}, "properties": {"repobilityId": "ef006af0bbcdb6d5", "scanner": "scanner-primary", "fingerprint": "27ce5b614280474f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-e6b313e3dfef9dbf", "level": "note", "message": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/e358d5d5ca4d_merge_v0110.py:23"}, "properties": {"repobilityId": "0b6a78495b721692", "scanner": "scanner-primary", "fingerprint": "e6b313e3dfef9dbf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-c8245827df35771b", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/u6v7w8x9y0z1_drop_uptime_below.py:32"}, "properties": {"repobilityId": "e51711fd1fc6b3e2", "scanner": "scanner-primary", "fingerprint": "c8245827df35771b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-4de5c4199baf56a6", "level": "note", "message": {"text": "Stub function `upgrade` (body is just `pass`/`return`) \u2014 server/alembic/versions/g0h1i2j3k4l5_merge_heads.py:21"}, "properties": {"repobilityId": "5f6478706c90e67a", "scanner": "scanner-primary", "fingerprint": "4de5c4199baf56a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-7e65e777ef199b89", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/whatisup/main.py:247"}, "properties": {"repobilityId": "c2816a303e46372c", "scanner": "scanner-primary", "fingerprint": "7e65e777ef199b89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f65e5916523e563", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/whatisup/api/v1/monitors.py:173"}, "properties": {"repobilityId": "ec89314a6e9424c0", "scanner": "scanner-primary", "fingerprint": "0f65e5916523e563", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1be792dd52cf35f4", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/whatisup/models/probe.py:50"}, "properties": {"repobilityId": "d679d007e924fe6d", "scanner": "scanner-primary", "fingerprint": "1be792dd52cf35f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6cf945b5c9d20635", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/whatisup/models/alert.py:100"}, "properties": {"repobilityId": "5b690345399cdbe8", "scanner": "scanner-primary", "fingerprint": "6cf945b5c9d20635", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d3a5d9f832e09d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/whatisup/services/incident.py:322"}, "properties": {"repobilityId": "4eee24bf2a68566f", "scanner": "scanner-primary", "fingerprint": "9d3a5d9f832e09d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e46e8c02909b8fdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 extension/background.js:240"}, "properties": {"repobilityId": "6180d58bb6d0429f", "scanner": "scanner-primary", "fingerprint": "e46e8c02909b8fdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "ff4099f739b6cabd", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "90ba19473b44a620", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "8a7967f81cfc6270", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9302c087cea6f2a3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "264eb11fa662246c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "d8943324823e9018", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b6b3a6b1070b69e9", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "11bdae4909131021", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "bf7baa71ea79461f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0c8b449d4017e8de", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2e5bf892cc60bd1d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c275737c631b7b8a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "ca25d44ea4425796", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a2fd8200c95811a0", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-df5f380a71183949", "level": "error", "message": {"text": "JS POST `/admin/users` admin endpoint without auth \u2014 frontend/src/api/admin.js:5"}, "properties": {"repobilityId": "546e16c3ada6a118", "scanner": "scanner-primary", "fingerprint": "df5f380a71183949", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-9d8aab54281130b1", "level": "error", "message": {"text": "JS PATCH `/admin/users/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:6"}, "properties": {"repobilityId": "3f1eef2c0d390030", "scanner": "scanner-primary", "fingerprint": "9d8aab54281130b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-114ec25ff73e8305", "level": "error", "message": {"text": "JS DELETE `/admin/users/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:7"}, "properties": {"repobilityId": "79abe97f96f58b4e", "scanner": "scanner-primary", "fingerprint": "114ec25ff73e8305", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-8dae12d9cbc9ba2e", "level": "error", "message": {"text": "JS POST `/admin/probe-groups` admin endpoint without auth \u2014 frontend/src/api/admin.js:11"}, "properties": {"repobilityId": "b18715f6eebbb729", "scanner": "scanner-primary", "fingerprint": "8dae12d9cbc9ba2e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-78aecba785cafc2d", "level": "error", "message": {"text": "JS PATCH `/admin/probe-groups/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:12"}, "properties": {"repobilityId": "799be42b0d08c33d", "scanner": "scanner-primary", "fingerprint": "78aecba785cafc2d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-421626699a1a79ee", "level": "error", "message": {"text": "JS DELETE `/admin/probe-groups/${id}` admin endpoint without auth \u2014 frontend/src/api/admin.js:13"}, "properties": {"repobilityId": "ce27c2ed2fb0d3ff", "scanner": "scanner-primary", "fingerprint": "421626699a1a79ee", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-2a6d1f0f51d4a161", "level": "error", "message": {"text": "JS POST `/admin/probe-groups/${groupId}/probes` admin endpoint without auth \u2014 frontend/src/api/admin.js:14"}, "properties": {"repobilityId": "86a94e9e45bc21f7", "scanner": "scanner-primary", "fingerprint": "2a6d1f0f51d4a161", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-f02e535b57719d44", "level": "error", "message": {"text": "JS DELETE `/admin/probe-groups/${groupId}/probes/${probeId}` admin endpoint without auth \u2014 frontend/src/api/admin.js:15"}, "properties": {"repobilityId": "99f91f10127f19dc", "scanner": "scanner-primary", "fingerprint": "f02e535b57719d44", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-ce2e05b821431408", "level": "error", "message": {"text": "JS POST `/admin/probe-groups/${groupId}/users` admin endpoint without auth \u2014 frontend/src/api/admin.js:16"}, "properties": {"repobilityId": "fcb9ff49519e73f3", "scanner": "scanner-primary", "fingerprint": "ce2e05b821431408", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-57c913ecbd54f749", "level": "error", "message": {"text": "JS DELETE `/admin/probe-groups/${groupId}/users/${userId}` admin endpoint without auth \u2014 frontend/src/api/admin.js:17"}, "properties": {"repobilityId": "4b8caf09522fe566", "scanner": "scanner-primary", "fingerprint": "57c913ecbd54f749", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-0027c8a1007512cc", "level": "error", "message": {"text": "JS PUT `/admin/settings/oidc` admin endpoint without auth \u2014 frontend/src/api/admin.js:20"}, "properties": {"repobilityId": "2f0fd1cf809d628f", "scanner": "scanner-primary", "fingerprint": "0027c8a1007512cc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/admin.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-24aa268643d48bb3", "level": "error", "message": {"text": "FastAPI POST `heartbeat_ping` without auth dependency \u2014 server/whatisup/api/v1/ping.py:21"}, "properties": {"repobilityId": "2397618ba00d1d0c", "scanner": "scanner-primary", "fingerprint": "24aa268643d48bb3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/ping.py"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-489a632030aca413", "level": "error", "message": {"text": "FastAPI POST `verify_totp` without auth dependency \u2014 server/whatisup/api/v1/totp.py:177"}, "properties": {"repobilityId": "464a032105868598", "scanner": "scanner-primary", "fingerprint": "489a632030aca413", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/totp.py"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-e67b1ccce43e3df4", "level": "error", "message": {"text": "FastAPI POST `heartbeat` without auth dependency \u2014 server/whatisup/api/v1/probes.py:185"}, "properties": {"repobilityId": "618b722d7ea2caa3", "scanner": "scanner-primary", "fingerprint": "e67b1ccce43e3df4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/probes.py"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-22b13749fc2a00c9", "level": "error", "message": {"text": "FastAPI POST `push_diagnostics` without auth dependency \u2014 server/whatisup/api/v1/probes.py:301"}, "properties": {"repobilityId": "57926386a332d557", "scanner": "scanner-primary", "fingerprint": "22b13749fc2a00c9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/probes.py"}, "region": {"startLine": 301}}}]}, {"ruleId": "scanner-3a720d3e5d56290c", "level": "error", "message": {"text": "FastAPI POST `push_result` without auth dependency \u2014 server/whatisup/api/v1/probes.py:355"}, "properties": {"repobilityId": "b486b833c67a4fe7", "scanner": "scanner-primary", "fingerprint": "3a720d3e5d56290c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/probes.py"}, "region": {"startLine": 355}}}]}, {"ruleId": "scanner-1d3e1fca06ebfad4", "level": "error", "message": {"text": "FastAPI POST `subscribe_status` without auth dependency \u2014 server/whatisup/api/v1/public.py:384"}, "properties": {"repobilityId": "a1613b830d3606ac", "scanner": "scanner-primary", "fingerprint": "1d3e1fca06ebfad4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/public.py"}, "region": {"startLine": 384}}}]}, {"ruleId": "scanner-22dcf9343b859ba0", "level": "error", "message": {"text": "FastAPI POST `refresh` without auth dependency \u2014 server/whatisup/api/v1/auth.py:127"}, "properties": {"repobilityId": "314a275924ab6806", "scanner": "scanner-primary", "fingerprint": "22dcf9343b859ba0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/whatisup/api/v1/auth.py"}, "region": {"startLine": 127}}}]}]}]}