{"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-528d2dc8d7389921", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-labels.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-labels.ts:50"}, "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-7d9955253a35b8bf", "name": "Stray `console.log` in TS/JS \u2014 scripts/deploy-status.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/deploy-status.ts:50"}, "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-4086d0a84c71826d", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-mocks.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-mocks.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ee9d6a821db2950", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-sw-browser-safe.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-sw-browser-safe.ts:46"}, "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-24d7e19d718db7da", "name": "Icon-only button without accessible name \u2014 src/components/CreateContentDialog/CreateContentDialog.vue:57", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/CreateContentDialog/CreateContentDialog.vue:57"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f8dd45c8b893afb", "name": "Icon-only button without accessible name \u2014 src/components/LinksEditor/LinkRow.vue:49", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/LinksEditor/LinkRow.vue:49"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d74ff1b1bd7603cc", "name": "Stray `console.log` in TS/JS \u2014 services/comms-worker/src/log/structured.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/comms-worker/src/log/structured.ts:6"}, "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-638bfb9410fed9ba", "name": "Insecure pattern 'node_child_process' in vite.config.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in vite.config.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ba97fa117b788e2", "name": "Insecure pattern 'node_child_process' in scripts/kill-port.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/kill-port.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-407f6e98cac376c4", "name": "Insecure pattern 'node_child_process' in scripts/dev-token.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/dev-token.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f51c91e13cd0b6d", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-slug-alt.pw.ts:25", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-slug-alt.pw.ts:25"}, "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-eb07d75f6e24d5c0", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/upload-newspaper.pw.ts:68", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/upload-newspaper.pw.ts:68"}, "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-b42db9ea100a6616", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-save-broken.pw.ts:83", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-save-broken.pw.ts:83"}, "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-6ad6c8cab989c0c6", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/prod-manual-verify.pw.ts:53", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/prod-manual-verify.pw.ts:53"}, "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-cfecfe3e5f8e8601", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/verify-edit-flow.pw.ts:71", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/verify-edit-flow.pw.ts:71"}, "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-3bc98630c6af2044", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-lang-switch-metadata.pw.ts:47", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-lang-switch-metadata.pw.ts:47"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51735d18dd5424c3", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/prod-bundle-smoke.pw.ts:80", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/prod-bundle-smoke.pw.ts:80"}, "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-642eed01184d6955", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/probe-pdf-upload.pw.ts:76", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/probe-pdf-upload.pw.ts:76"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d29e53e85e98d7b8", "name": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-save-create.pw.ts:113", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-save-create.pw.ts:113"}, "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-4f39c7ef59b44e68", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/directives/render.ts:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/directives/render.ts:24"}, "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-123016efeed301d0", "name": "Insecure pattern 'exec_used' in src/views/ContentView/run-optimistic-delete.ts:58", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/views/ContentView/run-optimistic-delete.ts:58"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7f599877abdac2b4", "name": "Insecure pattern 'local_storage_auth_token' in src/composables/useAuth/token-storage.test.ts:6", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/composables/useAuth/token-storage.test.ts:6"}, "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-0afc42165f72674e", "name": "Insecure pattern 'vue_v_html' in src/components/MarkdownEditor/MarkdownPreview.vue:36", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in src/components/MarkdownEditor/MarkdownPreview.vue:36"}, "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-61d3280ee97cf719", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/MarkdownEditor/exec-footnote.integration.test.ts:75", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/MarkdownEditor/exec-footnote.integration.test.ts:75"}, "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-048db3652def24f8", "name": "Insecure pattern 'domparser_html_parse' in src/features/newspaper/html-to-fb2/html-to-fb2.ts:14", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in src/features/newspaper/html-to-fb2/html-to-fb2.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ff6098648c9e7c8", "name": "Possible secret in src/sw/git/sync/pull/pull-repo.ts", "shortDescription": {"text": "Possible secret in src/sw/git/sync/pull/pull-repo.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-31f3f4d355de9c87", "name": "Possible secret in src/sw/git/sync/clone/clone-options.ts", "shortDescription": {"text": "Possible secret in src/sw/git/sync/clone/clone-options.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-85892d523d020905", "name": "Possible secret in src/sw/git/remote/build-auth-opts.ts", "shortDescription": {"text": "Possible secret in src/sw/git/remote/build-auth-opts.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6a23fb7044df2f02", "name": "Insecure pattern 'exec_used' in src/sw/handlers/route.ts:43", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/sw/handlers/route.ts:43"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-76e11693cae1127a", "name": "Insecure pattern 'local_storage_auth_token' in e2e-realmode/helpers/seed-token.ts:21", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-realmode/helpers/seed-token.ts:21"}, "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-e026c957316c08e8", "name": "Insecure pattern 'cors_wildcard' in services/comms-worker/src/app.ts:35", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in services/comms-worker/src/app.ts:35"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4cb90cea31fcb9c6", "name": "Insecure pattern 'local_storage_auth_token' in e2e/auth/setup.ts:17", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/auth/setup.ts:17"}, "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-411c22425e4cf193", "name": "Insecure pattern 'local_storage_auth_token' in e2e/auth/popup-login.spec.ts:20", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/auth/popup-login.spec.ts:20"}, "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-e5877dd34329fd91", "name": "Insecure pattern 'local_storage_auth_token' in e2e/auth/helpers.ts:10", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/auth/helpers.ts:10"}, "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-e60fe5a4f87132df", "name": "Insecure pattern 'direct_innerhtml_assignment' in e2e/comms-walkthrough/overlay.ts:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in e2e/comms-walkthrough/overlay.ts:80"}, "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-692822e989b6993d", "name": "Insecure pattern 'direct_innerhtml_assignment' in e2e/comms-walkthrough/scenario.spec.ts:67", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in e2e/comms-walkthrough/scenario.spec.ts:67"}, "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-90ae77e019c93bdd", "name": "Insecure pattern 'local_storage_auth_token' in e2e/comms-walkthrough/scenario.spec.ts:189", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/comms-walkthrough/scenario.spec.ts:189"}, "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-b44af7f3fde012de", "name": "Insecure pattern 'local_storage_auth_token' in e2e/lighthouse/desktop-auth.spec.ts:6", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/lighthouse/desktop-auth.spec.ts:6"}, "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-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "196 tests / 1050 src (ratio 0.19)."}, "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 16 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 100 placeholder/mock markers across 44 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-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5da0826cf48c5543", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker.ts:15"}, "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-2e75e73d402cbadc", "name": "Commented-code block (7 lines) in eslint.config.js:50", "shortDescription": {"text": "Commented-code block (7 lines) in eslint.config.js: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-85882766cc615c60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-labels.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-labels.ts:42"}, "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-ced96f5dd9c1a9f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/deploy-status.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/deploy-status.ts:35"}, "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-d092a0f897bec6ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sandbox-config.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sandbox-config.ts:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf9af84b9ab23fcc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sandbox-gh.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sandbox-gh.ts:19"}, "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-5ee46007142d7a2f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/integration-create.pw.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/integration-create.pw.ts:19"}, "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-cb56f03db3280bad", "name": "Commented-code block (5 lines) in e2e-prod/repro-slug-alt.pw.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in e2e-prod/repro-slug-alt.pw.ts:34"}, "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-f2467776e072d0b2", "name": "Commented-code block (5 lines) in e2e-prod/prod-manual-verify.pw.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in e2e-prod/prod-manual-verify.pw.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-384a7bf2e04f922b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/prod-manual-verify.pw.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/prod-manual-verify.pw.ts:60"}, "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-8a15420aef91dcf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/repro-lang-switch-metadata.pw.ts:153", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/repro-lang-switch-metadata.pw.ts:153"}, "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-040199d1c2cf1424", "name": "Commented-code block (8 lines) in e2e-prod/prod-bundle-smoke.pw.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in e2e-prod/prod-bundle-smoke.pw.ts: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-08840cd40d883bb4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/prod-bundle-smoke.pw.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/prod-bundle-smoke.pw.ts:27"}, "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-5e2bff4877f05a16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/repro-save-create.pw.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/repro-save-create.pw.ts:80"}, "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-caeaf517420c2187", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/cors-proxy.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/cors-proxy.ts:31"}, "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-917cd6ec1bbbf3e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/token-handler.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/token-handler.ts:14"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f04987021764603", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/stores/comms-http.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/stores/comms-http.ts:21"}, "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-cd34afc4d76d1c33", "name": "Commented-code block (5 lines) in src/views/ContentEditView/useEditPageInit.test.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/ContentEditView/useEditPageInit.test.ts:54"}, "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-f5724f5f5259202c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/mint-session.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/mint-session.ts:38"}, "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-5a3c8a7667fa1779", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/fetch-github-user.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/fetch-github-user.ts:11"}, "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-adfbcd29a853ac35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/exchange-token.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/exchange-token.ts:40"}, "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-29664a4f96158076", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useDeployStatus/gh-fetch.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useDeployStatus/gh-fetch.ts:13"}, "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-29669a99092f89a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useDeployStatus/job-logs.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useDeployStatus/job-logs.ts:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c92599ca8124240f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useSWBridge/sw-fetch.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useSWBridge/sw-fetch.ts:45"}, "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-b97f3e5bf76408a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useSWBridge/check-sw-available.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useSWBridge/check-sw-available.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14604a708f43c851", "name": "Commented-code block (6 lines) in src/components/ContentNav/nav-by-role.ts:42", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/ContentNav/nav-by-role.ts:42"}, "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-15fac434bcbe8ac7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/ticket-actions.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/ticket-actions.ts:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8999aa3fef949339", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/add-comment.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/add-comment.ts:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6560d1107adc028a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/ticket-state.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/ticket-state.ts:22"}, "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-185fe624a7ec0899", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/gh-tickets.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/gh-tickets.ts:41"}, "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-ce481773dc7fcd1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/put-content.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/put-content.ts:34"}, "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-35d2f8d85631b2f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/put-blob/http.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/put-blob/http.ts:50"}, "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-baddf642d657e6d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/invite-post.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/invite-post.ts:11"}, "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-0779d0ea28098bdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/handle-revoke-invite.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/handle-revoke-invite.ts:12"}, "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-c800f39500857ade", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/team-membership-ops.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/team-membership-ops.ts:21"}, "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-a639cc8aecd790af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/org-role-membership.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/org-role-membership.ts:21"}, "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-63edffa2b331c8a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/github-api.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/github-api.ts:25"}, "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-72964a6db1d07c59", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/astro-schema-drift.spec.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/astro-schema-drift.spec.ts:66"}, "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-7d8b428a4848a932", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/schema-gate.spec.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/schema-gate.spec.ts:30"}, "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-4aaedb51f4acfb7f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/sandbox-read.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/sandbox-read.ts:19"}, "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-59e7f71266a8ac9c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/sandbox-config.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/sandbox-config.ts:13"}, "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-3b4dfbf979cc8a91", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/astro-validate.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/astro-validate.ts:17"}, "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-338440eef3a0b26a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 vite/proxy-helpers.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vite/proxy-helpers.ts:54"}, "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-93be671cff3e0ac0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/otlp-handlers.test.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/otlp-handlers.test.ts:36"}, "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-5cd90c29e12992fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/rate-limit.test.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/rate-limit.test.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-54e443f237638c0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/health.test.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/health.test.ts:11"}, "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-601ec2d67ee4ae21", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/auth-middleware.test.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/auth-middleware.test.ts:25"}, "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-1d0d9f14621a691e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/batch-size-guard.test.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/batch-size-guard.test.ts:14"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0814b9f1e0cb072d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/gh-user.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/gh-user.ts:22"}, "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-78aa31a6ff1ed7c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/health.test.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/health.test.ts:11"}, "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-35d53360206b926b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/subscribers/routes.test.ts:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/subscribers/routes.test.ts:57"}, "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-3ebdf855965bbb4b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/webhooks/routes.test.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/webhooks/routes.test.ts:53"}, "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-f4d48aa5e6d59055", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/dispatch/force-route.test.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/dispatch/force-route.test.ts:54"}, "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-c1262a379e815632", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/dispatch/full-flow.test.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/dispatch/full-flow.test.ts:80"}, "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-1e82db1de0d952f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/unsubscribe/routes.test.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/unsubscribe/routes.test.ts:42"}, "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-c4e9edfebb41edf9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/schedule/routes.test.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/schedule/routes.test.ts:55"}, "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-7640a713c49c965a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/middleware/require-session.test.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/middleware/require-session.test.ts:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-baa57e8fb7375338", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/send-log/route.test.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/send-log/route.test.ts:71"}, "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-fd695a8ea7d8e4d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/auth-worker/src/session-handler.test.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/auth-worker/src/session-handler.test.ts:69"}, "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-ca89a41c2ec1b037", "name": "Commented-code block (6 lines) in e2e/content/create-edit-roundtrip.spec.ts:115", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/content/create-edit-roundtrip.spec.ts:115"}, "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-844c0c3858f39cd9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/content/create-edit-roundtrip.spec.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/content/create-edit-roundtrip.spec.ts:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-030da566069872e9", "name": "15 env vars used in code but missing from .env.example", "shortDescription": {"text": "15 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `BROWSERS`, `CI`, `DEV`, `GITHUB_OWNER`, `GITHUB_REPO`, `PROBE_BASE_URL`, `VITE_AUTH_BASE` + 7 more. 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-7b87212c97e3f8c5", "name": "Dangling fetch: GET https://api.github.com/repos/${owner}/${repo}/contents/${path} (e2e-prod/integration-create.pw.ts:19", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/repos/${owner}/${repo}/contents/${path} (e2e-prod/integration-create.pw.ts:19)"}, "fullDescription": {"text": "`e2e-prod/integration-create.pw.ts:19` calls `GET https://api.github.com/repos/${owner}/${repo}/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/<p>/<p>/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2065476ca01ce5ff", "name": "Dangling fetch: GET /api/github/content/blog (e2e-prod/prod-manual-verify.pw.ts:60)", "shortDescription": {"text": "Dangling fetch: GET /api/github/content/blog (e2e-prod/prod-manual-verify.pw.ts:60)"}, "fullDescription": {"text": "`e2e-prod/prod-manual-verify.pw.ts:60` calls `GET /api/github/content/blog` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/github/content/blog`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9f5e76159b76b624", "name": "Dangling fetch: GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/blog/${SLUG}/index", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/blog/${SLUG}/index.en.md?ref=master (e2e-prod/prod-manual-verify.pw.ts:179)"}, "fullDescription": {"text": "`e2e-prod/prod-manual-verify.pw.ts:179` calls `GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/blog/${SLUG}/index.en.md?ref=master` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/communist-prometheus/public-website-content/contents/blog/<p>/index.en.md`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe6a239ce87eb045", "name": "Dangling fetch: GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath}?ref", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath}?ref=master (e2e-prod/prod-manual-verify.pw.ts:249)"}, "fullDescription": {"text": "`e2e-prod/prod-manual-verify.pw.ts:249` calls `GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath}?ref=master` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/communist-prometheus/public-website-content/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98a2e80a1bc65ae1", "name": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath} ", "shortDescription": {"text": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath} (e2e-prod/prod-manual-verify.pw.ts:255)"}, "fullDescription": {"text": "`e2e-prod/prod-manual-verify.pw.ts:255` calls `DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/communist-prometheus/public-website-content/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aaaa86f1f7f7f6f0", "name": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path} (e2e-pr", "shortDescription": {"text": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path} (e2e-prod/repro-lang-switch-metadata.pw.ts:158)"}, "fullDescription": {"text": "`e2e-prod/repro-lang-switch-metadata.pw.ts:158` calls `DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/communist-prometheus/public-website-content/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5fbbd1e23a042670", "name": "Dangling fetch: GET https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch} (e2e-prod/prod-bundle-s", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch} (e2e-prod/prod-bundle-smoke.pw.ts:27)"}, "fullDescription": {"text": "`e2e-prod/prod-bundle-smoke.pw.ts:27` calls `GET https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/<p>/<p>/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26a10d879f421131", "name": "Dangling fetch: DELETE https://api.github.com/repos/${owner}/${repo}/contents/${path} (e2e-prod/prod-bundle-smoke.pw.ts:", "shortDescription": {"text": "Dangling fetch: DELETE https://api.github.com/repos/${owner}/${repo}/contents/${path} (e2e-prod/prod-bundle-smoke.pw.ts:33)"}, "fullDescription": {"text": "`e2e-prod/prod-bundle-smoke.pw.ts:33` calls `DELETE https://api.github.com/repos/${owner}/${repo}/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/<p>/<p>/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dfae26fb6aaf9634", "name": "Dangling fetch: GET /api/github/content/blog (e2e-prod/prod-bundle-smoke.pw.ts:91)", "shortDescription": {"text": "Dangling fetch: GET /api/github/content/blog (e2e-prod/prod-bundle-smoke.pw.ts:91)"}, "fullDescription": {"text": "`e2e-prod/prod-bundle-smoke.pw.ts:91` calls `GET /api/github/content/blog` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/github/content/blog`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-48c657c309a90f74", "name": "Dangling fetch: POST /api/github/file (e2e-prod/prod-bundle-smoke.pw.ts:118)", "shortDescription": {"text": "Dangling fetch: POST /api/github/file (e2e-prod/prod-bundle-smoke.pw.ts:118)"}, "fullDescription": {"text": "`e2e-prod/prod-bundle-smoke.pw.ts:118` calls `POST /api/github/file` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/github/file`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-70bd72491a3a30dd", "name": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path} (e2e-pr", "shortDescription": {"text": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path} (e2e-prod/repro-save-create.pw.ts:85)"}, "fullDescription": {"text": "`e2e-prod/repro-save-create.pw.ts:85` calls `DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/communist-prometheus/public-website-content/contents/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-339da7fe347b7e71", "name": "Dangling fetch: GET /api/cors/evil.example/x (src/api/cors-proxy.test.ts:50)", "shortDescription": {"text": "Dangling fetch: GET /api/cors/evil.example/x (src/api/cors-proxy.test.ts:50)"}, "fullDescription": {"text": "`src/api/cors-proxy.test.ts:50` calls `GET /api/cors/evil.example/x` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/cors/evil.example/x`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-39535aeff7f0b045", "name": "Dangling fetch: GET /api/cors/github.com/owner/repo/contents/secrets (src/api/cors-proxy.test.ts:58)", "shortDescription": {"text": "Dangling fetch: GET /api/cors/github.com/owner/repo/contents/secrets (src/api/cors-proxy.test.ts:58)"}, "fullDescription": {"text": "`src/api/cors-proxy.test.ts:58` calls `GET /api/cors/github.com/owner/repo/contents/secrets` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/cors/github.com/owner/repo/contents/secrets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63e81ffbdd204603", "name": "Dangling fetch: POST /api/oauth/token (src/api/token-handler.test.ts:20)", "shortDescription": {"text": "Dangling fetch: POST /api/oauth/token (src/api/token-handler.test.ts:20)"}, "fullDescription": {"text": "`src/api/token-handler.test.ts:20` calls `POST /api/oauth/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/oauth/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d9d6b595629bf7d", "name": "Dangling fetch: POST /api/sw/init (src/composables/useSWBridge/try-fetch-init.ts:10)", "shortDescription": {"text": "Dangling fetch: POST /api/sw/init (src/composables/useSWBridge/try-fetch-init.ts:10)"}, "fullDescription": {"text": "`src/composables/useSWBridge/try-fetch-init.ts:10` calls `POST /api/sw/init` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sw/init`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97b090564334dfab", "name": "Dangling fetch: HEAD /sw.js (src/composables/useSWBridge/check-sw-available.ts:18)", "shortDescription": {"text": "Dangling fetch: HEAD /sw.js (src/composables/useSWBridge/check-sw-available.ts:18)"}, "fullDescription": {"text": "`src/composables/useSWBridge/check-sw-available.ts:18` calls `HEAD /sw.js` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sw.js`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b8f5c8ae22982f7", "name": "Dangling fetch: PUT /api/github/file/stage (e2e-realmode/schema-gate.spec.ts:30)", "shortDescription": {"text": "Dangling fetch: PUT /api/github/file/stage (e2e-realmode/schema-gate.spec.ts:30)"}, "fullDescription": {"text": "`e2e-realmode/schema-gate.spec.ts:30` calls `PUT /api/github/file/stage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/github/file/stage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f035857bb232346", "name": "Dangling fetch: GET /api/github/file?path=${encodeURIComponent(p)} (e2e/content/create-edit-roundtrip.spec.ts:23)", "shortDescription": {"text": "Dangling fetch: GET /api/github/file?path=${encodeURIComponent(p)} (e2e/content/create-edit-roundtrip.spec.ts:23)"}, "fullDescription": {"text": "`e2e/content/create-edit-roundtrip.spec.ts:23` calls `GET /api/github/file?path=${encodeURIComponent(p)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/github/file`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-93c52fb582f1c330", "name": "Unused endpoint: USE /v1/*", "shortDescription": {"text": "Unused endpoint: USE /v1/*"}, "fullDescription": {"text": "`services/log-collector/src/index.ts` declares `USE /v1/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6bad0417de6f5874", "name": "Unused endpoint: POST /v1/traces", "shortDescription": {"text": "Unused endpoint: POST /v1/traces"}, "fullDescription": {"text": "`services/log-collector/src/otlp-handlers.ts` declares `POST /v1/traces` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa249daa165bb136", "name": "Unused endpoint: POST /v1/logs", "shortDescription": {"text": "Unused endpoint: POST /v1/logs"}, "fullDescription": {"text": "`services/log-collector/src/otlp-handlers.ts` declares `POST /v1/logs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8073f7bf758f6d0", "name": "Unused endpoint: USE /api/*", "shortDescription": {"text": "Unused endpoint: USE /api/*"}, "fullDescription": {"text": "`services/comms-worker/src/app.ts` declares `USE /api/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd099bdf85e8a6c4", "name": "Unused endpoint: GET /api/subscribers", "shortDescription": {"text": "Unused endpoint: GET /api/subscribers"}, "fullDescription": {"text": "`services/comms-worker/src/subscribers/routes.ts` declares `GET /api/subscribers` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94b14419f3341584", "name": "Unused endpoint: POST /api/subscribers", "shortDescription": {"text": "Unused endpoint: POST /api/subscribers"}, "fullDescription": {"text": "`services/comms-worker/src/subscribers/routes.ts` declares `POST /api/subscribers` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15d9a4b73ad9e47e", "name": "Unused endpoint: PATCH /api/subscribers/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/subscribers/:id"}, "fullDescription": {"text": "`services/comms-worker/src/subscribers/routes.ts` declares `PATCH /api/subscribers/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d89b8aee3606379", "name": "Unused endpoint: DELETE /api/subscribers/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/subscribers/:id"}, "fullDescription": {"text": "`services/comms-worker/src/subscribers/routes.ts` declares `DELETE /api/subscribers/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85258d174dd43b8c", "name": "Unused endpoint: POST /webhooks/resend", "shortDescription": {"text": "Unused endpoint: POST /webhooks/resend"}, "fullDescription": {"text": "`services/comms-worker/src/webhooks/routes.ts` declares `POST /webhooks/resend` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd5d9b5ca5aea5bd", "name": "Unused endpoint: POST /api/dispatch", "shortDescription": {"text": "Unused endpoint: POST /api/dispatch"}, "fullDescription": {"text": "`services/comms-worker/src/dispatch/force-route.ts` declares `POST /api/dispatch` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8266f87ed7bd38c4", "name": "Unused endpoint: GET /unsubscribe", "shortDescription": {"text": "Unused endpoint: GET /unsubscribe"}, "fullDescription": {"text": "`services/comms-worker/src/unsubscribe/routes.ts` declares `GET /unsubscribe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52681d778ae5876a", "name": "Unused endpoint: POST /unsubscribe", "shortDescription": {"text": "Unused endpoint: POST /unsubscribe"}, "fullDescription": {"text": "`services/comms-worker/src/unsubscribe/routes.ts` declares `POST /unsubscribe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-90e88e24f9c69554", "name": "Unused endpoint: GET /api/schedule", "shortDescription": {"text": "Unused endpoint: GET /api/schedule"}, "fullDescription": {"text": "`services/comms-worker/src/schedule/routes.ts` declares `GET /api/schedule` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9ccfe8ab3ec0071", "name": "Unused endpoint: PUT /api/schedule", "shortDescription": {"text": "Unused endpoint: PUT /api/schedule"}, "fullDescription": {"text": "`services/comms-worker/src/schedule/routes.ts` declares `PUT /api/schedule` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4f86e622d0122bc", "name": "Unused endpoint: GET /api/cutoff", "shortDescription": {"text": "Unused endpoint: GET /api/cutoff"}, "fullDescription": {"text": "`services/comms-worker/src/schedule/routes.ts` declares `GET /api/cutoff` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5690d182101869d", "name": "Unused endpoint: PUT /api/cutoff", "shortDescription": {"text": "Unused endpoint: PUT /api/cutoff"}, "fullDescription": {"text": "`services/comms-worker/src/schedule/routes.ts` declares `PUT /api/cutoff` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca0ee8c086b37844", "name": "Unused endpoint: GET /api/runs", "shortDescription": {"text": "Unused endpoint: GET /api/runs"}, "fullDescription": {"text": "`services/comms-worker/src/send-log/route.ts` declares `GET /api/runs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b827568e136f7ac", "name": "Unused endpoint: POST /auth/session", "shortDescription": {"text": "Unused endpoint: POST /auth/session"}, "fullDescription": {"text": "`services/auth-worker/src/session-handler.ts` declares `POST /auth/session` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c059f57186114027", "name": "Unused endpoint: POST /auth/logout", "shortDescription": {"text": "Unused endpoint: POST /auth/logout"}, "fullDescription": {"text": "`services/auth-worker/src/logout-handler.ts` declares `POST /auth/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25068"}, "properties": {"repository": "communist-prometheus/admin-website", "repoUrl": "https://github.com/communist-prometheus/admin-website", "branch": "main"}, "results": [{"ruleId": "scanner-528d2dc8d7389921", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-labels.ts:50"}, "properties": {"repobilityId": "f2ad1b67d021c454", "scanner": "scanner-primary", "fingerprint": "528d2dc8d7389921", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d9955253a35b8bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/deploy-status.ts:50"}, "properties": {"repobilityId": "06d3f9e98773819c", "scanner": "scanner-primary", "fingerprint": "7d9955253a35b8bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4086d0a84c71826d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-mocks.ts:41"}, "properties": {"repobilityId": "7c069d878cb53a84", "scanner": "scanner-primary", "fingerprint": "4086d0a84c71826d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ee9d6a821db2950", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-sw-browser-safe.ts:46"}, "properties": {"repobilityId": "137f472590086d0b", "scanner": "scanner-primary", "fingerprint": "6ee9d6a821db2950", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-24d7e19d718db7da", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/CreateContentDialog/CreateContentDialog.vue:57"}, "properties": {"repobilityId": "c372da119bb95cd8", "scanner": "scanner-primary", "fingerprint": "24d7e19d718db7da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0f8dd45c8b893afb", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/LinksEditor/LinkRow.vue:49"}, "properties": {"repobilityId": "9e5234f528f963c6", "scanner": "scanner-primary", "fingerprint": "0f8dd45c8b893afb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d74ff1b1bd7603cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/comms-worker/src/log/structured.ts:6"}, "properties": {"repobilityId": "54ed3d71dd80f9ec", "scanner": "scanner-primary", "fingerprint": "d74ff1b1bd7603cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-638bfb9410fed9ba", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in vite.config.ts:2"}, "properties": {"repobilityId": "b194fcea7803da43", "scanner": "scanner-primary", "fingerprint": "638bfb9410fed9ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vite.config.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-1ba97fa117b788e2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/kill-port.ts:1"}, "properties": {"repobilityId": "4a5f44405aa0fc5c", "scanner": "scanner-primary", "fingerprint": "1ba97fa117b788e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/kill-port.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-407f6e98cac376c4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/dev-token.ts:2"}, "properties": {"repobilityId": "38f3ca8520f43cf0", "scanner": "scanner-primary", "fingerprint": "407f6e98cac376c4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/dev-token.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-2f51c91e13cd0b6d", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-slug-alt.pw.ts:25"}, "properties": {"repobilityId": "334c62a7d143818f", "scanner": "scanner-primary", "fingerprint": "2f51c91e13cd0b6d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/repro-slug-alt.pw.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-eb07d75f6e24d5c0", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/upload-newspaper.pw.ts:68"}, "properties": {"repobilityId": "8a0947c64d728c9c", "scanner": "scanner-primary", "fingerprint": "eb07d75f6e24d5c0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/upload-newspaper.pw.ts"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-b42db9ea100a6616", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-save-broken.pw.ts:83"}, "properties": {"repobilityId": "7f56e0345f37548e", "scanner": "scanner-primary", "fingerprint": "b42db9ea100a6616", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/repro-save-broken.pw.ts"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-6ad6c8cab989c0c6", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/prod-manual-verify.pw.ts:53"}, "properties": {"repobilityId": "59b37894103db3c4", "scanner": "scanner-primary", "fingerprint": "6ad6c8cab989c0c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/prod-manual-verify.pw.ts"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-cfecfe3e5f8e8601", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/verify-edit-flow.pw.ts:71"}, "properties": {"repobilityId": "c3a6465c4a99bdd1", "scanner": "scanner-primary", "fingerprint": "cfecfe3e5f8e8601", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/verify-edit-flow.pw.ts"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-3bc98630c6af2044", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-lang-switch-metadata.pw.ts:47"}, "properties": {"repobilityId": "bbcf64998eb01415", "scanner": "scanner-primary", "fingerprint": "3bc98630c6af2044", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/repro-lang-switch-metadata.pw.ts"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-51735d18dd5424c3", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/prod-bundle-smoke.pw.ts:80"}, "properties": {"repobilityId": "31540acc6e95b317", "scanner": "scanner-primary", "fingerprint": "51735d18dd5424c3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/prod-bundle-smoke.pw.ts"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-642eed01184d6955", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/probe-pdf-upload.pw.ts:76"}, "properties": {"repobilityId": "df10eb90695ca969", "scanner": "scanner-primary", "fingerprint": "642eed01184d6955", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/probe-pdf-upload.pw.ts"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-d29e53e85e98d7b8", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-prod/repro-save-create.pw.ts:113"}, "properties": {"repobilityId": "f708115b9aed17a3", "scanner": "scanner-primary", "fingerprint": "d29e53e85e98d7b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-prod/repro-save-create.pw.ts"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-4f39c7ef59b44e68", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/directives/render.ts:24"}, "properties": {"repobilityId": "c6cf54e04e52192f", "scanner": "scanner-primary", "fingerprint": "4f39c7ef59b44e68", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/directives/render.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-123016efeed301d0", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/views/ContentView/run-optimistic-delete.ts:58"}, "properties": {"repobilityId": "ba7b88a8604d1dbc", "scanner": "scanner-primary", "fingerprint": "123016efeed301d0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/views/ContentView/run-optimistic-delete.ts"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-7f599877abdac2b4", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/composables/useAuth/token-storage.test.ts:6"}, "properties": {"repobilityId": "1e5e7df8fd8d8264", "scanner": "scanner-primary", "fingerprint": "7f599877abdac2b4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/composables/useAuth/token-storage.test.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-0afc42165f72674e", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in src/components/MarkdownEditor/MarkdownPreview.vue:36"}, "properties": {"repobilityId": "5d68e822347cf3cd", "scanner": "scanner-primary", "fingerprint": "0afc42165f72674e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/MarkdownEditor/MarkdownPreview.vue"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-61d3280ee97cf719", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/MarkdownEditor/exec-footnote.integration.test.ts:75"}, "properties": {"repobilityId": "e0c42c6f92c2491c", "scanner": "scanner-primary", "fingerprint": "61d3280ee97cf719", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/MarkdownEditor/exec-footnote.integration.test.ts"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-048db3652def24f8", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in src/features/newspaper/html-to-fb2/html-to-fb2.ts:14"}, "properties": {"repobilityId": "d647e3b9c39c061d", "scanner": "scanner-primary", "fingerprint": "048db3652def24f8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/features/newspaper/html-to-fb2/html-to-fb2.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-4ff6098648c9e7c8", "level": "error", "message": {"text": "Possible secret in src/sw/git/sync/pull/pull-repo.ts"}, "properties": {"repobilityId": "66e5167afb25a1bd", "scanner": "scanner-primary", "fingerprint": "4ff6098648c9e7c8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/sw/git/sync/pull/pull-repo.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-31f3f4d355de9c87", "level": "error", "message": {"text": "Possible secret in src/sw/git/sync/clone/clone-options.ts"}, "properties": {"repobilityId": "7a0ea341f00821cf", "scanner": "scanner-primary", "fingerprint": "31f3f4d355de9c87", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/sw/git/sync/clone/clone-options.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-85892d523d020905", "level": "error", "message": {"text": "Possible secret in src/sw/git/remote/build-auth-opts.ts"}, "properties": {"repobilityId": "eb00be0e1bc45a3a", "scanner": "scanner-primary", "fingerprint": "85892d523d020905", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/sw/git/remote/build-auth-opts.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-6a23fb7044df2f02", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/sw/handlers/route.ts:43"}, "properties": {"repobilityId": "5846c273a0162362", "scanner": "scanner-primary", "fingerprint": "6a23fb7044df2f02", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/sw/handlers/route.ts"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-76e11693cae1127a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e-realmode/helpers/seed-token.ts:21"}, "properties": {"repobilityId": "d9693da5b2eef226", "scanner": "scanner-primary", "fingerprint": "76e11693cae1127a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-realmode/helpers/seed-token.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-e026c957316c08e8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in services/comms-worker/src/app.ts:35"}, "properties": {"repobilityId": "a1d23c4a09d04d03", "scanner": "scanner-primary", "fingerprint": "e026c957316c08e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/comms-worker/src/app.ts"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-4cb90cea31fcb9c6", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/auth/setup.ts:17"}, "properties": {"repobilityId": "f4cf732b33571cd7", "scanner": "scanner-primary", "fingerprint": "4cb90cea31fcb9c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/auth/setup.ts"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-411c22425e4cf193", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/auth/popup-login.spec.ts:20"}, "properties": {"repobilityId": "16e365d5df19560d", "scanner": "scanner-primary", "fingerprint": "411c22425e4cf193", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/auth/popup-login.spec.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-e5877dd34329fd91", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/auth/helpers.ts:10"}, "properties": {"repobilityId": "a627efdcf1f13919", "scanner": "scanner-primary", "fingerprint": "e5877dd34329fd91", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/auth/helpers.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-e60fe5a4f87132df", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in e2e/comms-walkthrough/overlay.ts:80"}, "properties": {"repobilityId": "5b97d42c2dba311e", "scanner": "scanner-primary", "fingerprint": "e60fe5a4f87132df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/comms-walkthrough/overlay.ts"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-692822e989b6993d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in e2e/comms-walkthrough/scenario.spec.ts:67"}, "properties": {"repobilityId": "94e4fe5c0624c003", "scanner": "scanner-primary", "fingerprint": "692822e989b6993d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/comms-walkthrough/scenario.spec.ts"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-90ae77e019c93bdd", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/comms-walkthrough/scenario.spec.ts:189"}, "properties": {"repobilityId": "d017a793ec902987", "scanner": "scanner-primary", "fingerprint": "90ae77e019c93bdd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/comms-walkthrough/scenario.spec.ts"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-b44af7f3fde012de", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e/lighthouse/desktop-auth.spec.ts:6"}, "properties": {"repobilityId": "3ce81cf1912d1264", "scanner": "scanner-primary", "fingerprint": "b44af7f3fde012de", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/lighthouse/desktop-auth.spec.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "7f54f657334f288b", "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": "71d835da9c03c787", "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": "0ec20f27de085f8c", "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": "98084fdd13d8da99", "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": "2ccc8277846e2b07", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5da0826cf48c5543", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker.ts:15"}, "properties": {"repobilityId": "6107458a9d0a4adb", "scanner": "scanner-primary", "fingerprint": "5da0826cf48c5543", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e75e73d402cbadc", "level": "none", "message": {"text": "Commented-code block (7 lines) in eslint.config.js:50"}, "properties": {"repobilityId": "51858730ab02152e", "scanner": "scanner-primary", "fingerprint": "2e75e73d402cbadc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85882766cc615c60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-labels.ts:42"}, "properties": {"repobilityId": "38f17b1ee577d3d1", "scanner": "scanner-primary", "fingerprint": "85882766cc615c60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ced96f5dd9c1a9f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/deploy-status.ts:35"}, "properties": {"repobilityId": "30316a055a5e70e7", "scanner": "scanner-primary", "fingerprint": "ced96f5dd9c1a9f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d092a0f897bec6ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sandbox-config.ts:37"}, "properties": {"repobilityId": "5bac2620dd9ad2ff", "scanner": "scanner-primary", "fingerprint": "d092a0f897bec6ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf9af84b9ab23fcc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sandbox-gh.ts:19"}, "properties": {"repobilityId": "dc9db3740c546dc6", "scanner": "scanner-primary", "fingerprint": "cf9af84b9ab23fcc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ee46007142d7a2f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/integration-create.pw.ts:19"}, "properties": {"repobilityId": "bf2f33c9fc8e6502", "scanner": "scanner-primary", "fingerprint": "5ee46007142d7a2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb56f03db3280bad", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e-prod/repro-slug-alt.pw.ts:34"}, "properties": {"repobilityId": "cfcd1b1f9a59203c", "scanner": "scanner-primary", "fingerprint": "cb56f03db3280bad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2467776e072d0b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e-prod/prod-manual-verify.pw.ts:4"}, "properties": {"repobilityId": "59a824196d97604b", "scanner": "scanner-primary", "fingerprint": "f2467776e072d0b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-384a7bf2e04f922b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/prod-manual-verify.pw.ts:60"}, "properties": {"repobilityId": "ff03f1841698b63a", "scanner": "scanner-primary", "fingerprint": "384a7bf2e04f922b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a15420aef91dcf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/repro-lang-switch-metadata.pw.ts:153"}, "properties": {"repobilityId": "0f7dbd38dfe29830", "scanner": "scanner-primary", "fingerprint": "8a15420aef91dcf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-040199d1c2cf1424", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e-prod/prod-bundle-smoke.pw.ts:3"}, "properties": {"repobilityId": "fca2a17d36b1e336", "scanner": "scanner-primary", "fingerprint": "040199d1c2cf1424", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08840cd40d883bb4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/prod-bundle-smoke.pw.ts:27"}, "properties": {"repobilityId": "c3b2867a5c5283a1", "scanner": "scanner-primary", "fingerprint": "08840cd40d883bb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e2bff4877f05a16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-prod/repro-save-create.pw.ts:80"}, "properties": {"repobilityId": "3f46b5efc4bed201", "scanner": "scanner-primary", "fingerprint": "5e2bff4877f05a16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-caeaf517420c2187", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/cors-proxy.ts:31"}, "properties": {"repobilityId": "9c5eeabb23596d17", "scanner": "scanner-primary", "fingerprint": "caeaf517420c2187", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-917cd6ec1bbbf3e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/token-handler.ts:14"}, "properties": {"repobilityId": "76cba27b7bdaaa1a", "scanner": "scanner-primary", "fingerprint": "917cd6ec1bbbf3e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f04987021764603", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/stores/comms-http.ts:21"}, "properties": {"repobilityId": "ecc68b33a463875e", "scanner": "scanner-primary", "fingerprint": "5f04987021764603", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd34afc4d76d1c33", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/ContentEditView/useEditPageInit.test.ts:54"}, "properties": {"repobilityId": "5f4e9bea107e5833", "scanner": "scanner-primary", "fingerprint": "cd34afc4d76d1c33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5724f5f5259202c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/mint-session.ts:38"}, "properties": {"repobilityId": "6442b8ffcff5d031", "scanner": "scanner-primary", "fingerprint": "f5724f5f5259202c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a3c8a7667fa1779", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/fetch-github-user.ts:11"}, "properties": {"repobilityId": "60e5d9ef23437908", "scanner": "scanner-primary", "fingerprint": "5a3c8a7667fa1779", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-adfbcd29a853ac35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useAuth/exchange-token.ts:40"}, "properties": {"repobilityId": "2a123193e1220b02", "scanner": "scanner-primary", "fingerprint": "adfbcd29a853ac35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29664a4f96158076", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useDeployStatus/gh-fetch.ts:13"}, "properties": {"repobilityId": "7ba9b0f78f399845", "scanner": "scanner-primary", "fingerprint": "29664a4f96158076", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29669a99092f89a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useDeployStatus/job-logs.ts:48"}, "properties": {"repobilityId": "b7a5c78a1fede061", "scanner": "scanner-primary", "fingerprint": "29669a99092f89a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c92599ca8124240f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useSWBridge/sw-fetch.ts:45"}, "properties": {"repobilityId": "e10fb1a792735138", "scanner": "scanner-primary", "fingerprint": "c92599ca8124240f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b97f3e5bf76408a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/composables/useSWBridge/check-sw-available.ts:18"}, "properties": {"repobilityId": "29712e2e5a379445", "scanner": "scanner-primary", "fingerprint": "b97f3e5bf76408a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14604a708f43c851", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/ContentNav/nav-by-role.ts:42"}, "properties": {"repobilityId": "3ac4023b568d9d32", "scanner": "scanner-primary", "fingerprint": "14604a708f43c851", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15fac434bcbe8ac7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/ticket-actions.ts:26"}, "properties": {"repobilityId": "932bd20d7b3f955a", "scanner": "scanner-primary", "fingerprint": "15fac434bcbe8ac7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8999aa3fef949339", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/add-comment.ts:26"}, "properties": {"repobilityId": "898a482fc7f4e838", "scanner": "scanner-primary", "fingerprint": "8999aa3fef949339", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6560d1107adc028a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/ticket-state.ts:22"}, "properties": {"repobilityId": "f2eff1253de307a4", "scanner": "scanner-primary", "fingerprint": "6560d1107adc028a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-185fe624a7ec0899", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/gh-tickets.ts:41"}, "properties": {"repobilityId": "e4a807d9bbf98f8a", "scanner": "scanner-primary", "fingerprint": "185fe624a7ec0899", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce481773dc7fcd1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/put-content.ts:34"}, "properties": {"repobilityId": "d6059a3e125eb67d", "scanner": "scanner-primary", "fingerprint": "ce481773dc7fcd1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35d2f8d85631b2f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/tickets/api/put-blob/http.ts:50"}, "properties": {"repobilityId": "f16fbdeb5ba0da8b", "scanner": "scanner-primary", "fingerprint": "35d2f8d85631b2f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-baddf642d657e6d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/invite-post.ts:11"}, "properties": {"repobilityId": "d987c0a3ca0beaf5", "scanner": "scanner-primary", "fingerprint": "baddf642d657e6d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0779d0ea28098bdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/handle-revoke-invite.ts:12"}, "properties": {"repobilityId": "7b1f3e7b5027b591", "scanner": "scanner-primary", "fingerprint": "0779d0ea28098bdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c800f39500857ade", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/team-membership-ops.ts:21"}, "properties": {"repobilityId": "f1bbf6667598067a", "scanner": "scanner-primary", "fingerprint": "c800f39500857ade", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a639cc8aecd790af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/org-role-membership.ts:21"}, "properties": {"repobilityId": "2322250aa7a74b7a", "scanner": "scanner-primary", "fingerprint": "a639cc8aecd790af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63edffa2b331c8a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/sw/rbac/github-api.ts:25"}, "properties": {"repobilityId": "7f70c7674adad277", "scanner": "scanner-primary", "fingerprint": "63edffa2b331c8a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-72964a6db1d07c59", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/astro-schema-drift.spec.ts:66"}, "properties": {"repobilityId": "91944c90394f1a7f", "scanner": "scanner-primary", "fingerprint": "72964a6db1d07c59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7d8b428a4848a932", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/schema-gate.spec.ts:30"}, "properties": {"repobilityId": "981a91418bd33873", "scanner": "scanner-primary", "fingerprint": "7d8b428a4848a932", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4aaedb51f4acfb7f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/sandbox-read.ts:19"}, "properties": {"repobilityId": "a7ab41d0ff0b3538", "scanner": "scanner-primary", "fingerprint": "4aaedb51f4acfb7f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59e7f71266a8ac9c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/sandbox-config.ts:13"}, "properties": {"repobilityId": "fd1def966023c39d", "scanner": "scanner-primary", "fingerprint": "59e7f71266a8ac9c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b4dfbf979cc8a91", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-realmode/helpers/astro-validate.ts:17"}, "properties": {"repobilityId": "ce00fa654c01197a", "scanner": "scanner-primary", "fingerprint": "3b4dfbf979cc8a91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-338440eef3a0b26a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vite/proxy-helpers.ts:54"}, "properties": {"repobilityId": "e2446b967187747a", "scanner": "scanner-primary", "fingerprint": "338440eef3a0b26a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93be671cff3e0ac0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/otlp-handlers.test.ts:36"}, "properties": {"repobilityId": "b34b985d76b51195", "scanner": "scanner-primary", "fingerprint": "93be671cff3e0ac0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5cd90c29e12992fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/rate-limit.test.ts:24"}, "properties": {"repobilityId": "2601d7928d432183", "scanner": "scanner-primary", "fingerprint": "5cd90c29e12992fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54e443f237638c0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/health.test.ts:11"}, "properties": {"repobilityId": "0868f6e0cae72406", "scanner": "scanner-primary", "fingerprint": "54e443f237638c0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-601ec2d67ee4ae21", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/auth-middleware.test.ts:25"}, "properties": {"repobilityId": "6f342b0dd2884c44", "scanner": "scanner-primary", "fingerprint": "601ec2d67ee4ae21", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d0d9f14621a691e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/batch-size-guard.test.ts:14"}, "properties": {"repobilityId": "70ef8b2101eaa676", "scanner": "scanner-primary", "fingerprint": "1d0d9f14621a691e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0814b9f1e0cb072d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/log-collector/src/gh-user.ts:22"}, "properties": {"repobilityId": "f66c481bfd07625f", "scanner": "scanner-primary", "fingerprint": "0814b9f1e0cb072d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-78aa31a6ff1ed7c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/health.test.ts:11"}, "properties": {"repobilityId": "66d82380011eaeb9", "scanner": "scanner-primary", "fingerprint": "78aa31a6ff1ed7c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35d53360206b926b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/subscribers/routes.test.ts:57"}, "properties": {"repobilityId": "68fdd90b5d878605", "scanner": "scanner-primary", "fingerprint": "35d53360206b926b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ebdf855965bbb4b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/webhooks/routes.test.ts:53"}, "properties": {"repobilityId": "10362f32f1fc072d", "scanner": "scanner-primary", "fingerprint": "3ebdf855965bbb4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f4d48aa5e6d59055", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/dispatch/force-route.test.ts:54"}, "properties": {"repobilityId": "3c93bea705c657e4", "scanner": "scanner-primary", "fingerprint": "f4d48aa5e6d59055", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c1262a379e815632", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/dispatch/full-flow.test.ts:80"}, "properties": {"repobilityId": "ec74b15cba94a566", "scanner": "scanner-primary", "fingerprint": "c1262a379e815632", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e82db1de0d952f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/unsubscribe/routes.test.ts:42"}, "properties": {"repobilityId": "efda0ec6cc343d33", "scanner": "scanner-primary", "fingerprint": "1e82db1de0d952f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c4e9edfebb41edf9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/schedule/routes.test.ts:55"}, "properties": {"repobilityId": "cc1a56e35d747e10", "scanner": "scanner-primary", "fingerprint": "c4e9edfebb41edf9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7640a713c49c965a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/middleware/require-session.test.ts:48"}, "properties": {"repobilityId": "0fbcdf51aae80ad6", "scanner": "scanner-primary", "fingerprint": "7640a713c49c965a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-baa57e8fb7375338", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/comms-worker/src/send-log/route.test.ts:71"}, "properties": {"repobilityId": "38ddcd838f4eab9f", "scanner": "scanner-primary", "fingerprint": "baa57e8fb7375338", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd695a8ea7d8e4d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/auth-worker/src/session-handler.test.ts:69"}, "properties": {"repobilityId": "6677fab326d4b35b", "scanner": "scanner-primary", "fingerprint": "fd695a8ea7d8e4d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca89a41c2ec1b037", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/content/create-edit-roundtrip.spec.ts:115"}, "properties": {"repobilityId": "5a6593f934e1c1e8", "scanner": "scanner-primary", "fingerprint": "ca89a41c2ec1b037", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-844c0c3858f39cd9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/content/create-edit-roundtrip.spec.ts:23"}, "properties": {"repobilityId": "5df50b13f22da855", "scanner": "scanner-primary", "fingerprint": "844c0c3858f39cd9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-030da566069872e9", "level": "note", "message": {"text": "15 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0519c1c0e8c1f8e4", "scanner": "scanner-primary", "fingerprint": "030da566069872e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-7b87212c97e3f8c5", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/repos/${owner}/${repo}/contents/${path} (e2e-prod/integration-create.pw.ts:19)"}, "properties": {"repobilityId": "fbf4e68423cefada", "scanner": "scanner-primary", "fingerprint": "7b87212c97e3f8c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2065476ca01ce5ff", "level": "error", "message": {"text": "Dangling fetch: GET /api/github/content/blog (e2e-prod/prod-manual-verify.pw.ts:60)"}, "properties": {"repobilityId": "a24af60930c1a068", "scanner": "scanner-primary", "fingerprint": "2065476ca01ce5ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9f5e76159b76b624", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/blog/${SLUG}/index.en.md?ref=master (e2e-prod/prod-manual-verify.pw.ts:179)"}, "properties": {"repobilityId": "beacf486e527f23d", "scanner": "scanner-primary", "fingerprint": "9f5e76159b76b624", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe6a239ce87eb045", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath}?ref=master (e2e-prod/prod-manual-verify.pw.ts:249)"}, "properties": {"repobilityId": "b11c9a4e2b03d423", "scanner": "scanner-primary", "fingerprint": "fe6a239ce87eb045", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98a2e80a1bc65ae1", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${cleanupPath} (e2e-prod/prod-manual-verify.pw.ts:255)"}, "properties": {"repobilityId": "adc7411b03a42f83", "scanner": "scanner-primary", "fingerprint": "98a2e80a1bc65ae1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aaaa86f1f7f7f6f0", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path} (e2e-prod/repro-lang-switch-metadata.pw.ts:158)"}, "properties": {"repobilityId": "569a3437b7207cef", "scanner": "scanner-primary", "fingerprint": "aaaa86f1f7f7f6f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5fbbd1e23a042670", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch} (e2e-prod/prod-bundle-smoke.pw.ts:27)"}, "properties": {"repobilityId": "f9845778d3ee0be1", "scanner": "scanner-primary", "fingerprint": "5fbbd1e23a042670", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26a10d879f421131", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.github.com/repos/${owner}/${repo}/contents/${path} (e2e-prod/prod-bundle-smoke.pw.ts:33)"}, "properties": {"repobilityId": "588ea98dabafb4f7", "scanner": "scanner-primary", "fingerprint": "26a10d879f421131", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dfae26fb6aaf9634", "level": "error", "message": {"text": "Dangling fetch: GET /api/github/content/blog (e2e-prod/prod-bundle-smoke.pw.ts:91)"}, "properties": {"repobilityId": "1307def24490f0b1", "scanner": "scanner-primary", "fingerprint": "dfae26fb6aaf9634", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-48c657c309a90f74", "level": "error", "message": {"text": "Dangling fetch: POST /api/github/file (e2e-prod/prod-bundle-smoke.pw.ts:118)"}, "properties": {"repobilityId": "ee427228e445194f", "scanner": "scanner-primary", "fingerprint": "48c657c309a90f74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-70bd72491a3a30dd", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.github.com/repos/communist-prometheus/public-website-content/contents/${path} (e2e-prod/repro-save-create.pw.ts:85)"}, "properties": {"repobilityId": "429a3f03014ebc34", "scanner": "scanner-primary", "fingerprint": "70bd72491a3a30dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-339da7fe347b7e71", "level": "error", "message": {"text": "Dangling fetch: GET /api/cors/evil.example/x (src/api/cors-proxy.test.ts:50)"}, "properties": {"repobilityId": "57db7f48e6ca8278", "scanner": "scanner-primary", "fingerprint": "339da7fe347b7e71", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-39535aeff7f0b045", "level": "error", "message": {"text": "Dangling fetch: GET /api/cors/github.com/owner/repo/contents/secrets (src/api/cors-proxy.test.ts:58)"}, "properties": {"repobilityId": "f21a5ac57f238d28", "scanner": "scanner-primary", "fingerprint": "39535aeff7f0b045", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-63e81ffbdd204603", "level": "error", "message": {"text": "Dangling fetch: POST /api/oauth/token (src/api/token-handler.test.ts:20)"}, "properties": {"repobilityId": "07bef64e0cf488bc", "scanner": "scanner-primary", "fingerprint": "63e81ffbdd204603", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8d9d6b595629bf7d", "level": "error", "message": {"text": "Dangling fetch: POST /api/sw/init (src/composables/useSWBridge/try-fetch-init.ts:10)"}, "properties": {"repobilityId": "f3ec2c90ecf15126", "scanner": "scanner-primary", "fingerprint": "8d9d6b595629bf7d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97b090564334dfab", "level": "error", "message": {"text": "Dangling fetch: HEAD /sw.js (src/composables/useSWBridge/check-sw-available.ts:18)"}, "properties": {"repobilityId": "58ee5b852a9d6fa3", "scanner": "scanner-primary", "fingerprint": "97b090564334dfab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b8f5c8ae22982f7", "level": "error", "message": {"text": "Dangling fetch: PUT /api/github/file/stage (e2e-realmode/schema-gate.spec.ts:30)"}, "properties": {"repobilityId": "119a877c40331d72", "scanner": "scanner-primary", "fingerprint": "1b8f5c8ae22982f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f035857bb232346", "level": "error", "message": {"text": "Dangling fetch: GET /api/github/file?path=${encodeURIComponent(p)} (e2e/content/create-edit-roundtrip.spec.ts:23)"}, "properties": {"repobilityId": "269f877d48a6064f", "scanner": "scanner-primary", "fingerprint": "0f035857bb232346", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93c52fb582f1c330", "level": "note", "message": {"text": "Unused endpoint: USE /v1/*"}, "properties": {"repobilityId": "ed82e29f70f445be", "scanner": "scanner-primary", "fingerprint": "93c52fb582f1c330", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bad0417de6f5874", "level": "note", "message": {"text": "Unused endpoint: POST /v1/traces"}, "properties": {"repobilityId": "c89794344bdca287", "scanner": "scanner-primary", "fingerprint": "6bad0417de6f5874", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa249daa165bb136", "level": "note", "message": {"text": "Unused endpoint: POST /v1/logs"}, "properties": {"repobilityId": "b683e9219e3d33e8", "scanner": "scanner-primary", "fingerprint": "aa249daa165bb136", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8073f7bf758f6d0", "level": "note", "message": {"text": "Unused endpoint: USE /api/*"}, "properties": {"repobilityId": "608636bfa779ebcc", "scanner": "scanner-primary", "fingerprint": "b8073f7bf758f6d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd099bdf85e8a6c4", "level": "note", "message": {"text": "Unused endpoint: GET /api/subscribers"}, "properties": {"repobilityId": "45e95a546c0f5d38", "scanner": "scanner-primary", "fingerprint": "dd099bdf85e8a6c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94b14419f3341584", "level": "note", "message": {"text": "Unused endpoint: POST /api/subscribers"}, "properties": {"repobilityId": "44ba153cd55ac63a", "scanner": "scanner-primary", "fingerprint": "94b14419f3341584", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15d9a4b73ad9e47e", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/subscribers/:id"}, "properties": {"repobilityId": "2d51b76721f34858", "scanner": "scanner-primary", "fingerprint": "15d9a4b73ad9e47e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d89b8aee3606379", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/subscribers/:id"}, "properties": {"repobilityId": "686de54d407f1c7e", "scanner": "scanner-primary", "fingerprint": "2d89b8aee3606379", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85258d174dd43b8c", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/resend"}, "properties": {"repobilityId": "997714ce99534973", "scanner": "scanner-primary", "fingerprint": "85258d174dd43b8c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd5d9b5ca5aea5bd", "level": "note", "message": {"text": "Unused endpoint: POST /api/dispatch"}, "properties": {"repobilityId": "3eb3f76662d9f0e1", "scanner": "scanner-primary", "fingerprint": "cd5d9b5ca5aea5bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8266f87ed7bd38c4", "level": "note", "message": {"text": "Unused endpoint: GET /unsubscribe"}, "properties": {"repobilityId": "e1da8015c888eed9", "scanner": "scanner-primary", "fingerprint": "8266f87ed7bd38c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52681d778ae5876a", "level": "note", "message": {"text": "Unused endpoint: POST /unsubscribe"}, "properties": {"repobilityId": "86cc70153156a913", "scanner": "scanner-primary", "fingerprint": "52681d778ae5876a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90e88e24f9c69554", "level": "note", "message": {"text": "Unused endpoint: GET /api/schedule"}, "properties": {"repobilityId": "90cb388b2e8260f2", "scanner": "scanner-primary", "fingerprint": "90e88e24f9c69554", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e9ccfe8ab3ec0071", "level": "note", "message": {"text": "Unused endpoint: PUT /api/schedule"}, "properties": {"repobilityId": "1cad956c52d418bc", "scanner": "scanner-primary", "fingerprint": "e9ccfe8ab3ec0071", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4f86e622d0122bc", "level": "note", "message": {"text": "Unused endpoint: GET /api/cutoff"}, "properties": {"repobilityId": "37623fd2b6e74569", "scanner": "scanner-primary", "fingerprint": "a4f86e622d0122bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b5690d182101869d", "level": "note", "message": {"text": "Unused endpoint: PUT /api/cutoff"}, "properties": {"repobilityId": "9448cab012cf375d", "scanner": "scanner-primary", "fingerprint": "b5690d182101869d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca0ee8c086b37844", "level": "note", "message": {"text": "Unused endpoint: GET /api/runs"}, "properties": {"repobilityId": "287cebab714e1498", "scanner": "scanner-primary", "fingerprint": "ca0ee8c086b37844", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b827568e136f7ac", "level": "note", "message": {"text": "Unused endpoint: POST /auth/session"}, "properties": {"repobilityId": "d905cc159a11e2a7", "scanner": "scanner-primary", "fingerprint": "3b827568e136f7ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c059f57186114027", "level": "note", "message": {"text": "Unused endpoint: POST /auth/logout"}, "properties": {"repobilityId": "f87e0cf2bf23f8ca", "scanner": "scanner-primary", "fingerprint": "c059f57186114027", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}